Ibm midrange RPG-将数字DS复制到Alpha DS
我想把数字DS复制到字母DS。第一个想法是MOVEA,但这似乎不起作用。错误:“MOVEA的因子2或结果字段未引用数组”Ibm midrange RPG-将数字DS复制到Alpha DS,ibm-midrange,rpgle,Ibm Midrange,Rpgle,我想把数字DS复制到字母DS。第一个想法是MOVEA,但这似乎不起作用。错误:“MOVEA的因子2或结果字段未引用数组” 首先,没有所谓的“数字DS” RPG中的数据结构只是字节的集合。由于编译器没有字节类型,它只是将其视为SBCS字符 您的问题是您的数字子字段默认为压缩十进制。因此,您的DS named NUM只有6个字节 将它们定义为分区,以便两个DS都为10字节 D Alpha DS
首先,没有所谓的“数字DS” RPG中的数据结构只是字节的集合。由于编译器没有字节类型,它只是将其视为SBCS字符 您的问题是您的数字子字段默认为压缩十进制。因此,您的DS named NUM只有6个字节 将它们定义为分区,以便两个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);
关于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
是字符(10)TBR1
是字符(5)TBR2
是字符(5)Num
是字符(10)TBR1N
分区为(50)TBR2N
分区为(50)没有数组,因此您不能将
MOVEA
与两侧的任何数组一起使用,但是MOVEL
可以将Alpha
分配给Num
,如下所示:
C MOVEL Alpha Num
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);
也就是说,你不应该再使用固定形式了。所有受支持的操作系统版本都支持自由格式的RPGIV,使用它可以获得一些优势。特别是在这种情况下,隐式数字数据类型在自由形式中是不可能的。所以你会有这样的想法:
C MOVEL Alpha Num
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);
数据类型现在是显式的,您甚至可以限定您的数据结构,以便可以这样说:
C MOVEL Alpha Num
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);
看起来这是不允许的。。。数值移动:移动仅在定义了相同数值长度的字段和数组元素之间有效。因子2和结果字段项可以指定数值字段、数值数组元素或数值数组;至少一个必须是数组或数组元素。数值类型可以是二进制、压缩十进制或分区十进制,但不需要指定因子2和结果字段之间相同。“将
MOVEA
更改为MOVEL
。这不是数字移动。数据结构被视为一个固定字符字段。在数据结构内部,如果数据类型保留为空,则子字段定义为字符字段(小数点为空)或分区小数点(小数点不为空)。can和did。谢谢。数据结构中的数字定义没有数据类型,默认为分区。他的问题是移动a,一个简单的移动就足够了。或者你可以这样做:dcl-ds-Convert-qualified;tbr1字符(5)位置(1);tbr1n分区(5:0)位置(1);tbr2字符(5)位置(6);tbr2n分区(5:0)位置(6);结束ds代码>这样它会自动转换。