2013-06-30 60 views
0

我必須刪除一些被認爲無用的記錄。清除AS/400上的記錄

有一個地址文件和一個訂單歷史文件。在擁有消費品的公司中,他們獲得了許多產品查詢或開始銷售,從未成爲銷售。

每個查詢都會在地址文件中記錄客戶編號。訂單歷史記錄文件是相同的客戶列和後綴字段。這是從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到不同的邏輯上的orderhistory 和裏德爲我們只要有匹配的客戶數量 ,如果有一個後綴不是= 000,然後我們打開標誌 並獲得出。

清除子程序將不得不再次讀取通過使用相同的客戶號碼清除訂單歷史文件所需的記錄,該客戶號碼仍將在地址文件的讀取中。因爲我不確定subr有什麼價值,對於顧客,我不想存儲它。

那麼它會寫入新文件含地址文件,然後我們就可以ITER讀取下 客戶的地址文件。

我們也不能假設,如果有人沒有買,他們有001也許是多年來刪除了。

如果我們這樣做,我可以簡單地鏈接。

+0

是什麼這個問題? –

+0

我可以發誓我會讀一些東西,顯示使用SQL進行批處理和本機IO的速度增益,但不知道它現在在哪裏。有趣的是,我在這裏重新編寫了一個過程(以及一些新的索引,這些索引對於本機IO來說很難'使用'),從大約24小時開始......到2 –

回答

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; 

在那裏,您已經定義了您的保留表並將其填充到每個單獨的語句中。它確實有一些嵌套的邏輯,但只有兩個語句。

要清除它們

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

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

總計四個SQL語句。 (我不會連問你有多少在RPG程序)

一旦你瞭解SQL,你可以考慮一下處理整個文件,而不僅僅是創紀錄的說明進行錄製。這是更容易完成的事情,做得好時,它幾乎總是更快。

(您可能會聽到關於在特定情況下的性能參數,但最常見的他們根本沒有使用SQL,以及他們應該。如果你寫的RPG差,表現不好過。;-)

+0

好吧,這看起來不錯。其實我有一個資源,我可以用於SQL部分。只有1個問題,當你在這裏「選擇cust FROM orderHistory GROUP BY cust」 HAVING max(sufix)='000' )這意味着這個客戶在這個訂單歷史記錄中的所有記錄都是= 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