Précédent   Forum des professionnels en informatique > Systèmes > Autres systèmes > AS/400
AS/400 Le Forum d'entraide sur IBM AS/400 - iSeries. RPG.
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 02/03/2011, 15h55   #1
Invité régulier
 
Inscription : août 2008
Messages : 32
Détails du profil
Informations forums :
Inscription : août 2008
Messages : 32
Points : 5
Points : 5
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
mutsum1 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 02/03/2011, 16h46   #2
Membre Expert
 
Inscription : novembre 2004
Messages : 1 298
Détails du profil
Informations forums :
Inscription : novembre 2004
Messages : 1 298
Points : 1 355
Points : 1 355
Colle ici les DDS de l'écran, stp.
Il va falloir utiliser RTNCSRLOC() avec SFLCSRRRN().
Mercure est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 03/03/2011, 09h31   #3
Invité régulier
 
Inscription : août 2008
Messages : 32
Détails du profil
Informations forums :
Inscription : août 2008
Messages : 32
Points : 5
Points : 5
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...
mutsum1 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 03/03/2011, 11h19   #4
Membre régulier
 
Inscription : octobre 2006
Messages : 111
Détails du profil
Informations forums :
Inscription : octobre 2006
Messages : 111
Points : 92
Points : 92
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.
m4k-Hurrican est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 03/03/2011, 14h49   #5
Membre Expert
 
Inscription : novembre 2004
Messages : 1 298
Détails du profil
Informations forums :
Inscription : novembre 2004
Messages : 1 298
Points : 1 355
Points : 1 355
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 :
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 :
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;
           ...
Mercure est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 03/03/2011, 18h06   #6
Invité régulier
 
Inscription : août 2008
Messages : 32
Détails du profil
Informations forums :
Inscription : août 2008
Messages : 32
Points : 5
Points : 5
Désolé je n'arrive pas à reproduire ton exemple.
La donnée SflNxtChg est inconnue.
mutsum1 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 03/03/2011, 18h31   #7
Membre Expert
 
Inscription : novembre 2004
Messages : 1 298
Détails du profil
Informations forums :
Inscription : novembre 2004
Messages : 1 298
Points : 1 355
Points : 1 355
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 :
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 :
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.
Mercure est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 04/03/2011, 09h38   #8
Invité régulier
 
Inscription : août 2008
Messages : 32
Détails du profil
Informations forums :
Inscription : août 2008
Messages : 32
Points : 5
Points : 5
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 :
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 :
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 ?
mutsum1 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 04/03/2011, 10h46   #9
Invité régulier
 
Inscription : août 2008
Messages : 32
Détails du profil
Informations forums :
Inscription : août 2008
Messages : 32
Points : 5
Points : 5
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 :
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 :
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.
mutsum1 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 04/03/2011, 11h38   #10
Membre éclairé
 
Homme
Inscription : septembre 2008
Messages : 251
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : France

Informations forums :
Inscription : septembre 2008
Messages : 251
Points : 309
Points : 309
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.
FORMULARY est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 04/03/2011, 12h55   #11
Invité régulier
 
Inscription : août 2008
Messages : 32
Détails du profil
Informations forums :
Inscription : août 2008
Messages : 32
Points : 5
Points : 5
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.
mutsum1 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 04/03/2011, 14h44   #12
Membre Expert
 
Inscription : novembre 2004
Messages : 1 298
Détails du profil
Informations forums :
Inscription : novembre 2004
Messages : 1 298
Points : 1 355
Points : 1 355
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.
Mercure est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 04/03/2011, 14h57   #13
Membre éclairé
 
Homme
Inscription : septembre 2008
Messages : 251
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : France

Informations forums :
Inscription : septembre 2008
Messages : 251
Points : 309
Points : 309
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)
FORMULARY est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 04/03/2011, 15h00   #14
Invité régulier
 
Inscription : août 2008
Messages : 32
Détails du profil
Informations forums :
Inscription : août 2008
Messages : 32
Points : 5
Points : 5
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 :
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 :
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.
mutsum1 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 04/03/2011, 15h19   #15
Membre Expert
 
Inscription : novembre 2004
Messages : 1 298
Détails du profil
Informations forums :
Inscription : novembre 2004
Messages : 1 298
Points : 1 355
Points : 1 355
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.
Mercure est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 04/03/2011, 15h37   #16
Membre Expert
 
Inscription : novembre 2004
Messages : 1 298
Détails du profil
Informations forums :
Inscription : novembre 2004
Messages : 1 298
Points : 1 355
Points : 1 355
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 :
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
Mercure est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 04/03/2011, 16h05   #17
Membre éclairé
 
Homme
Inscription : septembre 2008
Messages : 251
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : France

Informations forums :
Inscription : septembre 2008
Messages : 251
Points : 309
Points : 309
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.
FORMULARY est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 04/03/2011, 16h06   #18
Invité régulier
 
Inscription : août 2008
Messages : 32
Détails du profil
Informations forums :
Inscription : août 2008
Messages : 32
Points : 5
Points : 5
Oui !!! Effectivement le WRITE intermédiaire résoud le problème.
Merci pour cette grande idée, ça marche nickel.

Un grand merci à vous.
mutsum1 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 04/03/2011, 16h20   #19
Membre Expert
 
Inscription : novembre 2004
Messages : 1 298
Détails du profil
Informations forums :
Inscription : novembre 2004
Messages : 1 298
Points : 1 355
Points : 1 355
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.
Mercure est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité Cette discussion est résolue.
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 15h09.


 
 
 
 
Partenaires

Hébergement Web