2017-03-07 2 views
0

에게 제공 I 다음 Easytrieve 플러스 코드가 있습니다같은 Easytrieve 코드는 다른 결과

68 *******A010 INVALID FILE REFERENCE - ENTRADA 

:

* 
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 
하나 개 설치시이 코드는 오류없이 다른 설치에서 작동

메시지를 제공을 입력 파일은 다음과 같습니다.

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 번 줄을 추가하려면 edit 링크를 사용할 수 있습니까? 필자는 컴파일 된 링크를 사용하고 있다고 생각합니다. 프로그램 목록이 있습니까? 그렇다면 소스 코드를 확인하십시오. –

답변

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를 사용하여 차별화를 제안하십시오.

필요한 데이터 만 정의하면됩니다.

이름을 개선하십시오.

거대한 중첩 구조로 이동하지 마십시오. 성능이 저하 될 수 있습니다.

여기에 코드를 게시 할 때 탭을 사용하지 마십시오. 다른 사람이 코드를 보았을 때 고통 스러울 수 있습니다.