0

我有以下 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)               
4

1 回答 1

0

我无法访问 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

如果您查看简化的控制逻辑,您会看到如果使用 DO 循环中的第一个 GET 读取一对记录中的第二个,那是文件中的最后一条记录(就像您的示例数据一样),然后将执行另一个 GET(给您 EOF),然后您的程序仍将尝试从记录区域访问 INPUT-DATA-PART,Easytrieve Plus 将为您提供 A0016,无效文件引用(以及文件)。

使用显示的数据,程序将始终失败。如果数据以单独的 JOBNAME 记录结尾,则程序将“成功”。

不,你不应该仅仅通过测试 EOF 来“修复”它。你应该重构逻辑。

一致且正确地使用缩进。

在库中,您不需要指定 DEFINE。如果在 JOB 或 SORT 中定义数据,则只需要 DEFINE。

MOVE 不像 COBOL MOVE 那样工作。它会让你绊倒。对大多数事情使用赋值(除了文件,或者如果你想要一个可变长度的 MOVE)。

由于您已经使用分配,我建议在 IF 中使用 EQ,只是为了获得一些差异化。

您只需要定义您需要的数据。

改善你的名字。

不要使用大型嵌套结构,使用 PERFORM 分解事物。

并且在此处发布代码时不要使用选项卡。当其他人拿你的代码看时,这可能会很痛苦。

于 2017-03-07T23:46:28.637 回答