Gérer la pagination arrière dans un sous-fichier sous Adélia.

On peut néanmoins pallier ce manque en ajoutant un peu de code dans le pavé TRANSACTION.

Le principe est relativement simple et se décompose en plusieurs phases :

1 – dès que la pagination arrière est demandée, il faut récupérer la clé de la première ligne du sous-fichier de façon à  pouvoir se repositionner à  partir de cette clé

2 – à  partir de la clé de la première ligne du sous-fichier (récupérée au point n° 1), il faut lire en arrière le fichier d’autant d’enregistrements qu’il y a de lignes dans le sous-fichier, afin de récupérer la clé du première enregistrement à  afficher lors du réaffichage du sous-fichier

3 – recharger le sous-fichier à  partir de la nouvelle clé (récupérée au point n° 2).

Attention : à  l’intérieur du pavé TRANSACTION, un problème se pose quant au moment où l’on détecte la demande de pagination arrière, et le moment où on déclenche le réaffichage de la transaction avec rechargement du sous-fichier. La détection au moyen de l’indicateur *PAGAR doit se faire avant l’ordre VERIFIER (j’ai remarqué que dans le cas contraire on peut perdre la valeur de cet indicateur). Si le sous-fichier est en affichage, on peut recharger le sous-fichier immédiatement après la détection du *PAGAR. Par contre, s’il s’agit d’un sous-fichier en mise à  jour (avec des zones modifiables), il est impératif d’exécuter le réaffichage du sous-fichier après les ordres VERIFIER et VALIDER, sinon on risque de perdre d’éventuelles modifications effectuées par l’utilisateur s’il demande une pagination arrière avant d’avoir appuyé sur la touche ENTREE pour valider sa saisie.

Pour être en mesure de récupérer la clé de la première ligne du sous-fichier, il nous faut déclarer une vue LIGNE_SF1 (cas du sous-fichier n° 1) et une variable WRAN01 de type *NODEF comme suit :

Déclaration de la vue LIGNE_SF1 :


!—————!———-!———-!—————————!—————–!
!Mot directeur ! Code !Fic./Zones! Utilisation ! Critère d’accès !
!—————!———-!———-!—————————!—————–!
!LIGNE_SF1 !KKCLC2 !*1 ! Mise à  jour avec création ! Par clé !
!WRAN01 ! ! ! ! !
!—————!———-!———-!—————————!—————–!

Déclaration de la variable WRAN01 :


!-----------!---------------!----!-----!----!---------!----------!
! CODE !MOT DIRECTEUR !TYPE! LG !DEC.!NB.POSTES! REF. !
!-----------!---------------!----!-----!----!---------!----------!
! WRAN01 !WRAN01 ! N ! 4! 0 ! !*NODEF !
!-----------!---------------!----!-----!----!---------!----------!

Exemple de pagination arrière dans le cas où le sous-fichier est en affichage seulement :


....
*-- A l'intérieur du pavé TRANSACTION et avant le VERIFIER
SI *PAGAR
WRAN01 = *RANPA1
LIRE LIGNE_SF1
*-- SV_CLE est la clé de la vue VUE_SFL et ZW_CLE est la zone équivalente du sous-fichier
SV_CLE = ZW_CLE
TRAITER_PROC PAGSFL
INITIALISER 01
SI W_NBR_ENREG = 1
*-- Message d'erreur si début de sous-fichier atteint
ENVOYER_MSG MSG0032
SINON
ENVOYER_MSG *EFF_TOUT
FIN
TRAITER 01
FIN
....

Code de la procédure PAGSFL :


DEBUT_PROCEDURE PAGSFL
*-- Compteur du nombre de lignes à  "remonter"
W_NBR_ENREG = 1
*
*-- VUE_SFL : vue sur le fichier utilisé par le sous-fichier, indexée sur SV_CLE
* il faut utiliser un LIRE_PRECEDENT ou un LIRE_ARRIERE selon les besoins
*
POSITIONNER_AV VUE_SFL
LIRE_ARRIERE VUE_SFL
TANT_QUE VUE_SFL EXISTE ET W_NBR_ENREG <= *NBLS1 SV_CLE = MD_CLE W_NBR_ENREG = W_NBR_ENREG + 1 LIRE_ARRIERE VUE_SFL REFAIRE FIN_PROCEDURE

Exemple de pagination arrière dans le cas où le sous-fichier est en mise à  jour seulement (la procédure PAGSFL reste inchangée) :


W_TOP_PAGAR = 'N'
SI *PAGAR
W_TOP_PAGAR = 'O'
FIN

VERIFIER 01
VALIDER 01

*-- Exécution de la pagination arrière après le VALIDER (évite de perdre les saisies en cours)
SI W_TOP_PAGAR = 'O'
WRAN01 = *RANPA1
LIRE LIGNE_SF1
*-- SV_CLE est la clé de la vue VUE_SFL et ZW_CLE est la zone équivalente du sous-fichier
SV_CLE = ZW_CLE
TRAITER_PROC PAGSFL
INITIALISER 01
SI W_NBR_ENREG = 1
*-- Message d'erreur si début de sous-fichier atteint
ENVOYER_MSG MSG0032
SINON
ENVOYER_MSG *EFF_TOUT
FIN
TRAITER 01
FIN

Print Friendly, PDF & Email