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 31/12/2009, 11h55   #1
Invité régulier
 
Inscription : février 2007
Messages : 33
Détails du profil
Informations forums :
Inscription : février 2007
Messages : 33
Points : 7
Points : 7
Par défaut Sous-fichiers : limite de défilement atteinte

Bonjour,

Voilà mon problème : j'affiche un sous-fichier en RPG ILE (SQL), qui fonctionne bien excepté que quand on atteint les limites de défilement (début et fin du sous fichier), le terminal (dans mon cas l'émulation écran de Client Access) se bloque et je dois appuyer sur la touche CTRL du clavier pour débloquer le terminal.
Ce n'est pas le comportement que j'observe habituellement dans les écrans OS/400.

Quelqu'un sait-il s'il faut mettre un indicateur particulier pour gérer les touches ROLLUP et ROLLDOWN ?

Merci par avance
Vincent


ps : je n'ai pas le code source ici mais je le posterais si besoin quand j'aurais accès à l'AS/400.
SyrioDev est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 31/12/2009, 14h01   #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
Par défaut ERRSFL

Ajoute le mot clé ERRSFL au niveau fichier dans les DDS.

Si ça ne solutionne pas le pb, colle ici les DDS pour analyse.
Mercure est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 03/01/2010, 21h46   #3
Invité régulier
 
Inscription : février 2007
Messages : 33
Détails du profil
Informations forums :
Inscription : février 2007
Messages : 33
Points : 7
Points : 7
Bonjour,

Merci pour ta réponse. Cela solutionne en partie le problème : en effet, quand j'arrive sur mon sous-fichier, je ne suis plus bloqué directement comme avant. En revanche, j'ai toujours un blocage quand je dépassé les limites du sous-fichier.

Voici mon DDS (DSPF) :


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
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
     A*%%TS  SD  20091223  222745  VINCENT     REL-V4R4M0  5769-PW1
     A*%%EC
     A                                      DSPSIZ(24 80 *DS3)
     A                                      ERRSFL
     A          R ADDPRD
     A*%%TS  SD  20091219  191817  VINCENT     REL-V4R4M0  5769-PW1
     A                                  1 32'Ajouter un produit'
     A                                      DSPATR(HI)
     A                                  3  2'Veuillez saisir les données nécess-
     A                                      aires :'
     A                                      COLOR(BLU)
     A                                  6  4'Code barre . . :'
     A                                  7  4'Libellé  . . . :'
     A                                  8  4'Prix . . . . . :'
     A            CDEBAR    R        I  6 21REFFLD(PRD/CDEBAR *LIBL/PRD)
     A            LBL       R        I  7 21REFFLD(PRD/LBL *LIBL/PRD)
     A            PRX       R        I  8 21REFFLD(PRD/PRX *LIBL/PRD)
     A                                 22 21'ENTREE pour Valider'
     A                                      DSPATR(HI)
     A                                      COLOR(BLU)
     A          R WRKPRDSFL                 SFL
     A*%%TS  SD  20091223  222745  VINCENT     REL-V4R4M0  5769-PW1
     A            $CDEBAR   R        O  7  8REFFLD(PRD/CDEBAR *LIBL/PRD)
     A            $LBL      R   35   O  7 29REFFLD(PRD/LBL *LIBL/PRD)
     A            $PRX      R        O  7 65REFFLD(PRD/PRX *LIBL/PRD)
     A                                      EDTCDE(Z)
     A            $OPT           1S 0I  7  5
     A          R WRKPRDCTL                 SFLCTL(WRKPRDSFL)
     A*%%TS  SD  20091223  222745  VINCENT     REL-V4R4M0  5769-PW1
     A                                      SFLSIZ(9999)
     A                                      SFLPAG(0010)
     A                                      CA03
     A                                      CA06
     A                                      CA09
     A                                      OVERLAY
     A                                      SFLDSP
     A                                      SFLDSPCTL
     A  50                                  SFLCLR
     A  60                                  SFLEND(*MORE)
     A                                      SFLCSRRRN(&CSRRRN)
     A            CSRRRN         5S 0H
     A                                  1 32'Liste des produits'
     A                                      DSPATR(HI)
     A                                  6  8'Code barre produit'
     A                                      COLOR(BLU)
     A                                  6 29'Libellé du produit'
     A                                      COLOR(BLU)
     A                                  6 66'Prix'
     A                                      COLOR(BLU)
     A                                  6  4'Opt'
     A                                      COLOR(BLU)
     A          R WRKPRDFTR
     A*%%TS  SD  20091220  011933  VINCENT     REL-V4R4M0  5769-PW1
     A                                 19  6'F3=Quitter'
     A                                      COLOR(BLU)
     A                                 19 22'F6=Créer...'
     A                                      COLOR(BLU)
     A                                 19 40'F9=Trier'
     A                                      COLOR(BLU)
     A                                 21  6' ==> '
     A            FLD001        34A  I 21 13DSPATR(PC)

Et mon code ILE RPG (avec SQL dynamique dedans) :


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
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
     FECRANS    CF   E             WORKSTN SFILE(WRKPRDSFL:WRrn1)
     DWRrn1            S              4  0 Inz
     DQUERY            S            100A   VARYING
     DQUERY1           S             90A   VARYING Inz('SELECT CDEBAR, -
     D                                     LEFT(LBL, 35) as LBL, PRX -
     D                                     FROM PRD ORDER BY ' )
     DORDER            S             10A   VARYING Inz('CDEBAR')
     C                   DoW       *InKC = *Off
     C                   Eval      *In(50) = *On
     C                   Eval      CSRRRN = 99
     C                   Write     WRKPRDCTL
     C                   Eval      *In(50) = *Off
     C                   Eval      *In(60) = *On
     C                   Eval      WRrn1 = *Zeros
     C                   Eval      QUERY = %trim(QUERY1)+ ' '+ %trim(ORDER)
     C/EXEC SQL PREPARE S1 FROM :QUERY
     C/END-EXEC
     C/EXEC SQL DECLARE MAINCURSOR CURSOR FOR S1
     C/END-EXEC
     C/EXEC SQL OPEN MAINCURSOR
     C/END-EXEC
     C                   DoW       SQLSTT = '00000' AND WRrn1 < 9999
     C/EXEC SQL FETCH NEXT FROM MAINCURSOR INTO :$CDEBAR, :$LBL, :$PRX
     C/END-EXEC
     C                   If        SQLSTT = '00000'
     C                   Eval      WRrn1 = WRrn1 + 1
     C                   Eval      CSRRRN = WRrn1
     C                   Write     WRKPRDSFL
     C                   EndIf
     C                   EndDo
     C/EXEC SQL CLOSE MAINCURSOR
     C/END-EXEC
     C                   If        WRrn1 < 1
     C                   Eval      WRrn1 = 1
     C                   Eval      $CDEBAR = 'Aucun produit.'
     C                   Write     WRKPRDSFL
     C                   EndIf
     C                   If        CSRRRN = 0
     C                   Eval      CSRRRN = 1
     C                   EndIf
     C                   Write     WRKPRDFTR
     C                   ExFmt     WRKPRDCTL
     C                   Select
     C                   When      *InKF = *On
     C                   Call      'ADDPRD'
     C                   When      *InKI = *On AND %trim(ORDER) = 'CDEBAR'
     C                   Eval      ORDER = 'LBL'
     C                   When      *InKI = *On AND %trim(ORDER) = 'LBL'
     C                   Eval      ORDER = 'PRX'
     C                   When      *InKI = *On AND %trim(ORDER) = 'PRX'
     C                   Eval      ORDER = 'CDEBAR'
     C                   EndSl
     C                   Eval      *In89 = *On
     C                   EndDo
     C                   Eval      *InLR = *On


Merci par avance pour votre aide. Je précise que je suis débutant dans le domaine, aussi toute suggestion d'améliorations/optimisations du code est la bienvenue.

Cordialement,

Vincent Billard
SyrioDev est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 04/01/2010, 14h32   #4
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
Tu devrais déclarer la touche 'ROLLUP' non conditionnée dans ton DSPF et la gérer dans ton programme pour éviter de reseter le clavier avec la touche 'Control' si limite défilement atteinte.
Egalement, définis un vrai sous-fichier auto-extensible avec SFLSIZ = SFLPAG + 1 (par ex. SFLSIZ(11) et SFLPAG(10)). Dans ton programme, tu ne charges alors jamais qu'une seule page à la fois et ce n'est que lorsque l'utilisateur pagine en avant (ROLLUP ou PAGEDOWN) que le programmeur charge la page suivante. La gestion de la pagination arrière est alors automatiquement assurée par le système et c'est beaucoup plus confortable et pour le user et le pour programmeur.

Au sujet des indicateurs, tu devrais t'inspirer de cet extrait de programme ci-dessous pour les coder au lieu d'employer l'antique méthode avec *INKx. D'autres préféreront une autre méthode basée sur les indicateurs avec *IN, mais celle que j'expose ici est AMHA suffisante pour qqn qui débute.

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
36
37
38
39
40
41
42
43
44
45
46
47
48
FMyScreen    cf   e             workstn     
F                                     sfile(sfl02:s2rrn)
F                                     infds(INFDS)      
                                                                         
 * Named hexadecimal constants for function keys                         
D  F1             C                   X'31'                              
D  F2             C                   X'32'                              
D  F3             C                   X'33'                              
D  F4             C                   X'34'                              
D  F5             C                   X'35'                              
D  F6             C                   X'36'                                   
D  F7             C                   X'37'                                   
D  F8             C                   X'38'                                   
D  F9             C                   X'39'                                   
D  F10            C                   X'3A'                                   
D  F11            C                   X'3B'                                   
D  F12            C                   X'3C'                                   
D  F13            C                   X'B1'                                   
D  F14            C                   X'B2'                                   
D  F15            C                   X'B3'                                   
D  F16            C                   X'B4'                                   
D  F17            C                   X'B5'                                   
D  F18            C                   X'B6'                                   
D  F19            C                   X'B7'                                   
D  F20            C                   X'B8'                                   
D  F21            C                   X'B9'                                   
D  F22            C                   X'BA'                                   
D  F23            C                   X'BB'                                   
D  F24            C                   X'BC'                                   
D  Enter          C                   X'F1'                                   
D  PageUp         C                   X'F4'                                   
D  PageDown       C                   X'F5'                                   
                                                                              
 * Screen File information data structure. 
D INFDS           DS                
D  Key                  369    369


 /Free
     Select;
       When Key = F3;
         ExSr Exit;
       When Key = F4;
         ExSr Prompt;
       When Key = F5;
         ExSr Refresh;
     EndSl;
 /End-Free
Mercure est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 04/01/2010, 19h09   #5
Invité régulier
 
Inscription : février 2007
Messages : 33
Détails du profil
Informations forums :
Inscription : février 2007
Messages : 33
Points : 7
Points : 7
Merci pour tes conseils. J'essaye ce soir et je te tiens au courant.

Cordialement,

Vincent
SyrioDev est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 06/01/2010, 14h10   #6
Invité régulier
 
Inscription : février 2007
Messages : 33
Détails du profil
Informations forums :
Inscription : février 2007
Messages : 33
Points : 7
Points : 7
Bonjour,

J'ai fait comme tu me l'a indiqué : ça fonctionne très bien.

Seul hic : les perfomances.
En effet, vu qu'on rejoue la requête à chaque fois et que dans celle ci il y a un "order by", j'ai l'impression que l'AS/400 reparcoure tous les enregistrements en base (environs 5000 lignes dans la table) et comme j'ai un serveur plutôt ancien (9406 250 avec CPU 2295 et 256 MB de ram) ce n'est pas très rapide.

Ma question est donc : y a t'il des moyens d'optimiser ce fonctionnement?

Merci

Vincent
SyrioDev est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 06/01/2010, 14h47   #7
Membre Expert
 
Patrick
Inscription : mai 2008
Messages : 816
Détails du profil
Informations personnelles :
Nom : Patrick
Âge : 41
Localisation : France, Hérault (Languedoc Roussillon)

Informations forums :
Inscription : mai 2008
Messages : 816
Points : 1 035
Points : 1 035
Quelle version de l'OS ?
K2R400 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 06/01/2010, 15h55   #8
Invité régulier
 
Inscription : février 2007
Messages : 33
Détails du profil
Informations forums :
Inscription : février 2007
Messages : 33
Points : 7
Points : 7
OS/400 V4R5

Cordialement,
Vincent
SyrioDev est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 07/01/2010, 11h38   #9
Membre Expert
 
Patrick
Inscription : mai 2008
Messages : 816
Détails du profil
Informations personnelles :
Nom : Patrick
Âge : 41
Localisation : France, Hérault (Languedoc Roussillon)

Informations forums :
Inscription : mai 2008
Messages : 816
Points : 1 035
Points : 1 035
Le problème c'est que le nouveau moteur SQE est apparu à la version V5R2.
Tu utilises donc le moteur SQL CQE (utilisé aussi par l'OPNQRYF), ne t'attends donc pas à de bonnes performances tout au contraire c'est une vraie m....
Si tu n'avais beaucoup d'enregs à charger, il te faudrait les charger tous et utiliser l'Api QLGSORT pour un tri en mémoire (idem que le F16 dans le WRKACTJOB).
Avec beaucoup d'enregs à trier dans un SF sans SQE, pas vraiment de solutions si ce n'est d'expliquer à l'utilisateur qui peut aller se faire un café et de laisser faire cette m.... de CQE.
K2R400 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 08/01/2010, 18h28   #10
Invité régulier
 
Inscription : février 2007
Messages : 33
Détails du profil
Informations forums :
Inscription : février 2007
Messages : 33
Points : 7
Points : 7
Serais-ce plus performant sans utiliser SQL ? (passer par les I/O natives de RPG ?)

Merci pour ces explications.

Vincent
SyrioDev est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 08/01/2010, 18h37   #11
Membre Expert
 
Patrick
Inscription : mai 2008
Messages : 816
Détails du profil
Informations personnelles :
Nom : Patrick
Âge : 41
Localisation : France, Hérault (Languedoc Roussillon)

Informations forums :
Inscription : mai 2008
Messages : 816
Points : 1 035
Points : 1 035
yes pas photo !!!! si c'est CQE qui tient la barre.
K2R400 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 17/01/2010, 12h55   #12
Invité régulier
 
Inscription : février 2007
Messages : 33
Détails du profil
Informations forums :
Inscription : février 2007
Messages : 33
Points : 7
Points : 7
merci pour les réponses.
je considère ma question comme résolue, je la cloture donc.

cordialement,
Vincent
SyrioDev 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 +1. Il est actuellement 03h45.


 
 
 
 
Partenaires

Hébergement Web