Один и тот же код Easytrieve в разных установках дает разные результаты
У меня есть следующий код Easytrieve Plus:
*
FILE ENTRADA
INPUT-REC1 1 132 A
*
*
FILE SALIDA
C1-JOBNAME 1 16 A
C1-FILLER 17 5 A
C1-MENSAGEM 22 31 A
*
DEFINE WS-INREC1 W 132 A
*
DEFINE WS-INDIC1 WS-INREC1 1 A
*
DEFINE WS-INPUT1 WS-INREC1 16 A
*
*
DEFINE WS-INREC2 W 132 A
*
DEFINE WS-INDIC2 WS-INREC2 1 A
*
DEFINE WS-INPUT2 WS-INREC2 16 A
*
DEFINE WS-MSG1 W 31 A VALUE 'INSERIR PARAMETROS CA-VIEW. '
*
DEFINE WS-MSG2 W 31 A VALUE 'PARÂMETROS CORRECTOS. '
*
DEFINE WS-MSG3 W 31 A VALUE 'PARÂMETROS INCORRECTOS. '
*
DEFINE WS-COUNT W 8 N VALUE 0
*
DEFINE WS-COUNT-VAL W 8 N VALUE 0
*
* PROCESO
*
JOB INPUT NULL
DO WHILE NOT EOF ENTRADA
IF WS-COUNT = 0
GET ENTRADA
MOVE INPUT-REC1 TO WS-INREC1
WS-COUNT = WS-COUNT + 1
END-IF
IF WS-INDIC1 = 'J' AND NOT EOF ENTRADA
GET ENTRADA
WS-COUNT = WS-COUNT + 1
WS-COUNT-VAL = WS-COUNT
DISPLAY 'WS-COUNT: ' WS-COUNT
MOVE INPUT-REC1 TO WS-INREC2
IF WS-INDIC2 = 'J'
MOVE WS-MSG1 TO C1-MENSAGEM
MOVE WS-INPUT1 TO C1-JOBNAME
DISPLAY 'CJ-JOBNAME:' C1-JOBNAME
MOVE WS-INREC2 TO WS-INREC1
ELSE
IF WS-INPUT2 = 'F RF CNF CH '
MOVE WS-MSG3 TO C1-MENSAGEM
MOVE WS-INPUT1 TO C1-JOBNAME
DISPLAY 'CF3-JOBNAME:' C1-JOBNAME
END-IF
IF WS-INPUT2 = 'F RF CH '
MOVE WS-MSG2 TO C1-MENSAGEM
MOVE WS-INPUT1 TO C1-JOBNAME
DISPLAY 'CF2-JOBNAME:' C1-JOBNAME
END-IF
GET ENTRADA
WS-COUNT = WS-COUNT + 1
DISPLAY 'WS-COUNT2: ' WS-COUNT
MOVE INPUT-REC1 TO WS-INREC1
END-IF
END-IF
PUT SALIDA
END-DO
STOP
Этот код при одной установке работает без ошибок, а при другой установке выдает сообщение:
68 *******A010 INVALID FILE REFERENCE - ENTRADA
Входной файл выглядит следующим образом:
JOBNAME:ADJADP0
F RF CH
JOBNAME:ADJBDK1
F RF CH
JOBNAME:BMRPNN2
JOBNAME:BMRP1N1
F RF CNF CH
JOBNAME:BMRP1N2
F RF CNF CH
JOBNAME:IU3A02J4
F RF CH
JOBNAME:IU3A02J5
F RF CH
И выходной файл:
JOBNAME:ADJADP0 PARÂMETROS CORRECTOS.
JOBNAME:ADJBDK1 PARÂMETROS CORRECTOS.
JOBNAME:BMRPNN2 INSERIR PARAMETROS CA-VIEW.
JOBNAME:BMRP1N1 PARÂMETROS INCORRECTOS.
JOBNAME:BMRP1N2 PARÂMETROS INCORRECTOS.
JOBNAME:IU3A02J4 PARÂMETROS CORRECTOS.
JOBNAME:IU3A02J5 PARÂMETROS CORRECTOS.
При установке, где это не работает, шаг Easytrieve заканчивается кодом состояния 0016, но создает выходной файл (он просто не обрабатывает последнюю запись):
JOBNAME:ADJADP0 PARÂMETROS CORRECTOS.
JOBNAME:ADJBDK1 PARÂMETROS CORRECTOS.
JOBNAME:BMRPNN2 INSERIR PARAMETROS CA-VIEW.
JOBNAME:BMRP1N1 PARÂMETROS INCORRECTOS.
JOBNAME:BMRP1N2 PARÂMETROS INCORRECTOS.
JOBNAME:IU3A02J4 PARÂMETROS CORRECTOS.
Ошибка, которую это дает:
68 *******A010 INVALID FILE REFERENCE - ENTRADA
FILE STATISTICS - E Z T PLUS 5.2D- 3/07/17-19.42-JSN00036
ENTRADA 13 INPUT SAM FIX BLK 132 2
SALIDA 6 OUTPUT SAM FIX BLK 132 3
*******A014 PREMATURE TERMINATION DUE TO PREVIOUS ERROR(S)
1 ответ
У меня нет доступа к Easytrieve Plus, поэтому заранее извиняюсь, если он не скомпилирован по краям.
Упрощение вашей программы:
FILE ENTRADA
INPUT-DATA-PART 1 16 A
FILE SALIDA
C1-JOBNAME 1 16 A
C1-MENSAGEM 22 31 A
W-INREC1 W 16 A
W-INDIC1 W-INREC1 1 A
W-INREC2 W 16 A
W-INDIC2 W-INREC2 1 A
W-MSG1 W 31 A VALUE 'INSERIR PARAMETROS CA-VIEW. '
W-MSG2 W 31 A VALUE 'PARÂMETROS CORRECTOS. '
W-MSG3 W 31 A VALUE 'PARÂMETROS INCORRECTOS. '
W-COUNT W 8 N VALUE 0
W-COUNT-VAL W 8 N VALUE 0
JOB INPUT NULL
PERFORM READ-INPUT
IF EOF ENTRADA
DISPLAY "No input and some other useful text, like name"
RETURN-CODE = 20
STOP EXECUTE
END-IF
W-INREC1 = INPUT-DATA-PART
DISPLAY "First record read"
DO WHILE NOT EOF ENTRADA
IF W-INDIC1 EQ 'J'
PERFORM READ-INPUT
DISPLAY 'W-COUNT 1: ' W-COUNT
W-INREC2 = INPUT-DATA-PART
IF W-INDIC2 EQ 'J'
PERFORM NEXT-WAS-J-STORE-IT
ELSE
PERFORM NOT-J-PROCESS-AND-READ
END-IF
END-IF
PUT SALIDA
END-DO
STOP
READ-INPUT. PROC
GET ENTRADA
W-COUNT = W-COUNT + 1
W-COUNT-VAL = W-COUNT
END-PROC
NEXT-WAS-J-STORE-IT. PROC
C1-MENSAGEM = W-MSG1
C1-JOBNAME = W-INREC1
DISPLAY 'CJ-JOBNAME:' C1-JOBNAME
W-INREC1 = W-INREC2
END-PROC
NOT-J-PROCESS-AND-READ. PROC
IF W-INREC2 EQ 'F RF CNF CH '
C1-MENSAGEM = W-MSG3
C1-JOBNAME = W-INREC1
DISPLAY 'CF3-JOBNAME:' C1-JOBNAME
END-IF
IF W-INREC2 EQ 'F RF CH '
C1-MENSAGEM = W-MSG2
C1-JOBNAME = W-INREC1
DISPLAY 'CF2-JOBNAME:' C1-JOBNAME
END-IF
PERFORM READ-INPUT
DISPLAY 'W-COUNT 2: ' W-COUNT
W-INREC1 = INPUT-DATA-PART
END-PROC
Если вы посмотрите на упрощенную логику управления, вы увидите, что если вторая из пары записей читается с первым GET в цикле DO, и это последняя запись в файле (как в случае с вашими примерами данных)), затем выполнит еще один GET (давая вам EOF), а затем ваша программа все равно попытается получить доступ к INPUT-DATA-PART из области записи, а Easytrieve Plus выдаст вам A0016, недопустимую ссылку на файл (и имя файл).
С данными, показанными, программа всегда будет терпеть неудачу. Если вместо этого данные заканчиваются одинокой записью JOBNAME, программа "преуспеет".
И нет, вы не должны "исправлять" это, просто стуча в тесте на EOF. Вы должны перестроить логику.
Используйте отступы, последовательно и правильно.
Внутри библиотеки вам не нужно указывать DEFINE. Вам нужно только DEFINE, если вы определяете данные в JOB или SORT.
MOVE не работает, как движение COBOL. Это тебя сбьет с толку. Используйте присваивания для большинства вещей (кроме файлов или если вы хотите MOVE переменной длины).
Поскольку вы уже используете назначения, я бы предложил использовать эквалайзер в IF, просто чтобы получить некоторую дифференциацию.
Вам нужно только определить необходимые данные.
Улучши свои имена.
Не переходите на массивные вложенные структуры, разбивайте вещи с помощью PERFORM.
И не используйте вкладки при размещении кода здесь. Это может быть боль, когда кто-то другой берет ваш код, чтобы посмотреть.