2015-01-27 3 views
0

일부 데이터 유효성 검사를 시도하고 if 문을 사용하여 ERROR-FLAG 변수와 RECORD-CODE가 "NO"및 "VC"인지 확인하려고합니다. 실시 예 이하 .. 변수와 텍스트의 비교?

 MOVE "NO"     TO ERROR-FLAG. 
     MOVE "NO"     TO ERROR-FLAG2. 
     IF VEND-NUM = SPACES 
      MOVE "YES"    TO ERROR-FLAG 
      MOVE "********" TO BC-AST-OUT 
      MOVE "B" TO B-ERROR-OUT 
     END-IF. 
     IF VEND-NUM IS NOT NUMERIC AND ERROR-FLAG IS NOO 
      MOVE "YES"    TO ERROR-FLAG 
      MOVE "********" TO BC-AST-OUT 
      MOVE "C" TO C-ERROR-OUT 
     END-IF. 
     IF RECORD-CODE IS NOT VC 
      MOVE "YES"    TO ERROR-FLAG 
      MOVE "**" TO A-AST-OUT 
      MOVE "A" TO A-ERROR-OUT 

     END-IF. 

NOO AND VC

각각 "NO"및 "VC"로 작업 저장 영역에 정의된다. 나는 이것을 알아낼 수 없다. 모든 도움이 많이 감사한다! 그것은 중요하지만 VEND-NUM 및 RECORD-CODE을 읽을 있는지 확실하지 않습니다.

Error code 
    176 IGYPS2074-S "NOO" was defined as a type that was invalid in this  context. The statement was discarded. 

        Same message on line: 195 205 210 224 

    181 IGYPS2074-S "VC" was defined as a type that was invalid in this context. The statement was discarded. 

내가 ERROR-FLAG가 "NO"인지 아닌지가 결정합니다. 그것이 "아니오"라면 나는 if에 대해 다음 이동 명령을 수행하기를 원합니다. 그들이 88 - 레벨 조건 이름 또는 SPECIAL-NAMES를 사용하여 정의 할 수 있습니다 "클래스 테스트 '인 것처럼 당신의 IF 문에서

+0

정확히 무슨 일이 벌어지고 당신은 무엇을 기대합니까 ???, 질문은 광범위한 것입니다. –

+0

오류 코드'176 IGYPS2074-S "NOO"가이 컨텍스트에서 유효하지 않은 유형으로 정의되었습니다. 성명서는 폐기되었습니다. 같은 메시지가 : 195 205210 224 181 IGYPS2074-S "VC"는이 컨텍스트에서 유효하지 않은 형식으로 정의되었습니다. 성명서는 폐기되었습니다. " – Bob

+0

NOO, VC, Record-code 등의 정의는 무엇입니까? –

답변

2

NOO를 CLASS처럼 사용하고 있습니다. 나는 CLASS가 무엇인지를 건너 뛸 것이다. (그러나 숫자는 "0, 1, 2, 3, 4, 5, 6, 7, 8, 9"의 숫자 값을 재 그룹화하는 CLASS이다. 코드를 컴파일하고 읽고 이해하는 방법을 설명합니다.

"ERROR-FLAG"및 "NOO"에 대한 해결책을 제공하며 "RECORD-CODE"및 "VC"에 대해서도 동일합니다.

여기서 "ERROR-FLAG"의 값이 "NOO"와 같은지 테스트하려고합니다. COBOL에서 당신은 문자 그대로 쓸 수있다 :

IF VEND-NUM IS NOT NUMERIC AND ERROR-FLAG IS EQUAL TO NOO 

또한이 방법을 쉽게 읽을 수 있습니다된다

IF VEND-NUM IS NOT NUMERIC AND ERROR-FLAG = NOO 

이 엄격 동일합니다. 코드를 더욱를 유지 관리하기 위해

, 나는 강하게 당신과 같이 괄호를 사용하는 것이 좋습니다 : 레벨 88 선언 :

IF (VEND-NUM IS NOT NUMERIC) AND (ERROR-FLAG = NOO) 

마지막으로, COBOL 당신에게 훌륭한 도구를 제공합니다.귀하의 경우,이 같은 오류-FLAG에 레벨 88의 값 선언 할 수있다 :이 경우

01 ERROR-FLAG   PIC X(02). 
    88 ERROR-FLAG-NOO value 'NO'. 

, "ERROR-FLAG는"값을 포함 "NO"다음 오류-FLAG-NOO입니다 true (부울처럼 작동 함).

귀하의 IF 문은 다음과 같을 수 있습니다 첫 번째 단계입니다

IF (VEND-NUM IS NOT NUMERIC) AND (ERROR-FLAG-NOO) 

는 : 프로그램을 컴파일 및 레벨 (88) 값을 통해 이해하기가 좀 더 쉽게 만들 수. 두 번째로 EVALUATE 문을 사용할 수 있습니다. 두 번째 IF 문에서 첫 번째 문항이 정확하지 않은 경우 두 번째 테스트를하고 싶지 않으므로 ERROR-FLAG가 "NO"이면 테스트를 진행합니다. 당신은 할 수 :

EVALUTE TRUE 
    WHEN VEND-NUM = SPACES 
     ... 
    WHEN VEND-NUM IS NOT NUMERIC 
     ... 
    WHEN RECORD-CODE NOT = VC 
     ... 
    WHEN OTHER 
     ... 
END-EVALUATE 

를이 경우, 첫 번째에 해당하는 경우, (내가 쓴 "...") 실행될 때 다음 코드를. 다음 WHEN은 테스트되지 않으며 EVALUATE 문은 "END-EVALUATE"로 이동합니다. 첫 번째 WHEN 문이 거짓이면 두 번째 WHEN 문이 테스트됩니다. 등등. 모든 WHEN 문이 거짓이면 "WHEN OTHER"문이 항상 실행됩니다. 인터넷에서 EVALUATE 문에 대한 문서를 상당히 쉽게 찾을 수 있습니다.

+0

NUMERIC의 일부로 0으로 편집되었습니다. 최적화 도구의 의미는 (적어도 IBM COBOL의 경우) IF가 작성된 순서대로 테스트된다는 보장이 없다는 것입니다. "VEND-NUM NOT NUMERIC AND ERROR-FLAG = NOO"에서 "ERROR-FLAG = NOO"를 먼저 테스트 할 수 있습니다. 괄호가 없으면 일부 결과가 변경 될 수 있습니다. 또한 나는이 경우가 아니라고 인정한다. 첫 번째 메시지와 일치하도록 NOO를 사용했습니다. –

+0

아니요. 맞지 않습니다. IF (또는 어떤 조건)가 평가되는 순서는 문서화되어 있으며 최적화에 의해 완전히 영향을받지 않습니다. 그것에 대해 생각 해봐. '숫자가 0이고 평등하다면. ' 두 번째 테스트가 처음 수행되면 S0C7이 발생할 수 있습니다. 이것은 IBM COBOL을위한 것은 아니며 평가 순서는 COBOL 표준에 있습니다. 어쨌든 괄호를 사용합니다. 인간이 명령을 이해할 수 있기를 바랍니다. 컴파일러는 항상 우리가 작성한 것으로부터 올바른 것을 얻지 만 사람들은 항상 올바르게 작성하지는 않습니다 :-) IF의 순서를 최적화하지 않아서 IF의 결과를 변경할 수 있습니다. –

+0

나는 이것에 관한 어떤 문서에 정말로 관심이있다. MY-TAB (0)에 한 번 액세스 한 IF (IND> ZERO) 및 (MY-TAB (IND) = 10) 문에이 왕과 관련된 문제가 발생했습니다. IF IND> ZERO로 변경하면 MY-TAB (IND) = 10 ... END-IF END-IF로 변경됩니다. –

3

, 당신은 NOOVC을 사용하고 있습니다.

브루스 마틴 (Bruce Martin)이 지적한 것처럼 IF 문에서 IS EQUAL TO/IS NOT EQUAL TO를 사용하는 것이 하나의 방법입니다.

더 명확한 방법은 실제로 88을 사용하는 것입니다. 예제.

01 FILLER PIC X VALUE SPACE. 
    88 DATA-IN-ERROR VALUE "Y". 
    88 DATA-NOT-IN-ERROR VALUE "N". 

SET DATA-NOT-IN-ERROR TO TRUE 
IF VEND-NUM = SPACES 
    SET DATA-IN-ERROR TO TRUE 
    MOVE "********" TO BC-AST-OUT 
    MOVE "B" TO B-ERROR-OUT 
END-IF 

IF VEND-NUM IS NOT NUMERIC 
AND DATA-NOT-IN-ERROR 
    ... 
END-IF 

이름은이를 설명하기위한 것으로 상황에 맞게 개선 될 수 있습니다.

풀러 예 :

 05 RECORD-CODE     PIC XX. 
      88 RECORD-CODE-IS-VC  VALUE "VC". 

    ...  

    01 FILLER       PIC X. 
     88 ERROR-FOUND     VALUE "Y". 
     88 ERROR-FOUND-FALSE   VALUE "N". 

    SET FIRST-ERROR-FOUND-FALSE TO TRUE 

    IF VEND-NUM = SPACES 
     SET FIRST-ERROR-FOUND TO TRUE 
     MOVE "********" TO BC-AST-OUT 
     MOVE "B" TO B-ERROR-OUT 
    END-IF 

    IF VEND-NUM IS NOT NUMERIC 
    AND FIRST-ERROR-FOUND-FALSE 
     SET ERROR-FOUND   TO TRUE 
     MOVE "********" TO BC-AST-OUT 
     MOVE "C" TO C-ERROR-OUT 
    END-IF 

    IF NOT RECORD-CODE-IS-VC 
     SET ERROR-FOUND   TO TRUE 
     MOVE "**"    TO A-AST-OUT 
     MOVE "A"    TO A-ERROR-OUT 
    END-IF 

또한 재 작업 : 다른 곳에서의 오류 코드가 필요한 경우

EVALUATE TRUE 
     WHEN VEND-NUM = SPACES 
      MOVE "********"  TO BC-AST-OUT 
      MOVE "B"   TO B-ERROR-OUT 
     WHEN VEND-NUM NOT NUMERIC 
      MOVE "********"  TO BC-AST-OUT 
      MOVE "C"   TO B-ERROR-OUT 
     WHEN NOT RECORD-CODE-IS-VC 
      MOVE "**"   TO A-AST-OUT 
      MOVE "A"   TO A-ERROR-OUT 
    END-EVALUATE 

, 단순히 SET 문을 삽입합니다.

관련 문제