Ошибка компиляции программы COBOL с последовательными файлами

У меня есть эта программа COBOL на моем мэйнфрейме:

       IDENTIFICATION DIVISION.                                          
       PROGRAM-ID. TEST2.                                                
       ENVIRONMENT DIVISION.                                             
       INPUT-OUTPUT SECTION.                                             
       FILE-CONTROL.                                                     
           SELECT DATOS ASSIGN TO INPUTFL.                               
       DATA DIVISION.                                                    
       FILE SECTION.                                                     
       FD DATOS.                                                         
          01  REG-DAT.                                                   
              05  ID-LB           PIC 9(10).                             
              05  TITULO          PIC X(16).                             
              05  GEN-1           PIC X(8).                              
              05  GEN-2           PIC X(11).                             
              05  STOCK           PIC 99.                                
              05  FILLER          PIC X(33).                             
       WORKING-STORAGE SECTION.                                          
           01  FIN      PIC X VALUE 'N'.                                 
       PROCEDURE DIVISION.                                               
       1000-ABRIR.                                                       
           OPEN INPUT DATOS                                             
                PERFORM 2000-LEER UNTIL FIN = 'S'                       
           CLOSE DATOS                                                  
           STOP RUN.                                                    
       2000-LEER.                                                       
           READ DATOS                                                   
                AT END MOVE 'S' TO FIN                                  
                NOT AT END PERFORM 2100-MOSTRAR.                                                    
       2100-MOSTRAR.                                                    
           DISPLAY 'ID LIBRO: ' ID-LB.                                  
           DISPLAY 'TITULO: ' TITULO.                                   
           DISPLAY 'GENERO PRINCIPAL: ' GEN-1.                          
           DISPLAY 'GENERO SECUNDARIO: ' GEN-2.                         
           DISPLAY 'STOCK: ' STOCK.                                     
           DISPLAY '--------------------------------'.                             

Прежде чем тестировать его, я должен его скомпилировать, но когда я запускаю JCL, он выдает ошибку 0012. Это JCL:

//HERC0101 JOB (COBOL),                                              
//             'COBOL COMPILATION',                                  
//             CLASS=A,                                              
//             MSGCLASS=H,                                           
//             REGION=8M,TIME=1440,                                  
//             NOTIFY=HERC01,                                        
//             MSGLEVEL=(1,1)                                        
//****************************************************************** 
//*                                                                  
//* THIS JOB HAS AS PURPOSE COMPILE THE COBOL CODE                   
//* PROCEDURE LOCATED @ SYS2.PROCLIB(COBOL)                          
//*                                                                  
//****************************************************************** 
//COMPILE  EXEC COBOL,                                               
//         PROG='TEST2',                                             
//         PDSF='MBVT.APPLICBC.SRC',                                 
//         PDSL='MBVT.APPLICBC.LOAD'                                 
/*                                                                   
//                                                                   

Я попробовал использовать другой, более простой код, например этот:

       IDENTIFICATION DIVISION.     
       PROGRAM-ID. TEST2.            
       ENVIRONMENT DIVISION.        
       DATA DIVISION.               
       PROCEDURE DIVISION.          
           DISPLAY 'HOLA MUNDO!!'.  
           STOP RUN.                

И JCL скомпилировал его правильно, но с другим показал мне такую ​​ошибку: IEF202I HERC0101 LKED COMPILE - STEP WAS NOT RUN BECAUSE OF CONDITION CODES В журнале показана вся процедура, и после показа кода показано следующее:

                                                                                
 6      IKF1155I-W     DEVICE CLASS INVALID IN SYSTEM-NAME. SKIPPING TO NEXT FIE
6      IKF1141I-W     FILE ORGANIZATION FIELD INVALID IN SYSTEM-NAME.  SEQUENTI
6      IKF1157I-E     EXTERNAL-NAME NOT PRESENT IN SYSTEM-NAME.                
6      IKF2133I-W     LABEL RECORDS CLAUSE MISSING. DD CARD OPTION WILL BE TAKE
27     IKF4052I-E     NOT    MAY NOT BE TARGET FIELD FOR ALPHANUMERIC LITERAL  
                      AND IS DISCARDED.                                        
27     IKF4052I-E     AT    MAY NOT BE TARGET FIELD FOR ALPHANUMERIC LITERAL  (
                      AND IS DISCARDED.                                        
27     IKF4052I-E     END    MAY NOT BE TARGET FIELD FOR ALPHANUMERIC LITERAL  
                      AND IS DISCARDED.                                        
28     IKF4072I-W     EXIT FROM PERFORMED PROCEDURE ASSUMED BEFORE PROCEDURE-NA
                                                                                

Почти все проблемы с COBOL можно исправить, добавив больше точек (символов .):-)

paxdiablo 25.06.2024 22:52

В системе отсутствует оператор DD для файла INPUTFL.

not2savvy 25.06.2024 23:10

где в JCL мне следует поместить оператор DD?

Juan 25.06.2024 23:37

Обычно на мэйнфреймах JCL для компиляции программы COBOL отделен от JCL для запуска скомпилированной программы COBOL.

Gilbert Le Blanc 26.06.2024 01:53

@ Хуан, тебе действительно не следует задавать здесь эти вопросы. Retrocomputing.stackexchange.com — подходящее место, так как вы только запутаете людей и себя. Если вы настаиваете на том, чтобы задать их здесь, вам нужно начать с сообщения людям, что вы используете MVS Release 3.8J, чтобы люди, знакомые с новыми операционными системами, не пытались помочь вам с информацией, которая неверна на ОС, которую вы используете.

Kevin McKenzie 26.06.2024 14:21

@GilbertLeBlanc, как я уже писал в своем посте, я не пытаюсь запустить программу COBOL, просто скомпилирую ее

Juan 26.06.2024 16:20

"И JCL скомпилировал правильно, но с другим" Каким другим? Для компиляции программы COBOL должен быть один и только один JCL.

Gilbert Le Blanc 26.06.2024 18:37

другой код @GilbertLeBlanc прочитайте полное заявление

Juan 26.06.2024 22:50
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
1
8
93
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Как упоминалось в вашей предыдущей теме, вы используете старый эмулятор и, следовательно, все странные сообщения. Для справки: программа отлично компилируется на z/OS.

Вы используете старый (например, MVT) компилятор COBOL, синтаксис которого совершенно другой по сравнению с компилятором COBOL, используемым на компьютере z/OS.

Итак, вы можете попробовать изменить эту строку

SELECT DATOS ASSIGN TO INPUTFL.     

К

SELECT DATOS ASSIGN TO UT-S-INPUTFL.

что избавит от сообщения об ошибке, показанного в строке 6.

Также обратите внимание, что вам нужно переместить определения 01 в позицию 8, как показано ниже.

----+----1----+----2----+----3----+----4----+----5----+-
       FD DATOS.                                        
       01 REG-DAT.                                      
           05  ID-LB           PIC 9(10).               
           05  TITULO          PIC X(16).               
           05  GEN-1           PIC X(8).                
           05  GEN-2           PIC X(11).               
           05  STOCK           PIC 99.                  
           05  FILLER          PIC X(33).               
       WORKING-STORAGE SECTION.                         
       01  FIN                 PIC X VALUE 'N'.         

Не работает то, что вы предлагаете, все равно показывает ту же ошибку

Juan 26.06.2024 16:19

@Juan: Тогда вам нужно внести дополнительные изменения в код.

Gilbert Le Blanc 26.06.2024 18:40

как что?? Я принимаю предложения @GilbertLeBlanc

Juan 26.06.2024 22:52

Хуан, тебе нужно взять руководство к компилятору, который ты используешь, и поискать синтаксис. Как упоминалось ранее, вы используете очень старый компилятор, а большинство из нас даже НЕ используют этот компилятор.

Kolusu 27.06.2024 19:15

Колусу и другие плакаты. Не могли бы вы пояснить, что вы используете эмулятор мэйнфрейма Hercules. Легально доступное программное обеспечение для этого эмулятора устарело более чем на двадцать лет.

James Anderson 04.07.2024 11:59
Ответ принят как подходящий

NOT AT END был добавлен в COBOL85, поэтому может быть недоступен в очень старых эмуляторах.
Затем компилятор применяет их к оператору MOVE с несколькими целями, как если бы вы запрограммировали

        MOVE 'S' TO FIN
        MOVE 'S' TO NOT
        MOVE 'S' TO AT
        MOVE 'S' TO END

и поэтому выводит IKF4052I-E в этой строке три раза

NOT    MAY NOT BE TARGET FIELD FOR ALPHANUMERIC LITERAL AND IS DISCARDED.
AT     MAY NOT BE TARGET FIELD FOR ALPHANUMERIC LITERAL AND IS DISCARDED.
END    MAY NOT BE TARGET FIELD FOR ALPHANUMERIC LITERAL AND IS DISCARDED.

Если вам действительно нужно использовать этот древний компилятор, перекодируйте READ следующим образом:

           READ DATOS                                                   
                AT END MOVE 'S' TO FIN.                                 
           IF FIN NOT = 'S'                                             
              PERFORM 2100-MOSTRAR.                                     

Как указал Колусу, вам нужна утилита класса устройства «UT» device = disk и идентификатор организации «S» последовательно:

       FILE-CONTROL.                                                     
           SELECT DATOS ASSIGN TO UT-S-INPUTFL.                            

Чтобы исправить предупреждение о записях меток, измените FD следующим образом:

       FD DATOS LABEL RECORDS ARE STANDARD.                              

В любом случае вам следует начинать уровень 01 в столбце 8–11, поэтому переместите объявление FIN хотя бы на один столбец влево:

       WORKING-STORAGE SECTION.                                          
          01  FIN      PIC X VALUE 'N'.                                  

Чтобы исправить последнее предупреждение, вы можете попробовать добавить следующее:

       2095-LEER-EX.                                                    
           EXIT.                                                        

Другие вопросы по теме