RPG III:如何将数组重新定义为单独的字段,就像在COBOL中一样



在RPG III中,我需要在文件中存储一个巨大的数组。最大字段长度为256,因此我用16个字段定义了该文件,每个字段长250个字符。有没有一种方法可以将数组的1000个值放入16个字段而不移动?就像COBOL中的redefinitions一样?

数组:

 E                    MPDV     1000  4   

文件规格:

 D000001                                           1   4 WRPMOD 
 D000002                                           5 254 W01PDV 
 ... etc. until     
 D000017                                        37554004 W16PDV   

在Cobol中我会写:

 01 MPDV-TOP.
     03 MPDV-ARR OCCURS 1000.
        05 MPDV PIC X(4).
  01 WRPREC REDEFINES MPDV-TOP.
     03 W01PDV PIC X(250).
     .... ETC. UNTIL
     03 W16PDV PIC X(250).

读取文件,我得到数组MPDV与它的值和值在MPDV我可以写文件。

我的解决方案是这样的:额外的数组

    E                    MPX        16250               MPDV REDEF   

和许多动作:

C                     MOVELMMEMOD    WRPMOD    
C                     MOVEAMPDV      MPX       
C                     MOVELMPX,1     W01PDV    
C                     MOVELMPX,2     W02PDV    
.... etc until
C                     MOVELMPX,16    W16PDV  
C                     WRITEWRPASM         

和反向读取。

使用数据结构将单个字段覆盖到主字段中:

IMPDV        DS                                      
I                                        1 250 W01PDV
I                                      251 500 W02PDV
I                                      501 750 W03PDV
                      . . .
I                                     37514000 W16PDV

有关更多信息,我推荐使用以下资源:

IBM i信息中心
ILE RPG程序员指南
ILE RPG语言参考

Safari Books Online
现代RPG IV语言

RPG III?使用RPG IV要好得多,真的。

在RPG III中,数据结构方法是一个很好的方法。不过,有一种不同的方法可以解决这个问题。更实际地定义文件。而不是任意大小的数组"块",定义每个字段。例如,假设我们正在讨论每周的销售数据,我们想保留许多周的销售数据。将每周的销售额定义为表中的一个单独列,而不是仅仅创建250字节的字符字段,这些字段实际上并不能反映其中存储的数据。

在下面的例子中,我的程序描述了这个文件,但是同样的技术也适用于外部定义的文件。我只做了10列,但你可以看到它是如何工作的。数据库文件实际上定义了真正的列。这意味着查询用户、SQL用户(ODBC…Web应用程序?)都可以访问实际数据,而不必诉诸强制类型转换(substring())。

它的工作方式是将数据库表中的定义复制到数据结构中。在RPG中,数据结构共享存储,因此您在第1到第10列中定义的任何内容都可以重新映射到第1到第10列中定义的另一个字段。在这里,我们将整个sales数组映射到各个sales列的顶部。对ARY,1的任何更改都会自动更改WEEK01,反之亦然,因为存储是共享的—它们是完全相同的存储。
 E                    ARY        10 10 0              
 IDUMMY   AA  01                                      
 I                                        1  100WEEK01
 I                                       11  200WEEK02
 I                                       21  300WEEK03
 I                                       31  400WEEK04
 I                                       41  500WEEK05
 I                                       51  600WEEK06
 I                                       61  700WEEK07
 I                                       71  800WEEK08
 I                                       81  900WEEK09
 I                                       91 1000WEEK10
 I            DS                                      
 I                                        1  100WEEK01
 I                                       11  200WEEK02
 I                                       21  300WEEK03
 I                                       31  400WEEK04
 I                                       41  500WEEK05
 I                                       51  600WEEK06
 I                                       61  700WEEK07
 I                                       71  800WEEK08
 I                                       81  900WEEK09
 I                                       91 1000WEEK10
 I                                        1 100 ARY    

相关内容

  • 没有找到相关文章

最新更新