在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