PureAbap
PureAbap

Reputation: 99

Checkbox multiple selection filter

I want to filter the data into my program depending what checkbox is selected or not.

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

So if one of these two is selected or if both are selected how can I filter my data?

 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.

Upvotes: 0

Views: 3419

Answers (3)

Bananach
Bananach

Reputation: 1

You can always use:

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

But I guess that's not what you wanted to do. Not the most elegant way but hey - it works.

Upvotes: 0

Sandra Rossi
Sandra Rossi

Reputation: 13656

"Dynamic" queries are to be avoided as far as possible, just to make it easier to check the code against possible SQL injection attacks (with SELECT … WHERE (lv_query), there could be a Denial-of-Service attack with an empty lv_query empty). So I would write the code by divScorp as follows:

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: my code (and the one of divScorp) is non-sense because pureAbap algorithm is incorrect : in case p_z1 and p_z2 are both 'X', then there's the risk that the SELECT returns nothing if t023-matkl is different from v023-matkl. Maybe p_z1 and p_z2 should be converted into radio buttons? (only one of the two can be selected?)

Upvotes: 1

divScorp
divScorp

Reputation: 502

You can prepare dynamic where clause -

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).

Upvotes: 2

Related Questions