Le sous-fichier statique

Haaaaa… Le sous-fichier. Cet élément incontournable du monde des programmes sur l’IBM i.

Cette chose mystérieuse donne des sueurs froides aux débutants et peut énerver un vieux "briscard" pendant des heures.

 

Démystifions le machin et voyons de quoi il s’agit :

  • Un sous-fichier est une liste gérée en mémoire comme un fichier (d’où le nom : Sous-fichier). Ce fichier n’est visible que par le travail en cours, on peut donc le considérer comme une sorte de fichier temporaire, même si dans les faits il n’est pas généré dans QTEMP. Ca n’est ni plus ni moins qu’une liste déroulante, mais façon IBM i.
  • Des indicateurs et des variables nous permettent de définir ce qui doit être affiché.

 

Avec le sous-fichier, on va gérer des pages contenant un certain nombre d'enregistrements à afficher en une seule fois. Son fonctionnement met en œuvre des mots clés particuliers dans la définition de l’écran et une algorithmie particulière au niveau du code. En effet, on va pouvoir afficher ou non la liste, gérer la position du curseur dans la page, gérer les pages entres elles, gérer la position dans le fichier principal, donc c’est un peu complexe ! 

 

Il y a deux manières de remplir un sous-fichier : 

  • La première est dite "statique" : La plus facile. Une sorte de copie de fichier globale dans l’esprit. Le remplissage se fait d’un coup, on affiche la première page, l’affichage des pages suivantes et précédentes est pris en charge par le système qui gère la pagination.>
  • La deuxième dite « dynamique » permet de remplir le sous-fichier page par page (écran par écran en quelque-sorte). On associe ce remplissage aux touches Rollup et Rolldown du terminal. La pagination en avant est gérée dans le programme, la pagination arrière prise en charge par le système.

Il existe une troisième méthode « Full-dynamique » qui permet de remplir le sous-fichier page par page (écran par écran en quelque-sorte). On associe ce remplissage aux touches Rollup et Rolldown du terminal. La pagination en avant, comme la pagination arrière est gérée dans le programme. Très complexe et peu d’intérêt sauf pour des raisons spécifiques, nous l’évoquerons mais ne l’étudierons pas.

 

Nous allons voir en détail les deux méthodes principales. Mais avant de remplir quoi que ce soit, il faut s’occuper de l’écran.

Pour un sous-fichier, le DSPF va mettre en œuvre plusieurs formats écrans.  Le format d’enregistrement proprement dit (SFL) qui contient les données à afficher (la ligne de l’écran qui se répète …) et son format de contrôle (SFLCTL) qui lui va contenir les mots clés et les indicateurs permettant au SFL de bien se dérouler (comme dans le repassage, il faut éviter les plis.). C’est sur ce dernier que l’on effectuera la célèbre opération EXFMT bien connue des utilisateurs d’écrans en RPG.

 

Le format sous-fichier contient la description de la ligne à afficher. Ci-dessous, le format SFL1 (le mot clé SFL signifiant qu’il s’agit du sous fichier proprement dit) décrit la ligne à afficher. Nous avons la zone DBLNAM de longueur 20 en caractères, en type O (pour output), positionné en colonne 2 de la ligne 7. Puis la zone DBFNAM de longueur 20 en caractères, en type O, positionné en colonne 25 de la ligne 7, etc …  On remarquera que les quatre zones composants la ligne sont positionnées sur la ligne 7. Il s’agit bien d’une seule ligne. 7 étant la première ligne à afficher.

 

     A          R  SFL1                             SFL
     A             DBLNAM         20A    0    7    2  
     A             DBLNAM         20A    0    7   25
     A             DBCIVI          3A    0    7   50
     A             DBTELP         10A    0    7   64

 

Ensuite, voyons le format de contrôle et ses mots clés pour que l’ensemble fonctionne. Dans notre exemple, le format de contrôle se nommera SFL1CTL. (Je le rappelle, les mots clés sont pour le format de contrôle. Le format SFL, lui ne sert qu’à décrire la ligne qui va se répéter et se dérouler sur l’écran) :

  • SFLCTL : On lui associe le nom du format sous-fichier (ici SFL01). Ainsi, il sait qui il contrôle !
  • SFLDSPCTL : Associé à un indicateur, il détermine si le format de contrôle s’affiche ou non.
  • SFLDSP : Associé à un indicateur, il détermine si la page du sous-fichier s’affiche ou non (indépendamment du SFLDSPCTL)
  • SFLCLR : Associé à un indicateur, il remet le sous-fichier à blanc (la force du « clear » au service du sous-fichier)
  • SFLSIZ(nnnn) : Nombre d’enregistrement dans le sous-fichier (en mémoire).
  • SFLPAG(nnnn) : Nombre d’enregistrement affiché par page.

 

Voici l’exemple du DDS d’un sous-fichier :

 

     A                                      DSPSIZ(24 80 *DS3)
     A                                      PRINT
     A                                      CA03(03)
     A          R SFL1                      SFL
     A            DBLNAM        20A  O  7  2
     A            DBFNAM        20A  O  7 25
     A            DBCIVI         3A  O  7 50
     A            DBTELP        10A  O  7 64
     A          R SF1CTL                    SFLCTL(SFL1)
     A                                      SFLSIZ(0016)
     A                                      SFLPAG(0015)
     A                                      OVERLAY
     A N32                                  SFLDSP
     A N31                                  SFLDSPCTL
     A  31                                  SFLCLR
     A                                  6  2'Nom'
     A                                      DSPATR(HI)
     A                                  6 26'Prénom'
     A                                      DSPATR(HI)
     A                                  6 50'Civ.'
     A                                      DSPATR(HI)
     A                                  6 64'Téléphone'
     A                                      DSPATR(HI)
     A                                  1  2'SFL001D'
     A                                  1 71DATE
     A                                      EDTCDE(Y)
     A                                  2 71TIME
     A                                  1 24'Sous-fichier avec positionnement'
     A                                      DSPATR(HI)
     A                                  4  2'Afficher à partir de :'
     A            PTNAME        20A  B  4 28CHECK(LC)
     A                                  4 50'(Nom)'
     A          R FKEY1
     A                                 23  2'F3=Sortie'

 

Et ce qu’il va donner une fois affiché :

 

 

Vous l’aurez compris, l’idée de notre exemple est d’afficher les données (Nom, Prénom, Civilité et Numéro de téléphone) contenues dans un fichier de base de données. La description du fichier est la suivante :

 

     A          R PFR
     A            DBLNAM         20          
     A            DBFNAM         20 
     A            DBCIVI          3 
     A            DBTELP         10

 

Nous utiliserons un fichier logique dont la clé est DBLNAM :

 

     A          R PFR
     A          K DBLNAM          

 

Donc, maintenant que nous avons un écran qui décrit un sous-fichier, utilisons-le !! Passons au code !!

Tout d’abord la déclaration de l’écran en carte F (DCL-F pour les Freestylers …). Par rapport à ce que l’on sait déjà pour déclarer des écrans, ici on rajoute le mot clé SFILE. Ses paramètres sont le nom du format du sous-fichier, ainsi que le nom de la zone qui va faire office de rang. Ce dernier étant la position de l’enregistrement dans le sous-fichier. En effet, comme tout fichier (PF), le sous-fichier possède un rang d’enregistrement. Le même que celui dont on peut se servir pour accéder à un enregistrement d’un PF sans avoir la clé. Ici, ce rang on va l’incrémenter à la main. Chaque fois que l’on va écrire un enregistrement dans le sous-fichier, il faudra alimenter ce rang. Si on ne le fait pas, ça n’avancera pas. On dérape, on se prend les pieds dans le tapis … et patatras !

 

                FSf1001d    cf    e                          Workstn
                F                                                    Sfile(sfl1:RANG)

 

Pour résumer, le fichier écran s’appelle sfl001d, on précise que c’est un sous-fichier (mot clé Sfile), que le format du sous-fichier est Sfl1 et que le rang d’enregistrements s’appelle RANG. L’algorithme proprement dit va être le suivant :

  • Initialisation du sous-fichier (Nettoyage des zones, initialisation des compteurs à l’aide des mots clés associés aux indicateurs)
  • Lecture Base de Données (Les enregistrements à afficher proviennent d’un fichier de la base de données. Il va falloir enclencher une lecture de celui-ci afin de trouver les bons enregistrements à afficher).
  • Tant que non fin de fichier
    • Ecriture Sous-Fichier (On transfère les zones lues du fichier de la base de données aux zones de la ligne du sous-fichier)
    • Lecture Base de Données (On lit l’enregistrement suivant du fichier de la base de données)
  •  Ecriture/Lecture du Format de Contrôle (l’EXFMT classique d’un fichier écran)

 

     FSfl001d   cf   e             Workstn
     F                                     Sfile(Sfl1:RANG)
     FSfl001lf  if   e           k Disk
     DSflmax           C                   Const(500)
     DRANG             S              4  0
      /Free

       Dou *IN03;  // Sortie si touches F3

          // A- Initialisation du sous-fichier
          RANG = *Zero;   // Initialisat° du compteur d'enregistrement.
          *In31 = *On;    // Activat° de l'indic de vidage de SFL  (Associé au mot clé SFLCR)
          Write Sf1c      // Vidage du sous-fichier
          *In31 = *Off;   // Désactivat° de l'indic de vidage de SFL (Associé au mot clé SFLCLR)

          // B- Lecture de la base de données
          Setll (Ptname) Sfl001lf;  // On se positionne avec la zone Ptname saisie à l'écran
          Read Sfl001lf;

          // B- Tant que non fin de fichier
          Dow (Not %eof) And (RANG <= Sflmax); // TQ Non Fin de Fichier et limite de 500 ligne

            RANG += 1;  // Incrémentation du compteur de ligne
            // les zones du PF ayant le même nom que celle du SFL, le "move" de celles-ci
            // est implicite et ça se passe ici !
            Write Sfl1;       // Ecriture du format de sous-fichier
            Read Sfl001lf;    // Lecture enregistrement suivant

          Enddo;

          // C -Cas particulier (aucun enregistrement)
          If RANG = *Zero;  // Si aucun enregistement à charger
            *In32 = *On;    // Indicateur de non affichage du SFL (Associé au mot clé SFLDSP)
          Endif;

          Write Fkey1;        // Affiche la ligne de touches de fonctions
          Exfmt Sf1ctl;       // Affiche le format de contrôle du SFL

       Enddo;

       *Inlr = *On;

       /End-Free 

 

Trois parties au sein d’une boucle dont on ne peut sortir que par l’action de la touche F3. (Grand classique de la gestion des écrans, donc rien de neuf de ce côté.) : 

A-Initialisation du sous-fichier : On met à zéro le RANG, on enclenche l’indicateur (*IN31) qui va permettre de remettre à blanc le sous-fichier. L’action de l’initialisation proprement dite s’effectue lors du write du format de contrôle. Vous aurez noté que par le jeu des indicateurs, on affichera le format de contrôle si l’on active pas le SFLCLR et inversement.  Regardons en détail le format écran à ce niveau :

 

1 A                                                                OVERLAY
0 A N32                                                            SFLDSP
0 A N31                                                            SFLDSPCTL
0 A  31                                                            SFLCLR

 

B- Boucle de chargement du sous-fichier : Du grand classique. On se positionne (SETLL), on lit (READ) et tant que l’on n’est pas en fin de fichier, on écrit la ligne du sous-fichier en incrémentant le RANG.

C- Cas particulier : C’est le cas où si la valeur de la clé n’est pas trouvée (fichier vide par exemple). Nous ne sommes pas entrées dans le DOW, donc RANG reste à zéro. Là, on active l’indicateur 32 afin de ne pas afficher le sous-fichier . Le format de contrôle lui va bien s’afficher. Si on ne fait pas celà, on va essayer d’afficher le sous-fichier avec un RANG à zéro, le résultat imposant le port de lunettes de protections…

 

 

En conclusion, vous voyez ici le code le plus simple pour gérer un sous-fichier avec positionnement. Il y a le minimum de mots clés et de code. Rien n’est inutile. Il existe bien d’autres mots clés au niveau de l’écran comme le SFLEND, le SFLRCDNBR (que l’on associe au RANG qui, du coup est définit dans l’écran), nous verrons cela dans le prochain épisode sur le sous-fichier dynamique.

 

Vous avez des questions concernant un sujet particulier autour de l'IBM i ? Alors contactez-nous au 04 30 96 97 32, ou via le formulaire de contact.