AS400- MOVEA无法将十进制数据结构移动到十进制数组

问题描述 投票:0回答:3
D posDS     ds
D pos1               2 0
D pos2               2 0

D posArr             2 0   dim(2)

C                     MoveA   posDS     posARR

在上面的代码中,我得到RNF7262-因子2和结果字段的类型和长度不同。请协助正确定义数据类型和大小的问题。

error-handling compiler-errors ibm-midrange rpgle rpg
3个回答
2
投票

看来您可能试图以数组的形式访问多个“顺序”字段,这些字段可能源自表。

而不是尝试移动数据,只需执行以下操作

dcl-ds posDs;
  pos1 zoned(2);
  pos2 zoned(2);
  posArr zoned(2) dim(2) pos(1);
end-ds;

修复格式如下

 d posDs           ds
 d  pos1                          2  0
 d  pos2                          2  0
 d  posArr                        2  0 dim(2) overlay(posDs)

2
投票

数据结构也被视为字符字段。没有“十进制数据结构”之类的东西。

如果您希望将“ posArr”数组与数据结构中的子字段分开,则可以如Charles所示在数据结构中定义一个数组,然后在数据结构之外定义另一个数组。然后,您可以使用“ EVAL”分配数组,而不是尝试使用不建议使用的MOVEA操作码。

d posDs           ds                  inz
d  pos1                          2  0
d  pos2                          2  0
d  posArrDs                      2  0 dim(2) samepos(pos1)

d posArr          s              2  0 dim(2)

    pos1 = 1;
    pos2 = 2;
    posArr = posArrDs; // Instead of MOVEA
    return;

1
投票

我相信您将需要指定要分配给数组或从数组中分配哪个元素,例如posArr(1)posArr(2)。如果您要同时分配这两个元素,我认为将需要两个分配语句或一个循环。

即使您解决了该问题,但是由于RPG中的数据结构未初始化为零,您仍然可能会得到十进制数据错误。除非您在定义规范中使用INZ关键字,否则它们将初始化为空白。这意味着,如果将未初始化的数字字段分配给另一个数字,它将在运行时因写入无效的十进制数据而崩溃。通过使用INZ可以很容易地防止数据结构出现,对于独立字段也不是问题,因为系统会将它们初始化为零。

© www.soinside.com 2019 - 2024. All rights reserved.