Флажок множественного выбора фильтра - PullRequest
0 голосов
/ 04 июля 2018

Я хочу отфильтровать данные в моей программе в зависимости от того, установлен флажок или нет.

parameters: p_z1 as checkbox DEFAULT 'X' ,
            p_z2 as checkbox.
selection-screen end of block b4.

Так что, если выбран один из этих двух или оба выбраны, как я могу отфильтровать мои данные?

 select single * from mara where matnr = pv_matnr 
and "if checkbox one is selected" where matkl = t023-matkl.
"if checkbox two is selected" where matkl = v023-matkl.

Ответы [ 3 ]

0 голосов
/ 05 июля 2018

«Динамических» запросов следует избегать, насколько это возможно, просто чтобы упростить проверку кода на предмет возможных атак с использованием SQL-инъекций (с помощью SELECT… WHERE (lv_query) возможна атака типа «отказ в обслуживании» с пустой lv_query пустой). Поэтому я написал бы код с помощью divScorp следующим образом:

parameters: p_z1 as checkbox DEFAULT 'X' ,
            p_z2 as checkbox,
            pv_matnr TYPE mara-matnr.
DATA: t023 TYPE t023, v023 TYPE v023, mara TYPE mara.
DATA range_matkl TYPE RANGE OF mara-matkl.

CLEAR range_matkl.
IF p_z1 = 'X'.
  APPEND VALUE #( sign = 'I' option = 'EQ' low = t023-matkl ) TO range_matkl.
ENDIF.
IF p_z2 = 'X'.
  APPEND VALUE #( sign = 'I' option = 'EQ' low = v023-matkl ) TO range_matkl.
ENDIF.

SELECT SINGLE * FROM mara WHERE MATNR = PV_MATNR and matkl IN range_matkl.

PS: мой код (и код divScorp) не имеет смысла, потому что алгоритм pureAbap неверен: в случае, когда p_z1 и p_z2 оба равны 'X', существует риск, что SELECT ничего не вернет, если t023-matkl отличается с v023-маткл. Может быть, p_z1 и p_z2 должны быть преобразованы в переключатели? (можно выбрать только один из двух?)

0 голосов
/ 18 июля 2018

Вы всегда можете использовать:

IF chck1 = 'X' and chck2 = 'X'.
    SELECT ... WHERE both.
ELSEIF chck1 = 'X'.
    SELECT ... WHERE ...
ELSEIF chck2 = 'X'.
    SELECT ... WHERE ...
ENDIF.

Но я думаю, это не то, что вы хотели сделать. Не самый элегантный способ, но эй - это работает.

0 голосов
/ 04 июля 2018

Вы можете подготовить динамическое предложение where -

DATA : lv_query TYPE string.

CONCATENATE 'MATNR = PV_MATNR' lv_query INTO lv_query.
IF p_z1 = 'X'.
  CONCATENATE lv_query 'AND MATKL = T023-MATKL' INTO lv_query SEPARATED BY space.
ENDIF.
IF p_z2 = 'X'.
  CONCATENATE lv_query 'AND MATKL = V023-MATKL' INTO lv_query SEPARATED BY space.
ENDIF.

SELECT SINGLE * FROM mara WHERE (lv_query).
...