Ibm midrange RPG-将数字DS复制到Alpha DS

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复制到字母DS。第一个想法是MOVEA,但这似乎不起作用。错误:“MOVEA的因子2或结果字段未引用数组”


首先,没有所谓的“数字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这样它会自动转换。