Product settype list tool - report PROD_DISPLAY_SETTYPE

时间:2022-06-25
本文章向大家介绍Product settype list tool - report PROD_DISPLAY_SETTYPE,主要内容包括其使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。

版权声明:署名,允许他人基于本文进行创作,且必须基于与原先许可协议相同的许可协议分发本文 (Creative Commons

Created by Jerry Wang, last modified on Dec 20, 2014

使用该tool 列出指定的product type下能assign的所有settype name和description:

可根据settype的类型做filter:

source code:

REPORT ZHANA_DISPLAY_SETTYPE.
PARAMETERS: prod TYPE COMM_PRODUCT-product_type,
            set type COMT_PROD_COMP_TYPE.
DATA: lt_prod_set type STANDARD TABLE OF COMM_PROD_FRG,
      lt_set TYPE STANDARD TABLE OF COMC_SETTYPE,
      lt_set_text TYPE STANDARD TABLE OF COMC_SETTYPE_T,
      ls_set LIKE LINE OF lt_set,
      ls_set_text LIKE LINE OF lt_set_text.
IF prod IS NOT INITIAL.
   SELECT * INTO TABLE lt_prod_set FROM COMM_PROD_FRG WHERE product_type = prod.
ELSE.
   SELECT * INTO TABLE lt_prod_set FROM COMM_PROD_FRG.
ENDIF.
CHECK sy-subrc = 0.
IF set IS NOT INITIAL.
   SELECT * INTO TABLE lt_set FROM COMC_SETTYPE FOR ALL ENTRIES IN lt_prod_set WHERE FRGTYPE_GUID = lt_prod_set-FRAGMENT_TYPE
       AND PROD_COMP_TYPE = set.
ELSE.
   SELECT * INTO TABLE lt_set FROM COMC_SETTYPE FOR ALL ENTRIES IN lt_prod_set WHERE FRGTYPE_GUID = lt_prod_set-FRAGMENT_TYPE.
ENDIF.
SELECT * INTO TABLE lt_set_text FROM COMC_SETTYPE_T FOR ALL ENTRIES IN lt_set WHERE FRGTYPE_GUID = lt_set-FRGTYPE_GUID.
LOOP AT lt_set INTO ls_set.
   READ TABLE lt_set_text INTO ls_set_text WITH KEY FRGTYPE_GUID = ls_set-FRGTYPE_GUID LANGU = sy-langu.
   WRITE: / ls_set-FRGTYPE_ID, ls_set_text-FRGTYPE_TEXT.
ENDLOOP.

test report: read complete set type by my self

REPORT  ZHANA_PRODUCT_READ_ALL1.

PARAMETER: prd_id TYPE comm_product-product_id OBLIGATORY.

TYPES:  tt_set_guid_tab TYPE STANDARD TABLE OF COMT_FRG_GUID.

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,
      lt_rel_meta TYPE COMT_PR_ORG_REL_TAB,
      ls_rel_meta LIKE LINE OF lt_rel_meta,
      ls_cate_sel_rel LIKE LINE OF lt_cate_set_rel,
      lr_old TYPE REF TO data,
      lv_set_guid TYPE COMT_FRG_GUID,
      lt_set_guid TYPE tt_set_guid_tab,
      lr_new TYPE REF TO data,
      lr_data TYPE REF TO data,
      lv_first_time TYPE abap_bool VALUE abap_true,
      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_typedescr TYPE REF TO cl_abap_typedescr,
      lr_tabdescr TYPE REF TO cl_abap_tabledescr,
      lr_chardescr TYPE REF TO CL_ABAP_ELEMDESCR,
      lr_strucdescr TYPE REF TO cl_abap_structdescr.

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

CONSTANTS: co_set_guid TYPE string value 'IV_SET_GUID',
           co_product_guid TYPE string VALUE 'IV_PRODUCT_GUID'.

START-OF-SELECTION.

SELECT SINGLE product_id product_guid INTO ls_product FROM comm_product WHERE product_id = prd_id.
IF sy-subrc <> 0.
   WRITE:/ 'Cannot find product with ID: ' , prd_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.
                   CLEAR: lt_set_guid.
                   PERFORM get_set_guid USING ls_product-product_guid LS_SETTYPE CHANGING lt_set_guid.
                   READ TABLE lt_set_guid INTO lv_set_guid INDEX 1.
                   <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>.

           ENDLOOP.
        ENDIF.

   ENDLOOP.
ENDLOOP.

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.

   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.
          READ TABLE lt_para_table1 INTO ls_line1 INDEX sy-index.
          WRITE:/ ls_line1-name, ' Content:' , <local_field1> COLOR COL_POSITIVE INTENSIFIED ON.
       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.
                     PERFORM display_table USING <local_field2>.
                 ENDTRY.
              ENDTRY.
         ENDIF.
      ENDDO.
  ENDLOOP.
ENDFORM.

FORM display_content USING struc TYPE ANY.
   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>.
       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.
         CHANGING set_guid_tab TYPE tt_set_guid_tab.

   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.
         APPEND <field> TO set_guid_tab.
         EXIT.
      ENDIF.
   ENDLOOP.

ENDFORM.