谁能告诉我这个RPGLE阵列有什么问题?

时间:2017-07-07 10:51:36

标签: arrays printing ibm-midrange rpgle packed-decimal

有一个看起来像这样的打印机文件:

Customer-data                 Units01 Units02 ....... Units11
-------------------------------------------------------------
Name/address/zip/....         Count01 Count02 ....... Count11
Name/address/zip/....         Count01 Count02 ....... Count11
:    :       :   :            :       :       :       : 
Name/address/zip/....         Count01 Count02 ....... Count11
                              ------- ------- ------- -------
Totals                        Total01 Total02 ....... Total11

单位,计数和总计字段映射到数据结构中,数据结构重叠,如下所示:

0014.00 D UNITSDS         DS
0015.00 D   UNITS01
0016.00 D   UNITS02
:       :   :
0024.00 D   UNITS10
0025.00 D   UNITS11
0026.00 D  UNITSAR                            LIKE(UNITS) DIM(11) 
0026.00 D                                     OVERLAY(UNITSDS)
:       D*-------------------------------------------------------
0034.00 D COUNTDS         DS
0035.00 D   COUNT01
0036.00 D   COUNT02
:       :   :
0044.00 D   COUNT10
0045.00 D   COUNT11
0046.00 D  COUNTAR                            LIKE(COUNT) DIM(11) 
0046.00 D                                     OVERLAY(COUNTDS)
:       D*-------------------------------------------------------
0054.00 D TOTALDS         DS
0055.00 D   TOTAL01
0056.00 D   TOTAL02
:       :   :
0064.00 D   TOTAL10
0065.00 D   TOTAL11
0066.00 D  TOTALAR                            LIKE(TOTAL) DIM(11) 
0066.00 D                                     OVERLAY(TOTALDS)

经过一些处理后,当我在打印机文件的详细信息行上处理WRITE时,出现“十进制数据错误”。

我非常惊讶看到数组COUNTAR和TOTALAR的数据类型为“Packed”,尽管所有先前定义的变量COUNT,COUNTnn,TOTAL和TOTALnn都是“Zoned”且数据结构COUNTDS和TOTALDS是“Char”

打包数据已映射到打印机文件的输出缓冲区中,导致“十进制数据错误”。

为什么这些数组突然处于“Packed”数据格式?

2 个答案:

答案 0 :(得分:0)

数据结构始终都是字符,因为RPG没有BYTE数据类型。

您似乎没有在这里定义子字段,因此他们必须从其他地方获取大小和类型。可能,打印机文件。打印机文件可能已更改吗?

我怀疑这不是一个分区vs包装​​问题。但是需要查看其余的定义以及编译列表中的交叉引用,才能真正了解正在发生的事情。

相反,这可能是由于DS未初始化的原因。

来自manual

  

未指定INZ参数时:
    - 初始化数据结构的静态独立字段和子字段初始化为其RPG默认初始值(for   例如,字符为空格,数字为0)     - 初始化未初始化数据结构的子字段(未在数据结构的定义规范中指定的INZ)   空白(无论数据类型如何)。

由于您的DS上没有INZ关键字,因此它们被视为未初始化,并且您的DS的所有子字段都设置为空白。哪个或当然不是有效数字。

如果报告正常运行正常,则在所有11列中打印数据。如果您尝试以不加载所有11个子字段的方式运行报告,您现在可能会看到错误;因此留下一些空白。当系统尝试将数据移动到打印机文件的输出缓冲区时,会出现十进制数据错误。

简而言之,请将INZ关键字添加到您的DS中。

D COUNTDS         DS                  INZ

答案 1 :(得分:0)

我会编码

0014.00 D UNITSDS         DS
0015.00 D   UNITS01
0016.00 D   UNITS02
:       :   :
0024.00 D   UNITS10
0025.00 D   UNITS11
0026.00 D  UNITSAR                            LIKE(UNITS01) DIM(11) 
0026.00 D                                     OVERLAY(UNITSDS)
:       D*-------------------------------------------------------
0034.00 D COUNTDS         DS
0035.00 D   COUNT01
0036.00 D   COUNT02
:       :   :
0044.00 D   COUNT10
0045.00 D   COUNT11
0046.00 D  COUNTAR                            LIKE(COUNT01) DIM(11) 
0046.00 D                                     OVERLAY(COUNTDS)
:       D*-------------------------------------------------------
0054.00 D TOTALDS         DS
0055.00 D   TOTAL01
0056.00 D   TOTAL02
:       :   :
0064.00 D   TOTAL10
0065.00 D   TOTAL11
0066.00 D  TOTALAR                            LIKE(TOTAL01) DIM(11) 
0066.00 D                                     OVERLAY(TOTALDS)