Как зациклить на динамической внутренней таблице - PullRequest
0 голосов
/ 14 января 2019

Я работаю над имплантацией улучшения в ZXMBCU10, которая вызывается в пользовательской программе на несколько уровней вниз по пути выполнения. Внутри ZXMBCU10 я хочу получить доступ к таблице в родительской программе, что я делаю следующим способом:

  1. Объявить имя родительской программы;

    DATA: ex_tbl_name TYPE char100 VALUE '(ZPROGRAM)G_TAB'.

  2. Получение значения с помощью назначения символа поля.

    FIELD-SYMBOLS: <fs> TYPE any.

    ASSIGN (ex_tbl_name) TO <fs>.

Затем я проверяю успешное назначение (что верно).

IF <fs> IS ASSIGNED.

Accessing parent table

У меня проблема в том, как прочитать данные в символе поля <fs>.

Я пробовал LOOP и READ TABLE, но получаю следующее:

Loop and Read table sample

Здесь добавлены как Read Table, так и Loop только для проверки синтаксиса

LOOP;

Внутренняя таблица "<FS>" не имеет строки заголовка - одно из дополнений "INTO ва "," НАЗНАЧЕНИЕ "," ССЫЛКА НА "," ПЕРЕВОЗКА НЕТ ПОЛЕЙ "требуется. требуется.

READ TABLE;

Вы не можете использовать явные или неявные операции с индексами для таблиц с Типы "HASHED TABLE" или "ЛЮБОЙ СТОЛ". «<FS>» имеет тип «ЛЮБОЙ СТОЛ». Возможно, что дополнение "TABLE" не было указано ранее "<FS>".

Ответы [ 2 ]

0 голосов
/ 16 января 2019

LOOP AT

Ошибка около LOOP AT ( Внутренняя таблица "<FS>" не имеет строки заголовка - требуется одно из дополнений "INTO wa", "ASSIGNING", "REFERENCE INTO", "TRANSPORTING NO FIELDS" ), это то, что вы не указываете часть «результата» LOOP AT, т. Е. НАЗНАЧЕНИЕ, ССЫЛКА НА ... (как сказано в сообщении).

Для символа поля только LOOP AT всегда недопустим, а если это переменная вместо символа поля, то она устарела, поскольку это подразумевает использование строки заголовка.

LOOP AT <fs>. " always invalid !

Допустимый синтаксис может быть следующим: вы должны объявить символ поля как внутреннюю таблицу (по крайней мере со словом TABLE или обратиться к «типу таблицы»), для которой поддерживается любая категория внутренней таблицы LOOP AT (хешированный, отсортированный, стандартный), поэтому вы можете использовать TYPE ANY TABLE:

DATA: ex_tbl_name TYPE char100 VALUE '(ZPROGRAM)G_TAB'.
FIELD-SYMBOLS: <fs> TYPE ANY TABLE.

ASSIGN (ex_tbl_name) TO <fs>.
LOOP AT <fs> ASSIGNING FIELD-SYMBOL(<line>).
ENDLOOP.

ЧИТАТЬ СТОЛ

Ошибка около READ TABLE ( Нельзя использовать явные или неявные операции с индексами для таблиц с типами «HASHED TABLE» или «ANY TABLE». «<FS>» имеет тип «ANY TABLE». возможно, что добавление «TABLE» не было указано до «<FS>» ), если вы использовали READ TABLE ... INDEX ..., чей INDEX означает, что его можно использовать только с внутренней таблицей категории SORTED или STANDARD.

Следующий код недействителен из-за комбинации ЛЮБОГО TABLE и READ TABLE INDEX, потому что <FS> может в конечном итоге быть внутренней таблицей hashed (кто знает), тогда READ TABLE INDEX завершится ошибкой, следовательно ошибка компилятора:

DATA: ex_tbl_name TYPE char100 VALUE '(ZPROGRAM)G_TAB'.
FIELD-SYMBOLS: <fs> TYPE ANY TABLE. " <=== impossible with READ TABLE INDEX !

ASSIGN (ex_tbl_name) TO <fs>.
READ TABLE <fs> ASSIGNING FIELD-SYMBOL(<line>) INDEX 1. " <=== impossible with ANY TABLE !

Решение: для использования READ TABLE <fs> INDEX ... вы можете объявить символ поля как SORTED, STANDARD или INDEX (последнее - это общее имя, соответствующее SORTED и STANDARD).

Этот код действителен:

DATA: ex_tbl_name TYPE char100 VALUE '(ZPROGRAM)G_TAB'.
FIELD-SYMBOLS: <fs> TYPE INDEX TABLE.

ASSIGN (ex_tbl_name) TO <fs>.
READ TABLE <fs> ASSIGNING FIELD-SYMBOL(<line>) INDEX 1.

Конечно, предполагается, что G_TAB является индексной таблицей, а не хеш-таблицей!

PS: в своем коде вы использовали INTO DATA(lv_fs), но обычно, если у вас есть общая внутренняя таблица, ASSIGNING предпочтительнее.

0 голосов
/ 14 января 2019

изменить тип символа поля на

any table.

вместо:

any.
...