2017-03-07 113 views
0

我有以下Easytrieve加代碼:同Easytrieve代碼給出了不同的結果

* 
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      

而ouptut fil E:

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)    
+0

你正在編譯和運行(EXEC PGM = EZTPA00),還是運行一個已編譯和鏈接的程序(EXEC PGM = yourprog)?如果第一個,你可以使用問題下的編輯鏈接添加第68行。我懷疑你正在運行編譯鏈接。你有程序清單嗎?如果是這樣,請檢查來源。 –

回答

0

我沒有獲得Easytrieve加,所以提前道歉,如果它不周圍的邊緣編譯。

程序的簡化:

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,以獲得一些區別。

你只需要定義你需要的數據。

改善你的名字。

不要去大規模的嵌套結構,打破與PERFORMs的東西。

在這裏發佈代碼時不要使用Tabs。當其他人拿你的代碼看時,這可能是一種痛苦。

相關問題