0

我必须删除一些被认为无用的记录。

有一个地址文件和一个订单历史文件。在拥有消费品的公司中,他们会收到许多产品咨询或开始销售,而这些产品永远不会成为销售。

每个查询都会在地址文件中获得一条记录,即客户编号。在订单历史文件中是相同的客户编号和后缀字段。它从 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 上设置为不同的逻辑并读取只要我们有匹配的客户编号并且如果有后缀 not = 000 然后我们打开标志并退出。

清除 subr 将不得不再次通读以获取从 orderhistory 文件中清除所需的记录,方法是使用仍在读取地址文件中的相同客户编号。因为我不确定 subr 对客户有什么价值,我不想存储它。

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

我们也不能假设如果有人买了,他们有一个 001,也许它多年来被删除了。

如果我们这样做了,我可以简单地链接它。

4

2 回答 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,它的性能也会很差。;-)

于 2013-06-30T19:48:22.633 回答
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'
    )
于 2013-06-30T12:35:07.297 回答