2012 Nov 05 9:11 PM
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!
2012 Nov 06 4:04 PM
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!
2012 Nov 05 9:59 PM
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.
2012 Nov 05 10:18 PM
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
2012 Nov 05 10:24 PM
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.
2012 Nov 06 3:51 PM
Thank you Manu. How do I build Range Tables inside the FM? I haven't built a range table before.
2012 Nov 06 6:06 AM
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).
2012 Nov 06 4:04 PM
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
.
2012 Nov 06 4:18 PM