Bonjour,
M'ennuyant un peu et ayant ouvert un LDD... j'ai décidé de calculer mes intérêts en COBOL !... (bon oui j'ai d'abord fait la calculatrice Windows avant...)
Et petit à petit, je me suis dit que je pouvais faire un truc assez générique si je m'y penche beaucoup.
Pour le moment je fais très simple : 1 fichier qui contient le contenu du compte, le pourcentage d'intérêts, le nom de la personne, et la description de la ligne (type de compte)
Voici donc le format d'un fichier en entrée :
Bon, avec 12000 à 1.25%, on doit obtenir à la fin 150 (facile à tester donc).
Dans ma déclaration COBOL j'ai donc :
Et en sortie ça affichera :
[je viens de tilter que je n'ai pas mis de virgule dans le contenu du compte... on verra plus tard]
Mon code est très TRES similaire à celui que j'avais fais il y a quelques années et le voici :
Lors des DISPLAY de debug, je peux voir ceci :
Pourquoi y a-t-il un 001..2 au lieu d'un 001.25 ?
Le nom est décalé d'une espace du coup... (car le 5 passe en X(1) )
Merci de m'éclairer !
Je pense que ça vient de ma déclaration 999V99, mais je n'ai pas encore bien compris comment gérer les V , et .
M'ennuyant un peu et ayant ouvert un LDD... j'ai décidé de calculer mes intérêts en COBOL !... (bon oui j'ai d'abord fait la calculatrice Windows avant...)
Et petit à petit, je me suis dit que je pouvais faire un truc assez générique si je m'y penche beaucoup.
Pour le moment je fais très simple : 1 fichier qui contient le contenu du compte, le pourcentage d'intérêts, le nom de la personne, et la description de la ligne (type de compte)
Voici donc le format d'un fichier en entrée :
Citation:
0012000 001.25 TEST LDD 0000042 000000 LOLILOL Divers. |
Dans ma déclaration COBOL j'ai donc :
Code:
FD ACCT-DATA.
01 ACCT-RECORD.
05 CURRENT-OWNED-IN PICTURE 9(7).
05 PICTURE X(1).
05 PERCENTAGE-IN PICTURE 999V99.
05 PICTURE X(1).
05 NAME-IN PICTURE X(20).
05 PICTURE X(1).
05 DESCRIPTION-IN PICTURE X(20).Code:
FD TOTAL-DATA.
01 PRINT-REC.
05 NAME-OUT PICTURE X(20).
05 PICTURE X(10).
05 TOTAL-OUT PICTURE Z(7).9(2).Mon code est très TRES similaire à celui que j'avais fais il y a quelques années et le voici :
Code:
IDENTIFICATION DIVISION.
PROGRAM-ID. INTERETS.
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.
SELECT TOTAL-DATA ASSIGN TO DISK "TOTAL.DAT"
ORGANIZATION IS LINE SEQUENTIAL.
SELECT SORTED-DATA ASSIGN TO DISK "SRT-TMP.DAT".
* * SELECT SORTED-DATA ASSIGN TO SYSWORK.
DATA DIVISION.
FILE SECTION.
FD ACCT-DATA.
01 ACCT-RECORD.
05 CURRENT-OWNED-IN PICTURE 9(7).
05 PICTURE X(1).
05 PERCENTAGE-IN PICTURE 999V99.
05 PICTURE X(1).
05 NAME-IN PICTURE X(20).
05 PICTURE X(1).
05 DESCRIPTION-IN PICTURE X(20).
SD SORTED-DATA.
01 SORTED-RECORD.
05 CURRENT-OWNED-ST PICTURE 9(7).
05 PICTURE X(1).
05 PERCENTAGE-ST PICTURE 999V99.
05 PICTURE X(1).
05 NAME-ST PICTURE X(20).
05 PICTURE X(1).
05 DESCRIPTION-ST PICTURE X(20).
FD TOTAL-DATA.
01 PRINT-REC.
05 NAME-OUT PICTURE X(20).
05 PICTURE X(10).
05 TOTAL-OUT PICTURE Z(7).9(2).
WORKING-STORAGE SECTION.
01 ARE-THERE-MORE-RECORDS PICTURE XXX VALUE 'YES'.
77 CURRENT-NAME PICTURE X(20).
77 CURRENT-TOTAL PICTURE 9(7)V99.
77 CURRENT-SUM PICTURE 9(7)V99.
77 CURRENT-ENTRIES PICTURE 999.
01 IS-FIRST-ENTRY PICTURE XXX VALUE 'YES'.
88 NOT-FIRST-ENTRY VALUE 'NO '.
PROCEDURE DIVISION.
100-MAIN-MODULE.
SORT SORTED-DATA ON ASCENDING KEY NAME-ST OF SORTED-RECORD
USING ACCT-DATA
OUTPUT PROCEDURE 200-MAIN-LOOP
STOP RUN.
200-MAIN-LOOP.
MOVE 'YES' TO IS-FIRST-ENTRY
OPEN OUTPUT TOTAL-DATA
PERFORM UNTIL ARE-THERE-MORE-RECORDS = 'NO'
RETURN SORTED-DATA
AT END
MOVE 'NO ' TO ARE-THERE-MORE-RECORDS
PERFORM 400-WRITE-SUM-TO-FILE
PERFORM 500-WRITE-LOG
NOT AT END
PERFORM 300-COUNT-ROUTINE
END-RETURN
END-PERFORM
CLOSE TOTAL-DATA.
300-COUNT-ROUTINE.
DISPLAY "Current money : " CURRENT-OWNED-ST
DISPLAY "Percentage : " PERCENTAGE-ST
DISPLAY "Name temp : " NAME-ST
IF IS-FIRST-ENTRY = 'YES'
* * Premiere iteration, on initialize tout
MOVE NAME-ST TO CURRENT-NAME
MOVE 0 TO CURRENT-TOTAL
MOVE 1 TO CURRENT-ENTRIES
MOVE 'NO ' TO IS-FIRST-ENTRY
ELSE
IF NAME-ST = CURRENT-NAME
* * 2e iteration ou plus dans un meme bloc de nom
* * On ajoute la depense associee
MULTIPLY CURRENT-OWNED-ST BY PERCENTAGE-ST GIVING CURRENT-SUM
ADD CURRENT-SUM TO CURRENT-TOTAL
ADD 1 TO CURRENT-ENTRIES
ELSE
* * On change de nom, donc on ecrit
PERFORM 400-WRITE-SUM-TO-FILE
* * On reinitialize avec le nouveau nom
MOVE NAME-ST TO CURRENT-NAME
MOVE 0 TO CURRENT-TOTAL
MOVE 1 TO CURRENT-ENTRIES
END-IF
END-IF.
400-WRITE-SUM-TO-FILE.
MOVE SPACES TO PRINT-REC
MOVE CURRENT-NAME TO NAME-OUT
MOVE CURRENT-TOTAL TO TOTAL-OUT
WRITE PRINT-REC.
500-WRITE-LOG.
MOVE "-------------------------------------" TO PRINT-REC
WRITE PRINT-REC.
END PROGRAM INTERETS.Citation:
Current money : 0012000 Percentage : 001..2 Name temp : TEST Current money : 0000042 Percentage : 000.00 Name temp : LOLILOL |
Le nom est décalé d'une espace du coup... (car le 5 passe en X(1) )
Merci de m'éclairer !
Je pense que ça vient de ma déclaration 999V99, mais je n'ai pas encore bien compris comment gérer les V , et .
Aucun commentaire:
Enregistrer un commentaire