У меня есть эта программа 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
В системе отсутствует оператор DD для файла INPUTFL.
где в JCL мне следует поместить оператор DD?
Обычно на мэйнфреймах JCL для компиляции программы COBOL отделен от JCL для запуска скомпилированной программы COBOL.
@ Хуан, тебе действительно не следует задавать здесь эти вопросы. Retrocomputing.stackexchange.com — подходящее место, так как вы только запутаете людей и себя. Если вы настаиваете на том, чтобы задать их здесь, вам нужно начать с сообщения людям, что вы используете MVS Release 3.8J, чтобы люди, знакомые с новыми операционными системами, не пытались помочь вам с информацией, которая неверна на ОС, которую вы используете.
@GilbertLeBlanc, как я уже писал в своем посте, я не пытаюсь запустить программу COBOL, просто скомпилирую ее
"И JCL скомпилировал правильно, но с другим" Каким другим? Для компиляции программы COBOL должен быть один и только один JCL.
другой код @GilbertLeBlanc прочитайте полное заявление





Как упоминалось в вашей предыдущей теме, вы используете старый эмулятор и, следовательно, все странные сообщения. Для справки: программа отлично компилируется на 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: Тогда вам нужно внести дополнительные изменения в код.
как что?? Я принимаю предложения @GilbertLeBlanc
Хуан, тебе нужно взять руководство к компилятору, который ты используешь, и поискать синтаксис. Как упоминалось ранее, вы используете очень старый компилятор, а большинство из нас даже НЕ используют этот компилятор.
Колусу и другие плакаты. Не могли бы вы пояснить, что вы используете эмулятор мэйнфрейма Hercules. Легально доступное программное обеспечение для этого эмулятора устарело более чем на двадцать лет.
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.
Почти все проблемы с COBOL можно исправить, добавив больше точек (символов
.):-)