我想将Numeric复制到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发布于 2018-04-06 20:54:48
关于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 0Alpha是字符(10)
TBR1为CHAR(5)
TBR2为CHAR(5)
Num是字符(10)
TBR1N已分区(%5% 0)
TBR2N已分区(%5% 0)
由于没有数组,所以您不能在两端使用MOVEA。但是MOVEL可以像这样将Alpha赋值给Num:
C MOVEL Alpha Num也就是说,你不应该再使用固定形式了。所有受支持的操作系统版本都支持自由形式的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);发布于 2018-04-06 04:51:52
首先,没有“数字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);https://stackoverflow.com/questions/49680958
复制相似问题