我想将 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
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)TBR2N
没有数组,所以你不能在两边使用MOVEA
,但是MOVEL
将工作分配Alpha
到Num
像这样:
C MOVEL Alpha Num
话虽如此,你不应该再使用 Fixed Form 了。所有受支持的 OS 版本都支持 Free Form RPGIV,你可以通过使用它获得一些优势。特别是在这种情况下,隐式数值数据类型在 Free Form 中是不可能的。所以你会有这样的事情:
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);
首先,没有所谓的“数字 DS”。
RPG 中的数据结构只是字节的集合。由于编译器没有 BYTE 类型,它只是将其视为 SBCS 字符。
你的问题是,你的数字子字段默认为包装十进制。所以你的 DS 命名为 NUM 只有 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);
本站系公益性非盈利分享网址,本文来自用户投稿,不代表码文网立场,如若转载,请注明出处
评论列表(77条)