Application Development and Automation Discussions
Join the discussions or start your own on all things application development, including tools and APIs, programming models, and keeping your skills sharp.
cancel
Showing results for 
Search instead for 
Did you mean: 
Read only

Using dynamic where clause with dynamic table...

Former Member
0 Likes
1,699

Hi,

I have a requirement. I am working in a user exit in which there is a table parameter C_T_DATA whose structure is defined at runtime only based on some conditions. Lets say, if cond1 is true, structure will be ABC; else it will be XYZ.

Now, in my code, i need to use SELECT query based on the value populated in internal table. So i wrote the code like below :

DATA : v_where TYPE string.

If cond1 is true.

     v_where = 'GUID = C_T_DATA-GUID'.

     SELECT partner_guid

          from BUT000

          into table it_partner

          FOR ALL ENTRIES IN c_t_data

          WHERE (v_where).

elseif cond2 is true.

     v_where = 'VBELN = C_T_DATA-VBELN'.

*----Corresponding Code    

endif.

Now, when I am executing the code, I am getting a short dump saying only literals are allowed in dynamic where and not values. So anyone could please help me out to solve this. I found some posts for this but in all those the structure of table was known while in my case it is known at run time only.

Kindly help.

Regards,

Guddan

5 REPLIES 5
Read only

Clemenss
Active Contributor
0 Likes
1,235

Hi Guddan,

please check this alternative:

DATA:

  lt_guid    TYPE SORTED TABLE OF  OF but00-guid

    WITH UNIQUE KEY table_line,

  lt_vbeln   TYPE SORTED TABLE OF  OF vbak-vbeln

    WITH UNIQUE KEY table_line.

FIELD-SYMBOLS: 

  <any>      TYPE any,

  <data>     TYPE any.

LOOP AT c_t_data ASSIGNING <data>.

  IF cond1 is true.

    ASSIGN COMPONENT 'GUID' OF STRUCTURE <data> to <any>.

    INSERT <any> INTO TABLE lt_guid.

  ELSE. 

    ASSIGN COMPONENT 'VBELN' OF STRUCTURE <data> to <any>.

    INSERT <any> INTO TABLE lt_vbeln.

  ENDIF. 

ENDLOOP.

CHECK SY-SUBRC = 0. "avoid select .. for all entries with empty table

IF cond1 is true.

  SELECT partner_guid

    INTO table it_partner

    FROM but000

    FOR ALL ENTRIES IN lt_guid

    WHERE guid = lt_guid-table_line.

ELSE. 

*----Corresponding Code     

ENDIF. 

DATA:

  lt_guid    TYPE SORTED TABLE OF  OF but00-guid

    WITH UNIQUE KEY table_line,

  lt_vbeln   TYPE SORTED TABLE OF  OF vbak-vbeln

    WITH UNIQUE KEY table_line.

FIELD-SYMBOLS: 

  <any>      TYPE any,

  <data>     TYPE any.

LOOP AT c_t_data ASSIGNING <data>.

  IF cond1 is true.

    ASSIGN COMPONENT 'GUID' OF STRUCTURE <data> to <any>.

    INSERT <any> INTO TABLE lt_guid.

  ELSE. 

    ASSIGN COMPONENT 'VBELN' OF STRUCTURE <data> to <any>.

    INSERT <any> INTO TABLE lt_vbeln.

  ENDIF. 

ENDLOOP.

CHECK SY-SUBRC = 0. "avoid select .. for all entries with empty table

IF cond1 is true.

  SELECT partner_guid

    INTO table it_partner

    FROM but000

    FOR ALL ENTRIES IN lt_guid

    WHERE guid = lt_guid-table_line.

ELSE. 

*----Corresponding Code     

ENDIF. 

Please experts have mercy and enable fixed space font and ABAP syntax highlighting for posting code here. Thank you.

Regards,

Clemens

Read only

Sandra_Rossi
Active Contributor
0 Likes
1,235

Hi Guddan,

if you look at the ABAP documentation (7.0), it says that the dynamic Where clause is allowed for FOR ALL ENTRIES since 6.10. Please, could you tell us how you defined C_T_DATA?

For information, this code works well, test it on your system:

DATA lt_sflight TYPE TABLE OF sflight.
DATA lt_carrid TYPE TABLE OF s_carr_id.
DATA l_dynamic_where type STRING.
APPEND 'LH' TO lt_carrid.
l_dynamic_where = 'CARRID = LT_CARRID-TABLE_LINE'.
SELECT * FROM sflight
  INTO TABLE lt_sflight
  FOR ALL ENTRIES IN lt_carrid
  WHERE (l_dynamic_where).

Regards,

Sandra

Read only

0 Likes
1,235

Hi Sandra,

Table C_T_DATA is defined as a TABLE parameter of a user exit without using any type. That means its structure will be defined at run time only.

Hope it clears the requirement.

Regards,

Guddan

Read only

0 Likes
1,235

Hi Archna,

your problem is rather that there is no valid field in your where clause:

v_where = 'GUID = C_T_DATA-GUID'.

BUT000 has no component GUID, it is PARTNER_GUID.

  DATA:

   lv_where TYPE string,

   lt_partner TYPE TABLE OF but000-partner.

  lv_where = 'PARTNER_GUID = C_T_DATA-PARTNER_GUID'.

  SELECT partner

  INTO TABLE lt_partner

  FROM but000

  FOR ALL ENTRIES IN c_t_data

  WHERE (lv_where).

works perfect in SAP ECC 6.0 SAP_ABA    701    0007

Regards,

Clemens

Read only

Former Member
0 Likes
1,235

Hi,

Can you paste the error message that appears?

Regards,

Jake