«Динамических» запросов следует избегать, насколько это возможно, просто чтобы упростить проверку кода на предмет возможных атак с использованием 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 должны быть преобразованы в переключатели? (можно выбрать только один из двух?)