2014-11-30 2 views
2

"M"으로 시작하는 고객 이름을 가진 레코드를 꺼내어 임시 파일에 기록하는 프로그램을 만들려고합니다. 프로그램은 실행되지만 레코드를 출력 파일에 쓰지 않습니다. 코드를 디버깅했으며 코드 줄 "WRITE MAST2-RECORD"가 실행되지 않는 것처럼 보입니다. 이 코드 줄을 건너 뜁니다.첫 번째 이름으로 레코드 추출

ENVIRONMENT DIVISION. 
    INPUT-OUTPUT SECTION. 
    FILE-CONTROL. 
     SELECT MAST-FILE ASSIGN TO 'G:\CPSC315-COBOL\COBOLAssignments\P15-1\OVERDUE.IND.TXT' 
      ORGANIZATION IS INDEXED 
      ACCESS IS RANDOM 
      RECORD KEY IS M-ACCT-NUM. 

     SELECT MAST2-FILE ASSIGN TO 'G:\CPSC315-COBOL\COBOLAssignments\P15-1\OVERDUE2.IND.TXT' 
      ORGANIZATION IS LINE SEQUENTIAL. 

    DATA DIVISION. 
    FILE SECTION. 
    FD MAST-FILE 
     LABEL RECORDS ARE STANDARD. 
    01 MAST-RECORD. 
     05 M-ACCT-NUM   PIC X(4). 
     05 M-CUSTOMER-NAME PIC X(15). 
     05 M-DAYS-OVERDUE  PIC 99. 
     05 M-BALANCE-DUE  PIC 999V99. 

    FD MAST2-FILE 
     LABEL RECORDS ARE STANDARD. 
    01 MAST2-RECORD   PIC X(50). 

    WORKING-STORAGE SECTION. 
    01 COUNTER    PIC 9. 

    01 PROGRAM-DATA-ITEMS. 
     05 WRITE-OK   PIC X VALUE 'Y'. 

    PROCEDURE DIVISION. 
    10-MAINLINE. 
     OPEN OUTPUT MAST-FILE 
      OUTPUT MAST2-FILE 
     PERFORM 20-LOAD-MAST-FILE 
     CLOSE MAST-FILE 
      MAST2-FILE 
     STOP RUN. 

    20-LOAD-MAST-FILE. 
     PERFORM 30-INPUT-INDEX 
      PERFORM UNTIL M-ACCT-NUM = 0 OR WRITE-OK = 'N' 
      PERFORM 40-WRITE-FILE 
      PERFORM 50-FIND-CUSTOMER-START-WITH-M 
      PERFORM 30-INPUT-INDEX 
     END-PERFORM. 

    30-INPUT-INDEX. 
     DISPLAY 'ENTER ACCOUNT NUMBER (0 TO QUIT): ' WITH NO ADVANCING 
     ACCEPT M-ACCT-NUM. 

    40-WRITE-FILE. 
     DISPLAY ' ENTER CUSTOMER NAME: ' WITH NO ADVANCING 
      ACCEPT M-CUSTOMER-NAME 
      DISPLAY '  ENTER DAYS OVERDUE: ' WITH NO ADVANCING 
      ACCEPT M-DAYS-OVERDUE 
      DISPLAY '   ENTER BALANCE DUE: ' WITH NO ADVANCING 
      ACCEPT M-BALANCE-DUE 
      WRITE MAST-RECORD 
       INVALID KEY 
        MOVE 'N' TO WRITE-OK 
        DISPLAY 'ERROR ' MAST-RECORD 
      END-WRITE. 

    50-FIND-CUSTOMER-START-WITH-M. 
     MOVE 0 TO COUNTER 
     INSPECT MAST-RECORD TALLYING COUNTER FOR ALL ' M ' 
     IF COUNTER > 0 
      WRITE MAST2-RECORD 
     END-IF. 

    end program Program1. 

답변

3

전체 레코드에서 blank-M-blank를 찾습니다. 당신은 당신이 가지고있는 대신에 그 정의를 사용하고 쓰기에 대한 테스트에서 88를 사용하는 경우 당신은 당신이하고 싶은 말은 무엇

는 M.

05 M-CUSTOMER-NAME. 
     10 M-CUSTOMER-NAME-FIST-CHARACTER PIC X. 
      88 M-CUSTOMER-NAME-START-M VALUE "M". 

로 시작하는 좋은 고객 이름입니다 , 당신은 당신이 원하는 것을 얻어야합니다.

는 예 대체 :

50-FIND-CUSTOMER-START-WITH-M. 
    MOVE 0 TO COUNTER 
    INSPECT MAST-RECORD TALLYING COUNTER FOR ALL ' M ' 
    IF COUNTER > 0 
     WRITE MAST2-RECORD 
    END-IF. 

작성자 :

50-FIND-CUSTOMER-START-WITH-M. 
    IF M-CUSTOMER-NAME-START-M 
     WRITE MAST2-RECORD 
    END-IF 
    . 

간단한, 쉽게 이해하는, 유지 보수가 매우 용이.

이름의 유효성을 고려해야합니다. 좋은 시스템에서는 선행 공백이 없습니다. 가난한 시스템에있을 수 있습니다.

이를 처리하려면 고객 이름의 첫 번째 바이트를 공백으로 테스트하십시오. 그렇다면 전체 이름에 대한 고객 이름을 테스트하십시오. 전체 공간이 아니라면 첫 번째 비어 있지 않은 부분을 찾을 때까지 반복하십시오. 먼저 M이 아닌 비어 있음을 테스트하십시오.이 경우 두 가지 테스트가 있습니다.

이 프로그램을 복사 및 축소하고 고객 이름의 첫 번째 바이트가 공백 인 곳에서보고/출력함으로써 데이터 품질을 개별적으로 평가할 수 있습니다.

일단 알게되면 분석가 (가정교사)에게 가서 가능한 공백을 처리해야하는지 물어 봅니다. 그렇지 않으면 실제 프로그램에서 공백으로 테스트를 계속하고이 경우 충돌이 발생합니다.