ABAP: от get_auth_values () результат к запросу SQL
Я использую результат get_auth_values (). Это структура типа us335.
Этот результат может содержать отдельные значения или пары значений низкого-высокого уровня.
Я хочу использовать результаты us335 и выполнить запрос SQL. Объединение записей с AND
,
Я вижу эти способы решить эту проблему:
- создайте SQL-запрос с помощью `WHERE COL IN (value1, value2, ...) и COL <=value3 и col >=value4 ...
- создать SQL-запрос, используя специфический для OpenSQL IN seltab с моим собственным кодом (используя RANGE)
- создать запрос SQL, используя специфичные для OpenSQL
IN seltab
с помощью встроенного метода (который я не знаю до сих пор)
Я предполагаю, что есть еще больше способов решить это.
Какой самый выполнимый способ?
1 ответ
Соберите динамическое предложение WHERE. Начните с функционального модуля RH_DYNAMIC_WHERE_BUILD
, Напишите собственный конструктор строк, если он не подходит.
Вы также можете построить диапазоны для динамических предложений IN, но это будет сложнее. Типы полей различаются, а диапазоны зависят от типа (TYPE RANGE OF <type>
) вы получите много чрезмерно динамического кода, который не доставляет удовольствия при программировании.
Обратите внимание на следующие детали при построении предложения WHERE:
Имена полей в полномочиях могут отличаться от имен столбцов, из которых вы выбираете. Возможно, вам придется сопоставить их.
Значения авторизации могут содержать заполнитель
*
, Убедитесь, что вы перевели его на оператора ABAPCP
или оператор SQLLIKE
, Если значение является только звездочкой, вы можете игнорировать условие, потому что оно ничего не будет ограничивать.Функциональный модуль принимает значения длиной до 20 символов, а значения авторизации могут быть до 40 символов. Если вам нужна полная длина, функционального модуля недостаточно.
Строковые поля требуют заключать значения в кавычки для правильного синтаксиса SQL, в то время как нестроковые значения, такие как целые числа, не должны быть заключены, чтобы сделать выбор правильным. Убедитесь, что вы выбрали правильное вложение для типа столбца.
Я не уверен, что инспектор кода распознает эту комбинацию функциональных модулей как безопасную. Динамические предложения WHERE являются потенциальной точкой проникновения для внедрения SQL. Инспектор кода обычно отклоняет управляющие потоки, которые делегируют сборку предложения какому-либо другому классу. Вам может понадобиться добавить экранирование с помощью методов класса
cl_abap_dyn_prg
,
Как сказал Флориан, у вас здесь не так много вариантов. Если вы хотите запрашивать свою таблицу с настраиваемой структурой только динамически, предложение where поможет вам или создание нескольких seltabs (диапазонов), но последнее может быть нефункциональным, если ключ таблицы очень сложный.
Здесь более функциональное, чем техническое решение, но тем не менее. Если вы хотите запросить свою настраиваемую таблицу с данными аутентификации изget_auth_values()
FM, предлагаю использовать вспомогательную таблицу базы данных:
DATA: lt_tab TYPE TABLE OF us335.
CALL FUNCTION 'GET_AUTH_VALUES'
EXPORTING
object1 = 'B_USERSTAT'
user = sy-uname
tcode = 'SPRO'
TABLES
values = lt_tab.
SELECT agr_users~uname, agr_1251~auth, agr_users~agr_name
FROM agr_1251
JOIN agr_users
ON agr_users~agr_name = agr_1251~agr_name
INTO TABLE @DATA(lt_agr)
FOR ALL ENTRIES IN @lt_tab
WHERE object = 'B_USERSTAT'
AND auth = @lt_tab-auth
AND low = @lt_tab-lowval
AND high = @lt_tab-highval.
Здесь мы выбираем пользователей по их авторизации с помощью таблицы agr_1251
структура которого полностью напоминает структуру вывода FM. Это дает вам имена пользователей + авторизации, которые вы можете использовать при следующих выборах.