当前位置:  开发笔记 > 数据库 > 正文

寻找更加清晰的方式来编码这个RPG LE

如何解决《寻找更加清晰的方式来编码这个RPGLE》经验,为你挑选了1个好方法。

---这里我们找到了我们想要在其他文件中清除的客户编号.首先,我们正在阅读客户主数据,然后在订单历史记录或发票历史记录中查看客户编号是否存在.如果不是,那么我们希望从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和其他两个文件中删除这些客户.



1> WarrenT..:

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和其他两个文件中删除这些客户.

推荐阅读
wangtao
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有