---这里我们找到了我们想要在其他文件中清除的客户编号.首先,我们正在阅读客户主数据,然后在订单历史记录或发票历史记录中查看客户编号是否存在.如果不是,那么我们希望从Customer master以及其他2个文件中清除此客户.
但是在第二个文件中,如果客户编号在营销列中有"A"或"C",而且是在2007年之后,我们不希望从任何文件中清除这个.
所以我创建了代码,在将客户记录写入保存/保留文件并删除之前,它返回一个标志,是的,可以删除.
C IF PUGFIL = 'Y' AND C ACENT# <> ACENT#_OLD c EXSR CHKCUS_SR c ACFLAG IFEQ 'N' C WRITE TRCMASRR c* delete arcmasrr
c CHKCUS_SR BEGSR c eval ACFLAG = ' ' C ORHKEY SETLL dRCST1 C ORHKEY READE dRCST1 * If the order entity is found, write the rec into VRCSTKBI file C DOW NOT %EOF(dRCST1) c if BICOTC <> 'A' AND BICOTC <> 'C' C WRITE VRCSTKRR c EVAL ACFLAG = 'N' c endif c if bicotc = 'A' c if BISTPD < 20070101 C WRITE VRCSTKRR c EVAL ACFLAG = 'N' c endif c endif c if bicotc = 'C' c if BISTPD < 20070101 C WRITE VRCSTKRR c EVAL ACFLAG = 'N' c endif c endif c acflag ifeq 'N' C EXSR CHKADR_SR
WarrenT.. 5
Buck和Benny就如何改进RPG代码提出了很多好的建议.
使用自由格式来提高可读性
使用更长的描述性名称,以阐明实际情况.(当你刚开始给出明确的名字时,不要让某人有一个名字decypher)
使用子程序而不是子程序.从子过程返回值使其成为用户定义的函数,甚至更好
程序应该执行一个想法.该程序中的所有内容都应该与做那件事情有关.这被称为凝聚力.保持您的程序相当小而简单.多么小.作为麻省理工学院人工智能实验室负责人的Semour Papert有兴趣让年轻学生对计算机进行编程以做他们感兴趣的事情.当他问其中一个人他们认为一个程序应该有多大时,他得到的答案是"心灵大小的咬合".
您希望最小化过程之间不必要的依赖关系,以便一个区域中的更改不太可能导致另一个区域出现问题.这称为耦合.
在你的循环中,注意你检查'A'或'C'的位置,并为'A'重复相同的代码块,然后再为'C'重复一次.您可能已经使用了IF .. OR ..因此您不会重复代码块,这可能导致将来出现维护问题.它违反了DRY原则,不要重复自己.你可以把自己想象成一个整洁的管家说,有一个地方可以解决所有问题[代码行],以及所有代码[代码行].
现在到了一个小问题.到处都是,我看到人们使用相同的键立即使用SETLL,接着是READE.请改用CHAIN.在封面下,CHAIN执行SETLL完成的逻辑,然后执行READE的逻辑.有些人认为READE以成功的SETLL为条件,可以节省时间.但正在发生的是,对于每个I/O语句,编译器生成代码以准备调用I/O模块的参数,调用模块执行I/O函数,然后处理返回的参数.有两个I/O语句,你这两次.让CHAIN操作为您处理它,它也有机会获得一些内部效率.此外,您的RPG代码现在更简单一些.从各个角度来看都比较好.
为它做好准备......
您应该使用嵌入式SQL,而不是使用传统的I/O语句.有很多原因,我真的不想在这里写一篇完整的论文.现在就相信我.学习这项工作的投资确实得到了回报.
您将学习SELECT,DECLARE和OPEN CURSORS(如开放数据路径),然后从光标获取FETCH记录,甚至一次FETCH或INSERT多条记录.
现在,真的很重要
传统的RPG范例通常是循环,每次通过循环处理一条记录,通常一次在一条记录上对其他文件执行额外的I/O.
SQL使您可以将记录作为一个集合在一个语句,整个文件或多个文件中处理.通过在单个SQL语句中运行整个文件以及其他两个文件,可以极大地简化和简化您的RPG代码.
CREATE TABLE QTEMP/PURGING AS ( SELECT c.customer, ... FROM Customers c LEFT EXCEPTION JOIN Orders o on c.customer = o.customer LEFT EXCEPTION JOIN Invoices i on c.customer = i.customer WHERE c.customer not in (select s.customer from secondfile s where marketing in ('A','C') and eventdate > '2007-12-31' ) ) with data; DELETE FROM secondfile x WHERE x.customer in (select p.customer from purging p ); DELETE FROM thirdfile x WHERE x.customer in (select p.customer from purging p ); DELETE FROM Customers x WHERE x.customer in (select p.customer from purging p );
四个陈述.这就是全部.没有循环.一旦你得到第一个正确的陈述,剩下的就很简单了.
CREATE TABLE ... WITH DATA将SELECT的结果写入新表.我只是展示它进入QTEMP,因为我不确定你是否想保留它.LEFT EXCEPTION JOIN表示使用左侧表格中的行,右侧没有与搜索条件匹配的行.这使您可以选择不在订单历史记录中而不在发票文件中的客户记录.构建包含要清除的客户列表的文件后,您可以使用该列表从Customer Master和其他两个文件中删除这些客户.
Buck和Benny就如何改进RPG代码提出了很多好的建议.
使用自由格式来提高可读性
使用更长的描述性名称,以阐明实际情况.(当你刚开始给出明确的名字时,不要让某人有一个名字decypher)
使用子程序而不是子程序.从子过程返回值使其成为用户定义的函数,甚至更好
程序应该执行一个想法.该程序中的所有内容都应该与做那件事情有关.这被称为凝聚力.保持您的程序相当小而简单.多么小.作为麻省理工学院人工智能实验室负责人的Semour Papert有兴趣让年轻学生对计算机进行编程以做他们感兴趣的事情.当他问其中一个人他们认为一个程序应该有多大时,他得到的答案是"心灵大小的咬合".
您希望最小化过程之间不必要的依赖关系,以便一个区域中的更改不太可能导致另一个区域出现问题.这称为耦合.
在你的循环中,注意你检查'A'或'C'的位置,并为'A'重复相同的代码块,然后再为'C'重复一次.您可能已经使用了IF .. OR ..因此您不会重复代码块,这可能导致将来出现维护问题.它违反了DRY原则,不要重复自己.你可以把自己想象成一个整洁的管家说,有一个地方可以解决所有问题[代码行],以及所有代码[代码行].
现在到了一个小问题.到处都是,我看到人们使用相同的键立即使用SETLL,接着是READE.请改用CHAIN.在封面下,CHAIN执行SETLL完成的逻辑,然后执行READE的逻辑.有些人认为READE以成功的SETLL为条件,可以节省时间.但正在发生的是,对于每个I/O语句,编译器生成代码以准备调用I/O模块的参数,调用模块执行I/O函数,然后处理返回的参数.有两个I/O语句,你这两次.让CHAIN操作为您处理它,它也有机会获得一些内部效率.此外,您的RPG代码现在更简单一些.从各个角度来看都比较好.
为它做好准备......
您应该使用嵌入式SQL,而不是使用传统的I/O语句.有很多原因,我真的不想在这里写一篇完整的论文.现在就相信我.学习这项工作的投资确实得到了回报.
您将学习SELECT,DECLARE和OPEN CURSORS(如开放数据路径),然后从光标获取FETCH记录,甚至一次FETCH或INSERT多条记录.
现在,真的很重要
传统的RPG范例通常是循环,每次通过循环处理一条记录,通常一次在一条记录上对其他文件执行额外的I/O.
SQL使您可以将记录作为一个集合在一个语句,整个文件或多个文件中处理.通过在单个SQL语句中运行整个文件以及其他两个文件,可以极大地简化和简化您的RPG代码.
CREATE TABLE QTEMP/PURGING AS ( SELECT c.customer, ... FROM Customers c LEFT EXCEPTION JOIN Orders o on c.customer = o.customer LEFT EXCEPTION JOIN Invoices i on c.customer = i.customer WHERE c.customer not in (select s.customer from secondfile s where marketing in ('A','C') and eventdate > '2007-12-31' ) ) with data; DELETE FROM secondfile x WHERE x.customer in (select p.customer from purging p ); DELETE FROM thirdfile x WHERE x.customer in (select p.customer from purging p ); DELETE FROM Customers x WHERE x.customer in (select p.customer from purging p );
四个陈述.这就是全部.没有循环.一旦你得到第一个正确的陈述,剩下的就很简单了.
CREATE TABLE ... WITH DATA将SELECT的结果写入新表.我只是展示它进入QTEMP,因为我不确定你是否想保留它.LEFT EXCEPTION JOIN表示使用左侧表格中的行,右侧没有与搜索条件匹配的行.这使您可以选择不在订单历史记录中而不在发票文件中的客户记录.构建包含要清除的客户列表的文件后,您可以使用该列表从Customer Master和其他两个文件中删除这些客户.