2013-06-30 5 views
0

쓸모없는 레코드를 삭제해야합니다.AS/400에서 레코드 삭제

주소 파일과 주문 내역 파일이 있습니다. 소비자 제품을 보유한 회사에서 판매를하지 않는 많은 제품 문의 또는 판매 개시를 받게됩니다.

각 문의는 고객 번호 주소 파일에 레코드를 가져옵니다. 주문 내역 파일에는 동일한 고객 numn 및 접미어 필드가 있습니다. 000에서 시작하여 새 주문이있을 때마다 증가합니다. 사업의 대부분은 사실 반복 모델입니다.

'000'레코드 (여러 개의 000이있을 수 있음)가있는 고객은 이러한 파일에서 삭제하려는 제품을 구입하지 않은 것을 의미합니다.

나는 간단한 RPG 프로그램을 생각하고 있지만 가능한 경우 또는 다른 방법으로 SQL을 사용하는 것에 관심이 있습니다.

이 단계에서는 실제로 삭제하지 않고 검토 할 출력 파일로 제안 된 레코드를 복사하여 되돌릴 필요가있을 때 저장할 것입니다.

F Addressfile IF E 

F OrderHistory IF E 

**** create 2 output file clones but with altered name for now. 

F Zaddressfile O E 
F ZorderHistory O E 


        *inlr doweq *off 
          Read Addressfile   lr 
        *inlr ifeq *off 
          move *off  Flg000 
          exsr Chk000 
        Flg000 ifeq *on 
          iter 
          else exsr  purge 
          endif 
          endif 
          enddo 

        Chk000 begsr 

** 기본적으로 setll에 우리가 일치하는 고객 번호 이 다음 접미사 없습니다 = 000이 있으면 우리가 플래그 켜고 얻을로의 orderhistory 및 학년 때 락커룸에서 다른 논리 아웃.

purge subr은 주소록 읽기와 동일한 고객 번호를 사용하여 orderhistory 파일에서 제거하는 데 필요한 레코드를 다시 읽어야합니다. 왜냐하면 나는 고객에게 어떤 가치에 subr이 있는지 확신 할 수 없기 때문에 그것을 저장하고 싶지 않습니다.

주소 파일을 포함하여 새 파일에 기록한 다음 주소 파일에 다음 고객을 읽을 수 있습니다.

우리는 누군가가 구입했다면, 아마도 001을 가지고있을 수 있다고 생각하지 않을 수 있습니다.

우리가 그렇게했다면 간단히 말해서 사용할 수 있습니다.

+0

는 무엇인가 질문? –

+0

나는 일괄 처리를 위해 SQL을 사용하는 것보다 네이티브 IO를 사용하는 속도의 향상을 보여줄 것이지만 지금은 어디 있는지 알지 못한다고 맹세했습니다. Anecdotally, 나는 약 24 시간에서 2 시까 지 진행되는 과정을 다시 작성했다. (네이티브 - IO가 '사용'하기 힘든 몇 가지 새로운 지표와 함께) –

답변

0

RPG에서 수행해야 할 모든 단계 이것은 SQL에서 여러 가지 간단한 방법으로 수행 할 수 있습니다. SQL은 한 번에 전체 파일의 레코드 그룹을 처리하고 분석하는 데 능숙합니다.

CREATE TABLE zaddresses AS 
(SELECT * 
    FROM addressFile 
    WHERE cust IN (SELECT cust 
        FROM orderHistory 
        GROUP BY cust 
        HAVING max(sufix)='000' 
       ) 
) 
WITH DATA 
NOT LOGGED INITIALLY; 

CREATE TABLE zorderHst AS 
(SELECT * 
    FROM orderHistory 
    WHERE cust IN (SELECT cust 
        FROM zaddresses 
       ) 
) 
WITH DATA 
NOT LOGGED INITIALLY; 

여기에서 지주 테이블을 정의하고 하나의 단일 계산서로 채 웁니다. 그것은 중첩 된 논리를 가지고 있지만 그럼에도 불구하고 단지 두 문장만을 가지고 있습니다.

네 개의 SQL 문들을

DELETE FROM addressfile 
    WHERE cust IN (SELECT cust FROM zaddresses); 

DELETE FROM orderHistory 
    WHERE cust IN (SELECT cust FROM zaddresses); 

그랜드 총 제거합니다. (나는 RPG 프로그램에 얼마나 많은 사람이 있는지 물어 보지도 않는다.)

SQL을 이해하고 나면 레코드 지침으로 기록하지 않고 전체 파일을 처리하는 것에 대해 생각해 볼 수 있습니다. 일을 처리하기가 더 간단하면 이 잘 수행되면 더 빠릅니다.

(당신은 특정 상황에서 성능에 대한 인수를들을 수 있지만, 대부분의 경우 그들은 단순히뿐만 아니라 그들이해야 같은 SQL을 사용하고 있지 않습니다. 당신이 가난한 RPG를 작성하는 경우, 너무 심하게 수행한다. ;-)

+0

괜찮아 보인다. 사실 나는 SQL 부분에 사용할 수있는 리소스가 있습니다. 당신이 여기에있을 때 단 한가지 질문이 있습니다. "주문 내역 발신 오더 GROUP BY 고객" 최대 (sufix) = '000' ) 이것은 orderhistory에서이 고객 번호에 대한 모든 레코드가 all = 000? 이 생각은 나에게 꽤 좋아 보인다. – Booksman

+0

주문 내역 백업을 생성하지 않는다는 점을 제외하고는. – jmarkmurphy

+0

아, 우리는 또 하나의 진술이 필요합니다. – WarrenT

0

SQL을 사용합니다.

-- Save only the rows to be deleted 
CREATE TABLE ZADDRESSFILE AS 
    (SELECT * 
    FROM ADDRESSFILE af 
    WHERE NOT EXISTS 
     (SELECT 1 
     FROM ADDRESSFILE sub 
     WHERE sub.CUSTNO = af.CUSTNO 
     AND sub.SUFFIX <> '000' -- (or <> 0 if numeric) 
     ) 
    ) 

-- If ZADDRESSFILE exists and you want to add the rows 
-- to ZADDRESSFILE instead.... 
INSERT INTO ZADDRESSFILE 
    (SELECT * 
    FROM ADDRESSFILE af 
    WHERE NOT EXISTS 
     (SELECT 1 
     FROM ADDRESSFILE sub 
     WHERE sub.CUSTNO = af.CUSTNO 
     AND sub.SUFFIX <> '000' -- (or <> 0 if numeric) 
     ) 
    AND OT EXISTS 
     (SELECT 1 
      FROM ZADDRESSFILE sub 
      WHERE sub.CUSTNO = af.CUSTNO 
     ) 
    ) 


-- Get number of rows to be deleted 
SELECT COUNT(*) 
FROM ADDRESSFILE af 
WHERE NOT EXISTS 
    (SELECT 1 
    FROM ADDRESSFILE sub 
    WHERE sub.CUSTNO = af.CUSTNO 
    AND sub.SUFIX <> '000' 
    ) 


-- Delete 'em 
DELETE 
FROM ADDRESSFILE af 
WHERE NOT EXISTS 
    (SELECT 1 
    FROM ADDRESSFILE sub 
    WHERE sub.CUSTNO = af.CUSTNO 
    AND sub.SUFIX <> '000' 
    ) 
+0

이것은 이런 식으로는 효과가 없을 것이다. 왜냐하면 sufix는 주소 파일이 아니라 주문 내역 파일에 있기 때문입니다. – WarrenT