2017-11-02 1 views
0

레벨 표시기가 정의 된 (계산 목적으로 사용 된 레벨 표시기) RPG 프로그램에서 1 차 파일을 바꾸는 경험이있는 사람이 있습니까? 대신 RPG주기의 RPGLE에서 1 차 파일 바꾸기

, 난 완전히 절차 파일 (더 이상 기본 파일) ..

감사로 정의하는 새로운 파일 (기본 파일을 교체)를 도입 할 필요가있다.

+0

코드가 필요하지만 처리의 차이는 일반적으로 프로그램의 전체 재 작성을 의미합니다. 파일의 읽기뿐만 아니라주기의 중단 논리를 바꿔야합니다. 당신이 묻는 것은 "웹 애플리케이션의 MVC 프레임 워크를 어떻게 제거합니까?"와 대략 같습니다. – jmarkmurphy

+0

나는 한 무리를했다. CL 1 차 파일을 새 파일로 겹쳐 쓰고 RPG를 호출하십시오. 모든 것은 여전히 ​​효과가있을 것입니다. 우려 사항은 원본 파일과 동일한 순서로 새로운 파일입니다. 브레이크 처리 (SQL에서 그룹화)를 사용하면 실제로 레코드의 순서가 달라집니다. – danny117

+0

요구 사항은 기본 파일에 1 필드 더 추가하여 RPG주기를 교체하기로 결정했습니다. 이제 RPG에서 기본 파일 1은 30 개의 필드를 가지며 새 파일 2는 30 + 10 개의 새로운 필드를 갖습니다. 포인트 RPG주기 기본 파일에서 레코드를 읽기, 나는 그것을 대체해야합니다 읽기 및 다우. – MAS400

답변

3

왜 주 파일 사용을 중지 하시겠습니까? 레벨 표시기를 시뮬레이트하기 위해 자신의 비교를 수행하면 기본 파일을 변경하는 것보다 훨씬 더 많은 작업이 수행됩니다.

일반적으로 주 파일을 전체 절차 파일로 바꾸려면 계산의 맨 위에 % EOF (주 파일)가 아닌 READ + DOW를 넣고 두 번째 READ 및 ENDDO를 계산 끝에 넣습니다. 지금 L1_subr 등

이와 비교를 처리하기 위해 L0_subr 같은 그들에게 전화를위한 레벨 표시기 L0와 계산을 위해

, L1 등 열 7, 8, 내가 먼저, 서브 루틴으로 그 계산을 움직일 것입니다 이전 기록, 첫 번째 READ 후 DOW 앞에 수준 표시기 필드의 현재 값을 저장하는 명령문을 추가하십시오. 계산이 끝나면 두 번째 READ 전에 문을 추가하여 현재 값과 저장된 값을 비교하고 차이가 있으면 관련 Lx_subr을 호출하십시오. 모든 Lx_subrs가 호출 된 후 해당 특정 레벨 표시기에 대해 저장된 값을 업데이트하십시오.

이러한 종류의 변경은 오류가 발생하기 쉽습니다. 나는 그것을 기본 파일로 남겨두고 필요할 경우 I 스펙에 추가 레벨 표시기를 추가합니다. 여기에서 시작

2017년 11월 6일 갱신 :

는, 이전의 기록과 현재 레코드를 모두 추적하는 데 사용하려면 당신은 데이터 구조로 읽을 수있는 기능을 사용합니다. 읽기 이후

read rec cur_ds; 
dow not %eof; 
    ... 
    if have_prv_ds; 
     compare the previous record to the current record 
    endif; 
    eval-corr prv_ds = cur_ds; 
    have_prv_ds = *on; 
    read rec cur_ds; 
enddo; 

파일과 관련된 독립 필드에 영향을주지 않습니다, 좋은 연습이 실수로 그 독립 필드를 참조 피하기 위해 심지어 정의 된 독립 필드 것을 방지하는 것입니다. 이를 수행하려면 QUALIFIED 키워드로 파일을 정의하십시오. 그런 다음 file.fmt를 사용하여 레코드 형식을 참조하면 파일과 관련된 필드가 존재하지 않습니다.

dcl-f myfile qualified; 
dcl-ds cur_ds likerec(myfile.fmt); 
dcl-ds prv_ds likerec(myfile.fmt); 

read myfile.fmt cur_ds; 
dow not %eof(myfile); 
    ... 
    if have_prv_ds; 
     compare the previous record to the current record 
    endif; 
    eval-corr prv_ds = cur_ds; 
    have_prv_ds = *on; 
    read myfile.fmt cur_ds; 
enddo; 
+0

바바라에게 감사합니다. 근대화라고 부릅니다 :) 그것은 다음 단계에서 코드를 사용하기 위해 우리가 찾고있는 것입니다. 나는 위험하다는 것을 알고 있습니다. 우리는 처음 읽기를 비교하기 위해 두 번째 읽기를해야합니다. 저장된 가치 ....READ, SAVE, DOW, DETAIL, READ 경우에는 TOTAL ....을 수행하지만, 문제는 내가 다음 레코드를 읽으면 파일 필드에서 모든 이전 레코드가 지워질 것입니다 ..... 대신 SQL 읽기를 사용할 계획입니다. F 스펙에서 정의 ... 당신은 Group by Group이 나 또는 다른 이동 제안을 도와 줄 수 있다고 생각하십니까? 어떤 제안이 큰 도움이 될까요? – MAS400

+0

데이터 구조를 읽으면 새 레코드와 이전 레코드에 모두 액세스 할 수 있습니다. (데이터 구조를 읽거나 데이터 구조에서 쓰는 것도 "현대"로 간주됩니다. 레코드 데이터의 위치를 ​​제어 할 수 있기 때문입니다.) read rec cur_ds; % eof가 아닙니다. ...if have_prv_ds; 이전 레코드를 현재 레코드와 비교하십시오. endif; eval-corr prv_ds = cur_ds; have_prv_ds = * on; rec rec cur_ds; enddo; –

+0

위의 주석의 코드에 대한 원래의 글과 입출력을위한 데이터 구조를 사용하는 가장 좋은 방법에 대한 자세한 정보를 볼 수 있습니다. –