我想根据是否选中哪个复选框将数据过滤到程序中。
des.exe: MZ����@���: not found
des.exe: Syntax error: "(" unexpected
那么,如果选择这两个之一或同时选择两个,我该如何过滤我的数据?
parameters: p_z1 as checkbox DEFAULT 'X' ,
p_z2 as checkbox.
selection-screen end of block b4.
答案 0 :(得分:2)
您可以准备动态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).
答案 1 :(得分:1)
应尽可能避免“动态”查询,只是为了使其更容易地针对可能的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',则如果t023-matkl不同,则SELECT不会返回任何内容的风险来自v023-matkl。也许应该将p_z1和p_z2转换为单选按钮? (只能选择两者之一吗?)
答案 2 :(得分:0)
您始终可以使用:
IF chck1 = 'X' and chck2 = 'X'.
SELECT ... WHERE both.
ELSEIF chck1 = 'X'.
SELECT ... WHERE ...
ELSEIF chck2 = 'X'.
SELECT ... WHERE ...
ENDIF.
但是我想那不是你想做的。不是最优雅的方法,但是嘿-它可以工作。