Accueil du site > Les articles > Gérer la pagination arrière dans un sous-fichier sous Adélia.
Version à imprimer Enregistrer au format PDF

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

mardi 18 mai 2004, par Grégory Jarrige Visites  1819

Le langage ADELIA ne fournit pas de système simple pour gérer la pagination arrière. Sa gestion reste à la charge du développeur.


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