Abap 复选框多重选择过滤器

Abap 复选框多重选择过滤器,abap,opensql,Abap,Opensql,我想将数据过滤到我的程序中,这取决于是否选中了复选框 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 sel

我想将数据过滤到我的程序中,这取决于是否选中了复选框

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.

您可以准备动态
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).

您可以准备动态
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).
尽可能避免“动态”查询,只是为了更容易地检查代码是否受到可能的SQL注入攻击(使用SELECT…WHERE(lv_查询),可能会有一个空lv_查询的拒绝服务攻击)。因此,我将由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与v023 matkl不同,则SELECT将不会返回任何结果。也许p_z1和p_z2应该转换成单选按钮?(只能选择这两种查询中的一种?

应尽可能避免“动态”查询,以便更容易地检查代码是否受到可能的SQL注入攻击(使用SELECT…WHERE(lv_查询),可能会出现带有空lv_查询的拒绝服务攻击)。因此,我将由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与v023 matkl不同,则SELECT将不会返回任何结果。也许p_z1和p_z2应该转换成单选按钮?(只能选择其中一个?

您始终可以使用:

IF chck1 = 'X' and chck2 = 'X'.
    SELECT ... WHERE both.
ELSEIF chck1 = 'X'.
    SELECT ... WHERE ...
ELSEIF chck2 = 'X'.
    SELECT ... WHERE ...
ENDIF.
但我想那不是你想做的。这不是最优雅的方式,但它很有效。

您可以随时使用:

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

但我想那不是你想做的。这不是最优雅的方式,但它很管用。

当它们都被选中时会怎么样?@PureAbap对于您当前的需求,我已经给出了代码。根据您的要求进行更改。如果同时选择了这两个选项呢?@PureAbap对于您当前的要求,我已经给出了代码。根据您的要求进行更改。