Bonjour,
Suite à la discussion sur l'identification relative du forum administration, je me décide à faire quelques tests histoire de pouvoir juger par moi-même.
Seulement, je bloque déjà au niveau du trigger chargé d'incrémenter cette colonne d'identification relative.
J'ai réussi en m'appuyant sur l'un ou l'autre article un créer un trigger qui fonctionne mais qui est itératif. Et je n'aime pas ça.
J'avais réussi à en créer un ensembliste mais qui ne fonctionnait qu'à moitié dans le sens que, si on voulait insérer un ensemble de lignes, il ne fonctionnait que pour des valeurs de GFT_ID différentes.
Sans plus tarder, un peu de code :
Le DDL de la table
Et le DDL du trigger itératif :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28 /****** Object: Table [dbo].[T_ACTIVATION_ACT] Script Date: 10/04/2012 15:48:35 ******/ SET ANSI_NULLS ON GO SET QUOTED_IDENTIFIER ON GO CREATE TABLE [dbo].[T_ACTIVATION_ACT]( [GFT_ID] [int] NOT NULL, --clef primaire de la table parente [ACT_ID] [tinyint] NOT NULL, --colonne d'identification relative [DOS_ID] [int] NULL, [ACT_DATE] [datetime] NOT NULL, [ACT_VALUE] [decimal](6, 2) NOT NULL, CONSTRAINT [PK_T_ACTIVATION_ACT] PRIMARY KEY CLUSTERED ( [GFT_ID] ASC, [ACT_ID] ASC )WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY] ) ON [PRIMARY] GO ALTER TABLE [dbo].[T_ACTIVATION_ACT] WITH CHECK ADD CONSTRAINT [FK_T_ACTIVATION_ACT_TJ_GFT_DOS_JGD] FOREIGN KEY([GFT_ID], [DOS_ID]) REFERENCES [dbo].[TJ_GFT_DOS_JGD] ([GFT_ID], [DOS_ID]) GO ALTER TABLE [dbo].[T_ACTIVATION_ACT] CHECK CONSTRAINT [FK_T_ACTIVATION_ACT_TJ_GFT_DOS_JGD] GO
J'ai encore du mal avec la logique ensembliste. C'est pourquoi je viens chercher votre aide.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54 /****** Object: Trigger [dbo].[TR_RELATIVE_IDENTIFICATION_ACT] Script Date: 10/04/2012 15:48:44 ******/ SET ANSI_NULLS ON GO SET QUOTED_IDENTIFIER ON GO CREATE TRIGGER [dbo].[TR_RELATIVE_IDENTIFICATION_ACT] ON [dbo].[T_ACTIVATION_ACT] INSTEAD OF INSERT AS BEGIN SET NOCOUNT ON; SELECT ROW_NUM = ROW_NUMBER() OVER(ORDER BY GFT_ID), * INTO #INS FROM INSERTED; DECLARE @ITER INT; DECLARE @COUNT INT; SELECT @ITER=MIN(ROW_NUM) FROM #INS; SELECT @COUNT=MAX(ROW_NUM) FROM #INS; WHILE @ITER <= @COUNT BEGIN INSERT INTO T_ACTIVATION_ACT(GFT_ID, ACT_ID, DOS_ID, ACT_DATE, ACT_VALUE) SELECT INS.GFT_ID, COALESCE(MAX(ACT.ACT_ID),0)+1, INS.DOS_ID, INS.ACT_DATE, INS.ACT_VALUE FROM T_ACTIVATION_ACT ACT RIGHT OUTER JOIN #INS INS ON ACT.GFT_ID = INS.GFT_ID WHERE INS.ROW_NUM = @ITER GROUP BY INS.GFT_ID, INS.DOS_ID, INS.ACT_DATE, INS.ACT_VALUE; SET @ITER = @ITER+1; END END GO
Merci d'avance.
Partager