Bonjour
J'effectue un trigger de mise à jour dans lequel je fais une insertion de nouvelle en récupérant d'autre ligne. Dans les lignes que je réinsère il y a une clé étrangère que je dois incrémente seulement l'incrémentation se fait une seul fois alors qu'après test dans mon SELECT de mon curseur j'ai 6 enregistrements. Voila mon trigger
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
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
 
SET QUOTED_IDENTIFIER ON
GO
 
CREATE TRIGGER PassageBF ON [dbo].[F_DOCLIGNE] 
FOR  UPDATE
AS
DECLARE @PasseBF NUMERIC(13), @Qte NUMERIC(13),@Type SMALLINT,@Piece VARCHAR(9) ,@DL_No INTEGER,@maxDL_No INTEGER,@QteAvant NUMERIC(13),@Test INTEGER,@sens SMALLINT,@DO_Piece VARCHAR(9),@NbLigne INTEGER,
@CHAR_DO_Piece_bis	CHAR(1),
@CHAR_DO_Piece CHAR(1),-- Caractère pour ajout au n° de pièce
@CHAR_DO_Piece4 CHAR(1),
@CHAR_DO_Piece3 CHAR(1),
@CHAR_DO_Piece2 CHAR(1),
@CHAR_DO_Piece1 CHAR(1),@cbMarq INTEGER,
@AR_Ref			VARCHAR(17),	-- Numéros de l'article
@CdRet			INTEGER,		-- Code de retour pour les procédures
@Colisage		INTEGER,		-- Nombre de pièce par colis
@Palette			INTEGER,		-- Numéros de palette
@DL_Qte			INTEGER,		-- Qantité pour la ligne d'origine
@MaxCdMarq		INTEGER,		-- Code ligne pour l'insertion
@i					INTEGER,		-- Variable de boucle
@DL_PoidsNet	NUMERIC,		-- Poid net de la ligne réference
@DL_PoidsBrut	NUMERIC,		-- Poid brute de la ligne réference
@PoidsNet		NUMERIC,		-- Poid net de la ligne nouvelle
@PoidsBrut		NUMERIC,		-- Poid brute de la ligne nouvelle
@DL_MontantHT	NUMERIC,		-- Montant HT de la ligne réference
@DL_MontantTTC	NUMERIC,		-- Montant TTC de la ligne réference
@MontantHT	NUMERIC,			-- Montant HT recalculé
@MontantTTC	NUMERIC,			-- Montant TTC recalculé
@ref_art 	VARCHAR(6),
@ref 		VARCHAR(17),
@ref_art_num	VARCHAR(1),
@DO_Domaine SMALLINT,
@DO_Type SMALLINT,
@CT_Num VARCHAR(17),
@DL_PieceBC VARCHAR(9),
@DL_PieceBL VARCHAR(9),
@DO_Date SMALLDATETIME,
@DL_DateBC SMALLDATETIME,
@DL_DateBL SMALLDATETIME,
@DL_Ligne INTEGER,
@DO_Ref VARCHAR(17),
@DL_TNomencl SMALLINT,
@DL_TRemPied SMALLINT,
@DL_TRemExep SMALLINT,
@DL_Design VARCHAR(69),
@DL_QteBC NUMERIC(13),
@DL_QteBL NUMERIC(13),
@DL_Remise01REM_Valeur NUMERIC(13),
@DL_Remise01REM_Type SMALLINT,
@DL_Remise02REM_Valeur NUMERIC(13),
@DL_Remise02REM_Type SMALLINT,
@DL_Remise03REM_Valeur NUMERIC(13),
@DL_Remise03REM_Type SMALLINT,
@DL_PrixUnitaire NUMERIC(13),
@DL_PUBC NUMERIC(13),
@DL_Taxe1 NUMERIC(13),
@DL_TypeTaux1 SMALLINT,
@DL_TypeTaxe1 SMALLINT,
@DL_Taxe2 NUMERIC(13),
@DL_TypeTaux2 SMALLINT,
@DL_TypeTaxe2 SMALLINT,
@RE_No INTEGER,
@cbRE_No INTEGER,
@AG_No1 INTEGER, 
@AG_No2 INTEGER,
@DL_PrixRU NUMERIC(13),
@DL_CMUP NUMERIC(13),
@DL_MvtStock SMALLINT,
@GL_No INTEGER,
@cbGL_No INTEGER,
@AF_RefFourniss VARCHAR(19),
@EU_Enumere VARCHAR(21),
@EU_Qte NUMERIC(13),
@DL_TTC SMALLINT,
@DE_No INTEGER,
@cbDE_No INTEGER,
@DL_NoRef SMALLINT,
@DL_TypePL SMALLINT,
@DL_PUDevise NUMERIC(13),
@DL_PUTTC NUMERIC(13),
@DO_DateLivr SMALLDATETIME,
@CA_Num VARCHAR(13),
@DL_Taxe3 NUMERIC(13),
@DL_TypeTaux3 SMALLINT,
@DL_TypeTaxe3 SMALLINT,
@DL_Frais NUMERIC(13),
@DL_Valorise SMALLINT,
@AR_RefCompose VARCHAR(19),
@DL_NonLivre SMALLINT,
@AC_RefClient VARCHAR(19),
@DL_FactPoids SMALLINT,
@DL_Escompte SMALLINT,
@cbProt SMALLINT,
@cbCreateur CHAR(4),
@cbModification SMALLDATETIME,
@cbReplication INTEGER,
@cbFlag SMALLINT,
@DL_QteAp NUMERIC(13),
@DL_QteBCAp NUMERIC(13),
@DL_QteBLAp NUMERIC(13),
@PoidsNetAp NUMERIC(13),
@PoidsBrutAp NUMERIC(13),
@EU_QteAp NUMERIC(13),
@DL_TTCAp SMALLINT,
@DL_MontantHTAp NUMERIC(13),
@DL_MontantTTCAp NUMERIC(13),
@k INTEGER,
@Testcount VARCHAR(10)
 
 
SELECT @Type=DO_Type,@PasseBF=PassageBF,@Qte=DL_Qte,@Piece=DO_Piece,@DL_No=DL_No,@sens=DL_MvtStock FROM Inserted
SELECT @QteAvant=DL_Qte FROM Deleted
 
 
 
Set @Test=0
IF UPDATE(PassageBF)
BEGIN
 
	IF @Type=25
	BEGIN
		IF @sens=0 AND (@PasseBF<>0) 
		BEGIN
			--Déclaration curseur avant
 
			set @sens=3
 
			UPDATE F_DOCLIGNE SET DL_Qte=(DL_Qte*@PasseBF)/@QteAvant  FROM F_DOCLIGNE WHERE DO_Piece=@Piece AND 
DL_MvtStock=3
			UPDATE F_DOCLIGNE SET DL_Qte=@PasseBF  FROM F_DOCLIGNE WHERE DO_Piece=@Piece AND 
DL_MvtStock=0
			COMMIT
			Set @NbLigne=@@rowcount
			--Calculer Nouveau DO_Piece
			IF @Piece=NULL 
			BEGIN
				Raiserror('Le No_Pièce est NULL',16,1)
			END
			IF LEN(@Piece)>=10 
			BEGIN
				Raiserror('Le numéro de pièce ne peut être incrémenté',16,1)
			END
 
			SELECT @CHAR_DO_Piece_bis = RIGHT(LEFT(MAX(DO_Piece),8),1)--Récupere le chiffre qui va falloir incrementer
			FROM F_DOCENTETE 
			WHERE DO_Type=25
 
			SELECT @CHAR_DO_Piece = LEFT(RIGHT(MAX(DO_Piece),2),1)--Récupere le chiffre qui va falloir incrementer
			FROM F_DOCENTETE 
			WHERE DO_Type=25
 
			SELECT @CHAR_DO_Piece1 = LEFT(RIGHT(MAX(DO_Piece),3),1) --Récupere le nombre à rajouter en cas de test 1
			FROM F_DOCENTETE 
			WHERE DO_Type=25
 
			SELECT @CHAR_DO_Piece2 = LEFT(RIGHT(MAX(DO_Piece),4),1) --Récupere le nombre à rajouter en cas de test 1
			FROM F_DOCENTETE 
			WHERE DO_Type=25
 
			SELECT @CHAR_DO_Piece3 = LEFT(RIGHT(MAX(DO_Piece),5),1) --Récupere le nombre à rajouter en cas de test 1
			FROM F_DOCENTETE 
			WHERE DO_Type=25
 
			SELECT @CHAR_DO_Piece4 =LEFT(RIGHT(MAX(DO_Piece),6),1) --Récupere le nombre à rajouter en cas de test 1
			FROM F_DOCENTETE 
			WHERE DO_Type=25 
 
			-- Pour Info 'A' = 65 ; 'Z' = 90 ; 'a' = 97 ; 'z' = 122
			-- Recherche de la lettre suivante
			IF @CHAR_DO_Piece_bis IS NULL
			BEGIN
				SET @CHAR_DO_Piece_bis = '0' -- si pas de lettre initialise à 0
			END
			ELSE
			BEGIN
			-- incrémente la lettre
				IF (ASCII(@CHAR_DO_Piece_bis) >= 47
					AND ASCII(@CHAR_DO_Piece_bis) < 57) -- Verifie qu'une lettre existe*/
				BEGIN
					SET @CHAR_DO_Piece_bis = CHAR(ASCII(@CHAR_DO_Piece_bis) + 1)
				END
				ELSE		
				BEGIN
		 		-- incrémente la lettre
					IF (ASCII(@CHAR_DO_Piece) >= 47 AND ASCII(@CHAR_DO_Piece) < 57) -- Verifie qu'une lettre existe*/
					BEGIN
						SET @CHAR_DO_Piece = CHAR(ASCII(@CHAR_DO_Piece) + 1)
						SET @CHAR_DO_Piece_bis = '0'
					END
					ELSE
					BEGIN
					IF (ASCII(@CHAR_DO_Piece1) >= 47 AND ASCII(@CHAR_DO_Piece1) < 57) -- Verifie qu'une lettre existe*/
					BEGIN
						SET @CHAR_DO_Piece1 = CHAR(ASCII(@CHAR_DO_Piece1) + 1)
						SET @CHAR_DO_Piece = '0'
						SET @CHAR_DO_Piece_bis = '0'
					END
					ELSE 
					BEGIN
						IF (ASCII(@CHAR_DO_Piece2) >= 47 AND ASCII(@CHAR_DO_Piece2) < 57)
						BEGIN
							SET @CHAR_DO_Piece2 = CHAR(ASCII(@CHAR_DO_Piece2) + 1)
							SET @CHAR_DO_Piece1 = '0'
							SET @CHAR_DO_Piece = '0'
							SET @CHAR_DO_Piece_bis = '0'
						END
						ELSE
						BEGIN
							IF (ASCII(@CHAR_DO_Piece3) >= 47 AND ASCII(@CHAR_DO_Piece3) < 57)
							BEGIN
								SET @CHAR_DO_Piece3 = CHAR(ASCII(@CHAR_DO_Piece3) + 1)
								SET @CHAR_DO_Piece2 = '0'
								SET @CHAR_DO_Piece1 = '0'
								SET @CHAR_DO_Piece = '0'
								SET @CHAR_DO_Piece_bis = '0'
							END
 
							BEGIN -- toutes les lettres ont été utilisées
								RAISERROR ('Impossible de Numéroter cette pièce1',16,1)
							END
						END
					END
				END
			END
 
		SET @DO_Piece ='OF'+ @CHAR_DO_Piece3 + @CHAR_DO_Piece2+@CHAR_DO_Piece1 + @CHAR_DO_Piece +@CHAR_DO_Piece_bis	--@DO_PieceOrigine+@CHAR_DO_Piece 
		IF @DO_Piece IS NULL
		BEGIN
			RAISERROR('Le do_Piece est null',16,1)
		END 
		-- Valeur de cbMarq
		SELECT @cbMarq = MAX([cbMarq]+1)
		FROM [F_DOCENTETE]
 
		--Insertion ENTETE
		INSERT INTO [F_DOCENTETE] 
	  	([DO_Domaine],[DO_Type],[DO_Piece],[DO_Date],[DO_Ref],[DO_Tiers],
		[RE_No],[cbRE_No],[DO_Period],[DO_Devise],[DO_Cours],[DE_No],
		[cbDE_No],[LI_No],[cbLI_No],[CT_NumPayeur],[DO_Expedit],
		[DO_NbFacture],	[DO_BLFact],[DO_TxEscompte],[DO_Reliquat],[DO_Imprim],
		[CA_Num],[DO_Coord01],[DO_Coord02],[DO_Coord03],[DO_Coord04],
		[DO_Souche],[DO_DateLivr],[DO_Condition],[DO_Tarif],[DO_Colisage],
		[DO_TypeColis],	[DO_Transaction],[DO_Langue],[DO_Ecart],[DO_Regime],
		[N_CatCompta],[DO_Ventile],[AB_No],[DO_DebutAbo],[DO_FinAbo],
		[DO_DebutPeriod],[DO_FinPeriod],[CG_Num],[DO_Statut],[DO_Heure],
		[CA_No],[cbCA_No],[RE_NoCaissier],[cbRE_NoCaissier],[DO_Transfere],
		[DO_Cloture],[DO_NoWeb],[DO_Attente],[DO_Provenance],[cbProt],
		/*[cbMarq],*/[cbCreateur],[cbModification],[cbReplication],[cbFlag])
		SELECT 
		[DO_Domaine],[DO_Type],	@DO_Piece,[DO_Date],[DO_Ref],[DO_Tiers],
		[RE_No],[cbRE_No],[DO_Period],[DO_Devise],[DO_Cours],[DE_No],
		[cbDE_No],[LI_No],[cbLI_No],[CT_NumPayeur],[DO_Expedit],
		[DO_NbFacture],[DO_BLFact],[DO_TxEscompte],[DO_Reliquat],
		[DO_Imprim],[CA_Num],[DO_Coord01],[DO_Coord02],[DO_Coord03],
		[DO_Coord04],[DO_Souche],[DO_DateLivr],[DO_Condition],[DO_Tarif],
		[DO_Colisage],[DO_TypeColis],[DO_Transaction],[DO_Langue],
		[DO_Ecart],[DO_Regime],[N_CatCompta],[DO_Ventile],[AB_No],
		[DO_DebutAbo],[DO_FinAbo],[DO_DebutPeriod],[DO_FinPeriod],[CG_Num],
		[DO_Statut],[DO_Heure],[CA_No],[cbCA_No],[RE_NoCaissier],
		[cbRE_NoCaissier],[DO_Transfere],[DO_Cloture],[DO_NoWeb],[DO_Attente],
		[DO_Provenance],[cbProt],/*@cbMarq,*/[cbCreateur],[cbModification],
		[cbReplication],[cbFlag]
		FROM [F_DOCENTETE]
		WHERE [DO_Piece] = @Piece
 
		--1er Curseur
			--Raiserror(@DO_Piece,16,1)
			Set @k=0 
 
			/*SELECT @k=COUNT(DL_No) FROM F_DOCLIGNE WHERE DO_Piece=@Piece
			Set @Testcount=STR(@k)
			RAISERROR(@Testcount,16,1)*/
			DECLARE cursor_AvantModif CURSOR
			FOR SELECT [DL_No]
			FROM F_DOCLIGNE 
			WHERE DO_Piece=@Piece
 
			OPEN cursor_AvantModif
			FETCH NEXT FROM cursor_avantModif 
			WHILE @@FETCH_STATUS = 0
	  		BEGIN 	
			Set @k=@k+1	
			SELECT @maxDL_No=MAX(DL_No)+1 from F_DOCLIGNE
			set @maxDL_No=@maxDL_No+k
			--Set @Testcount=STR(@maxDL_No)
			--RAISERROR(@Testcount,16,1)    
			BEGIN TRANSACTION
				INSERT INTO [F_DOCLIGNE]
		  	([DO_Domaine],[DO_Type],[CT_Num],[DO_Piece],[DL_PieceBC],[DL_PieceBL],[DO_Date],
			[DL_DateBC],[DL_DateBL],[DL_Ligne],[DO_Ref],[DL_TNomencl],
			[DL_TRemPied],	[DL_TRemExep], [AR_Ref],[DL_Design],[DL_Qte],
			[DL_QteBC],[DL_QteBL],[DL_PoidsNet],[DL_PoidsBrut],
			[DL_Remise01REM_Valeur],[DL_Remise01REM_Type],[DL_Remise02REM_Valeur],
			[DL_Remise02REM_Type],[DL_Remise03REM_Valeur],[DL_Remise03REM_Type],
			[DL_PrixUnitaire],[DL_PUBC],[DL_Taxe1],[DL_TypeTaux1],[DL_TypeTaxe1],
			[DL_Taxe2],[DL_TypeTaux2],[DL_TypeTaxe2],[RE_No],[cbRE_No],[AG_No1],
			[AG_No2],[DL_PrixRU],[DL_CMUP],[DL_MvtStock],[GL_No],[cbGL_No],
			[AF_RefFourniss],[EU_Enumere],[EU_Qte],[DL_TTC],[DE_No],[cbDE_No],
			[DL_NoRef],[DL_TypePL],[DL_PUDevise], [DL_PUTTC],[DL_No],
			[DO_DateLivr],[CA_Num],[DL_Taxe3],[DL_TypeTaux3],[DL_TypeTaxe3],
			[DL_Frais],[DL_Valorise], [AR_RefCompose],[DL_NonLivre],
			[AC_RefClient],[DL_MontantHT],[DL_MontantTTC],[DL_FactPoids],
			[DL_Escompte],[cbProt],	/*[cbMarq],*/[cbCreateur],[cbModification],
			[cbReplication],[cbFlag]/*,[Pce_C],[Trait],[Car_P]*/)
			SELECT
			[DO_Domaine],[DO_Type],[CT_Num],@DO_Piece,[DL_PieceBC],[DL_PieceBL],[DO_Date],
			[DL_DateBC],[DL_DateBL],[DL_Ligne],[DO_Ref],[DL_TNomencl],[DL_TRemPied],
			[DL_TRemExep],[AR_Ref],[DL_Design],@QteAvant-@PasseBF,[DL_QteBC],[DL_QteBL],
			[DL_PoidsNet],[DL_PoidsBrut],[DL_Remise01REM_Valeur],[DL_Remise01REM_Type],
			[DL_Remise02REM_Valeur],[DL_Remise02REM_Type],[DL_Remise03REM_Valeur],
			[DL_Remise03REM_Type],[DL_PrixUnitaire],[DL_PUBC],[DL_Taxe1],
			[DL_TypeTaux1],[DL_TypeTaxe1],[DL_Taxe2],[DL_TypeTaux2],[DL_TypeTaxe2],
			[RE_No],[cbRE_No],[AG_No1],[AG_No2],[DL_PrixRU],[DL_CMUP],[DL_MvtStock], [GL_No],
			[cbGL_No],[AF_RefFourniss],[EU_Enumere],[EU_Qte],[DL_TTC],[DE_No],[cbDE_No],
			[DL_NoRef],[DL_TypePL],[DL_PUDevise], [DL_PUTTC],@maxDL_No,[DO_DateLivr],
			[CA_Num],[DL_Taxe3],[DL_TypeTaux3],[DL_TypeTaxe3],[DL_Frais],[DL_Valorise],
			[AR_RefCompose],[DL_NonLivre],[AC_RefClient],[DL_MontantHT],[DL_MontantTTC],
			[DL_FactPoids],[DL_Escompte],[cbProt],/*@MaxCdMarq,*/
			[cbCreateur],[cbModification],[cbReplication],[cbFlag]/*,
			@Colisage,'ok',	@Palette*/
			FROM [F_DOCLIGNE]
			WHERE [DO_Piece] = @Piece
			COMMIT
			FETCH NEXT FROM cursor_AvantModif 
			END
--Insertion Ligne avec boucle tant que
			CLOSE cursor_AvantModif
			DEALLOCATE cursor_AvantModif
			END
--Fermeture curseur
			END
--rentre pas la boucle
	END
END
Merci