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

IS SUPPLIED with Optional Import Parameters

Former Member
0 Likes
2,332

Hello ABAPers,

  I have a scenario that I have almost figured out that I could use some guidance with:

I have two optional import parameters in a remote function.  I want to return  data from a view based on a user entering either one of the Import Parameters.  I can get the function to work for one of the parameters but not both.  I am using 'IS SUPPLIED' statements and either an 'IF-ELSEIF' statement or two IF statements but neither way works for both Import Parameters.

If I code the function using an IF-ELSEIF statement it works for Import Parameter 1 (IV_1), but returns erroneous data for parameter 2 (IV_2):

FUNCTION Z_EQUIP_INFO .
*"--------------------------------------------------------------------
*"*"Local Interface:
*"  IMPORTING
*"     VALUE(IV_1) TYPE  U_30099-SERNR OPTIONAL
*"     VALUE(IV_2) TYPE  U_30099-INVNR OPTIONAL
*"  EXPORTING
*"     VALUE(EQUIP_NUM) TYPE  U_30099-EQUNR
*"     VALUE(MATERIAL_NUM) TYPE  U_30099-MATNR
*"     VALUE(OBJECT_TYPE) TYPE  U_30099-EQART
*"     VALUE(DESCRIPTION) TYPE  U_30099-EQKTX
*"--------------------------------------------------------------------


IF IV_1  IS SUPPLIED.

     SELECT SINGLE EQUNR MATNR EQART EQKTX
     FROM U_30099
     INTO (EQUIP_NUM, MATERIAL_NUM, OBJECT_TYPE, DESCRIPTION)
     WHERE SERNR = IV_1.

ELSEIF IV_2 IS SUPPLIED.

     SELECT SINGLE EQUNR MATNR EQART EQKTX
     FROM U_30099
     INTO (EQUIP_NUM, MATERIAL_NUM, OBJECT_TYPE, DESCRIPTION)
     WHERE INVNR = IV_2.

ENDIF.


ENDFUNCTION.

******************************************************************************************

If I code the function using two IF statements it returns accurate data for Import Parameter 2 (IV_2), but wrong data for Import Variable 1 (IV_1):

FUNCTION Z_EQUIP_INFO.
*"----------------------------------------------------------------------
*"*"Local Interface:
*"  IMPORTING
*"     VALUE(IV_1) TYPE  U_30099-SERNR OPTIONAL
*"     VALUE(IV_2) TYPE  U_30099-INVNR OPTIONAL
*"  EXPORTING
*"     VALUE(EQUIP_NUM) TYPE  U_30099-EQUNR
*"     VALUE(MATERIAL_NUM) TYPE  U_30099-MATNR
*"     VALUE(OBJECT_TYPE) TYPE  U_30099-EQART
*"     VALUE(DESCRIPTION) TYPE  U_30099-EQKTX
*"----------------------------------------------------------------------

IF IV_1 IS SUPPLIED.

     SELECT SINGLE EQUNR MATNR EQART EQKTX
     FROM U_30099
     INTO (EQUIP_NUM, MATERIAL_NUM, OBJECT_TYPE, DESCRIPTION)
     WHERE SERNR = IV_1.

ENDIF.



IF IV_2 IS SUPPLIED.

     SELECT SINGLE EQUNR MATNR EQART EQKTX
     FROM U_30099
     INTO (EQUIP_NUM, MATERIAL_NUM, OBJECT_TYPE, DESCRIPTION)
     WHERE INVNR = IV_2.

ENDIF.

ENDFUNCTION.

******************************************************************************************

What should I change to make this work for either optional Import Parameter?  Thank you very much!

1 ACCEPTED SOLUTION
Read only

basarozgur_kahraman
Contributor
0 Likes
1,848

Hello Eric,

Change your code as below:

FUNCTION Z_EQUIP_INFO.

*"----------------------------------------------------------------------

*"*"Local Interface:

*"  IMPORTING

*"     VALUE(IV_1) TYPE  U_30099-SERNR OPTIONAL

*"     VALUE(IV_2) TYPE  U_30099-INVNR OPTIONAL

*"  EXPORTING

*"     VALUE(EQUIP_NUM) TYPE  U_30099-EQUNR

*"     VALUE(MATERIAL_NUM) TYPE  U_30099-MATNR

*"     VALUE(OBJECT_TYPE) TYPE  U_30099-EQART

*"     VALUE(DESCRIPTION) TYPE  U_30099-EQKTX

*"----------------------------------------------------------------------

ranges: _r_iv_1 for U_30099-sernr,

        _r_iv_2 for U_30099-invnr.

clear: EQUIP_NUM, MATERIAL_NUM, OBJECT_TYPE, DESCRIPTION.

IF IV_1 IS not initial.

_r_iv_1-sign = 'I'.

_r_iv_1-option = 'EQ'.

_r_iv_1-low   = iv_1.

append _r_iv_1.

endif.

IF IV_2 IS not initial.

_r_iv_2-sign = 'I'.

_r_iv_2-option = 'EQ'.

_r_iv_2-low   = iv_2.

append _r_iv_2.

endif.

     SELECT SINGLE EQUNR MATNR EQART EQKTX

     FROM U_30099

     INTO (EQUIP_NUM, MATERIAL_NUM, OBJECT_TYPE, DESCRIPTION)

     WHERE SERNR in _r_inv_1

       and INVNR in _r_IV_2.

ENDFUNCTION

.

Hello ABAPers,

  I have a scenario that I have almost figured out that I could use some guidance with:

I have two optional import parameters in a remote function.  I want to return  data from a view based on a user entering either one of the Import Parameters.  I can get the function to work for one of the parameters but not both.  I am using 'IS SUPPLIED' statements and either an 'IF-ELSEIF' statement or two IF statements but neither way works for both Import Parameters.

If I code the function using an IF-ELSEIF statement it works for Import Parameter 1 (IV_1), but returns erroneous data for parameter 2 (IV_2):

FUNCTION Z_EQUIP_INFO .
*"--------------------------------------------------------------------
*"*"Local Interface:
*"  IMPORTING
*"     VALUE(IV_1) TYPE  U_30099-SERNR OPTIONAL
*"     VALUE(IV_2) TYPE  U_30099-INVNR OPTIONAL
*"  EXPORTING
*"     VALUE(EQUIP_NUM) TYPE  U_30099-EQUNR
*"     VALUE(MATERIAL_NUM) TYPE  U_30099-MATNR
*"     VALUE(OBJECT_TYPE) TYPE  U_30099-EQART
*"     VALUE(DESCRIPTION) TYPE  U_30099-EQKTX
*"--------------------------------------------------------------------


IF IV_1  IS SUPPLIED.

     SELECT SINGLE EQUNR MATNR EQART EQKTX
     FROM U_30099
     INTO (EQUIP_NUM, MATERIAL_NUM, OBJECT_TYPE, DESCRIPTION)
     WHERE SERNR = IV_1.

ELSEIF IV_2 IS SUPPLIED.

     SELECT SINGLE EQUNR MATNR EQART EQKTX
     FROM U_30099
     INTO (EQUIP_NUM, MATERIAL_NUM, OBJECT_TYPE, DESCRIPTION)
     WHERE INVNR = IV_2.

ENDIF.


ENDFUNCTION.

******************************************************************************************

If I code the function using two IF statements it returns accurate data for Import Parameter 2 (IV_2), but wrong data for Import Variable 1 (IV_1):

FUNCTION Z_EQUIP_INFO.
*"----------------------------------------------------------------------
*"*"Local Interface:
*"  IMPORTING
*"     VALUE(IV_1) TYPE  U_30099-SERNR OPTIONAL
*"     VALUE(IV_2) TYPE  U_30099-INVNR OPTIONAL
*"  EXPORTING
*"     VALUE(EQUIP_NUM) TYPE  U_30099-EQUNR
*"     VALUE(MATERIAL_NUM) TYPE  U_30099-MATNR
*"     VALUE(OBJECT_TYPE) TYPE  U_30099-EQART
*"     VALUE(DESCRIPTION) TYPE  U_30099-EQKTX
*"----------------------------------------------------------------------

IF IV_1 IS SUPPLIED.

     SELECT SINGLE EQUNR MATNR EQART EQKTX
     FROM U_30099
     INTO (EQUIP_NUM, MATERIAL_NUM, OBJECT_TYPE, DESCRIPTION)
     WHERE SERNR = IV_1.

ENDIF.



IF IV_2 IS SUPPLIED.

     SELECT SINGLE EQUNR MATNR EQART EQKTX
     FROM U_30099
     INTO (EQUIP_NUM, MATERIAL_NUM, OBJECT_TYPE, DESCRIPTION)
     WHERE INVNR = IV_2.

ENDIF.

ENDFUNCTION.

******************************************************************************************

What should I change to make this work for either optional Import Parameter?  Thank you very much!

7 REPLIES 7
Read only

Former Member
0 Likes
1,848

Hi,

I'm not sure to follow you...I don't see any issue related to the supplied statement here. But your logic is not correct if you also want to query on both fields at the same time.

You should define 3 cases:

IF IV_1 IS SUPPLIED AND IV_2 IS SUPPLIED.

     SELECT SINGLE EQUNR MATNR EQART EQKTX

     FROM U_30099

     INTO (EQUIP_NUM, MATERIAL_NUM, OBJECT_TYPE, DESCRIPTION)

     WHERE SERNR = IV_1

           AND INVNR = IV_2.

ELSEIF IV_1 IS SUPPLIED.

     SELECT SINGLE EQUNR MATNR EQART EQKTX

     FROM U_30099

     INTO (EQUIP_NUM, MATERIAL_NUM, OBJECT_TYPE, DESCRIPTION)

     WHERE SERNR = IV_1.



ELSEIF IV_2 IS SUPPLIED.

     SELECT SINGLE EQUNR MATNR EQART EQKTX
     FROM U_30099
     INTO (EQUIP_NUM, MATERIAL_NUM, OBJECT_TYPE, DESCRIPTION)
     WHERE INVNR = IV_2.

ENDIF.

Cheers,

Manu.

Read only

0 Likes
1,848

Eric,

i am not sure if IS SUPPLIED guarantees NOT INITIAL!

I think it depends on how you coded the main program which calls this FM. Do you actually pass both the optional fields. IS SUPPLIED may be always true (even if it is initial). I guess that is why you get erroneous results. You may try changing it to IS INITIAL or at least check it is not initial to avoid erroneous results.

Thanks!

VM

Read only

Former Member
0 Likes
1,848

Anyway by re-reading this, I would have go differently...using one select.

You just need to use ranges as import parameters (or build your own inside the FM). You will then only need one select:

     SELECT EQUNR MATNR EQART EQKTX

     FROM U_30099 UP TO 1 ROWS

     INTO (EQUIP_NUM, MATERIAL_NUM, OBJECT_TYPE, DESCRIPTION)

     WHERE SERNR IN R_IV_1

           AND INVNR IN R_IV_2.

     ENDSELECT.

This way not matter how the call was done...

Also prefer UP TO 1 ROWS option instead of SINGLE since your key is not fully defined here...

Kr,

Manu.

Read only

0 Likes
1,848

Thank you Manu.  How do I build Range Tables inside the FM?  I haven't built a range table before.

Read only

former_member193464
Contributor
0 Likes
1,848

when both the parameters are passed what do you want in that ? I am guessing you want to keep an AND statement.
You can try by making a dynamic where condition based on the parameters being passed.
take lv_where as string .

and lt_string Type standard table of string.

IF IV_1 is not initial.

lv_where = 'SERNR  EQ lv_1'.

APPEND lv_where TO lt_where.

ENDIF.

IF IV_2 is not initial.

lv_where = 'INVNR  EQ lv_2.

APPEND lv_where TO lt_where.

ENDIF.

CLEAR lv_where.

check lt_where is not initial.

LOOP AT lt_where into wa_where.

IF lv_where is INITIAL.

lv_where = wa_where.

ELSE.

CONCATENATE lv_where wa_where INTO Lv_where SEPARATED BY 'AND'.

ENDIF.

ENDLOOP.

now you can use your select query.

SELECT EQUNR MATNR EQART EQKTX 

     FROM U_30099 UP TO 1 ROWS

     INTO (EQUIP_NUM, MATERIAL_NUM, OBJECT_TYPE, DESCRIPTION)

     WHERE (lv_where).

Read only

basarozgur_kahraman
Contributor
0 Likes
1,849

Hello Eric,

Change your code as below:

FUNCTION Z_EQUIP_INFO.

*"----------------------------------------------------------------------

*"*"Local Interface:

*"  IMPORTING

*"     VALUE(IV_1) TYPE  U_30099-SERNR OPTIONAL

*"     VALUE(IV_2) TYPE  U_30099-INVNR OPTIONAL

*"  EXPORTING

*"     VALUE(EQUIP_NUM) TYPE  U_30099-EQUNR

*"     VALUE(MATERIAL_NUM) TYPE  U_30099-MATNR

*"     VALUE(OBJECT_TYPE) TYPE  U_30099-EQART

*"     VALUE(DESCRIPTION) TYPE  U_30099-EQKTX

*"----------------------------------------------------------------------

ranges: _r_iv_1 for U_30099-sernr,

        _r_iv_2 for U_30099-invnr.

clear: EQUIP_NUM, MATERIAL_NUM, OBJECT_TYPE, DESCRIPTION.

IF IV_1 IS not initial.

_r_iv_1-sign = 'I'.

_r_iv_1-option = 'EQ'.

_r_iv_1-low   = iv_1.

append _r_iv_1.

endif.

IF IV_2 IS not initial.

_r_iv_2-sign = 'I'.

_r_iv_2-option = 'EQ'.

_r_iv_2-low   = iv_2.

append _r_iv_2.

endif.

     SELECT SINGLE EQUNR MATNR EQART EQKTX

     FROM U_30099

     INTO (EQUIP_NUM, MATERIAL_NUM, OBJECT_TYPE, DESCRIPTION)

     WHERE SERNR in _r_inv_1

       and INVNR in _r_IV_2.

ENDFUNCTION

.

Read only

0 Likes
1,848

This code works.  Thank you very much Basar!