复选框多选过滤器

时间:2018-07-04 08:57:28

标签: sap abap

我想根据是否选中哪个复选框将数据过滤到程序中。

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.

3 个答案:

答案 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.

但是我想那不是你想做的。不是最优雅的方法,但是嘿-它可以工作。