FD : Description de fichier

Principes

Cette commande permet d'obtenir une description de fichier imprimée sous un format adapté à une impression laser, et de l'afficher dans la foulée.

Le programme de génération est très compact et utilise les API, ainsi que de nombreuses petites astuces d'impression. Les caractéristiques d'impression (OVRPRTF) peuvent nécessiter de petites adaptations en fonction du modèle d'imprimante.

Le programme CLP se contente de reformater les paramètres et de gérer les messages d'information et d'erreur.

Le panneau d'aide n'est pas vraiment indispensable mais peut servir de modèle pour des cas simples.

Liste des sources

SourceTypeTexte et commentaires
FDCMDDescription de fichier
Compiler avec PGM(FFD1C) HLPPNLGRP(*LIBL/FFDH) HLPID(*CMD)
FDHPNLGRPAide en ligne (compiler par option 14)
FFD1CCLPProgramme lié à la commande
FFD1RPGProgramme principal, fait tout le travail.
L'utilisation des API donne un programme unique et compact (400 lignes avec les commentaires). Il est auto documenté.

FD : commande

             CMD        PROMPT('Description de fichier')

   /* compiler avec PGM(FFD1C) HLPPNLGRP(*LIBL/FFDH) HLPID(*CMD)   */

             PARM       KWD(FILE) TYPE(FILE) PROMPT('Fichier')
 FILE:       QUAL       TYPE(*NAME) LEN(10)
             QUAL       TYPE(*NAME) LEN(10) DFT(*LIBL) +
                          SPCVAL((*LIBL) (*CURRENT) (*USRLIBL)) +
                          PROMPT('Bibliothèque')

FDH : panneau d'aide

:PNLGRP.

:HELP NAME='FD'.
:p.Cette commande imprime proprement et affiche à l'écran une description
de fichier.
:p.Elle utilise des API, un panneau d'aide simple, et tout un tas de
  petites astuces en liaison avec une impression, ce qui lui permet de
  servir de modèle dans beaucoup de cas.
:EHELP.

:HELP NAME='FD/FILE'.Fichier. - Aide.
:XH2.Fichier
:p.Entrer le nom du fichier et de la bibliothèque.
:EHELP.


:EPNLGRP.

FFD1C : programme de controle

Toutes les erreurs susceptibles de se produire sont renvoyées à la commande qui les gère de manière appropriée.

/* FFD1C - Description de fichier        Patrick LARREYA, 1990-2000 */

             PGM   &libfile

             dcl   &libfile    *char  20
             dcl   &lib        *char  10
             dcl   &file       *char  10

             DCL   &ERR      *CHAR   1    VALUE('0')
             DCL   &MSGID    *CHAR   7
             DCL   &MSGF     *CHAR  10
             DCL   &MSGLIB   *CHAR  10
             DCL   &MSGDTA   *CHAR 256

             MONMSG     MSGID(CPF0000) EXEC(GOTO CMDLBL(ERREUR))

             chgvar   &file  %sst(&libfile  1   10)
             chgvar   &lib   %sst(&libfile 11   10)

             chkobj   &lib/&file   *file

             SNDPGMMSG  MSGID(CPF9897) MSGF(QCPFMSG) +
                          MSGDTA('Traitement de' !> &LIB !< '/' !< +
                          &FILE !> 'en cours. . .') TOPGMQ(*EXT) +
                          MSGTYPE(*STATUS)
             CALL ffd1  (&file &lib)

            GOTO FINFIN

 ERREUR:    IF (&ERR = '1')   GOTO FINFIN
            CHGVAR  &ERR '1'
             RCVMSG     MSGTYPE(*LAST) MSGDTA(&MSGDTA) MSGID(&MSGID) +
                          MSGF(&MSGF) MSGFLIB(&MSGLIB)
             SNDPGMMSG  MSGID(&MSGID) MSGF(&MSGLIB/&MSGF) +
                          MSGDTA(&MSGDTA)  MSGTYPE(*ESCAPE)
FINFIN:      ENDPGM

FFD1 : programme principal

Ce programme est du RPG III.

Il utilise des user Spaces créés dans QTEMP. Consulter la documentation de API pour plus de précisions.

Positionner les attributs de spoules par QCMDEXC évite de créer des sources séparés, qui posent souvent problème lors des recompilations ou installations. QCMDEXC ne permet pas de gérer correctement les erreurs et ne doit être utilisé que si elles sont improbables et sans conséquences.

Il est important de noter que l'AS400 gère en général ses passages de paramètres par référence, et que de nombreux programmes de bas niveau ont besoin de connaître la longueur des paramètres transmis pour ne pas déborder. Le système vérifie qu'aucun débordement ne se produit hors de la zone dévolue aux données, mais ne fait pas de vérification individuelle. Les paramètres peuvent empiéter les uns sur les autres en cas d'erreur de programmation.

     H            D
     F*===================================================================
     F* FFD1 : DSPFFD directement par API.
     F*
     F*                                     Patrick LARREYA, 1990-2000
     F*===================================================================
     F* Comment celà marche-t-il ?
     F*
     F* Les API récupèrent leurs informations dans des Data Area
     F*  si l'information est fixe, dans un User Space si l'information
     F*  est une liste.
     F*
     F* Les users spaces liste comprennent une information fixes et une
     F* information liste.
     F*
     F* L'information fixe comprend (entre autres choses)
     F*  - la position du début de la liste
     F*  - le nombre de postes de la liste
     F*  - la taille de chaque poste de la liste.
     F*
     F* Un API permet de récupérer une portion de User Space et de la
     F*
     F* La récupération des clés utilisa un autre API, qui pourrait
     F* en fait servir pour récupérer toutes les informations de base.
     F*
     F*
     F* mettre dans une Data Area.
     F*===================================================================
     F*  Détail des API utilisés.
     F*
     F* API        Format     DS/UsrSpc Descriptif
     F* ---------  --------   ------    --------------------------------
     F* Plusieurs             ERRCOD    Récup codes erreur API.
     F* QUSROBJD   OBJD0200   D1INFO    Description d'objet, tous types
     F* QUSCRTUS              USP1      Création UserSpace Formats
     F* QUSLRCD    RCDL0100   USP1      Récup Liste de Formats d'un fichier
     F* QUSCRTUS              USP2      Création UserSpace Champs
     F* QUSLFLD    FLDL0100   USP2      Récup Liste de Champs d'un format
     F* QDBRTVFD   FILD0300
     F*===================================================================
     FQSYSPRT O   F     132     OA     PRINTER                        UC
     E                    CMD     1   3 80               Qsysprt
     E                    TK       6400  1               Infos clé
     I* Infos clé
     IINFOK       DS
     I                                        16400 TK
     I                                    B  11  120TKNBRK
     I                                    B  23  240TKNBFM
     I* Erreurs d'appel API
     IERRCOD      DS
     I                                    B   1   40BYTPRO
     I                                    B   5   80BYTAVA
     I                                        9  15 EXCID
     I                                       16  16 RSRVD
     I* Compteurs binaires sur récup caractéristiques User Space
     I            DS
     I                                    B   1   40USLEN
     I                                    B   5   80USPOS
     I                                    B   9  120USSPSQ
     I                                    B  13  160SCSPN2
     I                                    B  17  200SCLEN
     I                                    B  21  240U2LEN
     I                                    B  25  280U2POS
     I                                    B  29  320U3LEN
     I                                    B  33  360U3POS
     I* Compteurs binaires sur caractéristiques récupérées
     I* Ces informations sont récupérées dans la portion fixe
     I* du User Space. La technique est standard pour tous les API
     I* utilisant une liste.
     IUSINFO      DS
     I                                    B   1   40USDEPL
     I                                    B   9  120USNBLS
     I                                    B  13  160USSZLS
     IU2INFO      DS
     I                                    B   1   40U2DEPL
     I                                    B   9  120U2NBLS
     I                                    B  13  160U2SZLS
     IU3INFO      DS
     I                                    B   1   40U3DEPL
     I                                    B   9  120U3NBLS
     I                                    B  13  160U3SZLS
     I* Infos QDBLDBR, Infos fichier, format DBLR0100  (Longueur 320)
     IWHINFO      DS
     I                                        1  10 WHRFI
     I                                       11  20 WHRLI
     I                                       21  30 WHREFI
     I                                       31  40 WHRELI
     I                                       41  41 WHTYPE
     I* Taille du User Space en binaire
     I            DS
     I                                    B   1   40USSIZ
     I* Binary values values for API
     I            DS
     I                                    B   1   40INFOLN
     I* User Space and Object information
     ID1INFO      DS
     I                                        9  18 D1OBJ
     I                                       19  28 D1LIB1
     I                                       29  38 D1TYPE
     I                                       39  48 D1LIBO
     I                                      101 150 D1TXT
     I                                      151 160 D1SRC
     I                                      161 170 D1LIB
     I                                      171 180 D1MBR
     I* L'information Format la plus simple ne contient que le format.
     ID2INFO      DS
     I                                        1  10 D2FMT
     I                                       33  82 D2TXT
     I*  Prefix D2
     I*
     I* Fields information. FLDL0100  is lengh 285
     ID3INFO      DS
     I                                        1  10 D3NAME
     I                                       11  11 D3TYP
     I                                       12  12 D3TYPE
     I                                    B  13  160D3POS
     I                                    B  21  240D3BYTS
     I                                    B  25  280D3DIGS
     I                                    B  29  320D3DECP
     I                                       33  82 D3TXT
     I                                      153 171 D3CH1
     I                                      173 191 D3CH2
     I                                      193 211 D3CH3
     I           SDS
     I                                        1  10 PGMNAM
     I                                      244 253 WS
     I                                      254 263 USER
     I            DS
     I                                        1  120TIMHR
     I                                        1   60H1TIME
     I                                        7  120H1DATE
     I* Constantes User space
     I              'USPFFD1   QTEMP     'C         C1USP
     I              'FFDFMT              'C         C1ATR
     I              2000                  C         C1SIZ
     I              'USPFFD2   QTEMP     'C         C2USP
     I              'FFDFLD              'C         C2ATR
     I              10000                 C         C2SIZ
     I              '*ALL      '          C         C1AUT
     I              'Database Relations  'C         C1TXT
     C*------------------------------------------------------------------------
     C* Paramètres d'appel commande
     C           *ENTRY    PLIST
     C                     PARM           P0FILE 10        File
     C                     PARM           P0LIB  10        Library
     C* Taille zone erreur gérée
     C                     Z-ADD16        BYTPRO
     C* Configurer le fichier imprimante
     C                     MOVELCMD,1     CMDX      P
  1{ C           P0FILE    IFEQ *BLANK
     C                     CAT  'Qui ?':0 CMDX
  1| C                     ELSE
     C                     CAT  P0FILE:0  CMDX
  1} C                     END
     C                     CAT  CMD,2:0   CMDX
     C*
     C                     CALL 'QCMDEXC'
     C                     PARM           CMDX  120
     C                     PARM 120       CMDLEN 155
     C                     OPEN QSYSPRT
     C*-----------------------------------------------------------------
 1<--C                     EXSR INIT                       Initialisation
     C*
     C                     TIME           TIMHR
     C                     Z-ADD1         H1PAGE  40
 2<--C                     EXSR GETFIL                     Infos fichier
     C           P0FILE    CAT  '/':0     H1FILE 20 P
     C                     CAT  H1LIB:0   H1FILE
     C                     EXCPTH1
     C* Recherche des infos clé
     C           P0FILE    CAT  H1LIB     P1FILE
     C                     CALL 'QDBRTVFD'
     C                     PARM           INFOK            DS récup
     C                     PARM 6400      INFOLN           Taille
     C                     PARM           P1FILR 20        Fichier renvoyé
     C                     PARM 'FILD0300'F1APIF  8        Format API
     C                     PARM           P1FILE 20        Fichier Qualifié
     C                     PARM ' '       P1FMT  10        Format
     C                     PARM '0'       P1OVR   1        Override
     C                     PARM '*LCL'    P1SYST 10        Systeme
     C                     PARM '*EXT'    P1FMTT 10        Format *INT/*EXT
     C                     PARM           ERRCOD
     C*
  1{ C           EXCID     IFEQ '       '
     C           32        MULT TKNBFM    PK      50       Info Format sur 32
     C                     ADD  25        PK               Deplacement fixe 25
     C                     Z-ADD25        PF      50       Fmt commence en 25
  2{ C                     DO   TKNBFM                     Boucle sur format
     C                     MOVEATK,PF     D1KFM  10        Nom du format
     C                     MOVE *BLANK    D1CLES 70
     C                     ADD  32        PF
  3{ C                     DO   TKNBRK                     Boucle sur clés
     C                     MOVEATK,PK     A10    10        Clé sur 10
     C                     CAT  A10:1     D1CLES           Concaténée
     C                     ADD  64        PK               Poste 64 de long
  3} C                     ENDDO
     C                     EXCPTD1CLE                      Impr. Format
  2} C                     ENDDO
  1} C                     ENDIF
     C*
     C* Boucle sur les formats du fichier
     C*--------------------------------------
  1{ C                     DO   U2NBLS    N2      50       Pour chaque format
     C*--------------------------------------
 3<--C                     EXSR GETFMT                     Infos format
     C                     EXCPTD1FMT                      Infos format
     C* Boucle sur les champs du format
     C*---------------------------
  2{ C                     DO   U3NBLS    N3      50       Pour chaque champ
     C*---------------------------
 4<--C                     EXSR GETFLD
     C                     Z-ADDD3POS     X3POS   50
     C                     Z-ADDD3BYTS    X3LEN   40
     C                     Z-ADDD3DIGS    X3DIG   40
     C                     Z-ADDD3DECP    NUM2    20
  3{ C           X3DIG     IFEQ 0
     C                     MOVE ' '       X3DECA
     C                     Z-ADDX3LEN     X3DIG
     C                     Z-ADD0         X3LEN
  3| C                     ELSE
  4{ C           D3TYP     IFEQ 'S'
     C                     Z-ADD0         X3LEN
  4} C                     END
     C                     MOVE NUM2      X3DECA  1
  3} C                     ENDIF
  3{ C           *INOA     IFEQ '1'
     C                     ADD  1         H1PAGE
     C                     EXCPTH1
     C                     EXCPTD1FMT
  3} C                     ENDIF
     C                     EXCPTD1FLD                      Infos zones
     C*---------------------------
  2} C                     ENDDO
     C*---------------------------
     C*--------------------------------------
  1} C                     ENDDO
     C*--------------------------------------
     C                     CLOSEQSYSPRT
     C*
     C                     CALL 'QCMDEXC'
     C                     PARM CMD,3     CMDY   80
     C                     PARM 80        CMDLEN 155
     C*
     C                     SETON                     LR
     C*====================================================================
 1---C           INIT      BEGSR
     C* Vérification de présence du Userspace Format
     C                     MOVE '       ' EXCID
     C*
     C                     CALL 'QUSROBJD'
     C                     PARM           D1INFO
     C                     PARM 180       INFOLN
     C                     PARM 'OBJD0200'FORMAT  8
     C                     PARM C1USP     OBJLIB 20
     C                     PARM '*USRSPC' OBJTYP 10
     C                     PARM           ERRCOD
     C* ... Création si absent
  1{ C           EXCID     IFNE '       '
     C                     Z-ADDC1SIZ     USSIZ
     C                     CALL 'QUSCRTUS'                 API
     C                     PARM C1USP     USP1   20        Nom qualifié
     C                     PARM C1ATR     USATR  10        Attribut
     C                     PARM           USSIZ            Taille en binaire
     C                     PARM ' '       USINI   1        Remplissage
     C                     PARM C1AUT     USAUT  10        Droits
     C                     PARM C1TXT     USTXT  50        Description
  1} C                     ENDIF
     C* Vérification de présence du Userspace Zones
     C                     MOVE '       ' EXCID
     C*
     C                     CALL 'QUSROBJD'
     C                     PARM           D1INFO
     C                     PARM 180       INFOLN
     C                     PARM 'OBJD0200'FORMAT  8
     C                     PARM C2USP     OBJLIB 20
     C                     PARM '*USRSPC' OBJTYP 10
     C                     PARM           ERRCOD
     C* ... Création si absent
  1{ C           EXCID     IFNE '       '
     C                     Z-ADDC2SIZ     USSIZ
     C                     CALL 'QUSCRTUS'                 API
     C                     PARM C2USP     USP2   20        Nom qualifié
     C                     PARM C2ATR     USATR  10        Attribut
     C                     PARM           USSIZ            Taille en binaire
     C                     PARM ' '       USINI   1        Remplissage
     C                     PARM C1AUT     USAUT  10        Droits
     C                     PARM C1TXT     USTXT  50        Description
  1} C                     ENDIF
     C*
     C                     ENDSR
     C*====================================================================
 2---C           GETFIL    BEGSR
     C* Description du fichier
     C           P0FILE    CAT  P0LIB     P1FILQ 20
     C*
     C                     MOVE '       ' EXCID
     C*
     C                     CALL 'QUSROBJD'
     C                     PARM           D1INFO
     C                     PARM 180       INFOLN
     C                     PARM 'OBJD0200'FORMAT  8
     C                     PARM P1FILQ    OBJLIB 20
     C                     PARM '*FILE  ' OBJTYP 10
     C                     PARM           ERRCOD
     C*
     C                     MOVE D1LIBO    H1LIB  10
     C                     MOVE D1TXT     H1TXT  50
     C*   Info en cas de problème
  1{ C           EXCID     IFNE ' '
     C           EXCID     CAT  P1FILQ:1  H1TXT
  1} C                     ENDIF
     C*
     C* Description des formats du fichier
     C                     CALL 'QUSLRCD'
     C                     PARM C1USP     USP1
     C                     PARM 'RCDL0200'FORMAT  8
     C                     PARM P1FILQ    OBJLIB 20
     C                     PARM '0'       FILOVR  1
     C                     PARM           ERRCOD
     C* Recupération du formatage de la liste en début de userspace
     C                     CALL 'QUSRTVUS'
     C                     PARM C1USP     USP1             User Space
     C                     PARM 125       USPOS            Position
     C                     PARM 16        USLEN            Longueur
     C                     PARM           U2INFO           DS infos User Space
     C* Préparation des pointeurs pour récup de la liste
     C           1         ADD  U2DEPL    U2POS            Depuis
     C** $$ 10 est pris    Z-ADDU2SZLS    U2LEN            Taille poste liste
     C*                               Si U2LEN ne fait pas 10, problèmes
     C                     ENDSR
     C*====================================================================
 3---C           GETFMT    BEGSR
     C* Récupération du nom de format et de la liste des zones
     C*
     C* Nom du format dans user space format, nom + texte
     C                     CALL 'QUSRTVUS'
     C                     PARM C1USP     USP1             User Space
     C                     PARM U2POS     USPOS            Position
     C                     PARM 82        USLEN            Longueur
     C                     PARM           D2INFO           DS infos Format
  1{ C           D2TXT     IFEQ *BLANK
     C                     MOVELH1TXT     D2TXT     P
  1} C                     ENDIF
     C* Positionnement sur le format suivant dans le User Space.
     C                     ADD  U2SZLS    U2POS
     C* Récupération de la liste des champs du format
     C                     CALL 'QUSLFLD'
     C                     PARM C2USP     USP2             Destination Info
     C                     PARM 'FLDL0100'FORMAT  8        Format récupéré
     C                     PARM P1FILQ    OBJLIB 20        Fichier / Bib
     C                     PARM D2FMT     W2FMT  10        Format
     C                     PARM '0'       FILOVR  1        Pas d'override
     C                     PARM           ERRCOD           En cas d'erreur.
     C* Recupération du formatage de la liste des champs
     C                     CALL 'QUSRTVUS'
     C                     PARM C2USP     USP2             User Space
     C                     PARM 125       USPOS            Position
     C                     PARM 16        USLEN            Longueur
     C                     PARM           U3INFO           DS infos User Space
     C* Préparation des pointeurs pour récup du premier champ
     C           1         ADD  U3DEPL    U3POS            Depuis
     C**                   Z-ADDU3SZLS    U3LEN            Taille poste liste
     C*
     C                     ENDSR
     C*====================================================================
 4---C           GETFLD    BEGSR
     C* Récupération des infos concernant un champ
     C                     CALL 'QUSRTVUS'
     C                     PARM C2USP     USP2             User Space
     C                     PARM U3POS     USPOS            Position
     C                     PARM 211       USLEN            Longueur DS
     C                     PARM           D3INFO           DS infos Champs
     C* Positionnement sur le champ suivant
     C                     ADD  U3SZLS    U3POS
     C*
     C                     ENDSR
     C*====================================================================
     OQSYSPRT E   03           H1
     O                         H1FILE    20
     O                         H1TXT     71
     O                         H1DATE    79 '  /  /  '
     O                                   84 'Page'
     O                         H1PAGE    88 '    '
     O*                                      12345678901234567890'
     O        E 11             H1
     O                         P0LIB     10
     O                         H1TIME    79 '  :  :  '
     O                         USER      90
     O*                                      12345678901234567890'
     O        E 1              D1CLE
     O                         D1KFM     10
     O                                   12 ':'
     O                         D1CLES    83
     O*
     O        E 1              D1FMT
     O                                   20 '--------------------'
     O                                   40 '--------------------'
     O                                   60 '--------------------'
     O                                   80 '--------------------'
     O                                   90 '----------'
     O        E 1              D1FMT
     O                         D2FMT     10
     O                                   20 '* Format *'
     O                         D2TXT     80
     O        E 1              D1FMT
     O                                   20 '--------------------'
     O                                   40 '--------------------'
     O                                   60 '--------------------'
     O                                   80 '--------------------'
     O                                   90 '----------'
     O        E 1              D1FLD
     O                         D3NAME    10
     O                         X3DIG     14 '   0'
     O                         D3TYP     16
     O                         X3DECA    18
     O                         X3LEN     22 '   0'
     O                         X3POS     27 '    0'
     O                         D3TXT     80
** CMD : caractéristiques et affichage du spoule
OVRPRTF QSYSPRT USRDTA('
') LPI(8) CPI(15) PAGESIZE(88 90) OVRFLW(80) PAGRTT(0)
DSPSPLF  QSYSPRT * *LAST

Patrick Larreya, Septembre 2000.

Ce site a été créé avant l'an 2000, et à quelques détail près volontairement conservé en l'état.
Curieusement, de nombreux éléments techniques restent d'actualité.
Cette commande est toujours aussi utile, mais facile à réédrire en RPG IV ou pour générer du HTML.