我想将Numeric DS复制到Alpha DS。第一个想法是MOVEA,但这似乎不起作用。错误:" MOVEA的因子2或结果字段不引用数组"
D Alpha DS
D TBR1 5A
D TBR2 5A
D Num DS
D TBR1N 5 0
D TBR2N 5 0
C MOVEA Alpha Num
答案 0 :(得分:9)
RPG中的数据结构似乎存在很多误解。在过去的一个月里,有两个问题,因为有人认为他可以强迫数据结构成为UCS2值。它不会起作用。数据结构是使用作业的CCSID的固定长度字符字段。如果您使用数据结构名称作为变量,它具有一些内部结构的事实是没有意义的。
这似乎与固定形式RPG能够隐含地将字段定义为字符或数字而不赋予其数据类型相结合。独立字段和数据结构以不同方式处理这种情况。见下表:
field type | decimal positions | Implicit data type
----------------------------------------------------
stand alone | blank | A
| not blank | P
----------------------------------------------------
data | blank | A
structure | not blank | S
所以对于你的定义:
D Alpha DS
D TBR1 5A
D TBR2 5A
D Num DS
D TBR1N 5 0
D TBR2N 5 0
Alpha
是CHAR(10)
TBR1
是CHAR(5)
TBR2
是CHAR(5)
Num
是CHAR(10)
TBR1N
是ZONED(5 0)
TBR2N
是ZONED(5 0)
没有数组,因此您无法将MOVEA
用于任何一方,但MOVEL
可以将Alpha
分配给Num
,如下所示:
C MOVEL Alpha Num
话虽如此,你不应再使用固定表格了。所有受支持的操作系统版本都支持Free Form RPGIV,您可以通过使用它获得一些优势。特别是对于这种情况,自由形式中不可能存在隐式数字数据类型。所以你会有这样的事情:
dcl-ds Alpha Qualified;
tbr1 Char(5);
tbr2 Char(5);
end-ds;
dcl-ds Num Qualified;
tbr1n Zoned(5:0);
tbr2n Zoned(5:0);
end-ds;
Num = Alpha;
数据类型现在是显式的,您甚至可以限定数据结构,以便您可以这样说:
num.tbr1n = %dec(alpha.tbr1:5:0);
答案 1 :(得分:4)
首先,没有"数字DS"。
RPG中的数据结构只是一个字节集合。由于编译器没有BYTE类型,它只是将其视为SBCS字符。
您的问题是您的数字子字段默认为压缩十进制。因此,名为NUM的DS只有6个字节。
将它们定义为ZONED,这样两个DS都将为10个字节。
D Alpha DS
D TBR1 5A
D TBR2 5A
D Num DS
D TBR1N 5S 0
D TBR2N 5S 0
Num = Alpha;
但这种代码在RPGIV中确实不是一个好主意。
为什么不能明确转换?
tbr1n = %dec(tbr1:5:0);
tbr2n = %dec(tbr2:5:0);