RPG - 将数字DS复制到Alpha DS

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)

jma*_*phy 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
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可以分配AlphaNum这样:

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)