RPG - 将数字DS复制到Alpha DS

时间:2018-04-05 20:25:44

标签: ibm-midrange rpgle

我想将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

2 个答案:

答案 0 :(得分:9)

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 0)
TBR2N是ZONED(5 0)

没有数组,因此您无法将MOVEA用于任何一方,但MOVEL可以将Alpha分配给Num,如下所示:

C                   MOVEL     Alpha     Num

话虽如此,你不应再使用固定表格了。所有受支持的操作系统版本都支持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;

数据类型现在是显式的,您甚至可以限定数据结构,以便您可以这样说:

num.tbr1n = %dec(alpha.tbr1:5:0);

答案 1 :(得分:4)

首先,没有"数字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);