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 :
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;
Le message d'erreur étant celui-ci :
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.
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 :
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
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.

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 ?