Проверка значения в STRING_TABLE в предложении WHERE - PullRequest
0 голосов
/ 18 июня 2020

У меня есть процедура с параметром IT_ATINN:

IMPORTING 
    REFERENCE(IT_ATINN) TYPE  STRING_TABLE

IT_ATINN содержит список характеристик.

У меня такой код:

LOOP AT values_tab INTO DATA(value).
   SELECT ( @value-INSTANCE ) AS CUOBJ
   FROM  IBSYMBOL
   WHERE SYMBOL_ID = @value-SYMBOL_ID 
     AND ATINN ???                       "<======== HERE ???
   APPENDING TABLE @DATA(ibsymbol_tab).
ENDLOOP.

Как я могу проверить, совпадает ли ATINN (в предложении WHERE) с любой записью в IT_ATINN?

1 Ответ

0 голосов
/ 19 июня 2020

Для достижения того, что вы хотите (и я предполагаю, что вам нужны поля Dynami c SELECT), вы не можете использовать здесь встроенные объявления, как в L OOP, так и в SELECT:

Структура набора результатов должна быть статически идентифицируемой. Список SELECT и предложение FROM должны быть указаны статически, а переменные хоста в списке SELECT не должны быть общими c.

Таким образом, вы либо используете встроенную, либо динамическую, а не то и другое вместе.

Вот фрагмент, который иллюстрирует хорошее предложение Сандры:

TYPES: BEGIN OF ty_value_tab,
        instance  TYPE char18,
        symbol_id TYPE id,
       END OF ty_value_tab.

DATA: it_atinn TYPE string_table.

DATA: rt_atinn     TYPE RANGE OF atinn,
      value        TYPE ty_value_tab,
      values_tab   TYPE RANGE OF ty_value_tab,
      ibsymbol_tab TYPE TABLE OF ibsymbol.

rt_atinn = VALUE #( FOR value_atinn IN it_atinn ( sign = 'I' option = 'EQ' low = value_atinn ) ).

APPEND VALUE ty_value_tab( instance = 'ATWRT' ) TO values_tab.
LOOP AT values_tab INTO value.
  SELECT (value-instance)
    FROM ibsymbol
   WHERE symbol_id = @value-symbol_id
     AND atinn IN @rt_atinn
  APPENDING CORRESPONDING FIELDS OF TABLE @ibsymbol_tab.
ENDLOOP.

В целом, нет смысла выбирать ibsymbol в l oop, потому что в нем всего 8 полей, поэтому вы можете легко собрать все необходимые поля из values_tab и передать их как Dynami c fieldstring.

Если вы хотите использовать псевдоним CUOBJ для своего поля Dynami c, вы должны добавить его следующим образом:

LOOP AT values_tab INTO value.
  DATA(aliased_value) = value-instance && ` AS cuobj `.
  SELECT (aliased_value)
...

Помните, что ваш псевдоним должен существовать среди ibsymbol полей, иначе в случае объявления stati c ibsymbol_tab этот оператор выдаст короткий дамп.

...