0

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

程序中的数组:

 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         

并反向阅读。

4

2 回答 2

4

使用数据结构将各个字段叠加到主字段中:

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 语言

于 2011-11-05T15:56:37.307 回答
0

角色扮演游戏 III?使用 RPG IV 好得多,好得多。真的。

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

在下面的示例中,我用程序描述了文件,但同样的技术也适用于外部定义的文件。我只做了 10 列,但你可以看到它是如何工作的。数据库文件实际上定义了真正的列。这意味着查询用户、SQL 用户(ODBC...Web 应用程序?)都可以访问实际数据,而无需求助于 cast(substring())。

它的工作方式是将数据库表中的定义复制到数据结构中。在 RPG 中,数据结构共享存储,因此您在第 1 到第 10 列中定义的任何内容都可以重新映射到第 1-10 列中定义的另一个字段。在这里,我们将整个销售数组映射到各个销售列的顶部。对 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    
于 2011-11-07T16:11:56.360 回答