cobol читает запись переменной длины с ленты возвращает длину 0 - PullRequest
1 голос
/ 05 мая 2020

У меня есть программа COBOL, которая считывает записи из UNIT = TAPE

Длина записи является переменной длиной.

Я пытаюсь читать записи переменной длины и получать длину записи в переменной, но У меня нулевая длина.

Мой вопрос в том, что не так с кодом, который я написал

Это мой код:

 IDENTIFICATION DIVISION.                                    
   PROGRAM-ID. TDCBLALC.                                       
   ENVIRONMENT DIVISION.                                       
   INPUT-OUTPUT SECTION.                                       
   FILE-CONTROL.                                               
       SELECT KOVETZ-SPOOL ASSIGN TO OTFILE                    
         ORGANIZATION IS SEQUENTIAL                            
         ACCESS  MODE IS SEQUENTIAL                            
         FILE STATUS IS SW-END.                                
   DATA DIVISION.                                              
   FILE SECTION.                                               
   FD  KOVETZ-SPOOL                                            
       LABEL RECORD IS STANDARD                                
       RECORD IS VARYING IN SIZE FROM 1 TO 12600               
       DEPENDING ON ORECH-S                                    
       RECORDING MODE IS V.                                    
    01  RESHUMAT-SPOOL             PIC X(12600).               
   WORKING-STORAGE SECTION.                                    
    01  ORECH-S           PIC 9(8) COMP.                       
    01 I                  PIC S9(4) VALUE 0.                   
    01 SW-END PIC 99.                                          
    01 FN PIC X(44).                                           
    01 WS-ALLOC-STRING PIC X(100).                             
    01 PGM PIC X(08) VALUE 'BPXWDYN'.                          
   PROCEDURE DIVISION.                                         
       MOVE 'LYTO.SPOOL.PISD0735.T1401803.M001.D1191030' TO FN.
       STRING 'ALLOC DD(OTFILE) DSN(' DELIMITED BY SIZE          
              FN DELIMITED BY SPACE                              
              ') SHR REUSE '                                     
              ' UNIT(TAPE) '                                     
               DELIMITED BY SIZE                                 
        INTO WS-ALLOC-STRING                                     
       END-STRING.                                               
       DISPLAY ' WS-ALLOC-STRING *' WS-ALLOC-STRING '*'          
       CALL PGM USING WS-ALLOC-STRING.                           
       DISPLAY 'ALLOC RC='RETURN-CODE.                           
       OPEN INPUT KOVETZ-SPOOL                                   
       DISPLAY 'OPEN RC='RETURN-CODE.                            
       MOVE 00 TO SW-END                                         
       READ KOVETZ-SPOOL                                         
            AT END MOVE 1 TO SW-END                              
       END-READ                                                  
       DISPLAY 'READ RC='RETURN-CODE' SW-END='SW-END             

       PERFORM UNTIL SW-END = 1 OR I > 100                       
            ADD 1 TO I                                           
            DISPLAY 'ORECH-S=' ORECH-S                           
            DISPLAY 'RESHUMAT-SPOOL=' RESHUMAT-SPOOL(1:100)      
             READ KOVETZ-SPOOL                                   
               AT END MOVE 1 TO SW-END                           
             END-READ                                            
            DISPLAY 'READ RC='RETURN-CODE' SW-END='SW-END        
       END-PERFORM           

        CLOSE KOVETZ-SPOOL   

       GOBACK. 

Код возврата alloc = 0

Код возврата open = 0

Код возврата чтения = 0

Состояние файла (SW-END) после чтения: 47 (операция READ или START была попытка открыть файл INPUT или IO)

Не знаю почему, я явно открываю файл для ввода

В любом случае проблема осталась. Длина записи после чтения равна нулю

ORECH-S = 00000000

1 Ответ

1 голос
/ 05 мая 2020

Простая опечатка - вы забыли объявить СЕКЦИЮ РАБОЧЕГО ХРАНИЛИЩА

   IDENTIFICATION DIVISION.                       
   PROGRAM-ID. TDCBLALC.                          
   ENVIRONMENT DIVISION.                          
   INPUT-OUTPUT SECTION.                          
   FILE-CONTROL.                                  
       SELECT KOVETZ-SPOOL 
              ASSIGN TO OTFILE       
              ORGANIZATION IS SEQUENTIAL               
              FILE STATUS IS SW-END.                   

   DATA DIVISION.                                 
   FILE SECTION.                                  
   FD  KOVETZ-SPOOL                               
       LABEL RECORD IS STANDARD                                     
       RECORD IS VARYING IN SIZE FROM 1 TO 32600  
       DEPENDING ON ORECH-S                       
       RECORDING MODE IS V.                       
   01  RESHUMAT-SPOOL             PIC X(32600).

   WORKING-STORAGE SECTION.
   01  ORECH-S           PIC 9(8) COMP.     
   01 I                  PIC S9(4) VALUE 0. 
   01 SW-END PIC X(02).                     
   01 FN PIC X(44).                         
   01 WS-ALLOC-STRING PIC X(100).           
   01 PGM PIC X(08) VALUE 'BPXWDYN'.        

   PROCEDURE DIVISION.        
       MOVE 'LYTO.SPOOL.PISD0735.T1401803.M001.D1191030' TO FN.
       STRING 'ALLOC DD(OTFILE) DSN(' FN ') SHR REUSE '        
              ' UNIT(TAPE) '                                   
                   DELIMITED BY SIZE                                       
         INTO WS-ALLOC-STRING                                   
       END-STRING.   
       DISPLAY ' WS-ALLOC-STRING *' WS-ALLOC-STRING '*'        
       CALL PGM USING WS-ALLOC-STRING.                         
       DISPLAY RETURN-CODE.                                    
       OPEN INPUT KOVETZ-SPOOL                                 
       READ KOVETZ-SPOOL                                       
           AT END MOVE 1 TO SW-END                            
       END-READ   

       PERFORM UNTIL SW-END = 1 OR I > 100                   
           ADD 1 TO I                                       
           DISPLAY 'ORECH-S=' ORECH-S                       
           DISPLAY 'RESHUMAT-SPOOL=' RESHUMAT-SPOOL(1:100)  
           READ KOVETZ-SPOOL                               
             AT END MOVE 1 TO SW-END                       
           END-READ                                        
       END-PERFORM                                           

       CLOSE KOVETZ-SPOOL                                   

       GOBACK.

Я скомпилировал и запустил это с помощью GnuCobol, чтобы программа была синтаксически и логически правильной. Я заменил локальный файл и закомментировал вызов BPXDYN, поскольку я запускаю его на Linux, а файл имеет соглашение об именах Z / OS.

Не удалось выделить файл, поэтому открыть файл тоже не удалось, но он никогда не проверял статус файла. Чтение возвращает '47', поскольку файл никогда не открывался успешно

Программа выдала следующее: ALLO C DD (OTFILE) DSN (LYTO.SPOOL.PISD0735.T1401803.M001.D1191030) SHR REUSE UNIT (TAPE)

Имя набора данных необходимо заключить в кавычки, иначе система попытается поставить перед ним ваш идентификатор TSO.

...