IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

AS/400 Discussion :

(CL) RCVF et EOF


Sujet :

AS/400

  1. #1
    Membre régulier
    Profil pro
    Inscrit en
    Février 2009
    Messages
    92
    Détails du profil
    Informations personnelles :
    Localisation : France, Morbihan (Bretagne)

    Informations forums :
    Inscription : Février 2009
    Messages : 92
    Points : 116
    Points
    116
    Par défaut (CL) RCVF et EOF
    Bonjour .

    j'ai un petit souci de programmation CL ..

    J'ai un programme batch qui tourne toute la journée et qui scrute si des membres ont été ajoutés dans un fichier (SENDEDI).

    Voici en gros 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
     /* Fichier vides -->  END OF TREATMENT        */               
               RTVMBRD    FILE(AREDI/SENDEDI) NBRCURRCD(&RECORD)    
               MONMSG     MSGID(CPF3019) EXEC(GOTO CMDLBL(ENDTRT))  
                                                                    
     /*Récupération de la liste des membres pour les traiter séparement */                    
               DSPFD      FILE(AREDI/SENDEDI) TYPE(*MBR) +          
                            OUTPUT(*OUTFILE) FILEATR(*PF) +         
                            OUTFILE(APFBRAIN/SENDMBR)               
                                                                    
     LECT:  RCVF                                                 
               MONMSG     MSGID(CPF0864) EXEC(GOTO CMDLBL(END))     
                                                                   
     OVRDBF TO MEMBER                         */                    
               OVRDBF     FILE(SENDEDI) TOFILE(AREDI/SENDEDI) +     
                              MBR(&MBNAME)                                 
                                                                           
    /* Mes differents traitements sur chacun des membres */                         
                 ------------------------                                  
                                                                           
    /* REMOVE MEMBER FROM SENDEDI FILE  */                                
                 RMVM       FILE(AREDI/SENDEDI) MBR(&MBNAME)              
                              GOTO LECT                                   
     END:                                                                 
            autres traitement divers                                                              
                                                                   
      ENDTRT:      
                                                            
                  DLYJOB     DLY(3500)                      
                  GOTO RESTART                              
                  RCLRSC                                    
                  ENDPGM
    Mon souci : le programme fonctionne farpaitement la 1ère fois mais si de nouveaux membres sont ajoutés au fichier SENDEDI dans la journée , le EOF détecté la 1 ère fois de la commande RCVF sur le fichier SENDMBR est toujours actif , le message de fin de fichier CPF0864 aussi.. Et donc il va directement au label END

    J'ai bien essayé de fermer le fichier par un CLOF , mais ça ne change rien..?

  2. #2
    Membre habitué
    Inscrit en
    Novembre 2008
    Messages
    149
    Détails du profil
    Informations forums :
    Inscription : Novembre 2008
    Messages : 149
    Points : 149
    Points
    149
    Par défaut problème de cl
    Bonjour,

    je ne vois pas ou le problème se trouve, toutefois je te propose de clearer
    le ficheir apfbran/sendmbr avant le dly de facon a repartir avec un fichier propre.
    la logique serait comptage
    creation du fichier de sortie
    lecture du fichier de sortie
    traitement : comptage et comparaisons ds enregistrements conserver dans une dtaara par exemple
    test si different traitement (do)

    si identique aller au clear du fichier sauvagarder la dtaara et faire de dly

    dis nous si tu as d'autres soucis de mise au point

    a plus

  3. #3
    Expert confirmé
    Homme Profil pro
    ANCIEN Consultant/Formateur/Développeur AS/400, iSeries, System i et Cobol
    Inscrit en
    Juin 2007
    Messages
    2 096
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Tunisie

    Informations professionnelles :
    Activité : ANCIEN Consultant/Formateur/Développeur AS/400, iSeries, System i et Cobol
    Secteur : Conseil

    Informations forums :
    Inscription : Juin 2007
    Messages : 2 096
    Points : 4 155
    Points
    4 155
    Par défaut
    Bonjour.

    J'avais rencontré ce problème et je ne me rappelle pas l'avoir solutionné comme ça, mais je n'avais pas creusé davantage.
    J'ai réessayé ta solution en jouant sur divers paramètres y compris un OPNDBF et un OVRDBF avec positionnement, mais rien à faire et je n'ai pas non plus creusé davantage.
    Par contre j'ai utilisé 2 solutions :
    - l'une simple, au lieu d'utiliser un fichier, j'utilise une msgq. Plus simple à utiliser.
    - l'autre un peu plus compliquée, et dans les cas compliqués, un trigger sur le fichier en cas d'ajout.

  4. #4
    Membre régulier
    Profil pro
    Inscrit en
    Février 2009
    Messages
    92
    Détails du profil
    Informations personnelles :
    Localisation : France, Morbihan (Bretagne)

    Informations forums :
    Inscription : Février 2009
    Messages : 92
    Points : 116
    Points
    116
    Par défaut
    Merci à vous deux :

    Rcordonnier : le probleme se trouvant au niveau de la lecture (RCVF) qui n'est pas réinitialisée , je ne pense que ta solution changera grand chose.

    Hédhili : Merci , est ce que tu peux me détailler grossièrement ta solution avec une MSGQ , s'il te plait..

    Merci encore

  5. #5
    Membre habitué
    Profil pro
    Inscrit en
    Août 2008
    Messages
    123
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2008
    Messages : 123
    Points : 146
    Points
    146
    Par défaut
    Bjr,

    Je confirme, avant la V6R1 il n'est pas possible de relire un fichier en CLP, une fois l'EOF atteinte.
    Je vois 2 solutions simples :
    - mettre un CLP en amont pour rappeler celui qui fait la lecture,
    - remplacer le DSPFD en sortie fichier par l'utilisation de la commande RTVMBRD qui permet justement de récupérer des informations sur les membres d'un PF, avec des mecanismes pour balayer la liste des membres (positionnement par *FIRST et *LAST, passage au mbr suivant ou précédent par *NEXT et *PRV)
    et c'est plus performant que le fichier

  6. #6
    Membre régulier
    Profil pro
    Inscrit en
    Février 2009
    Messages
    92
    Détails du profil
    Informations personnelles :
    Localisation : France, Morbihan (Bretagne)

    Informations forums :
    Inscription : Février 2009
    Messages : 92
    Points : 116
    Points
    116
    Par défaut
    Merci beaucoup , je teste tout ça et je vous tiens au courant !


    Ça roule pour le CL en amont...Nickel , simple et rapide ...

  7. #7
    Expert confirmé
    Homme Profil pro
    ANCIEN Consultant/Formateur/Développeur AS/400, iSeries, System i et Cobol
    Inscrit en
    Juin 2007
    Messages
    2 096
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Tunisie

    Informations professionnelles :
    Activité : ANCIEN Consultant/Formateur/Développeur AS/400, iSeries, System i et Cobol
    Secteur : Conseil

    Informations forums :
    Inscription : Juin 2007
    Messages : 2 096
    Points : 4 155
    Points
    4 155
    Par défaut
    Citation Envoyé par Simka1000 Voir le message
    Merci à vous deux :

    ....
    Hédhili : Merci , est ce que tu peux me détailler grossièrement ta solution avec une MSGQ , s'il te plait..

    Merci encore
    En amont :
    - tu crées ta msgq
    - au lieu d'écrire dans le fichier que tu vas lire par le clp, tu écris dans la msgq par SNDMSG... TOMSG... file de message

    Après dans le cl, au lire par RCVF, tu fais RCVMSG tout en supprimant le message lu.
    Attention le premier RCVMSG doit récupérer la clé du message, puis on fait du next. Regarde le petit programme suivant :

    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
    0001.00  DEBUT:      PGM                                                        
    0002.00  VARIABLES:                                                             
    0003.00              DCL &R    *CHAR 1                                          
    0004.00              DCL &T    *CHAR 70                                         
    0005.00              DCL &K    *CHAR 4                                          
    0006.00  PREM:       RCVMSG  MSGQ(QUSRSYS/JAIDANE) MSGTYPE(*NEXT) RMV(*YES) +   
    0007.00                      MSGKEY(*TOP) KEYVAR(&K) MSG(&T)                    
    0008.00              IF (&T *EQ ' ') GOTO FIN1                                  
    0009.00              SNDUSRMSG  MSG(&T)                                         
    0010.00                                                                         
    0011.00  NEXT:       RCVMSG     MSGQ(QUSRSYS/JAIDANE) MSGTYPE(*NEXT) +          
    0012.00                         MSGKEY(&K) RMV(*YES) KEYVAR(&K) MSG(&T)         
    0013.00              IF (&T *EQ ' ') GOTO FIN1                                  
    0014.00              SNDUSRMSG  MSG(&T)                                         
    0015.00              GOTO NEXT                                                  
    0016.00  FIN1:      
    0017.00              SNDUSRMSG  MSG('FAUT T-IL CONTINUER ?') VALUES(O N) DFT(O) +             
    0018.00                           MSGRPY(&R)                                    
    0019.00              IF (&R *EQ 'N') GOTO FIN                                   
    0020.00              DLYJOB     DLY(5)                                          
    0021.00              GOTO PREM                                                  
    0022.00  FIN:        ENDPGM
    - Ici la msgq s'appelle JAIDANE dans QUSRSYS.
    - Dans FIN1, tu adaptes tes traitements. N'oublie pas de supprimer l'inq "FAUT-IL CONTINUER ?"
    - La fin de la msgq est détectée par exemple par un message vide.
    - En bouclant (au tout début), après un DLYJOb, si un message tombe, il est récupéré.
    - tu peux récrire les messages dans une autre msgq ou dans dans un fichier (historisation) puisqu'on les supprime au fur et à mesure qu'on les lit.

    Mais si la solution de jump400, qui me semble bonne, te va bien, alors ne te casse pas trop la tête, et prends ma solution pour mémoire. Elle n'est pas bien adaptée à ton cas.

  8. #8
    Membre régulier
    Profil pro
    Inscrit en
    Février 2009
    Messages
    92
    Détails du profil
    Informations personnelles :
    Localisation : France, Morbihan (Bretagne)

    Informations forums :
    Inscription : Février 2009
    Messages : 92
    Points : 116
    Points
    116
    Par défaut
    Merci pour ce complement..je garde la soluce dans ma boite a Outils.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. equivalent EOF
    Par $grm$ dans le forum PostgreSQL
    Réponses: 2
    Dernier message: 21/05/2004, 16h48
  2. Problème avec Do while rs.EOF
    Par lauraned dans le forum ASP
    Réponses: 12
    Dernier message: 21/05/2004, 12h00
  3. Fonction If avec rs.eof problème
    Par M1000 dans le forum ASP
    Réponses: 5
    Dernier message: 24/03/2004, 17h10
  4. modification de fichier EOF
    Par scorbo dans le forum C
    Réponses: 9
    Dernier message: 28/11/2003, 11h35
  5. RecordSet en EOF
    Par jfphan dans le forum ASP
    Réponses: 3
    Dernier message: 06/11/2003, 16h47

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo