Help, j’ai un probl…
 
Notifications 
Reti­rer tout

Help, j’ai un pro­blème de CAST ?

Posts
Uti­li­sa­teurs
Likes
63  Vu
0
Début du sujet

Bon­jour, 

Je fais une requête d’UP­DATE 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;

Voi­ci l’UP­DATE, et j’ai une erreur SQLCODE = ‑420 et SQLSTATE = 22018, après recherche, il s’a­git des champs Nbtr­po, 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 vrai­ment pas ce qui cloche, car cette requête fonc­tionne très bien sur l’ou­tils de requête d’ACS.

Cor­dia­le­ment, 

Éti­quettes du sujet
1 Réponse 
0

Quand ça arrive, une solu­tion est de sor­tir les requêtes en ques­tion et d’a­li­men­ter une zone RPG qui ser­vi­ra 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 pre­mier comp­tage est sto­cké 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 comp­tage est sto­cké 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 sim­pli­fiée en uti­li­sant les variables pré­cé­dem­ment 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);       

Cor­dia­le­ment, 

Share :