Additional Blogs by Members
cancel
Showing results for 
Search instead for 
Did you mean: 
Former Member
0 Kudos

由于系统自带的各种数据共享方法存在着各种各样的不足,因此对于数据之间的传递,可以使用一个数据共享类来实现,该共享类可以有自己的写法,但是核心就是每次只实例化一次,然后设置和获取数据。

该共享类支持任意类型数据的共享。

具体代码如下:

*----------------------------------------------------------------------*
*       CLASS Y_CL_WD_SHARED_DATA DEFINITION
*----------------------------------------------------------------------*
*
*----------------------------------------------------------------------*
CLASS y_cl_wd_shared_data DEFINITION
  
PUBLIC
   FINAL
  
CREATE PUBLIC .

  
PUBLIC SECTION.
    
CLASS-METHODS get_instance
       RETURNING
        
VALUE(ro_instance) TYPE REF TO y_cl_wd_shared_data .
  
PROTECTED SECTION.
  
PRIVATE SECTION.

    
TYPES:
      
BEGIN OF s_parameter,
        
key   TYPE string,
        
value TYPE REF TO data,
      
END OF s_parameter .
    
TYPES:
       t_parameter
TYPE HASHED TABLE OF s_parameter WITH UNIQUE KEY
  
key .

    
DATA mt_parameter TYPE t_parameter .
    
CLASS-DATA mo_shared_data TYPE REF TO y_cl_wd_shared_data .
ENDCLASS.



CLASS y_cl_wd_shared_data IMPLEMENTATION.


* <SIGNATURE>---------------------------------------------------------------------------------------+
* | Static Public Method Y_CL_WD_SHARED_DATA=>GET_INSTANCE
* +-------------------------------------------------------------------------------------------------+
* | [<-()] RO_INSTANCE                    TYPE REF TO Y_CL_WD_SHARED_DATA
* +--------------------------------------------------------------------------------------</SIGNATURE>
  
METHOD get_instance.

    
IF mo_shared_data IS NOT BOUND.
      
CREATE OBJECT mo_shared_data TYPE y_cl_wd_shared_data.
    
ENDIF.
     ro_instance
= mo_shared_data.

  
ENDMETHOD.


* <SIGNATURE>---------------------------------------------------------------------------------------+
* | Instance Public Method Y_CL_WD_SHARED_DATA->IF_FPM_PARAMETER~DELETE_VALUE
* +-------------------------------------------------------------------------------------------------+
* | [--->] IV_KEY                         TYPE        STRING
* +--------------------------------------------------------------------------------------</SIGNATURE>
  
METHOD if_fpm_parameter~delete_value.

    
DELETE TABLE mt_parameter WITH TABLE KEY key = iv_key.

  
ENDMETHOD.


* <SIGNATURE>---------------------------------------------------------------------------------------+
* | Instance Public Method Y_CL_WD_SHARED_DATA->IF_FPM_PARAMETER~GET_KEYS
* +-------------------------------------------------------------------------------------------------+
* | [<-()] RT_KEYS                        TYPE        T_KEYS
* +--------------------------------------------------------------------------------------</SIGNATURE>
  
METHOD if_fpm_parameter~get_keys.

    
DATA: lv_key TYPE string.

    
FIELD-SYMBOLS: <fs_parameter> LIKE LINE OF mt_parameter.

    
LOOP AT mt_parameter ASSIGNING <fs_parameter>.
       lv_key
= <fs_parameter>-key.
      
APPEND lv_key TO rt_keys.
    
ENDLOOP.

  
ENDMETHOD.


* <SIGNATURE>---------------------------------------------------------------------------------------+
* | Instance Public Method Y_CL_WD_SHARED_DATA->IF_FPM_PARAMETER~GET_VALUE
* +-------------------------------------------------------------------------------------------------+
* | [--->] IV_KEY                         TYPE        STRING
* | [<---] EV_VALUE                       TYPE        ANY
* | [<---] ER_VALUE                       TYPE REF TO DATA
* +--------------------------------------------------------------------------------------</SIGNATURE>
  
METHOD if_fpm_parameter~get_value.

    
DATA: lr_descr           TYPE REF TO cl_abap_typedescr.
    
DATA: lr_ev_value_descr  TYPE REF TO cl_abap_typedescr.

    
FIELD-SYMBOLS: <fs_parameter> LIKE LINE OF mt_parameter.
    
FIELD-SYMBOLS: <fs_value>    TYPE any.

    
READ TABLE mt_parameter ASSIGNING <fs_parameter> WITH KEY key = iv_key.
    
CHECK sy-subrc IS INITIAL.


     er_value
= <fs_parameter>-value.

    
IF ev_value IS SUPPLIED.
      
TRY.
          
ASSIGN <fs_parameter>-value->* TO <fs_value>.

          
CALL METHOD cl_abap_typedescr=>describe_by_data
            
EXPORTING
               p_data     
= <fs_value>
             RECEIVING
               p_descr_ref
= lr_descr
            
EXCEPTIONS
              
OTHERS      = 1.
          
IF sy-subrc <> 0.
            
CLEAR ev_value.
            
RETURN.
          
ENDIF.
          
CALL METHOD cl_abap_typedescr=>describe_by_data
            
EXPORTING
               p_data     
= ev_value
             RECEIVING
               p_descr_ref
= lr_ev_value_descr
            
EXCEPTIONS
              
OTHERS      = 1.
          
IF sy-subrc <> 0.
            
CLEAR ev_value.
            
RETURN.
          
ENDIF.
          
IF ( lr_descr->type_kind           = cl_abap_typedescr=>typekind_oref AND
                lr_ev_value_descr
->type_kind <> cl_abap_typedescr=>typekind_oref ) OR
             
( lr_descr->type_kind          <> cl_abap_typedescr=>typekind_oref AND
                lr_ev_value_descr
->type_kind  = cl_abap_typedescr=>typekind_oref ) OR
             
( lr_descr->type_kind           = cl_abap_typedescr=>typekind_table AND
                lr_ev_value_descr
->type_kind <> cl_abap_typedescr=>typekind_table ) OR
             
( lr_descr->type_kind          <> cl_abap_typedescr=>typekind_table AND
                lr_ev_value_descr
->type_kind  = cl_abap_typedescr=>typekind_table ).
            
CLEAR ev_value.
            
RETURN.
          
ENDIF.
           ev_value
= <fs_value>.
        
CATCH cx_root.
          
CLEAR ev_value.
      
ENDTRY.
    
ENDIF.

  
ENDMETHOD.


* <SIGNATURE>---------------------------------------------------------------------------------------+
* | Instance Public Method Y_CL_WD_SHARED_DATA->IF_FPM_PARAMETER~SET_VALUE
* +-------------------------------------------------------------------------------------------------+
* | [--->] IV_KEY                         TYPE        STRING
* | [--->] IV_VALUE                       TYPE        ANY(optional)
* | [--->] IR_VALUE                       TYPE REF TO DATA(optional)
* +--------------------------------------------------------------------------------------</SIGNATURE>
  
METHOD if_fpm_parameter~set_value.

    
DATA: ls_parameter LIKE LINE OF mt_parameter.
    
DATA: lr_datadescr TYPE REF TO cl_abap_datadescr.

    
FIELD-SYMBOLS: <fs_parameter> LIKE LINE OF mt_parameter.
    
FIELD-SYMBOLS: <fs_value1>   TYPE any.
    
FIELD-SYMBOLS: <fs_value2>   TYPE any.

    
READ TABLE mt_parameter ASSIGNING <fs_parameter> WITH KEY key = iv_key.
    
IF sy-subrc <> 0.
*   key not part of this bag, create the key
       ls_parameter
-key = iv_key.
      
INSERT ls_parameter INTO TABLE mt_parameter ASSIGNING <fs_parameter>.
    
ENDIF.

* Set value has copy semantic
    
IF iv_value IS SUPPLIED.
       lr_datadescr ?= cl_abap_datadescr
=>describe_by_data( iv_value ).
      
CREATE DATA <fs_parameter>-value TYPE HANDLE lr_datadescr.
      
ASSIGN <fs_parameter>-value->* TO <fs_value1>.
       <fs_value1>
= iv_value.
    
ELSEIF ir_value IS SUPPLIED.
       lr_datadescr ?= cl_abap_datadescr
=>describe_by_data_ref( ir_value ).
      
CREATE DATA <fs_parameter>-value TYPE HANDLE lr_datadescr.
      
ASSIGN <fs_parameter>-value->* TO <fs_value1>.
      
ASSIGN ir_value->* TO <fs_value2>.
       <fs_value1>
= <fs_value2>.
    
ELSE.
      
CLEAR <fs_parameter>-value.
    
ENDIF.

  
ENDMETHOD.
ENDCLASS.