Bonjour,
Je rencontre un souci lors de l'exécution d'un job et je ne parviens pas à situer le problème.
Voici le code du step qui pose problème :
Le message d'erreur étant celui-ci :
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 /*----------------------------------------------------------------------------------* *SCRIPT D'IMPORTATION DE L'ANCIENNE DB GIFTCARD DANS LA NOUVELLE DB * * _ _ * * /!\ PENSER A DESACTIVER LES TRIGGER AFTER UPDATE SUR LES TABLES STS ET SFS /!\ * * ¯¯¯ ¯¯¯ * *-----------------------------------------------------------------------------------*/ SET ANSI_WARNINGS OFF; DECLARE @SEQNRHIST INT; DECLARE @BARCODE VARCHAR(13); DECLARE @DATE DATETIME; DECLARE @ACTION VARCHAR(1); DECLARE @ORIGIN INT; DECLARE @DESTTYPE INT; DECLARE @DEST INT; DECLARE @VALUE INT; DECLARE @SALETYPE INT; DECLARE @USERTYPE INT; DECLARE @GFT_ID INT; DECLARE @STR_ID INT; DECLARE @DOS_ID INT; DECLARE @DECIMAL_VALUE DECIMAL(6,2); DECLARE @TMP VARCHAR(100); DECLARE @TRN_TILL SMALLINT; DECLARE @TRN_TICKET SMALLINT; DECLARE @USERNAME VARCHAR(50); DECLARE C CURSOR FOR SELECT SEQNRHIST, BARCODE, DATTIM, ACTION, ORIGIN, DESTTYPE, DEST, VALUE, SALETYPE, USERTYPE FROM DBO.T_CHEQUE_ACHAT_HISTORY WHERE ACTION = 'T' ORDER BY DATTIM, SEQNRHIST OPEN C; FETCH NEXT FROM C INTO @SEQNRHIST, @BARCODE, @DATE, @ACTION, @ORIGIN, @DESTTYPE, @DEST, @VALUE, @SALETYPE, @USERTYPE; WHILE @@FETCH_STATUS = 0 BEGIN --ON RECUPERE L'ID DU GIFT EXEC TMP_UP_CREATE_GIFT_IF_NOT_EXISTS @BARCODE, @GFT_ID OUTPUT, @VALUE; --ON NOTE LA LIGNE EN COURS DE TRAITEMENT POUR IDENTIFIER SI PLANTAGE UPDATE DBO.T_CURRENT_LINE_PROCESSING_CLP SET SEQNRHIST = @SEQNRHIST, BARCODE = @BARCODE, ACTION = @ACTION --ON DEFINIT SI L'UTILISATEUR EST NORMAL OU ADMIN IF @USERTYPE <> 0 SET @USERNAME = 'ADMIN'; ELSE SET @USERNAME = 'NORMAL'; --VENDU A LA CAISSE (TTR_ID = 0) IF @ACTION = 'T' BEGIN --ON RECUPERE L'ID DU MAGASIN SET @ORIGIN = @ORIGIN * 10000 IF @ORIGIN = 0 SET @STR_ID = 17 ELSE EXEC TMP_UP_GET_STORE_ID @ORIGIN, @STR_ID OUTPUT; --ON RECUPERE LA CAISSE ET LE TICKET SET @TMP = RIGHT('000000'+CAST(@DEST AS VARCHAR(6)),6); SET @TRN_TILL = CAST(LEFT(@TMP,2) AS SMALLINT); SET @TRN_TICKET = CAST(RIGHT(@TMP,4) AS SMALLINT); IF @USERTYPE <> 0 --SI L'UTILISATION EST SIMULEE PAR UN ADMIN --> CAISSE ET TICKET = 0 BEGIN SET @TRN_TICKET = 0; SET @TRN_TILL = 0; END --ON INSERE LA TRANSACTION SET @DECIMAL_VALUE = CAST(@VALUE AS DECIMAL(10,2)) / 100; INSERT INTO DBO.T_TRANSACTION_TRN( TTR_ID, GFT_ID, STR_ID, TRN_DATE, TRN_TILL, TRN_TICKET, TRN_VALUE, TRN_CREATED_BY) VALUES(0, @GFT_ID, @STR_ID, @DATE, @TRN_TILL, @TRN_TICKET, @DECIMAL_VALUE, @USERNAME); --ON LE RETIRE DU STOCK DU MAGASIN UPDATE dbo.V_STORE_STOCK_VSS SET SSS_DATE_OUT = @DATE WHERE GFT_ID = @GFT_ID AND SSS_DATE_OUT IS NULL AND STR_ID = @STR_ID END FETCH NEXT FROM C INTO @SEQNRHIST, @BARCODE, @DATE, @ACTION, @ORIGIN, @DESTTYPE, @DEST, @VALUE, @SALETYPE, @USERTYPE; END CLOSE C; DEALLOCATE C;
J'ai donc été voir dans le seul endroit du code où une insertion dans la table T_CHEQUE_CHQ est susceptible d'avoir lieu. Il s'agit de la procédure stockée TMP_UP_CREATE_GIFT_IF_NOT_EXISTS dont voici le code :Executed as user: XXXXXXXX. Arithmetic overflow occurred. [SQLSTATE 01000] (Message 3606) Cannot insert the value NULL into column 'CHQ_AMOUNT', table 'GIFT_MANAGEMENT.dbo.T_CHEQUE_CHQ'; column does not allow nulls. INSERT fails. [SQLSTATE 23000] (Error 515) The statement has been terminated. [SQLSTATE 01000] (Error 3621). The step failed.
Comme je m'attendais à ce que ce truc ne marche pas du premier coup, je note la ligne en cours de traitement dans la table T_CURRENT_PROCCESSING_LINE_CLP.
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 USE [GIFT_MANAGEMENT] GO /****** Object: StoredProcedure [dbo].[TMP_UP_CREATE_GIFT_IF_NOT_EXISTS] Script Date: 01/18/2013 10:28:14 ******/ SET ANSI_NULLS ON GO SET QUOTED_IDENTIFIER ON GO CREATE PROCEDURE [dbo].[TMP_UP_CREATE_GIFT_IF_NOT_EXISTS] @BARCODE CHAR(13), @GFT_ID INT OUTPUT, @VALUE INT = NULL AS BEGIN SET NOCOUNT ON; SET ANSI_WARNINGS OFF; DECLARE @TCA_ID SMALLINT = 0; DECLARE @TCA_CODE SMALLINT = CAST(SUBSTRING(@BARCODE,3,3) AS SMALLINT); DECLARE @CRD_SERIAL INT = CAST(SUBSTRING(@BARCODE,6,7) AS INT); DECLARE @CHQ_TYPE TINYINT = CAST(SUBSTRING(@BARCODE,3,2) AS TINYINT); DECLARE @CHQ_YEAR TINYINT = CAST(SUBSTRING(@BARCODE,5,1) AS TINYINT); DECLARE @CHQ_SERIAL INT = CAST(SUBSTRING(@BARCODE,6,7) AS INT); IF LEFT(@BARCODE,2) = '21' --CHEQUE BEGIN --CREATION DU CHEQUE S'IL N'EXISTE PAS IF NOT EXISTS ( SELECT * FROM DBO.T_CHEQUE_CHQ WHERE CHQ_PREFIX = 21 AND CHQ_TYPE = @CHQ_TYPE AND CHQ_YEAR = @CHQ_YEAR AND CHQ_SERIAL = @CHQ_SERIAL ) BEGIN INSERT INTO DBO.T_GIFT_GFT DEFAULT VALUES; SET @GFT_ID = SCOPE_IDENTITY(); INSERT INTO DBO.T_CHEQUE_CHQ(GFT_ID, CHQ_PREFIX, CHQ_TYPE, CHQ_YEAR, CHQ_SERIAL, CHQ_AMOUNT) VALUES(@GFT_ID, 21, @CHQ_TYPE, @CHQ_YEAR, @CHQ_SERIAL, CAST(@CHQ_TYPE AS DECIMAL(6,2))); END ELSE SELECT @GFT_ID = GFT_ID FROM DBO.T_CHEQUE_CHQ WHERE CHQ_TYPE = @CHQ_TYPE AND CHQ_YEAR = @CHQ_YEAR AND CHQ_SERIAL = @CHQ_SERIAL END ELSE IF LEFT(@BARCODE,2) = '24' --CARTE BEGIN --CREATION DU TYPE DE CARTE S'IL N'EXISTE PAS IF NOT EXISTS ( SELECT * FROM DBO.T_TYPE_CARD_TCA WHERE TCA_CODE = @TCA_CODE ) BEGIN INSERT INTO DBO.T_TYPE_CARD_TCA(TCA_STANDARD, TCA_CODE) VALUES(0, @TCA_CODE); SET @TCA_ID = SCOPE_IDENTITY(); END ELSE SELECT @TCA_ID = TCA_ID FROM DBO.T_TYPE_CARD_TCA WHERE TCA_CODE = @TCA_CODE --CREATION DE LA CARTE SI ELLE N'EXISTE PAS IF NOT EXISTS ( SELECT * FROM DBO.T_CARD_CRD WHERE TCA_ID = @TCA_ID AND CRD_SERIAL = @CRD_SERIAL ) BEGIN INSERT INTO DBO.T_GIFT_GFT DEFAULT VALUES; SET @GFT_ID = SCOPE_IDENTITY(); INSERT INTO DBO.T_CARD_CRD(GFT_ID, CRD_PREFIX, TCA_ID, CRD_SERIAL, CRD_RECHARGEABLE) VALUES(@GFT_ID, 24, @TCA_ID, @CRD_SERIAL, 0) END ELSE SELECT @GFT_ID = GFT_ID FROM DBO.T_CARD_CRD WHERE TCA_ID = @TCA_ID AND CRD_SERIAL = @CRD_SERIAL END ELSE IF LEFT(@BARCODE,2) = '22' --CHEQUE VARIABLE BEGIN --CREATION DU CHEQUE S'IL N'EXISTE PAS IF NOT EXISTS ( SELECT * FROM DBO.T_CHEQUE_CHQ WHERE CHQ_PREFIX = 22 AND CHQ_TYPE = @CHQ_TYPE AND CHQ_YEAR = @CHQ_YEAR AND CHQ_SERIAL = @CHQ_SERIAL ) BEGIN INSERT INTO DBO.T_GIFT_GFT DEFAULT VALUES; SET @GFT_ID = SCOPE_IDENTITY(); DECLARE @CHQ_AMOUNT DECIMAL(6,2); SET @CHQ_AMOUNT = CAST(@VALUE AS DECIMAL(6,2)) / 100; INSERT INTO DBO.T_CHEQUE_CHQ(GFT_ID, CHQ_PREFIX, CHQ_TYPE, CHQ_YEAR, CHQ_SERIAL, CHQ_AMOUNT) VALUES(@GFT_ID, 22, @CHQ_TYPE, @CHQ_YEAR, @CHQ_SERIAL, @CHQ_AMOUNT); END ELSE SELECT @GFT_ID = GFT_ID FROM DBO.T_CHEQUE_CHQ WHERE CHQ_TYPE = @CHQ_TYPE AND CHQ_YEAR = @CHQ_YEAR AND CHQ_SERIAL = @CHQ_SERIAL END END GO
Je sais donc exactement quelle ligne plante et j'ai voulu reproduire cette erreur en reprenant le même code que le step (avec le curseur en moins) et en initialisant les variables "manuellement" en faisant un select sur la ligne concernnée. Et là, pas de souci. Du coup, je ne comprends pas.
J'ai cherché un peu partout où cette erreur pouvait se produire mais je ne trouve pas.
D'autant plus que la ligne traitée juste avant celle défectueuse est exactement la même à l'exection de la valeur de la colonne BARCODE.
Bref, je suis totalement perdu...
Auriez-vous une idée vers quoi me diriger pour corriger cela ?
Partager