1

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

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

Units、Count 和 Total 字段被映射到数据结构中,并覆盖有这样的数组定义:

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 都是“分区的”并且数据结构 COUNTDS 和 TOTALDS 是“Char”。

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

为什么这些数组突然变成“打包”数据格式?

4

2 回答 2

0

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

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

我怀疑这不是分区与打包的问题。但是需要查看编译列表中的其余定义和交叉引用才能真正了解发生了什么。

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

手册

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

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

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

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

D COUNTDS         DS                  INZ
于 2017-07-07T13:45:23.720 回答
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)
于 2017-07-07T21:46:32.170 回答