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 :

Comment provoquer manuellement un READC ?


Sujet :

AS/400

  1. #1
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Août 2008
    Messages
    57
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2008
    Messages : 57
    Points : 36
    Points
    36
    Par défaut Comment provoquer manuellement un READC ?
    Bonjour,

    J'ai un traitement de sous-fichier classique via un READC.
    Ce READC ne lit que les lignes modifiées (pas de SFLNXTCHG global )

    L'utilisateur a également la possibilité de cliquer avec la souris sur une ligne du sous-fichier.

    Mon problème : comment faire pour que la ligne cliquée soit détectée par le READC ?


    J'ai essayé en insérant un SFLNXTCHG conditionné, puis en faisant un CHAIN sur le sous-fichier + activer le SFLNXTCHG + mise à jour. Mais ça ne marche pas, le READC qui suit ne voit toujours pas ma ligne.

    Une idée ?

    Merci

  2. #2
    Membre expérimenté

    Profil pro
    Inscrit en
    Novembre 2004
    Messages
    1 298
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2004
    Messages : 1 298
    Points : 1 578
    Points
    1 578
    Par défaut
    Colle ici les DDS de l'écran, stp.
    Il va falloir utiliser RTNCSRLOC() avec SFLCSRRRN().

  3. #3
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Août 2008
    Messages
    57
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2008
    Messages : 57
    Points : 36
    Points
    36
    Par défaut
    Je ne vois pas bien l'utilité du RTNCSRLOC dans mon cas.
    J'utilise déjà SFLCSRRRN qui me renvoi le N° de ligne du sous-fichier.

    Reste à savoir comment faire comprendre au READC que cette ligne a été modifiée...

  4. #4
    Membre éprouvé
    Homme Profil pro
    Responsable de service informatique
    Inscrit en
    Octobre 2006
    Messages
    689
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Jura (Franche Comté)

    Informations professionnelles :
    Activité : Responsable de service informatique
    Secteur : Distribution

    Informations forums :
    Inscription : Octobre 2006
    Messages : 689
    Points : 994
    Points
    994
    Par défaut
    Une ligne cliquée ne sera jamais indiquée comme telle au serveur, sauf dans un cas, si la ligne est associée au mot clé SFLSNGCHC. Mais dans ce cas, on oublie les zones d'entrée, le sous-fichier se comporte comme une Listbox en mode lecture seul.

  5. #5
    Membre expérimenté

    Profil pro
    Inscrit en
    Novembre 2004
    Messages
    1 298
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2004
    Messages : 1 298
    Points : 1 578
    Points
    1 578
    Par défaut
    Voila comment j'y suis arrivé avec RTNCSRLOC() et SFLCSRRRN().

    J'ai également utilisé MOUBTN() et le code AID pour savoir s'il y a eu utilisation de la souris.

    J'ai eu besoin de RTNCSRLOC() pour savoir sur quelle zone de quel format l'utilisateur a cliqué.

    Voici les DDS de mon SF de contrôle :

    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
         A          R CTL02                     SFLCTL(SFL02)
         A                                      ROLLUP(40)
         A                                      RTNCSRLOC(&RTNFMT &RTNZON)
         A                                      SFLCSRRRN(&RTNRG)
         A                                      MOUBTN(*ULD E01)
         A                                      OVERLAY
         A N50                                  SFLDSP
         A N51                                  SFLDSPCTL
         A  51                                  SFLCLR
         A  52                                  SFLEND(*MORE)
         A                                      SFLSIZ(0009)
         A                                      SFLPAG(0008)
         A            RTNFMT        10A  H
         A            RTNZON        10A  H
         A            RTNRG          4S 0H
    Et le code RPG IV associé :

    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
         FMonEcran  cf   e             workstn infds(infds)
                                             
    
          * Attention indicator byte (AID) = key pressed
         D infds           ds
         D  AID                  369    369
    
          * Command Keys      .
         D HELP            c                   x'31'
         D EXIT            c                   x'33'
         D PROMPT          c                   x'34'
         D REFRESH         c                   x'35'
         D CREATE          c                   x'36'
         D CANCEL          c                   x'3C'
    
         D E01             c                   x'71'
         D ENTER           c                   x'F1'
         
           /free
    
             .
             .
             .
             Exfmt Ctl02;
    
             // Contrôle si activation bouton gauche souris par double clic
             if AID = E01 and rtnrg > 0;
                chain rtnrg sfl02;
                w$opt = 2;   // MàJ n° option SF data
                SflNxtChg = *on;   // Force détection par READC avec SFLNXTCHG
                update sfl02;
              endif;
    
              readc sfl02;
               ...

  6. #6
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Août 2008
    Messages
    57
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2008
    Messages : 57
    Points : 36
    Points
    36
    Par défaut
    Désolé je n'arrive pas à reproduire ton exemple.
    La donnée SflNxtChg est inconnue.

  7. #7
    Membre expérimenté

    Profil pro
    Inscrit en
    Novembre 2004
    Messages
    1 298
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2004
    Messages : 1 298
    Points : 1 578
    Points
    1 578
    Par défaut
    Citation Envoyé par mutsum1
    La donnée SflNxtChg est inconnue.
    Evidemment ! Il faut définir un indicateur SFLNXTCHG au niveau du format écran concerné et lui associer le nom "SflNxtChg" dans le programme RPG.

    1/ Au niveau du format du SF de données (SF data), j'utilise par exemple l'indicateur 55 :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    A          R SFL02                     SFL       
    A  55                                  SFLNXTCHG
    2/ Au niveau du programme RPG, comme je pense à la maintenance, je définis un nom plus significatif que *in55 comme suit :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     D indicator       s               *   inz(%addr(*in)) 
     D                 ds                  based(indicator)
     D   rollup               40     40n                   
     D   sflnxtchg            55     55n 
    Si je ne veux pas le faire, j'utilise directo *in55 dans le programme bien entendu.

  8. #8
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Août 2008
    Messages
    57
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2008
    Messages : 57
    Points : 36
    Points
    36
    Par défaut
    ah ok, je pensais que ça venais de ma version (v5r4).

    Donc pour résumer, tu CHAIN sur la ligne du sous-fichier, tu actives l'indicateur du SFLNXTCHG et tu UPDATE.

    Mais c'est exactement ce que j'avais essayé dès le départ.
    Moi j'avais codé comme ça, mais ça revient au même :

    DDS
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    A          R ££SFL                     SFL                      
    A  14                                  SFLNXTCHG                
    A            ££OPT          1A  B  8  3VALUES(' ' '1' '5')      
    A          R ££CTL                     SFLCTL(££SFL)            
    A                                      CF14(14)                 
    A                                      MOUBTN(*URP CF14 *QUEUE) 
    A                                      SFLCSRRRN(&££RS)         
    A            ££RS           5S 0H
    RPG
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    C                   EXFMT     ££CTL                        
                                                               
    C                   IF        *IN14                        
    C     ££RS          CHAIN     ££SFL                        
    C                   EVAL      ££OPT = '5'                  
    C                   UPDATE    ££SFL                        
    C                   ENDIF                                  
                                                               
    C                   READC     ££SFL
    Mais ça ne marche pas. Le READC ne se déclenche pas.

    Ca marche vraiment chez toi ?

  9. #9
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Août 2008
    Messages
    57
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2008
    Messages : 57
    Points : 36
    Points
    36
    Par défaut
    J'ai creusé un peu et la souris n'y est pour rien.
    Si je simplifie de la façon suivante, ça ne marche pas non plus.

    DDS
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    A          R ££SFL                     SFL                      
    A  55                                  SFLNXTCHG                
    A            ££OPT          1A  B  8  3VALUES(' ' '1' '5')      
    A          R ££CTL                     SFLCTL(££SFL)

    RPG
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    C                   EXFMT     ££CTL                        
                                                               
    C     1             CHAIN     ££SFL                        
    C                   EVAL      ££OPT = '5'                  
    C                   SETON                                        55
    C                   UPDATE    ££SFL                        
                                                               
    C                   READC     ££SFL
    Le READC ne se déclenche pas.

    (EDIT)
    En fait apparemment, par cette méthode, le programme attend de repasser par le EXFMT.
    Le READC ne se déclenche pas la 1ère fois, mais une fois un aller/retour via le EXFMT, il se déclenche bien sur la ligne que l'on a mit à jour.

    C'est étonnant.
    Une mise à jour après un READC peut tout à fait être relue par un autre READC.
    Mais une mise à jour via un CHAIN est invisible tant qu'on est pas repassé par l'écran.

  10. #10
    Membre expérimenté
    Homme Profil pro
    Inscrit en
    Septembre 2008
    Messages
    940
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Septembre 2008
    Messages : 940
    Points : 1 409
    Points
    1 409
    Par défaut Comment provoquer manuellement un READC ?
    Je crois que c'est normal.

    Vous faites un update du sous-fichier mais vous ne réaffichez pas le sous-fichier de controle.

    Du coup, le readc suivant lit " l'ancien " sous-fichier (celui qui est à l'écran)

    Moi, je traiterais le sous-fichier par readc puis je regarderais si un clic a été fait et je le traiterais avec un chain sur le sous-fichier.

  11. #11
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Août 2008
    Messages
    57
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2008
    Messages : 57
    Points : 36
    Points
    36
    Par défaut
    Non, la mise à jour par le CHAIN est bien réalisée sur le sous-fichier actuel, et le READC se base sur ce même sous-fichier.
    C'est juste l'indicateur de modification qui n'est pas actif, comme si cet indicateur n'était mis à jour que par un EXFMT ou un READC.

    Pour passer outre pour l'instant, j'ai déclarer un SFLNXTCHG sans condition, de ce fait le READC lit toutes les lignes, et retrouve donc bien celle que j'ai modifiée manuellement auparavant.
    Ca marche comme ça, mais j'aurais bien aimé trouver une méthode plus propre.

  12. #12
    Membre expérimenté

    Profil pro
    Inscrit en
    Novembre 2004
    Messages
    1 298
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2004
    Messages : 1 298
    Points : 1 578
    Points
    1 578
    Par défaut
    Citation Envoyé par mutsum1
    Donc pour résumer, tu CHAIN sur la ligne du sous-fichier, tu actives l'indicateur du SFLNXTCHG et tu UPDATE.
    Oui, mais ça ne suffit pas. Tu ne fais pas ce que je t'ai montré dans mon post (#5 ci-dessus). J'utilise également le code AID, ce que tu ne fais pas dans les exemples que tu montres ici. Il faut l'utiliser comme je te l'ai montré, c'est primordial si tu veux que ça marche.

  13. #13
    Membre expérimenté
    Homme Profil pro
    Inscrit en
    Septembre 2008
    Messages
    940
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Septembre 2008
    Messages : 940
    Points : 1 409
    Points
    1 409
    Par défaut
    Non. Le chargement (par write ou update) dans le sous-fichier ne fait que le préparer pour le prochain affichage.
    Le readc lit les enregistrements marqués comme modifiés lors de l'affichage du format de contrôle (plus précisément, lors de la lecture du format)

    Du coup :

    Indique que l'enregistrement sera marqué modifié lors de la lecture
    - chain 1 monsfl
    - eval option=' '
    - eval sflnextchange=*on
    - update monsfl

    Affichage/Lecture du sous-fichier
    - exfmt monctl

    Lecture des enregs modifiés
    - readc monsfl

    Si on oublie l'exfmt, le readc lira simplement les enregs marqués comme lus lors du dernier affichage, et donc l'enregistrement "updaté" avec sflnxtchg ne sera pas lu par readc (sauf bien sûr s'il était déjà marqué modifié lors du dernier affichage)

  14. #14
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Août 2008
    Messages
    57
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2008
    Messages : 57
    Points : 36
    Points
    36
    Par défaut
    Si, j'ai bien essayé via le code AID, comme tu me l'avais indiqué.
    Mais ça ne marche pas mieux, le fonctionnement est identique à ma version.

    DDS
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    A          R ££SFL                     SFL                      
    A  55                                  SFLNXTCHG                
    A            ££OPT          1A  B  8  3VALUES(' ' '1' '5')      
    A          R ££CTL                     SFLCTL(££SFL)            
    A                                      MOUBTN(*URP E01) 
    A                                      SFLCSRRRN(&££RS)         
    A            ££RS           5S 0H
    RPG
    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
    FTST£      CF   E             WORKSTN SFILE(££SFL:££RN) INFDS(INFDS)    
    D INFDS           DS                                                    
    D  AID                  369    369                                      
    D E01             C                   x'71'                             
    ...
    C                   EXFMT     ££CTL                        
                                                               
    C                   IF        AID = E01      
    C     ££RS          CHAIN     ££SFL                        
    C                   EVAL      ££OPT = '5'                  
    C                   SETON                                        55
    C                   UPDATE    ££SFL                        
    C                   ENDIF                                  
                                                               
    C                   READC     ££SFL
    D'ailleurs, comme je l'ai indiqué plus haut, le problème ne vient pas de la souris, puisque même sans cette gestion, ça ne marche pas non plus.

  15. #15
    Membre expérimenté

    Profil pro
    Inscrit en
    Novembre 2004
    Messages
    1 298
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2004
    Messages : 1 298
    Points : 1 578
    Points
    1 578
    Par défaut
    Je ne sais pas ce que tu fais, mais chez moi, c'est sans souci avec ma programmation, je viens encore de réessayer.

    As-tu debogué ton programme pour voir si tu passes dans ta routine de détection du clic souris avec *in14 ou AID = E01 ?

    Est-ce que tu as bien 5 dans ££OPT juste après le CHAIN ££SFL ?

    Sur quel bouton de la souris cliques-tu ? Double ou simple clic ?

    Reproduis ma programmation à l'identique dans ton programme et tu verras que ça marche.

  16. #16
    Membre expérimenté

    Profil pro
    Inscrit en
    Novembre 2004
    Messages
    1 298
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2004
    Messages : 1 298
    Points : 1 578
    Points
    1 578
    Par défaut
    Je crois voir ton souci.

    Il faut refaire un EXFMT entre l'update du SF et le READC. Tu dois voir apparaître sur l'écran l'option 5 générée par le clic souris.

    Est-ce que c'est çà ?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    C                   EXFMT     ££CTL                        
                                                               
    C                   IF        AID = E01      
    C     ££RS          CHAIN     ££SFL     
    C                   EVAL      ££OPT = '5'                  
    C                   SETON                                        55
    C                   UPDATE    ££SFL                        
    C                   ENDIF                                  
    
    C                   EXFMT     ££CTL
                                                               
    C                   READC     ££SFL

  17. #17
    Membre expérimenté
    Homme Profil pro
    Inscrit en
    Septembre 2008
    Messages
    940
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Septembre 2008
    Messages : 940
    Points : 1 409
    Points
    1 409
    Par défaut
    J'ai refait des essais, et j'ai une bonne nouvelle.

    Comme je le disais dans mon post précédent, le update du sfl ne sert qu'à préparer le sous-fichier. c'est l'affichage du format de contrôle qui met à jour.

    Oui mais voila : exfmt = write + read. Est-ce le write ou le read qui met à jour ?

    J'ai fait un petit programme pour tester. Et bien, c'est le write !

    Du coup, on peut mettre à jour le sous-fichier, faire un write puis continuer tranquillement dans la boucle de lecture des readc.

    Un exfmt aurait été gênant, puisqu'il forçait un nouvel affichage.
    Un write n'est pas gênant, l'utilisateur ne voit aucune différence.

  18. #18
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Août 2008
    Messages
    57
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2008
    Messages : 57
    Points : 36
    Points
    36
    Par défaut
    Oui !!! Effectivement le WRITE intermédiaire résoud le problème.
    Merci pour cette grande idée, ça marche nickel.

    Un grand merci à vous.

  19. #19
    Membre expérimenté

    Profil pro
    Inscrit en
    Novembre 2004
    Messages
    1 298
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2004
    Messages : 1 298
    Points : 1 578
    Points
    1 578
    Par défaut
    Citation Envoyé par Formulary
    Un exfmt aurait été gênant, puisqu'il forçait un nouvel affichage.
    Pourquoi gênant ? Au contraire, je trouve que c'est plus confortable et rassurant de voir ce que le clic souris a apporté avant de valider, n'est-ce pas ?

    Et puis, j'ai soufflé la résolution du souci de mutsum1 en indiquant qu'il fallait faire un EXFMT entre l'update du SF et le READC.

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

Discussions similaires

  1. Comment provoquer l'arrêt de ma macro?
    Par jeanmarccassis dans le forum Macros et VBA Excel
    Réponses: 2
    Dernier message: 19/12/2008, 18h49
  2. Comment provoquer le pack() d'une Jframe depuis un JPanel sans ref sur la JFrame
    Par cdtkoenig dans le forum Agents de placement/Fenêtres
    Réponses: 4
    Dernier message: 21/07/2008, 19h11
  3. [CF][VB.NET/PPC] Comment provoquer un Beep ?
    Par borgfabr dans le forum Windows Mobile
    Réponses: 2
    Dernier message: 29/04/2005, 15h56
  4. Comment démarrer manuellement un service NT ?
    Par Desraux dans le forum API, COM et SDKs
    Réponses: 4
    Dernier message: 21/03/2005, 09h35
  5. [Client DataSet] Comment Insérer manuellement des lignes ?
    Par WebPac dans le forum Bases de données
    Réponses: 7
    Dernier message: 05/11/2004, 11h40

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