Accueil du site > Les articles > Les Sous-Fichiers
Version à imprimer Enregistrer au format PDF

Les Sous-Fichiers

Les bases de la programmation des sous-fichiers en RPG

mardi 4 juillet 2006, par Serge Gomes Visites  12764

Sous-Fichier

Un sous fichier est composé :
- d’un format sous fichier (type SFL) qui permet de décrire une ligne.
- d’un format de contrôle (type SFLCTL) qui permet la déclaration :
— des touches de fonctions
— de la taille d’une page de sous-fichier (SFLPAGE)
— de la taille du sous-fichier (SFLSIZ)

SFLPAGE est égal au nombre de lignes que l’on veut voir apparaitre à chaque chargement.

SFLSIZE, la taille du sous-fichier est en général la valeur de SFLPAGE + 1 (pour gérer ROLLUP & SFLEND)

- Autres mots clés à déclarer :

on associe, dans les DDS, des mots clés à des indicateurs

— SFLDSP => Affichage du sous fichier
— SFLDSPCTL => Affichage du format de controle
— SFLCLR => Effacement sous-fichier

- Autres mots clés à déclarer si le chargement est dynamique
— SFLRCDNBR => Rang
— SFLEND => + en fin de page si il y a encore des pages à afficher
— ROLLUP => Pour gérer la pagination (cet indicateur se mettera en fonction quand l’utilisateur utilise la touche "rollup").

PROGRAMMATION

Le sous-fichier est un fichier d’organisation relative (accès direct). Le cycle de programmation est toujours le même
— Effacement du sous fichier
— Chargement du sous-fichier (dynamique ou intégral)
— Affichage

- Effacement du sous-fichier :

Il se fait par l’écriture du format de contrôle après avoir mis en fonction l’indicateur associé au mot clé SFLCLR.Dans le même temps, vous devez désactiver l’affichage (inutile dans ce cas) en désactivant les indicateurs liés aux mots clés SFLDSP et SFLDSPCTL.

- Chargement du sous-fichier :

Il existe 2 méthodes classiques de chargement
— Intégral, le sous-fichier est chargé entièrement avant l’affichage (9999 lignes maxi), les touches ROLLUP et ROLLDOWN sont gérées par le système. Ce type de chargement est à utiliser avec des fichiers peu volumineux.
— Dynamique, Le sous fichier est chargé page par page. Le fait d’activer la touche ROLLUP doit déclencher le chargement de la page suivante du sous-fichier. La touche ROLLDOWN est gérée par le système.

Vous pouvez aussi opter pour un chargement "FULL INTEGRAL" qui consiste à charger page par page aussi bien en ROLLUP qu’en ROLLDOWN. Dans ce cas le système ne gère pas les touches ROLLUP et ROLLDOWN, charge au programmeur de mémoriser la position de départ et de fin de page et de charger une page à chaque activation de la touche ROLLUP ou ROLLDOWN. On rencontre parfois ce type de chargement en SQL et en mode CGI.

Dans tous les cas on doit écrire un enregistrement dans le sous fichier avec le format sous-fichier, sans oublier d’incrémenter le rang relatif du sous fichier. Dans le cas d’un chargement statique, on affectera 1 à la valeur du rang à la fin du chargement et avant l’affichage pour se positionner au début.

- Affichage

L’affichage se fait à partir du format de controle après avoir mis en fonction (*on) les indicateurs associés aux mots clés SFLDSP et SFLDSPCTL et hors fonction (*off) l’indicateur associé à SFLCLR. On ne peut pas afficher un sous fichier vide ou un sous fichier dont le rang est égal à 0.

— Intégral, pour afficher la 1ère page d’un sous-fichier intégral, remettre le rang à 1.
— Dynamique, il faut déclarer le mot clé SFLRCDNBR (DDS) associée à une zone (ex : WRAN01) défini en 4S 0 (numérique étendu sur 4). Dans le programme, il faut affecter à cette zone le rang correspondant au 1er enregistrement de la page à afficher.

Exemples :

Pour cet exemple nous allons nous appuyer sur le fichier BOOKS et le fichier écran BOOKFM.

- Descrition Fichier (BOOKS) :

                R BOOKSR
                  NUMBR          4  0
                  AUTHR         25A
                  TITLE         25A
                  PRICE          6  2        

- Descrition écran BOOKFM (DSPF) :

     A                                      DSPSIZ(27 132 *DS4)
     A                                      REF(SERGE/BOOKS)
     A                                      MSGLOC(27)
     A                                      CA03
     A                                      CF12
     A          R SFL01                     SFL
     A  08                                  SFLNXTCHG
     A            ZCDSEL         1A  B  6  3
     A            NUMBR     R        O  6  5
     A            AUTHR     R        O  6 10
     A            TITLE     R        O  6 36
     A            PRICE     R        O  6 62EDTCDE(1)
     A          R FORC1                     SFLCTL(SFL01)
     A                                      SFLSIZ(0020)
     A                                      SFLPAG(0019)
     A N07                                  ROLLUP(02)
     A                                      OVERLAY
     A  04                                  SFLDSP
     A N04                                  ERASE(SFL01)
     A  05                                  SFLDSPCTL
     A  06                                  SFLCLR
     A  07                                  SFLEND
     A            WRAN01         4S 0H      SFLRCDNBR
     A                                  1 20’Gestion des bibliothèques’
     A                                      COLOR(WHT)
     A                                  5  5’N° ’
     A                                      DSPATR(UL)
     A                                      COLOR(WHT)
     A                                  5 10’Auteur                   ’
     A                                      DSPATR(UL)
     A                                      COLOR(WHT)
     A                                  5 36’Titre                    ’
     A                                      DSPATR(UL)
     A                                      COLOR(WHT)
     A                                  5 62’Prix    ’
     A                                      DSPATR(UL)
     A                                      COLOR(WHT)
     A          R FORB1
     A                                      OVERLAY
     A                                 26  3’F3=QUITTER’
     A                                      COLOR(BLU)

- Exemple chargement statique :

      *‚------------------------------------------------------------------------
      *‚ Chargement Sous-fichier Statique
      *‚------------------------------------------------------------------------
      *šFICHIER écran
     FBOOKFM    CF   E             WORKSTN SFILE(SFL01:WRAN01)
      *‚------------------------------------------------------------------------
      *šPointeur de recouvrement des indicateurs
     DIndPtr           S               *   INZ(%ADDR(*IN))
     D                 DS                  BASED(IndPtr)
     D ROLLUP                  2      2
     D SFLDSP                  4      4
     D SFLDSPCTL               5      5
     D SFLCLR                  6      6
     D SFLEND                  7      7
     D SFLNXTCHG               8      8
     D FIN_SFL                70     70
      *šDS pour alimenter le FETCH
     DDS_FETCH       E DS                  EXTNAME(BOOKS)
      *šVariables de travail
     D W_X             S              3  0 INZ
     D W_FIN_PGM       S               N   INZ(*OFF)
     D W_NB_LIGSFL     S              4S 0 INZ
      *šConstantes
      *‚------------------------------------------------------------------------
     C* Initialisation du programe
     C                   EXSR      INISFL1
     C                   DOW       NOT W_FIN_PGM
     C                   EXSR      ECRAN1
     C                   ENDDO
     C                   EXSR      FINPGM
     C                   Eval      *INLR = *ON
      *‚------------------------------------------------------------------------
     C     INISFL1       BEGSR
     C                   Eval      WRAN01 = 0
     C                   Eval      W_NB_LIGSFL = 0
      * Effacement du sous-fichier 
     C                   Eval      SFLEND = *ON
     C                   Eval      SFLCLR = *ON
     C                   Eval      SFLDSP = *OFF
     C                   Eval      SFLDSPCTL = *OFF
     C                   WRITE     FORC1
     C                   Eval      SFLDSPCTL = *ON
     C                   Eval      SFLCLR = *OFF
     C                   EXSR      PREREQ
     C                   EXSR      FETCH
     C                   IF        sqlcod = 100
     C                   Eval      SFLEND = *ON
      *šAucun enregistrement ne correspond
     C                   ELSE
     C                   EXSR      CHASF1
     C                   EndIf
     C                   Z-ADD     1             WRAN01
     C                   ENDSR
      *‚------------------------------------------------------------------------
     C     ECRAN1        BEGSR
     C                   Eval      SFLDSPCTL  = *ON
     C                   WRITE     FORC1
     C                   WRITE     FORB1
      *š Lecture écran
     C                   READ      FORC1                                  70
      *šTraitement touche de fonction
     C                   If         *INKC
      *šTouche F3=Fin Programme
     C                   Eval      W_FIN_PGM = *ON
     C                   Else
     C                   EXSR      VERIF1
     C                   EndIF
     C                   ENDSR
      *‚------------------------------------------------------------------------
     C     VERIF1        BEGSR
     C                   READC     SFL01                                7070
     C                   DOW       FIN_SFL=*OFF AND W_FIN_PGM=*OFF
     C                   IF        ZCDSEL <> *BLANK
      *šEnregistrement sélectionné alimentation paramètres
     C                   ENDIF
     C                   READC     SFL01                                7070
     C                   ENDDO
     C                   ENDSR
      *‚------------------------------------------------------------------------
     C     CHASF1        BEGSR
      *šCharge tout SFL01
     C                   Eval      SFLDSP     = *ON
     C                   Eval      WRAN01 = W_NB_LIGSFL
     C                   Eval      W_X = 0
     C                   DOW       SQLCOD <> 100 AND  SQLCOD >= 0
     C                             AND W_NB_LIGSFL < *HIVAL
     C                   Eval      W_X = W_X + 1
     C                   Eval      W_NB_LIGSFL = W_NB_LIGSFL + 1
     C                   Eval      WRAN01 = W_NB_LIGSFL
     C                   Eval      ZCDSEL = *blank
     C                   WRITE     SFL01
     C                   EXSR      FETCH
     C                   END
     C                   ENDSR
      *‚------------------------------------------------------------------------
     C     PREREQ        BEGSR
     C/Exec SQL
     C+ Declare CustomerBook Cursor
     C+   For Select * from BOOKS Order By NUMBR
     C/End-Exec
     C/Exec SQL
     C+  Open CustomerBook
     C/End-Exec
     C                   ENDSR
      *‚------------------------------------------------------------------------
     C     FETCH         BEGSR
     C                   RESET                   DS_FETCH
      *šLecture curseur
     C/EXEC SQL
     C+ FETCH NEXT FROM CustomerBook INTO :DS_FETCH
     C/END-EXEC
     C                   ENDSR
      *‚------------------------------------------------------------------------
     C     FINPGM        BEGSR
     C/Exec SQL
     C+                  Close CustomerBook
     C/End-Exec
     C                   ENDSR
      *‚------------------------------------------------------------------------

- Exemple Chargement dynamique :

*‚------------------------------------------------------------------------ *‚ Chargement Sous-fichier Dynamique *‚------------------------------------------------------------------------ *šFICHIER écran FBOOKFM CF E WORKSTN SFILE(SFL01:WRAN01) *‚------------------------------------------------------------------------ *šPointeur de recouvrement des indicateurs DIndPtr S * INZ(%ADDR(*IN)) D DS BASED(IndPtr) D ROLLUP 2 2 D SFLDSP 4 4 D SFLDSPCTL 5 5 D SFLCLR 6 6 D SFLEND 7 7 D SFLNXTCHG 8 8 D FIN_SFL 70 70 *šDS pour alimenter le FETCH DDS_FETCH E DS EXTNAME(BOOKS) *šVariables de travail D W_MEM_RANG S LIKE(WRAN01) INZ D W_NB_LIGSFL S 4S 0 INZ DW_NB_LIGPAG C 19 D W_X S 3 0 INZ D W_FIN_PGM S N INZ(*OFF) *šConstantes *‚------------------------------------------------------------------------ C* Initialisation du programme C EXSR INISFL1 C DOW NOT W_FIN_PGM C EXSR ECRAN1 C ENDDO C EXSR FINPGM C Eval *INLR = *ON *‚------------------------------------------------------------------------ C INISFL1 BEGSR C Eval WRAN01 = 0 C Eval W_NB_LIGSFL = 0 C Eval SFLEND = *ON C Eval SFLCLR = *ON C Eval SFLDSP = *OFF C Eval SFLDSPCTL = *OFF C WRITE FORC1 C Eval SFLDSPCTL = *ON C Eval SFLCLR = *OFF C EXSR PREREQ C EXSR FETCH C IF sqlcod = 100 C Eval SFLEND = *ON *šAucun enregistrement ne correspond C ELSE C EXSR CHASF1 C EndIf C Z-ADD 1 WRAN01 C ENDSR *‚------------------------------------------------------------------------ C ECRAN1 BEGSR C Eval SFLDSPCTL = *ON C WRITE FORC1 C WRITE FORB1 *š Lecture écran C READ FORC1 70 *šTraitement touche de fonction C SELECT C WHEN *INKC *šTouche F3=Fin Programme C Eval W_FIN_PGM = *ON C WHEN ROLLUP = *ON C EXSR CHASF1 C Other C EXSR VERIF1 C ENDSL C ENDSR *‚------------------------------------------------------------------------ C VERIF1 BEGSR *šRelecture du sous-fichier pour CTL C READC SFL01 7070 C DOW FIN_SFL=*OFF AND W_FIN_PGM=*OFF C IF ZCDSEL <> *BLANK *šEnregistrement sélectionné alimentation paramètres C ENDIF C READC SFL01 7070 C ENDDO C ENDSR *‚------------------------------------------------------------------------ C CHASF1 BEGSR *šCharge 1 page SFL01 C Eval SFLDSP = *ON C Eval WRAN01 = W_NB_LIGSFL C Eval W_X = 0 C DOW W_X < W_NB_LIGPAG AND C SQLCOD <> 100 AND SQLCOD >= 0 C AND W_NB_LIGSFL < *HIVAL C Eval W_X = W_X + 1 C Eval W_NB_LIGSFL = W_NB_LIGSFL + 1 C Eval WRAN01 = W_NB_LIGSFL C Eval ZCDSEL = *blank C WRITE SFL01 C EXSR FETCH C END C IF SQLCOD = 100 OR SQLCOD < 0 C Eval SFLEND = *ON C ELSE C Eval SFLEND = *OFF C END C ENDSR *‚------------------------------------------------------------------------ C PREREQ BEGSR C/Exec SQL C+ Declare CustomerBook Cursor C+ For Select * from BOOKS Order By NUMBR C/End-Exec C/Exec SQL C+ Open CustomerBook C/End-Exec C ENDSR *‚------------------------------------------------------------------------ C FETCH BEGSR C RESET DS_FETCH *šLecture curseur C/EXEC SQL C+ FETCH NEXT FROM CustomerBook INTO :DS_FETCH C/END-EXEC C ENDSR *‚------------------------------------------------------------------------ C FINPGM BEGSR C/Exec SQL C+ Close CustomerBook C/End-Exec C ENDSR *‚------------------------------------------------------------------------