COBOL/400 et DSPF Imaginons un fichier écran : interrogation article. Titre: aucune variable (constantes). F1 : zone-clé et indicateur 03 (F3) + ERRMSG conditionné par 40. F2 : toutes les zones en sortie (entrée = retour image 1) Nous devrons déclarer le fichier écran de la manière suivante **********FICHIER ECRAN***************** SELECT ECRAN ASSIGN TO WORKSTATION-DSPFCBL ORGANIZATION TRANSACTION. ********************************************** DATA DIVISION. *-------------- FILE SECTION. *______________ |
FD ARTICLE LABEL RECORD STANDARD. 01 ART. COPY DDS-ARTICLEF1 OF ARTICLEP1. FD ECRAN LABEL RECORD STANDARD. 01 ECR PIC X(110). <-- lg du buffer le plus long (donnée par DSPFD) |
* * F2 ne contenant que des variables en sortie,il n'est utilisé * qu'une fois. 01 F2. COPY DDS-F2-O OF DSPFCBL. le compilateur va générer | utilisation ----------------------------------- | --------------------------------- 01 F1-in. | 05 F1-I. | READ ecran INTO F1-I format "F1". 06 codart pic s9(6). | (read fichier) 06 in03 pic 1 indicator 03. | 06 in40 pic 1 indicator 40. | 01 F1-out. | WRITE ecr FROM F1-O format "F1". 05 F1-O. | (write 01-FD) 06 in40 pic 1 indicator 40. | 01 F2. | 05 F2-O. | WRITE ecr FROM F2-O format "F2". 06 libart pic x(25). | 06 qtesto pic s9(7)v9(2). | ... etc ... | |
A noter que le COPY-DDS sera puissant avec MOVE CORRESPONDING si vous avez des noms de zone indentiques dans vos fichiers B de D et DSPF. C'est une facilité, pas une obligation. si vous avez sur une ligne 10 zones à afficher, alors que ces zones sont stockées dans votre programme sous forme de table. 01 tab. 05 zone pic s99999 OCCURS 10. N'écrivez pas de COPY-DDS pour ce format et utilisez : WRITE ecr FROM tab FORMAT "xxx". Ce qui compte c'est que LA STRUCTURE du buffer soit cohérente avec la définition du format du DSPF. cela ne sera vérifié qu'à l'exécution, le nom du format pouvant être lui-même dans une variable. |
Les indicateurs sont générées avec la clause PIC 1 en indiquant leur numéro système. (le mot INxx n'est pas réservé) Ils se manipulent par MOVE b"1"(vrai) to INxx, MOVE b"0" (faux) to INxx. Il est intéressant de noter que les indicateurs appartiennent au format, donc à la zone de groupe générée par le COPY-DDS Si la touche F3 (indicateur 03) est déclarée dans deux formats (F1 & F2) nous devrons les manipuler sous la forme in03 OF F1-I, in03 OF F2-I. Cette situation nous pousse à gérer les indicateurs dans un espace mémoire à part, et tant qu'à faire dans une table (ce n'est pas une obligation) 1/ Utilisation du mot-clé INDARA dans le DSPF (niveau fichier) 2/ SELECT ecran ASSIGN TO WORKSTN-DSPF-SI (SI = Séparate indicators) 3/ en W-S 01 IND PIC1 OCCURS 99 INDICATOR 01 . |
Les indicateurs sont devenus uniques Ils se manipulent sous la forme MOVE b"1" to IND(03). ou MOVE 3 TO X. MOVE b"1" to IND(x). Vous devez rajouter sur vos ordres d'E/S ecran (READ, WRITE, ...) .... INDIC IND. (ou INDICATOR, INDICATORS, nous sommes en COBOL) READ ecran INTO xxxxxx-I FORMAT "xxxxxx" INDIC ind. WRITE ecr FROM xxxxxx-O FORMAT "xxxxxx" INDIC ind. |
En ce qui concerne les sous-fichiers : Vous devez déclarer la zone contenant le N° de rang lors du SELECT. **********FICHIER ECRAN***************** SELECT ECRAN ASSIGN TO WORKSTATION-DSPFCBL-SI ORGANIZATION TRANSACTION ACCESS DYNAMIC RELATIVE KEY RANG . *------------------------ WORKING-STORAGE SECTION. *------------------------ 01 TABINDC. 02 IND PIC 1 OCCURS 99 INDIC 01. 77 RANG PIC 9(4) . * * PHASE DE MISE A BLANC DU SOUS-FICHIER (format de contrôle) * MOVE ZERO TO RANG. MOVE b"0" TO IND(30) IND(31). (condition SFLDSP/SFLDSPCTL) (rend SFLCLR vrai [N31].) |
* * ECRITURE d'un enregistrement dans le sous-fichier * (format d'enregistrement) * perform until eof ADD 1 TO RANG. MOVE b"1" to IND(30) (condition SFLDSP) WRITE SUBFILE ECR FROM FMTENR FORMAT "FMTENR". READ fichier AT END set eof to true END-READ end-perform. * * AFFICHAGE (format de contrôle) * MOVE B"1" TO IND(31). (condition SFLDSPCTL) WRITE ECR FROM FMTCTL-O FORMAT "FMTCTL" INDIC TABINDC. |
* * LECTURE des enregistrements modifiés * (format d'enregistrement) * perform until eosubf READ SUBFILE ECRAN NEXT MODIFIED INTO FMTENR FORMAT "FMTENR" AT END set eosubf true END-READ EVALUATE option WHEN = '2' PERFORM modif WHEN = '5' PERFORM affich END-EVALUATE end-perform. * Acces direct Move x TO RANG. READ SUBFILE ECRAN INTO FMTENR FORMAT "FMTENR" INVALID KEY ... |