AS400- MOVEA не компилируется для перемещения десятичной структуры данных в десятичный массив

D posDS     ds
D pos1               2 0
D pos2               2 0

D posArr             2 0   dim(2)

C                     MoveA   posDS     posARR

В приведенном выше коде я получаю RNF7262 - поле Factor 2 и Result не одного типа и длины. Пожалуйста, помогите, что пойдет не так, поскольку тип и размер данных определены правильно.


person kalyan    schedule 26.05.2020    source источник


Ответы (3)


Похоже, вы, возможно, пытаетесь получить доступ к нескольким «последовательным» полям, возможно, происходящим из таблицы, в виде массива.

вместо того, чтобы пытаться переместить данные, просто сделайте следующее

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)
person Charles    schedule 26.05.2020
comment
Вместо использования pos(1) или overlay(posDs) вы можете использовать samepos(pos1), если у вас 7.4 или у вас есть PTF 7.3, который добавляет поддержку SAMEPOS. ibm.biz/rpg_samepos_keyword - person Barbara Morris; 27.05.2020

Структура данных также считается символьным полем. Не существует такой вещи, как «десятичная структура данных».

Если вы хотите, чтобы ваш массив "posArr" был отделен от подполей в вашей структуре данных, вы должны определить массив внутри структуры данных, как показал Чарльз, а затем определить другой массив вне структуры данных. Затем вы можете просто назначить массивы с помощью «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;
person Barbara Morris    schedule 27.05.2020
comment
Eval может сделать это с массивами? Хороший! - person jmarkmurphy; 30.05.2020

Я полагаю, вам нужно будет указать, какой элемент массива вы назначаете или из которого, например, posArr(1) или posArr(2). Если вы пытаетесь присвоить оба элемента, я думаю, потребуется либо два оператора присваивания, либо цикл.

Даже если вы исправите это, вы все равно можете получить ошибку десятичных данных, потому что структуры данных в RPG не инициализируются нулем. Они инициализируются пробелами, если вы не используете ключевое слово INZ в своей спецификации определения. Это означает, что если вы назначите неинициализированное числовое поле другому числовому, во время выполнения произойдет сбой из-за записи недопустимых десятичных данных. Это легко предотвратить в структурах данных с помощью INZ, и это не проблема для отдельных полей, поскольку система инициализирует их нулем.

person Mike    schedule 26.05.2020