Mus*_*rge 0 rpgle ibm-midrange
我想将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
Run Code Online (Sandbox Code Playgroud)
关于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
Run Code Online (Sandbox Code Playgroud)
所以对于你的定义:
D Alpha DS
D TBR1 5A
D TBR2 5A
D Num DS
D TBR1N 5 0
D TBR2N 5 0
Run Code Online (Sandbox Code Playgroud)
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
Run Code Online (Sandbox Code Playgroud)
话虽这么说,你不应该再使用固定表格了.所有受支持的操作系统版本都支持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;
Run Code Online (Sandbox Code Playgroud)
数据类型现在是显式的,您甚至可以限定数据结构,以便您可以这样说:
num.tbr1n = %dec(alpha.tbr1:5:0);
Run Code Online (Sandbox Code Playgroud)