FUNCTION Z_MEMORY_ACCESS.
*"----------------------------------------------------------------------
*"*"Interfase local
*" IMPORTING
*" VALUE(PS_EXPORT) TYPE C OPTIONAL
*" VALUE(PS_IMPORT) TYPE C OPTIONAL
*" VALUE(PS_FREE) TYPE C OPTIONAL
*" VALUE(PS_MEMORY_ID) TYPE MEMORY_ID
*" REFERENCE(METHOD_MEMORY_ID) TYPE C DEFAULT 'S'
*" TABLES
*" PT_TABLE OPTIONAL
*" CHANGING
*" REFERENCE(PS_DATA) DEFAULT 'NO_DATA'
*" EXCEPTIONS
*" NOT_IMPORT
*"----------------------------------------------------------------------

CHECK NOT PS_MEMORY_ID IS INITIAL.

DATA: LS_MEMORY_ID TYPE MEMORY_ID.
DATA: LS_SESSION_ID TYPE THFB_SESSION_ID.


IF METHOD_MEMORY_ID = 'S'.
* Obtiene id de la sesión actual.. de 32 caracteres
* -------------------------------------------------
CALL FUNCTION 'TH_GET_SESSION_ID'
IMPORTING
SESSION_ID = LS_SESSION_ID.

* PS_MEMORY_ID debe tener máximo 55 caracteres...
* -------------------------------------------
CONCATENATE PS_MEMORY_ID '_' LS_SESSION_ID
INTO LS_MEMORY_ID.

ELSEIF METHOD_MEMORY_ID = 'J'.
LS_MEMORY_ID = PS_MEMORY_ID.
ENDIF.
* Export to Shared Memory
* -----------------------
IF PS_EXPORT = 'X'.
IF PS_DATA EQ 'NO_DATA'.
EXPORT PT_TABLE
TO SHARED MEMORY INDX(VL)
ID LS_MEMORY_ID.
ELSE.
EXPORT PS_DATA
TO SHARED MEMORY INDX(VL)
ID LS_MEMORY_ID.
ENDIF.
ENDIF.
* Import to Shared Memory
* -----------------------
IF PS_IMPORT = 'X'.
IF PS_DATA EQ 'NO_DATA'.
IMPORT PT_TABLE
FROM SHARED MEMORY INDX(VL)
ID LS_MEMORY_ID.
ELSE.
IMPORT PS_DATA
FROM SHARED MEMORY INDX(VL)
ID LS_MEMORY_ID.
ENDIF.
IF SY-SUBRC NE 0.
* RAISE NOT_IMPORT.
ENDIF.
ENDIF.
* Free Shared Memory
* ------------------
IF PS_FREE = 'X'.
DELETE FROM SHARED MEMORY INDX(VL) ID LS_MEMORY_ID.
ENDIF.

ENDFUNCTION.

jueves, 9 de febrero de 2012