清除AS / 400上的记录

时间:2013-06-30 02:56:31

标签: db2 ibm-midrange rpgle db2-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

**基本上在orderhistory上设置为不同的逻辑                               并且我们拥有匹配的客户编号                               如果后缀不是= 000,那么我们打开标志                               然后离开。

purge subr必须再次读取以通过使用仍然在读取地址文件中的相同客户编号来获取清除orderhistory文件所需的记录。因为我不确定subr是什么价值,对于客户我不想存储它。

然后它将写入包含地址文件的新文件,然后我们可以读取下一个 客户在地址文件中。

我们也不能假设如果有人买了,他们就有001,也许这些年就被删除了。

如果我们这样做,我可以直接链接。

2 个答案:

答案 0 :(得分: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'
    )

答案 1 :(得分: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很差,它的表现也很差。; - )