读取一个product全部数据的工具

84 阅读2分钟

Created by Jerry Wang on Mar 09, 2014

自己写了一个小工具,输入product ID,输出这个product所有settype包含的内容.

clipboard1

输出结果如下图所示:
clipboard2

REPORT  ZHANA_PRODUCT_READ_COMPLETE.

PARAMETER: prd_id TYPE comm_product-product_id OBLIGATORY.

CALL FUNCTION 'ZCRM_PRODUCT_GET_ALL_DATA'
  EXPORTING
     iv_product_id = prd_id.



FUNCTION zcrm_product_get_all_data.
*"----------------------------------------------------------------------
*"*"Local Interface:
*"  IMPORTING
*"     REFERENCE(IV_PRODUCT_ID) TYPE  COMM_PRODUCT-PRODUCT_ID
*"----------------------------------------------------------------------

 DATA: lt_product_assigned TYPE STANDARD TABLE OF comm_prprdcatr,
       ls_product_assigned LIKE LINE OF lt_product_assigned,
       lt_cate_set_rel     TYPE comt_prcat_frag_rel_tab,
       ls_settype          TYPE comt_settype_ext,
       ls_cate_sel_rel     LIKE LINE OF lt_cate_set_rel,
       lr_old              TYPE REF TO data,
       lv_set_guid         TYPE comt_frg_guid,
       lr_new              TYPE REF TO data,
       lr_data             TYPE REF TO data,
       params              TYPE TABLE OF rfc_funint,
       ptab                TYPE abap_func_parmbind_tab,
       ptab_line           TYPE abap_func_parmbind,
       etab                TYPE abap_func_excpbind_tab,
       etab_line           TYPE abap_func_excpbind,
       ls_params           LIKE LINE OF params,
       nametab             TYPE TABLE OF x031l,
       ls_nametab          LIKE LINE OF nametab,
       ls_product          TYPE comm_product,
       lr_tabdescr         TYPE REF TO cl_abap_tabledescr.

 FIELD-SYMBOLS: <data>  TYPE any,
                <field> TYPE any,
                <struc> TYPE any,
                <line>  TYPE any,
                <table> TYPE ANY TABLE.



 SELECT SINGLE product_id product_guid INTO ls_product FROM comm_product WHERE product_id = iv_product_id.
 IF sy-subrc <> 0.
   WRITE:/ 'Cannot find product with ID: ' , iv_product_id COLOR COL_NEGATIVE INTENSIFIED ON.
   RETURN.
 ENDIF.
 CALL METHOD cl_com_product_org_type=>comc_pr_org_link_read_all
   IMPORTING
     et_pr_org_rel = lt_rel_meta
   EXCEPTIONS
     not_found     = 1
     OTHERS        = 2.

 SELECT * INTO TABLE lt_product_assigned FROM comm_prprdcatr WHERE product_guid = ls_product-product_guid.

 LOOP AT lt_product_assigned INTO ls_product_assigned.
   CALL FUNCTION 'COM_PRCAT_FRAG_REL_READ'
     EXPORTING
       iv_category_guid  = ls_product_assigned-category_guid
     IMPORTING
       et_prcat_frag_rel = lt_cate_set_rel
     EXCEPTIONS
       wrong_call        = 1
       OTHERS            = 2.
   ASSERT sy-subrc = 0.

   PERFORM add_settype CHANGING lt_cate_set_rel.
   LOOP AT lt_cate_set_rel INTO ls_cate_sel_rel.
     CALL FUNCTION 'COM_SETTYPE_READ_SINGLE'
       EXPORTING
         iv_settype_guid  = ls_cate_sel_rel-frgtype_guid
       IMPORTING
         es_settype       = ls_settype
       EXCEPTIONS
         not_found        = 1
         no_import_values = 2
         no_text_found    = 3
         OTHERS           = 4.

     CHECK ls_settype-func_read IS NOT INITIAL.
     CLEAR: params,ptab,etab.
     CALL FUNCTION 'RFC_GET_FUNCTION_INTERFACE'
       EXPORTING
         funcname = ls_settype-func_read
       TABLES
         params   = params.
     LOOP AT params INTO ls_params WHERE optional = space.
       CLEAR: ptab_line.
       CASE ls_params-paramclass.
         WHEN 'E'.
           ptab_line-name = ls_params-parameter.
           ptab_line-kind = abap_func_importing.
           CREATE DATA lr_data TYPE (ls_params-tabname).
           ptab_line-value = lr_data.
           INSERT ptab_line INTO TABLE ptab.
         WHEN 'I'. "exporting parameter in the program
           ptab_line-name = ls_params-parameter.
           ptab_line-kind = abap_func_exporting.
           CREATE DATA lr_data TYPE (ls_params-tabname).
           ASSIGN lr_data->* TO <data>.
           IF ptab_line-name = co_set_guid.
             PERFORM get_set_guid USING ls_product-product_guid ls_settype CHANGING lv_set_guid.
             <data> = lv_set_guid.
           ELSEIF ptab_line-name = co_product_guid.
             <data> = ls_product-product_guid.
           ENDIF.
           ptab_line-value = lr_data.
           INSERT ptab_line INTO TABLE ptab.
         WHEN 'X'.
           etab_line-name = 'NOT_FOUND'.
           etab_line-value = 10.
           INSERT etab_line INTO TABLE etab.

       ENDCASE.

     ENDLOOP.
     ULINE.
     WRITE:/ 'Start processing Set type:' , ls_settype-frgtype_id COLOR COL_TOTAL.
     CHECK ptab IS NOT INITIAL.

     CALL FUNCTION ls_settype-func_read PARAMETER-TABLE ptab EXCEPTION-TABLE etab.
     IF sy-subrc <> 0.
       WRITE:/ 'No data maintained for Set type:' , ls_settype-frgtype_id COLOR COL_NEGATIVE.
     ELSE.
       LOOP AT ptab INTO ptab_line WHERE kind = abap_func_importing.
         CHECK ptab_line-value IS NOT INITIAL.
         ASSIGN ptab_line-value->* TO <struc>.
         PERFORM display_content USING <struc> ptab_line-value.

       ENDLOOP.
     ENDIF.

   ENDLOOP.
 ENDLOOP.

ENDFUNCTION.
FORM display_struct USING struc TYPE any.
 FIELD-SYMBOLS: <local_field1> TYPE any.
 DATA: lt_para_table1 TYPE abap_compdescr_tab,
       ls_line1       LIKE LINE OF lt_para_table1,
       lv_type        TYPE i.

 CLEAR: lv_type.

 PERFORM get_field_table USING struc CHANGING lt_para_table1.
 DO.
   ASSIGN COMPONENT sy-index OF STRUCTURE struc TO <local_field1>.
   IF sy-subrc <> 0.
     EXIT.
   ENDIF.
   IF <local_field1> IS NOT INITIAL.
     " IF <local_field1> is still structure
     " THEN
     TRY.
         lr_strucdescr ?= cl_abap_typedescr=>describe_by_data( <local_field1> ).
         lv_type = co_struct.
       CATCH cx_sy_move_cast_error.
         TRY.
             lr_tabledescr ?= cl_abap_tabledescr=>describe_by_data( <local_field1> ).
             lv_type = co_table.
           CATCH cx_sy_move_cast_error.
             TRY.
                 lr_refdescr ?= cl_abap_refdescr=>describe_by_data( <local_field1> ).
               CATCH cx_sy_move_cast_error.
                 lv_type = co_ref.
             ENDTRY.
             lv_type = co_other.
         ENDTRY.
     ENDTRY.

     CASE lv_type.
       WHEN co_struct.
         PERFORM display_struct USING <local_field1>.
       WHEN co_table.
         PERFORM display_table USING <local_field1>.
       WHEN co_ref.
         BREAK-POINT.
       WHEN co_other.
         READ TABLE lt_para_table1 INTO ls_line1 INDEX sy-index.
         WRITE:/ ls_line1-name, ' Content:' , <local_field1> COLOR COL_POSITIVE INTENSIFIED ON.
     ENDCASE.
   ENDIF.
 ENDDO.
ENDFORM.

FORM add_settype CHANGING rel_table TYPE comt_prcat_frag_rel_tab.
 DATA: lt_table    TYPE STANDARD TABLE OF comc_settype,
       lt_copy     LIKE lt_table,
       ls_rel_line TYPE comt_prcat_frag_rel,
       ls_table    LIKE LINE OF lt_table.

 CHECK lv_first_time = abap_true.

 ls_table-frgtype_id = 'COMM_PR_STATUS'.
 APPEND ls_table TO lt_copy.
 ls_table-frgtype_id = 'COMM_PR_CATEGORY'.
 APPEND ls_table TO lt_copy.

 SELECT frgtype_guid frgtype_id INTO CORRESPONDING FIELDS OF TABLE lt_table FROM comc_settype
   FOR ALL ENTRIES IN lt_copy WHERE frgtype_id = lt_copy-frgtype_id.

 LOOP AT lt_table INTO ls_table.
   ls_rel_line-frgtype_guid = ls_table-frgtype_guid.
   APPEND ls_rel_line TO rel_table.
 ENDLOOP.

 lv_first_time = abap_false.

ENDFORM.

FORM get_field_table USING struc TYPE any CHANGING para_tab TYPE abap_compdescr_tab.

 TRY.
     lr_strucdescr ?= cl_abap_typedescr=>describe_by_data( struc ).
     CLEAR: para_tab.
     para_tab = lr_strucdescr->components.
   CATCH cx_sy_move_cast_error.
 ENDTRY.
ENDFORM.

FORM display_table USING struc TYPE ANY TABLE.
 FIELD-SYMBOLS: <local_line2>  TYPE any,
                <local_field2> TYPE any.

 DATA: lt_para_table TYPE abap_compdescr_tab,
       ls_line       LIKE LINE OF lt_para_table.

 LOOP AT struc ASSIGNING <local_line2>.
   DO.
     PERFORM get_field_table USING <local_line2> CHANGING lt_para_table.
     ASSIGN COMPONENT sy-index OF STRUCTURE <local_line2> TO <local_field2>.
     IF sy-subrc <> 0.
       EXIT.
     ENDIF.
     IF <local_field2> IS NOT INITIAL.
       lr_typedescr = cl_abap_typedescr=>describe_by_data( <local_field2> ).
       TRY.
           lr_chardescr ?= lr_typedescr.
           READ TABLE lt_para_table INTO ls_line INDEX sy-index.
           WRITE:/ ls_line-name, ' Content:' , <local_field2> COLOR COL_POSITIVE INTENSIFIED ON.
         CATCH cx_sy_move_cast_error.
           "struc or table
           TRY.
               "struc
               lr_strucdescr ?= lr_typedescr.
               PERFORM display_struct USING <local_field2>.
             CATCH cx_sy_move_cast_error.
               TRY.
                   lr_tabledescr ?= lr_typedescr.
                   PERFORM display_table USING <local_field2>.
                 CATCH cx_sy_move_cast_error.
                   FIELD-SYMBOLS: <temp_table> TYPE REF TO data.
                   ASSIGN <local_field2> TO <temp_table>.
                   PERFORM display_ref USING <temp_table>.
               ENDTRY.
           ENDTRY.
       ENDTRY.
     ENDIF.
   ENDDO.
 ENDLOOP.
ENDFORM.

FORM display_ref USING ref_data TYPE REF TO data.

 FIELD-SYMBOLS:<local_table> TYPE ANY TABLE,
               <line>        TYPE any.

 ASSIGN ref_data->* TO <local_table>.
 LOOP AT <local_table> ASSIGNING <line>.
   PERFORM display_struct USING <line>.
 ENDLOOP.
ENDFORM.
FORM display_content USING struc TYPE any top_table TYPE REF TO data.
 FIELD-SYMBOLS: <local_table> TYPE ANY TABLE,
                <local_line>  TYPE any,
                <local_field> TYPE any.

 lr_typedescr = cl_abap_typedescr=>describe_by_data( struc ).
 TRY.
     lr_strucdescr ?= lr_typedescr.
     PERFORM display_struct USING struc.
   CATCH cx_sy_move_cast_error.
     "ASSIGN ptab_line-value->* TO <local_table>.
     ASSIGN top_table->* TO <local_table>.
     PERFORM display_table USING <local_table>.
 ENDTRY.
ENDFORM.


FORM get_set_guid USING product_guid TYPE comm_prprdcatr-product_guid settype TYPE comt_settype_ext
       CHANGING set_guid TYPE comt_frg_guid.
 READ TABLE lt_rel_meta
             WITH KEY org_type = settype-org_unit
             INTO ls_rel_meta.
 ASSERT sy-subrc = 0.

 DATA:
   lt_rel_table      TYPE REF TO data,
   lt_set_table      TYPE REF TO data,
   lt_set_table_sort TYPE REF TO data,
   lt_key_tab        TYPE REF TO data,
   ls_key_line       TYPE REF TO data,
   ls_result         TYPE REF TO data,
   lt_rel_db_tab     TYPE REF TO data,
   lt_set_guid       TYPE comt_frg_guid_tab,
   lv_current        TYPE abap_bool VALUE abap_true.

 FIELD-SYMBOLS:
   <rel_tab>      TYPE ANY TABLE,
   <rel_tab_db>   TYPE ANY TABLE,
   <set_tab>      TYPE ANY TABLE,
   <key_line>     TYPE any,
   <field>        TYPE any,
   <result>       TYPE any,
   <key_tab>      TYPE ANY TABLE,
   <set_tab_sort> TYPE ANY TABLE.

 "* create relation table:
 CREATE DATA lt_rel_table
               TYPE (ls_rel_meta-link_table_ttyp).
 ASSIGN lt_rel_table->* TO <rel_tab>.
 ASSERT <rel_tab> IS ASSIGNED.

 CREATE DATA lt_key_tab TYPE (ls_rel_meta-link_sel_ttyp).

 ASSIGN lt_key_tab->* TO <key_tab>.
 ASSERT <key_tab> IS ASSIGNED.

 CREATE DATA lt_rel_db_tab TYPE (ls_rel_meta-link_table_ttyp).

 ASSIGN lt_rel_db_tab->* TO <rel_tab_db>.

 CREATE DATA ls_key_line TYPE (ls_rel_meta-link_sel_struc).
 ASSIGN ls_key_line->* TO <key_line>.

 ASSIGN COMPONENT 1 OF STRUCTURE <key_line> TO <field>.
 <field> = product_guid.

 ASSIGN COMPONENT 2 OF STRUCTURE <key_line> TO <field>.
 <field> = settype-frgtype_guid.
 INSERT <key_line> INTO TABLE <key_tab>.

 CALL FUNCTION ls_rel_meta-func_rel_read_mu
   EXPORTING
     it_product_set_type = <key_tab>
     iv_current          = lv_current
     iv_read_old_values  = 'X'
     iv_update_buffer    = space
   IMPORTING
     et_rel              = <rel_tab>
     et_rel_old          = <rel_tab_db>
   EXCEPTIONS
     not_found           = 1
     wrong_call          = 2
     OTHERS              = 3.

 CHECK sy-subrc = 0.
 CREATE DATA ls_result TYPE (ls_rel_meta-link_table_struc).
 ASSIGN ls_result->* TO <result>.
 LOOP AT <rel_tab> ASSIGNING <result>.
   ASSIGN COMPONENT 'FRAGMENT_GUID' OF STRUCTURE <result> TO <field>.
   IF sy-subrc = 0.
     set_guid = <field>.
   ENDIF.
   EXIT.
 ENDLOOP.

ENDFORM.