J'ai fais l'EDIT pour le MAZONE.
En effet c'est étonnant que le compilateur n'ait rien dit pour ça.
J'ai mis 2 GOTO exclusivement pour quitter si ça échoue (je n'ai pas encore trouvé d'équivelent au RETURN en C), donc normalement il n'y aura pas de problème avec ça (et je suis beaucoup plus habitué à appeler des fonctions + while/for + if plutôt qu'à faire des PERFORM )
Moi-même je trouve le code assez laid....
On va décomplexifier (vu que j'ai dupliqué du code pour traiter les 2 fichiers).
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91
| IDENTIFICATION DIVISION.
PROGRAM-ID. REORG.
ENVIRONMENT DIVISION.
CONFIGURATION SECTION.
SOURCE-COMPUTER. PC-I686.
OBJECT-COMPUTER. PC-I686.
INPUT-OUTPUT SECTION.
FILE-CONTROL.
SELECT ACCT-DATA ASSIGN TO DISK "ACCT.DAT"
ORGANIZATION IS LINE SEQUENTIAL
FILE STATUS IS ST-ACCT-IN.
SELECT ACCT-DATA-OUT ASSIGN TO DISK "ACCT-KEY.DAT"
ORGANIZATION INDEXED
RECORD KEY TYPE-OUT OF ACCT-DATA-OUT
FILE STATUS IS ST-ACCT-OUT.
DATA DIVISION.
FILE SECTION.
* * Account analyzed
FD ACCT-DATA.
01 ACCT-RECORD.
05 OWNER-NAME-IN PICTURE X(20).
05 PICTURE X(1).
05 SAVING-IN PICTURE 9(7).
05 PICTURE X(1).
05 TYPE-IN PICTURE X(20).
* * Account analyzed with key
FD ACCT-DATA-OUT.
01 ACCT-OUT-RECORD.
05 OWNER-NAME-OUT PICTURE X(20).
05 SAVING-OUT PICTURE 9(7).
01 TYPE-OUT PICTURE X(20).
WORKING-STORAGE SECTION.
01 ARE-THERE-MORE-RECORDS PICTURE XXX VALUE 'YES'.
77 CURRENT-NAME PICTURE X(20).
77 CURRENT-ENTRIES PICTURE 999.
01 ST-ACCT-IN PIC X(02) VALUE SPACES.
88 ST-ACCT-IN-SUCCESS VALUE '00'.
88 ST-ACCT-IN-EOF VALUE '10'.
01 ST-ACCT-OUT PIC X(02) VALUE SPACES.
88 ST-ACCT-OUT-SUCCESS VALUE '00'.
88 ST-ACCT-OUT-EOF VALUE '10'.
01 IS-FIRST-ENTRY PICTURE XXX VALUE 'YES'.
88 NOT-FIRST-ENTRY VALUE 'NO '.
PROCEDURE DIVISION.
100-MAIN-MODULE.
INITIALIZE ST-ACCT-IN ST-ACCT-OUT
PERFORM 200-COPY-ACCT
STOP RUN.
110-ERROR-EXIT.
EXIT.
STOP RUN.
200-COPY-ACCT.
MOVE 'YES' TO IS-FIRST-ENTRY
OPEN INPUT ACCT-DATA
OUTPUT ACCT-DATA-OUT.
IF ST-ACCT-IN-SUCCESS AND ST-ACCT-OUT-SUCCESS
DISPLAY "ACCT OPEN SUCCESSFUL"
ELSE
DISPLAY "ACCT OPEN FAILED"
GO TO 110-ERROR-EXIT
END-IF.
READ ACCT-DATA INTO ACCT-RECORD
AT END MOVE 'NO ' TO ARE-THERE-MORE-RECORDS
END-READ.
PERFORM 210-WRITE-ACCT
UNTIL ARE-THERE-MORE-RECORDS = 'NO'.
CLOSE ACCT-DATA
ACCT-DATA-OUT.
210-WRITE-ACCT.
MOVE OWNER-NAME-IN TO OWNER-NAME-OUT.
MOVE SAVING-IN TO SAVING-OUT.
MOVE TYPE-IN TO TYPE-OUT.
WRITE ACCT-OUT-RECORD
WRITE TYPE-OUT
READ ACCT-DATA INTO ACCT-RECORD
AT END MOVE 'NO ' TO ARE-THERE-MORE-RECORDS
END-READ.
* * DISPLAY "Name temp : " NAME-ST
END PROGRAM INTERETS. |
Voilà, le but c'est de transformer un fichier séquentiel simple en séquentiel indexé.
Donc écrire depuis un 1er fichier vers un 2e.
- Quand on écrit dans un fichier indexé en sortie séquentielle, il faut que les enregistrements écrits soient dans l'ordre de la clé, sinon ça marche pas.
Généralement on ouvre un fichier séquentiel indexé en INPUT-OUTPUT et on déclare un ACCESS DYNAMIC ou RANDOM, si on n'indique pas le type d'accès, il est SEQUENTIAL par défaut. Une lecture de vérification de l'existence de la clé avant l'écriture de l'enregistrement est plus que souhaitée.
Dans l'ordre de la clé ?
Ici j'ai écrit dans le FILE CONTROL :
RECORD KEY TYPE-OUT OF ACCT-DATA-OUT
Et en FILE DESCRIPTOR :
1 2 3 4 5
| FD ACCT-DATA-OUT.
01 ACCT-OUT-RECORD.
05 OWNER-NAME-OUT PICTURE X(20).
05 SAVING-OUT PICTURE 9(7).
01 TYPE-OUT PICTURE X(20). |
Il faut bel et bien indiquer l'image mémoire précise qui sert de clé ? (TYPE-OUT)
Je l'ai mis en 01, mais il faut peut être "aussi" la mettre en 1er ?
Les options RANDOM, DYNAMIC, ... ne sont pas très utiles dans mon cas où il s'agit "uniquement" d'écriture ?
Partager