2014-01-10 3 views
0

Cobol에 은행 계좌 번호를 기입해야합니다. 보고서 사용자는 모든 계좌 번호를 원하지만 마지막 4 개의 X를 원합니다. 내 데이터 구조는 다음과 같습니다.Cobol에서 문자열을 쓰고 모든 X가있는 accout 번호의 처음 6 자리를 가리고 싶습니까?

데이터 구조 :

 01 Account. 
      05 acct pic x(10) value spaces. 

인쇄 아웃 :

 01 Account. 
      05 six-digits pic x(06) value 'XXXXXX'. 
      05 four-digits pic x(04) value spaces. 

MOVE new-account-value TO Accout. -- this over writes the X's and screws up my printout 
WRITE E-Record FROM Account. 

은 무엇 간단한 작업을 수행하는 쉬운 방법이 될 것입니다 :

 XXXXXX5678 

나는 다음과 같은 시도? 코볼은 항상 약간의 결함이있는 것 같습니다.

새 코드 : (여전히 작동하지 않습니다.) 이유가 무엇일까요? 이것은 예제와 같습니다. 그리고 값이 모두 X를 상수로 유지한다는 것을 기억한다면 이것은 잘못된 것이라고 생각합니다.

02 BANK-INFORMATIONE.        
    04 H5-ROUTE.         
     10 ROUTE-UNUSED PIC X(09) VALUE ALL 'X'. 
     10 ROUTE-USED PIC X(04) VALUE SPACES.  
    04 FILLER PIC XX  VALUE SPACES.   
    04 H5-ACCTE.         
     10 ACCT-UNUSED PIC X(06) VALUE ALL 'X'.  
     10 ACCT-USED PIC X(04) VALUE SPACES.  
+1

ROUTE-UNUSED 지원은 9 바이트입니까? 절차 단원 코드는 무엇을 작성 했습니까? –

+0

예, 사용되지 않은 바이트는 9 바이트가됩니다. 프로 시저 부분을 참조 할 때 모든 코드를 볼 필요가 있습니다. X를 route-unused로 이동하면 쓰기 전에는 작동하지만 Value All은 상수와 비슷하고 다시 작성할 필요가 없다고 생각합니다. –

+0

COBOL은 상수를 변경하지 않으면 상수 만 사용합니다. INITIALIZE를 사용했거나 BANK-INFORMATIONE을 어떤 값으로 설정 했습니까? 작동하지 않을 때 실제로 어떤 출력을 얻고 있습니까? 6 자리 뒤에 원하는 4 자리 숫자가 오는가? –

답변

4
01 Account-Reference. 
     05 acct-to-ignore pic x(6). 
     05 acct-to-use  pic x(4). 

    01 Masked-Account. 
     05 Masked-Account-Mask PIC X(6) VALUE ALL "X". 
     05 Masked-Account-Data PIC X(4). 

MOVE acct-to-use TO Masked-Account-Data 
WRITE E-Record FROM Masked-Account 

될 것이다.

단일 단어 데이터 이름을 사용하지 않는 것이 좋습니다. 선택한 단어가 나중에 컴파일러의 "예약어"가 될 수 있고 덜 설명 적이라는 것을 알지 못합니다.

보고서를위한 것이거나 보고서가 아닌 보고서 인 경우, 보고서 라인 자체에서 4 바이트가 뒤 따르는 6 개의 X가 포함 된 리터럴을 정의하십시오 . 나중에보고 할 파일에 계정을 작성하는 경우 파일 자체에 X를 포함 할 필요가 없습니다. 그래서 당신은 당신이 필요로하는 4 개의 낮은 자릿수를 사용할 수 있습니다.

+0

@Doug Hauf 이것은 전체 계정 번호가 '이동'중에 잘 리기 때문에 가장 좋은 답변입니다. 즉, 전체 번호를 보고서 레코드로 옮길 수 없습니다. 향후 유지 관리 중에 다른 사람이 요구할 때와 같이 처음으로 6 자리 숫자의 계정을 날려 버리는 것을 잊어 버리면 좋은 계정 번호가 게시 될 수 있습니다. – NealB

2
MOVE new-account-value TO Account 

MOVE 'XXXXXX' TO Account(1:6) 

WRITE E-Record FROM Account 
2

는 다음을 시도해보십시오 계정의 첫 6 개 자리에 대한

01 Account. 
     05 six-digits pic x(06). 
      88 Account-X value 'XXXXXX'. 
     05 four-digits pic x(04). 

MOVE new-account-value TO Account 
SET Account-X to true 
WRITE E-Record FROM Account 

88 레벨 정의 당신을 위해 덮어 쓰기를 할 것입니다. 사용중인 VALUE 절은 INITIALIZE 문이 아닌 초기 프로그램로드시에만 한 번만 설정되므로 값을 계정으로 옮기면 재설정되고 재설정 될 수 없으므로 VALUE 절은 입니다.

또는 다른 확실한 해결책이 될 수 있습니다

MOVE new-account-value TO Account 
MOVE 'XXXXXX' to six-digits 
WRITE E-Record FROM Account 

그리고 마지막으로, 모의에 의해 제안 된 솔루션도 작동합니다.

1

@Moot 답변은 정상적으로 작동합니다.

또 다른 해결책은이 프로그램을 읽고 다음 사람에게 무엇인지 모든 것을 다음 분명하다

01 Account PIC X(010). 
01 FILLER REDEFINES Account. 
    03 HiddenPart PIC X(006). 
    03 ShownPart PIC X(004). 


MOVE new-account-value to Account. 
MOVE ALL "X" TO HiddenPart. 
WRITE E-Record FROM Account.