2010-10-30 25 views
1

J'ai encore un peu de mal avec mes devoirs COBOL. Je pense que tout est supposé être, mais pour une raison quelconque, je ne peux pas obtenir de données de sortie lorsque j'exécute mon programme. Tout ce qu'il fait est de montrer des lignes vides comme quelqu'un vient d'appuyer sur la touche d'entrée encore et encore. Ça craint vraiment parce que je ne peux pas voir si j'ai raison ou tort. Voici mon code:Ma sortie n'apparaît pas dans COBOL

WORKING-STORAGE SECTION. 
    01 ARE-THERE-MORE-RECORDS  PIC X(3) VALUE 'YES'. 

    01 LINE-COUNT     PIC 99 VALUE ZEROS. 

    01 WS-DATE. 
     05 RUN-YEAR    PIC XX. 
     05 RUN-MONTH    PIC XX. 
     05 RUN-DAY     PIC XX. 
    01 HEADING-LINE-1. 
     05       PIC X(24) VALUE SPACES. 
     05       PIC X(26) 
      VALUE 'BASEBALL PLAYER STATISTICS'. 
     05       PIC X(12) VALUE SPACES. 
     05 HL-1-DATE. 
      10 MONTH-2    PIC XX. 
      10      PIC X  VALUE '/'. 
      10 DAY-2    PIC XX. 
      10      PIC X  VALUE '/'. 
      10 YEAR-2    PIC XX. 
     05       PIC X(6) VALUE SPACES. 
     05 PAGE-1     PIC X(4) VALUE 'PAGE'. 

    01 HEADING-LINE-2. 
     05       PIC X(6) VALUE 'LEAGUE'. 
     05       PIC X(3) VALUE SPACES. 
     05       PIC X(4) VALUE 'TEAM'. 
     05       PIC X(5) VALUE SPACES. 
     05       PIC X(4) VALUE 'NAME'. 
     05       PIC X(10) VALUE SPACES. 
     05       PIC X(4) VALUE 'HITS'. 
     05       PIC X(6) VALUE SPACES. 
     05       PIC X(7) VALUE 'AT BATS'. 
    01 DETAIL-LINE. 
     05 BLANK-A-OUT    PIC X  VALUE SPACES. 
     05 DL-LEAGUE    PIC XX. 
     05 BLANK-B-OUT    PIC X(3) VALUE SPACES. 
     05 DL-TEAM     PIC X(3). 
     05 BLANK-C-OUT    PIC X(3) VALUE SPACES. 
     05 DL-NAME     PIC X(10). 
     05 BLANK-D-OUT    PIC X(3) VALUE SPACES. 
     05 DL-HITS     PIC ZZ9. 
     05 BLANK-E-OUT    PIC X(3) VALUE SPACES. 
     05 DL-AT-BATS    PIC ZZ9. 

    PROCEDURE DIVISION. 
    100-MAIN. 
     OPEN INPUT BASEBALL-FILE-IN 
     OPEN OUTPUT BASEBALL-FILE-OUT 

     ACCEPT WS-DATE FROM DATE 
     MOVE RUN-MONTH TO MONTH-2 
     MOVE RUN-DAY TO DAY-2 
     MOVE RUN-YEAR TO YEAR-2 
     WRITE BASEBALL-RECORD-OUT 

     PERFORM UNTIL ARE-THERE-MORE-RECORDS = 'NO ' 
      READ BASEBALL-FILE-IN 
       AT END 
        MOVE 'NO ' TO ARE-THERE-MORE-RECORDS 
       NOT AT END 
        PERFORM 200-PROCESS-ONE-RECORD 
      END-READ 
     END-PERFORM 

     CLOSE BASEBALL-FILE-IN 
     CLOSE BASEBALL-FILE-OUT 
     STOP RUN. 


    200-PROCESS-ONE-RECORD. 
     MOVE LEAGUE-IN TO DL-LEAGUE 
     MOVE SPACES TO BLANK-A-OUT 
     MOVE TEAM-IN TO DL-TEAM 
     MOVE SPACES TO BLANK-B-OUT 
     MOVE NAME-IN TO DL-NAME 
     MOVE SPACES TO BLANK-C-OUT 
     MOVE HITS-IN TO DL-HITS 
     MOVE SPACES TO BLANK-D-OUT 
     MOVE AT-BATS-IN TO DL-AT-BATS 
     MOVE SPACES TO BLANK-E-OUT 
     WRITE BASEBALL-RECORD-OUT 
      AFTER ADVANCING 2 LINES. 

    300-LINE. 
     IF LINE-COUNT >= 50 
      PERFORM 400-NEXT-PAGE 
     END-IF 
     WRITE BASEBALL-RECORD-OUT 
      AFTER ADVANCING 1 LINE 
     ADD 1 TO LINE-COUNT. 

    400-NEXT-PAGE. 
     WRITE BASEBALL-RECORD-OUT 
      AFTER ADVANCING PAGE 
     MOVE ZEROS TO LINE-COUNT. 

Répondre

1

Vous ne déplacez jamais les données lues depuis BASEBALL-2.SEQ dans l'enregistrement utilisé pour écrire BASEBALL-2.RPT.

Vous pouvez faire peut utiliser quelque chose comme

* WRITE THE HEADER INFO 
MOVE HEADING-LINE-1 TO BASEBALL-RECORD-OUT 
WRITE BASEBALL-RECORD-OUT 

Ou

WRITE BASEBALL-RECORD-OUT FROM HEADING-LINE-1 

De même, vous pouvez écrire les détails Line

* WRITE THE DETAIL 
MOVE DETAIL-LINE TO BASEBALL-RECORD-OUT 
WRITE BASEBALL-RECORD-OUT 
0

Il a été un moment que je l'ai touché Cobol mais vous manque probablement la mise à jour BASEBALL-RECORD-OUT.

0

Vous devez déplacer HEADING-LINE-1, HEADING-LINE-2 et DETAIL-LINE sur BASEBALL-RECORD-OUT avant d'écrire en mode BASEBALL-RECORD-OUT.

3

Plusieurs modèles différents lors du codage COBOL I/O opérations. Je vois deux modèles distincts dans votre programme.

Motif 1:

Définir les clichés d'enregistrement d'E/S sous l'entrée FD. Vous l'avez fait pour votre fichier d'entrée. BASEBALL-RECORD-IN sert à la fois de tampon d'E/S de fichier et de description d'enregistrement complète.

Modèle 2:

Définir un tampon d'enregistrement FD fictif puis créer enregistrement de détails supplémentaires définitions sous travail de stockage. Vous l'avez fait pour votre enregistrement de sortie. BASEBALL-RECORD-OUT est juste un tampon d'E/S et les dispositions d'enregistrement de détail sont défendues sous Working Strorage en utilisant trois configurations différentes d'enregistrement : HEADING-LINE-1, HEADING-LINE-1 et DETAIL-LINE.

Quelle est la différence?

Les différences primaires concernent le moment où chacun de ces enregistrements devient adressable et comment vous lisez/écrivez des données. Lors de l'utilisation de Pattern 1, seule une mémoire tampon d'enregistrement unique est allouée. C'est l'enregistrement associé à la clause FD du fichier. Dans votre cas, il s'agit de l'enregistrement BASEBALL-RECORD-IN de 36 octets. Ce tampon peut ne pas être adressable avant que le fichier auquel il est associé ait été OUVERT. Tenter pour accéder à ce tampon d'enregistrement (en l'initialisant explicitement, en déplaçant des espaces à lui ou toute autre référence) provoquerait une erreur d'exécution (accident et graver). Après l'ouverture et la lecture, les données sont disponibles dans le tampon d'enregistrement associé à la FD. Étant donné que cette FD a une structure d'enregistrement définie, vous pouvez référencer n'importe lequel des champs de celle-ci (par exemple NAME-IN) immédiatement après l'émission d'une instruction READ.Lorsque vous utilisez le modèle 2, les structures d'enregistrement séparées sont déclarées dans Stockage de travail. Ici les enregistrements HEADING-LINE-1, HEADING-LINE-2 et DETAIL-LINE sont tous adressables lorsque le programme démarre - même si le tampon d'enregistrement de sortie BASEBALL-RECORD-OUT (associé avec le FD) ne sera pas adressable jusqu'à ce que le fichier de sortie ait été ouvert. La chose à retenir ici est qu'il n'y a pas de connexion "automatique" entre le tampon d'enregistrement BASEBALL-RECORD-OUT et les enregistrements de stockage HEADING-LINE-1, HEADING-LINE-2 et DETAIL-LINE - vous devez explicitement déplacer les données de travail de stockage dans le tampon d'enregistrement en utilisant quelque chose comme:

MOVE HEADING-LINE-1 TO BASEBALL-RECORD-OUT 
WRITE BASEBALL-RECORD-OUT 

avant chaque opération d'écriture. Sinon, vous pouvez écrire du dossier de travail de stockage comme dans:

WRITE BASEBALL-RECORD-OUT FROM HEADING-LINE-1 

Ceci est juste un moyen enrobé de sucre de faire MOVE/écriture illustré ci-dessus. Cette explication devrait vous expliquer pourquoi le READ place les données directement dans une structure d'enregistrement entièrement pour référence, mais WRITE nécessite un MOVE supplémentaire de quelque sorte.

Ce sont deux modèles d'E/S disponibles en COBOL. Comme vous en apprendre plus sur la langue un certain nombre de modèles supplémentaires devraient également se révéler.

0

Je vois qu'il y a deux paragraphes qui ne sont pas exécutés dans le code commençant par 300- et 400- car ils ne sont pas exécutés et sont en dessous du cycle d'arrêt. Il peut y avoir des entrées i-o-control omises pour la sortie vers le fichier et la sortie semble être écrite dans un fichier et non sur un écran ou une imprimante. Cela dépend de tous les paramètres par défaut ou ceux de toute affectation ou redirection externe.