This article illustrates how to write a dynamic where clause in ABAP SELECT queries using the function module 'RH_DYNAMIC_WHERE_BUILD'.
Calling the function module RH_DYNAMIC_WHERE_BUILD
CALL FUNCTION 'RH_DYNAMIC_WHERE_BUILD'
EXPORTING
dbtable = v_table_name
tables
condtab = t_condtab
where_clause = t_where_clause
EXCEPTIONS
EMPTY_CONDTAB = 1
NO_DB_FIELD = 2
UNKNOWN_DB = 3
WRONG_CONDITION = 4
OTHERS = 5.
IF sy-subrc <> 0.
MESSAGE ID SY-MSGID TYPE SY-MSGTY NUMBER SY-MSGNO
WITH SY-MSGV1 SY-MSGV2 SY-MSGV3 SY-MSGV4.
ENDIF.
Input parameters
v_table_name = Table name
t_condtab = Internal table contains the fieldnames and their
values used in where clause.
Output parameters
t_where_clause = Output string which will be used along
with the 'WHERE' clause in Select query. This internal table contains one field
with type character.
Populating t_condtab internal table
SFLIGHT table is used in this example to fetch data using dynamic Select query. CARRID, CONNID and FLDATE are the 3 key fields used for fetching data from SFLIGHT (MANDT field is not considered in this example). The internal table t_condtab will be populated using these 3 fields and passed to the function module. Function module will return the internal table t_where_clause, which can be used along with the where clause in the Select query.
Sample code for fetching data from SFLIGHT using dynamic where clause
TYPES : BEGIN OF ty_where_clause,
line TYPE char72,
END OF ty_where_clause.
DATA : t_condtab TYPE STANDARD TABLE OF hrcond,
t_sflight TYPE STANDARD TABLE OF sflight,
t_where_clause TYPE STANDARD TABLE OF ty_where_clause.
PERFORM fill_condtab USING 'CARRID' 'EQ' 'AA'.
PERFORM fill_condtab USING 'CONNID' 'EQ' '17'.
PERFORM fill_condtab USING 'FLDATE' 'EQ' '20130724'.
CALL FUNCTION 'RH_DYNAMIC_WHERE_BUILD'
EXPORTING
dbtable = 'SFLIGHT'
TABLES
condtab = t_condtab
where_clause = t_where_clause
EXCEPTIONS
empty_condtab = 1
no_db_field = 2
unknown_db = 3
wrong_condition = 4
OTHERS = 5.
IF sy-subrc <> 0.
MESSAGE ID sy-msgid TYPE sy-msgty NUMBER sy-msgno
WITH sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4.
ENDIF.
SELECT *
FROM sflight
INTO TABLE t_sflight
WHERE (v_where_clause).
*&---------------------------------------------------------------------*
*& Form FILL_CONDTAB
*&---------------------------------------------------------------------*
FORM fill_condtab USING value(pv_field) TYPE dbfeld
value(pv_operator) TYPE char2
value(pv_low) TYPE hrvalue
DATA : lx_condtab TYPE hrcond.
lx_condtab-field = pv_field.
lx_condtab-opera = pv_operator.
lx_condtab-low = pv_low.
APPEND lx_condtab TO t_condtab.
ENDFORM.