Les Sous-Fichiers

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
      *‚------------------------------------------------------------------------

Print Friendly, PDF & Email