[Résolu]Lors d'une mise à jour le programme boucle

RPG (3 et 4, free), CL, SQL, etc...
Répondre
BrigitteG
Messages : 109
Enregistré le : jeu. 20 sept. 2012, 08:56:38

[Résolu]Lors d'une mise à jour le programme boucle

Message par BrigitteG »

Bonjour,

Code : Tout sélectionner

FICHIERP
A          R FFichier                 
A            COPAIP         2A               
A            NUNATI        12A               
A            DAPAUL          L               
A                                            
A            DMAJ            Z         
A            COSU           1A         

FICHERL
A          R FFICHIER                 PFILE(FICHIERP)
A          K COPAIP 
A          K NUNATI 
A          K DAPAUL 
A          K DMAJ   
Dans ce programme, nous utilisons les 3ères clés du fichier logique pour lire et mettre à jour certaines zones, ainsi que la 4ème clé DMAJ.

Si nous faisons DMAJ = %timestamp, le programme boucle sur cet enregistrement.

Nous avons fait le test de mettre DMAJ = %timestamp(*sys:0) et le programme ne boucle plus, mais nous perdons l'info des 6 derniers chiffres.

Code : Tout sélectionner

       ctl-opt OPTION(*NODEBUGIO) ALWNULL(*USRCTL);

       dcl-f Fichier usage(*input:*update) keyed;

       dcl-ds KeyA likerec(FFichier:*key);


       dcl-pi *N;
        EàCopaip  char(2);
        EàNunati  char(12);
        EàDate    date;
        EàCodact  char(1);
       end-pi;

       KeyA.Copaip = EàCopaip;
       KeyA.Nunati = EàNunati;
       KeyA.Dapaul = EàDate;

       Setll %kds(KeyA:3) FICHIERL;
        dow not %EOF(FICHIERL);
         Reade %kds(KeyA:3) FICHIERL;
         if %EOF;
          leave;
         endif;

         select;
         When      EàCodact ='3';
          Dapaul = EàDate;
          cosu = '0';
         when      EàCodact ='0';
          Cosu = '1' ;
         Endsl;

         //Dmaj = %timestamp(*SYS);
         Dmaj = %timestamp(*SYS:0);

         Update    FFICHIER;
        enddo;

       *inlr = *on;
Voyez-vous une autre façon de faire qui nous permettrai de garder les 6 chiffres ?

Je vous remercie d'avance pour votre aide
Modifié en dernier par BrigitteG le lun. 20 déc. 2021, 15:13:51, modifié 1 fois.

monthi
Messages : 77
Enregistré le : mar. 11 sept. 2018, 15:37:02
Localisation : Paris

Re: Lors d'une mise à jour le programme boucle

Message par monthi »

Bonjour

Soit utiliser un logique qui n'a pas la zone Dmaj en clé,

Soit faire du SQL avec un cursor.

Cdlt

Hurri
Messages : 38
Enregistré le : lun. 02 nov. 2020, 16:04:59

Re: Lors d'une mise à jour le programme boucle

Message par Hurri »

Bonjour,

Le problème est simple, vous lisez avec une clé, puis vous mettez à jour cette clé.
Dans votre boucle de lecture, étant donner que DMAJ est en dernier dans la clé, et qu'il va être remplie avec une valeur supérieure ou égale à la valeur précédente, il va être positionné en fin pour cette même clé de lecture (les 3 premières valeurs), et votre ReadE va le retrouver comme dernier enregistrement en permanence...
Pour assurer les mises à jour, il manque un identifiant d'enregistrement dans votre fichier (une clé primaire). Mais comme je suppose que vous ne modifierez pas la BD, plusieurs possibilités s'offrent à vous.
Comme monthi l'indique, ne pas utiliser un logique avec DMAJ, mais uniquement les 3 premières valeurs. Toutefois, j'ai déjà eu des surprises avec ce genre de traitement, et l'enreg mis à jour n'était pas forcément celui qu'on attendait.
Utiliser un curseur SQL oui...
Ou pour régler le problème peut être plus simplement, faire la mise à jour en une requête SQL.

Code : Tout sélectionner

Exec SQL                                                            
   Update FICHIER                                                   
   Set    DMAJ = Current_Date,                                      
          DAPAUL = Case When :EàCodact = '3' Then :EàDate           
                   Else :DAPAUL                                     
                   End,                                             
          COSU   = Case When :EàCodact = '3' Then '0'               
                        When :EàCodact = '0' Then '1'               
                   Else :COSU                                       
                   End                                              
   Where  COPAIP = :COPAIP                                          
     and  NUNATI = :NUNATI                                          
     and  DAPAUL = :DAPAUL                                          
     and  DMAJ   = :DMAJ;                                           

BrigitteG
Messages : 109
Enregistré le : jeu. 20 sept. 2012, 08:56:38

Re: Lors d'une mise à jour le programme boucle

Message par BrigitteG »

Merci à vous deux.

Oui nous étions arrivés à la même conclusion avec le dmaj mais comme nous ne pouvons pas changer la clé nous allons utiliser la solution du sql.

Bonne journée

BrigitteG
Messages : 109
Enregistré le : jeu. 20 sept. 2012, 08:56:38

Re: Lors d'une mise à jour le programme boucle

Message par BrigitteG »

Avec les infos de Monthi & Hurri ( :D ) j'ai solutionné le problème en combinant
le slq cursor et sql update afin de pouvoir mettre à jour la zone DMAJ avec current_timestamp et non current_date.

A la place du sql update j'aurai pu faire un chain.

Répondre