Pages

Virgule avec calcul et entrées sujet

vendredi 31 janvier 2014




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 :

Citation:









0012000 001.25 TEST LDD
0000042 000000 LOLILOL Divers.




Bon, avec 12000 à 1.25%, on doit obtenir à la fin 150 (facile à tester donc).

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).


Et en sortie ça affichera :

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).


[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 :


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.


Lors des DISPLAY de debug, je peux voir ceci :

Citation:









Current money : 0012000
Percentage : 001..2
Name temp : TEST
Current money : 0000042
Percentage : 000.00
Name temp : LOLILOL




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 .




Aucun commentaire:

Enregistrer un commentaire