Использовать переменную в компоненте смещения и длины в табличном выражении?

#abap #internal-tables

#abap #внутренние таблицы

Вопрос:

Я пытаюсь понять, есть ли способ сделать следующее

 IF line_exists( company_accounts2[ saknr 0(2) = wa_company_accounts-saknr 0(wa_account_levels-num_of_digits) ] ).

  ENDIF.
 

Но число 2 в saknr 0(2) с параметром и, в частности, с тем, который существует по другую сторону равенства (wa_account_levels-num_of_digits). Есть ли какой-нибудь способ сделать это другим способом? Потому что, если я заменю 2 на wa_account_levels-num_of_digits, я получаю сообщение об ошибке «Спецификация длины «WA_ACCOUNT_LEVELS-NUM_OF_DIGITS» не является числовой».
Заранее спасибо

PS. Что не работает, и это то, о чем я спрашиваю, ниже приведенного выше кода приведен следующий код:

 IF line_exists( tab[ matnr 0(ls_mara-num_of_digits) = ls_mara-matnr 0(ls_mara-num_of_digits) ] ).
 

ЭТОТ КОД НЕ РАБОТАЕТ.

Комментарии:

1. Я не смог воспроизвести проблему с этой тестовой программой . Возможно WA_ACCOUNT_LEVELS-NUM_OF_DIGITS , это действительно не числовое число? Каков именно его тип?

Ответ №1:

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

   DATA(lv_text) = |saknr ({ wa_account_levels-num_of_digits })|.

  IF line_exists( company_accounts2[ (lv_text) = wa_company_accounts-saknr 0(wa_account_levels-num_of_digits) ] ).
    CONTINUE.
  ELSE.
    "make the APPEND
  ENDIF.
 

Ответ №2:

Это работает отлично, для того, чего вы хотите достичь, у вас wa_account_levels-num_of_digits должен быть примитивный тип i ( INT1 , INT2 , INT4 , INT8 в базе данных).

Вот рабочий образец MARA

 SELECT * UP TO 5 ROWS
FROM mara
INTO TABLE @DATA(tab).

READ TABLE tab INTO DATA(ls_mara) INDEX 1.

IF line_exists( tab[ matnr 0(2) = ls_mara-matnr 0(ls_mara-stfak) ] ).

ENDIF.
 

ОБНОВЛЕНИЕ: динамическая спецификация компонентов таблицы для доступа на чтение невозможна:

Если тип данных компонентов символьный и плоский, к имени компонента (как в доступе к подстроке) может быть добавлено смещение / длина off(len) для доступа к подобластям компонента. Для off и len могут быть указаны только непосредственно указанные числа или константы.

Комментарии:

1. Я знаю, что этот код работает. Но я хочу параметризовать левую часть равенства.