Today we will discuss how system take care of the obligatory parameter passing in the RFC function module.
Generally, when we call the FM without passing the obligatory parameter, system would raise the exception CALL_FUNCTION_PARM_MISSING and would lead to run time error. Now, when we call the same RFC FM with perticular Destination without passing the obligatory parameter, system is not giving any runtime error. How does this happen? Why this different behaviour?
Actually, when we generate our RFC FM, System generates one more Include program with Subroutine which calls the FM. So, when we call the RFC FM using CALL FUNCTION … DESTINATION .. RFC Framework calls this generated Subroutine. This Subroutine passes all the parameters to the FM Call, including the obligatory ones and it is not giving us any runtime error of missing parameters.
To demonstrate this, I would use the RFC FM ZTEST_NP_RFC which was created in the FG ZTEST_NP. This is the code snippet for the RFC FM:
FUNCTION ztest_np_rfc.
*"----------------------------------------------------------------------
*"*"Local Interface:
*" IMPORTING
*" VALUE(KUNNR) TYPE KUNNR
*" VALUE(NAME1) TYPE NAME1
*" EXPORTING
*" VALUE(SUBRC) TYPE SUBRC
*" EXCEPTIONS
*" NO_DATA_FOUND
*"----------------------------------------------------------------------
*
* Both initial.. Return 3
* Else.. Return 4
IF kunnr IS INITIAL
AND name1 IS INITIAL.
subrc = '3'.
ELSE.
subrc = '4'.
ENDIF.
*
ENDFUNCTION.
System has generated the Include LZTEST_NP_RFCV01 (L+fgname+V+fmnumber) with subroutine ZTEST_NP_RFC (same name as the FM) which call the FM. This include is part of the RFC framework. Here is the code snippet for this include LZTEST_NP_RFCV01:
*******************************************************************
* THIS FILE IS GENERATED BY THE FUNCTION LIBRARY **
* NEVER CHANGE IT MANUALLY, PLEASE! **
*******************************************************************
FORM ztest_np_rfc %_RFC.
* Parameter declaration
DATA kunnr TYPE
kunnr
.
DATA name1 TYPE
name1
.
DATA subrc TYPE
subrc
.
* Assign default values
* Call remote function
CALL FUNCTION 'ZTEST_NP_RFC' %_RFC
EXPORTING
kunnr = kunnr
name1 = name1
IMPORTING
subrc = subrc.
ENDFORM. "ZTEST_NP_RFC
Lets see the call to this FM using this test program.
REPORT ztest_np_1 LINE-COUNT 10 NO STANDARD PAGE HEADING.
*
DATA: lf_subrc TYPE subrc.
*
START-OF-SELECTION.
*
* CALL RFC FM without passing the mandatory Parameters
* and it would give us error
CALL FUNCTION 'ZTEST_NP_RFC' DESTINATION 'NONE'
IMPORTING
subrc = lf_subrc.
*
WRITE: lf_subrc.
Now, how do we find out how does this work? Since this is a part of the system, we need to activate the system debugging.
1. Put a breakpoint on the FM
2. Run the Program
3. From the debugger, start the System debugging. Settings > System Debugging
4. Step in (F5)
5. Check the Call the Stack
.. and the RFC Framework subroutine:
This would raise an question: As a developer, how do we design our RFC FMs which would not fail in terms of the functionality (works even we don’t pass the mandatory parameters)? In next blog, we would explore why it behaves like this and how we can overcome the problem. You can find it here: RFC Calls II – Solution to mandatory Parameters to FM
It is good one.
Regards,
Madhu.
[…] time ago, I wrote about RFC Calls: Function Module Parameter Passing. In this post, I figured out the hidden include by using the naming standard. System has […]