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
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
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
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
J'ai encore du mal avec la logique ensembliste. C'est pourquoi je viens chercher votre aide.

Merci d'avance.