Один и тот же код 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.

И не используйте вкладки при размещении кода здесь. Это может быть боль, когда кто-то другой берет ваш код, чтобы посмотреть.

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