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.