FUNCTION Z_GET_CUSTOMER_SYSTEM_PARAM.
*"----------------------------------------------------------------------
*"*"Local interface:
*" IMPORTING
*" VALUE(PARAMETER_NAME) TYPE C
*" EXPORTING
*" VALUE(PARAMETER_VALUE) TYPE C
*"----------------------------------------------------------------------
************************************************************************
* This function module implements custom system parameters, very
* similar to the regular SAP system parameters. It can be called from
* any abap to query a parameter value. The value can be set either
* in the default profile or in the instance profile. If it is not
* set there, the functiom module will return it's hard coded default
* value. Call the function module like this:
*
* report zimretst.
* data: parameter_value(30).
* call function 'Z_GET_CUSTOMER_SYSTEM_PARAM'
* exporting
* parameter_name = 'custom/trace'
* importing
* parameter_value = parameter_value.
* write: parameter_value.
*
* Default value: hardcoded, just like the real SAP system parameter
* default values in the kernel
*@@ custom/trace = NO
*@@ custom/aaaaa = 1
*@@ custom/bbbbb = 0
*@@ custom/ccccc = /tmp
************************************************************************
* Find out the name and location of the active instance profile
DATA: BEGIN OF P OCCURS 500,
STATUS LIKE SY-INDEX, NAME(60), CURRENT(60), DEFAULT(60),
END OF P.
DATA: INSTPROF(60).
CALL 'C_SAPGALLPARAM' ID 'PAR_SUB' FIELD P-*SYS*.
LOOP AT P.
IF P-NAME = 'SAPPROFILE_IN_EFFECT'.
EXIT.
ENDIF.
ENDLOOP.
INSTPROF = P-CURRENT.
IF INSTPROF IS INITIAL.
INSTPROF = P-DEFAULT.
ENDIF.
* Find out the name and location of the active default profile
DATA: DEFPROF(60), I TYPE I, A.
DEFPROF = INSTPROF.
DO.
SHIFT DEFPROF RIGHT.
A = DEFPROF+59.
IF A = '/'.
I = SY-INDEX.
EXIT.
ENDIF.
ENDDO.
SHIFT DEFPROF LEFT BY I PLACES.
DEFPROF+49 = 'DEFAULT.PFL'.
CONDENSE DEFPROF NO-GAPS.
* First read the default profile
DATA: L(100),
C.
OPEN DATASET DEFPROF FOR INPUT IN TEXT MODE.
DO.
READ DATASET DEFPROF INTO L.
IF SY-SUBRC <> 0. EXIT. ENDIF.
IF L CS PARAMETER_NAME.
C = L.
IF C <> '#'. "The line in the profile is not commented
SHIFT L LEFT UP TO '='.
SHIFT L LEFT.
CONDENSE L NO-GAPS.
PARAMETER_VALUE = L.
EXIT.
ENDIF.
ENDIF.
ENDDO.
* No such parameter in the default profile: read the instance profile
IF PARAMETER_VALUE IS INITIAL.
OPEN DATASET INSTPROF FOR INPUT IN TEXT MODE.
DO.
READ DATASET INSTPROF INTO L.
IF SY-SUBRC <> 0. EXIT. ENDIF.
IF L CS PARAMETER_NAME.
C = L.
IF C <> '#'. "The line in the profile is not commented
SHIFT L LEFT UP TO '='.
SHIFT L LEFT.
CONDENSE L NO-GAPS.
PARAMETER_VALUE = L.
EXIT.
ENDIF.
ENDIF.
ENDDO.
ENDIF.
* The parameter is not defined in the profiles: set it to default
DATA: BEGIN OF PROG_TAB OCCURS 300,
LINE(72),
END OF PROG_TAB.
IF PARAMETER_VALUE IS INITIAL.
READ REPORT 'LZTSTU01' INTO PROG_TAB. "source code name of the f.m.
LOOP AT PROG_TAB.
IF PROG_TAB CS PARAMETER_NAME AND PROG_TAB CS '@@'.
SHIFT PROG_TAB LEFT UP TO '='.
SHIFT PROG_TAB LEFT.
CONDENSE PROG_TAB NO-GAPS.
PARAMETER_VALUE = PROG_TAB.
EXIT.
ENDIF.
ENDLOOP.
ENDIF.
ENDFUNCTION.