Bonjour,
Je fais une requête d’UPDATE sur cette table :
CREATE TABLE tciarfcp(
-- SQL150B 10 REUSEDLT(*NO) de la table TCIARFCP de BF750 ignoré.
ienreg CHAR(1) CCSID 297 NOT NULL DEFAULT '',
csocte CHAR(1) CCSID 297 NOT NULL DEFAULT '',
cagexp CHAR(2) CCSID 297 NOT NULL DEFAULT '',
numcha NUMERIC(7, 0) NOT NULL DEFAULT 0,
numtra NUMERIC(2, 0) NOT NULL DEFAULT 0,
coduex NUMERIC(8, 0) NOT NULL DEFAULT 0,
nuexpl NUMERIC(6, 0) NOT NULL DEFAULT 0,
nunchf CHAR(7) CCSID 297 NOT NULL DEFAULT '',
dattrt NUMERIC(8, 0) NOT NULL DEFAULT 0,
heutrt NUMERIC(6, 0) NOT NULL DEFAULT 0,
opgmor CHAR(10) CCSID 297 NOT NULL DEFAULT '',
typori CHAR(1) CCSID 297 NOT NULL DEFAULT '',
nbtrto NUMERIC(8, 0) NOT NULL DEFAULT 0,
nbtrde NUMERIC(8, 0) NOT NULL DEFAULT 0,
nbtrpo NUMERIC(8, 0) NOT NULL DEFAULT 0,
nbtrdi NUMERIC(8, 0) NOT NULL DEFAULT 0,
nbtrpi NUMERIC(8, 0) NOT NULL DEFAULT 0,
dincpo NUMERIC(8, 0) NOT NULL DEFAULT 0,
oincpo CHAR(10) CCSID 297 NOT NULL DEFAULT '',
dincde NUMERIC(8, 0) NOT NULL DEFAULT 0,
oincde CHAR(10) CCSID 297 NOT NULL DEFAULT '',
dintpo NUMERIC(8, 0) NOT NULL DEFAULT 0,
ointpo CHAR(10) CCSID 297 NOT NULL DEFAULT '',
dintdp NUMERIC(8, 0) NOT NULL DEFAULT 0,
ointdp CHAR(10) CCSID 297 NOT NULL DEFAULT '',
Statut Char(20) CCSID 297 NOT NULL DEFAULT '',
Date_Last_update For COLUMN TMPLSTUPD TIMESTAMP FOR EACH ROW
ON UPDATE AS ROW CHANGE TIMESTAMP NOT NULL)
RCDFMT tciarfcf;
Voici l’UPDATE, et j’ai une erreur SQLCODE = ‑420 et SQLSTATE = 22018, après recherche, il s’agit des champs Nbtrpo, Nbtrto.
EXEC SQL
UPDATE Tciarfcp A
SET (Ienreg,
Nbtrpo,
Nbtrto,
Nbtrpi,
Dincpo,
Oincpo,
Dintpo,
Ointpo,
Statut) = (' ',
(SELECT COUNT(*)
FROM Bcptcp B
JOIN Bcadrp C ON (C.Coduex,
C.Numcha,
C.Numtra,
C.Nbatim,
C.Nescal) =
(B.Coduex,
B.Numcha,
B.Numtra,
B.Nbatim,
B.Nescal)
WHERE (B.Numcha,
B.Numtra,
C.Nunchf) =
(A.Numcha,
A.Numtra,
A.Nunchf)
AND B.Codinj = 'P'),
(SELECT COUNT(*)
FROM Bcptcp B
JOIN Bcadrp C ON (C.Coduex,
C.Numcha,
C.Numtra,
C.Nbatim,
C.Nescal) =
(B.Coduex,
B.Numcha,
B.Numtra,
B.Nbatim,
B.Nescal)
WHERE (B.Numcha,
B.Numtra,
C.Nunchf) =
(A.Numcha,
A.Numtra,
A.Nunchf)),
0,
:G_Date_Jour,
:User,
0,
' ',
:G_Statut_Pret)
WHERE (A.Numcha,
A.Numtra,
A.Nunchf) = (:P_Numero_Chantier,
:P_Numero_Tranche,
:P_Unite_Chauffe);
Je ne vois vraiment pas ce qui cloche, car cette requête fonctionne très bien sur l’outils de requête d’ACS.
Cordialement,
Quand ça arrive, une solution est de sortir les requêtes en question et d’alimenter une zone RPG qui servira de variable hôte dans la requête finale comme ceci :
Dcl-s l_Nombre_total_ptc Zoned(8:0);
Dcl-s l_Nombre_ptc_injectes Zoned(8:0);
Le premier comptage est stocké dans la variable L_Nombre_Ptc_Injectes.
EXEC SQL
SELECT COUNT(*)
INTO :L_Nombre_Ptc_Injectes
FROM Tciarfcp A,
Bcptcp B
JOIN Bcadrp C ON (C.Coduex,
C.Numcha,
C.Numtra,
C.Nbatim,
C.Nescal) = (B.Coduex,
B.Numcha,
B.Numtra,
B.Nbatim,
B.Nescal)
WHERE (B.Numcha,
B.Numtra,
C.Nunchf) = (A.Numcha,
A.Numtra,
A.Nunchf)
AND B.Codinj = 'P'
AND (A.Numcha,
A.Numtra,
A.Nunchf) = (:P_Numero_Chantier,
:P_Numero_Tranche,
:P_Unite_Chauffe);
Le deuxième comptage est stocké dans la variable L_Nombre_Total_Ptc.
EXEC SQL
SELECT COUNT(*)
INTO :L_Nombre_Total_Ptc
FROM Tciarfcp A,
Bcptcp B
JOIN Bcadrp C ON (C.Coduex,
C.Numcha,
C.Numtra,
C.Nbatim,
C.Nescal) = (B.Coduex,
B.Numcha,
B.Numtra,
B.Nbatim,
B.Nescal)
WHERE (B.Numcha,
B.Numtra,
C.Nunchf) = (A.Numcha,
A.Numtra,
A.Nunchf)
AND (A.Numcha,
A.Numtra,
A.Nunchf) = (:P_Numero_Chantier,
:P_Numero_Tranche,
:P_Unite_Chauffe);
Ensuite la requête finale est simplifiée en utilisant les variables précédemment calculées.
EXEC SQL
UPDATE Tciarfcp A
SET (Ienreg,
Nbtrpo,
Nbtrto,
Nbtrpi,
Dincpo,
Oincpo,
Dintpo,
Ointpo,
Statut) = (' ',
:L_Nombre_Ptc_Injectes ,
:L_Nombre_Total_Ptc ,
0,
:L_Date_Jour,
:User,
0,
' ',
:L_Statut_Pret)
WHERE (A.Numcha,
A.Numtra,
A.Nunchf) = (:P_Numero_Chantier,
:P_Numero_Tranche,
:P_Unite_Chauffe);
Cordialement,