Code20080611 - ooxxvv/MySAPnotes GitHub Wiki

Code20080611

  • 在 View Cluster 中 Events 的程式碼。

Code

***********************************************************************
**Program name: ZTCO1009_1012_VC
**Description : Subroutine for View Cluster
**Date/Author : 2008.06.10 / Joey Lee
***********************************************************************
** M O D I F I C A T I O N  L O G
***********************************************************************
** ChangeDate  Programmer  Request     Description
** ==========  ==========  ==========  ==================
** 2008.06.10  Joey Lee                New Program
***********************************************************************
REPORT ztco1009_1012_vc.
*======================================================================
*================================================Global Date declear===
INCLUDE lsvcmcod.

*======================================================================
*=========================================================Subroutine===
*&---------------------------------------------------------------------*
*&      Form  SET_HEADE_VALUE
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
FORM set_heade_value.
  DATA: lt_ztco1012_new LIKE ztco1012 OCCURS 0 WITH HEADER LINE,
        lw_ztco1011 LIKE ztco1011.

*-Check action
  IF vcl_action NE 'U'.
    EXIT.
  ENDIF.

*-Get input data form ZTCO1011
  PERFORM get_ztco1011 CHANGING lw_ztco1011.

  IF lw_ztco1011 IS INITIAL.
    EXIT.
  ENDIF.

*-Get new data for ZTCO1022
  PERFORM new_data_for_ztco1012 TABLES lt_ztco1012_new
                                 USING lw_ztco1011.

  IF lt_ztco1012_new[] IS INITIAL.
    EXIT.
  ENDIF.

*-Change data of <VCL_TOTAL>
  PERFORM add_to_ztco1012_v TABLES lt_ztco1012_new.

ENDFORM.                    "SET_HEADE_VALUE
*&---------------------------------------------------------------------*
*&      Form  GET_ZTCO1011
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
FORM get_ztco1011 CHANGING fw_ztco1011 STRUCTURE ztco1011.
  DATA: BEGIN OF lw_ztco1011_v.
          INCLUDE STRUCTURE ztco1011_v.
          INCLUDE STRUCTURE vimflagtab.
  DATA: END OF lw_ztco1011_v.
  DATA: l_error_flag TYPE c.
*-------TOT_WA needs to be aligned for assigning the-----*
*-------------structured field symbol <TOT_WA_STRUC>-----*
  DATA: align TYPE f,
        tot_wa(1000) TYPE c,
        eflag TYPE vcl_flag_type.
  FIELD-SYMBOLS: <tot_wa_struc> TYPE ztco1011_v,
                 <tot_wax> TYPE x,
                 <tot_action> TYPE vcl_flag_type,
                 <header_wa> TYPE vimdesc.
*----------------Assign structure and action-flag.
  FIELD-SYMBOLS: <erkrs>   TYPE ANY,
                 <seqname> TYPE ANY,
                 <begda>   TYPE ANY,
                 <sprctr>  TYPE ANY,
                 <eprctr>  TYPE ANY,
                 <gprctr>  TYPE ANY,
                 <sspart>  TYPE ANY,
                 <espart>  TYPE ANY,
                 <gspart>  TYPE ANY.
*--------------------------------------------------------*
  CLEAR: fw_ztco1011.

*-Assign <VCL_EXARCT> to data container and <VCL_HEADER> header data of
*--------------------------------------------------------desired view.
  PERFORM vcl_set_table_access_for_obj USING 'ZTCO1011_V'
                                       CHANGING l_error_flag.
  READ TABLE <vcl_header> INDEX 1 ASSIGNING <header_wa>.

*-Assign component
  ASSIGN: tot_wa TO <tot_wa_struc> CASTING,
          COMPONENT 'ERKRS' OF STRUCTURE <tot_wa_struc> TO <erkrs>,
       COMPONENT 'SEQNAME' OF STRUCTURE <tot_wa_struc> TO <seqname>,
          COMPONENT 'BEGDA' OF STRUCTURE <tot_wa_struc> TO <begda>,
          COMPONENT 'SPRCTR' OF STRUCTURE <tot_wa_struc> TO <sprctr>,
          COMPONENT 'EPRCTR' OF STRUCTURE <tot_wa_struc> TO <eprctr>,
          COMPONENT 'GPRCTR' OF STRUCTURE <tot_wa_struc> TO <gprctr>,
          COMPONENT 'SSPART' OF STRUCTURE <tot_wa_struc> TO <sspart>,
          COMPONENT 'ESPART' OF STRUCTURE <tot_wa_struc> TO <espart>,
          COMPONENT 'GSPART' OF STRUCTURE <tot_wa_struc> TO <gspart>,
          tot_wa TO <tot_wax> CASTING,
          <tot_wax>+<header_wa>-after_tabc TO <tot_action> CASTING.

*-Get field fieldname in all new datasets
  LOOP AT <vcl_extract> INTO tot_wa.

    fw_ztco1011-erkrs   = <erkrs>.
    fw_ztco1011-seqname = <seqname>.
    fw_ztco1011-begda   = <begda>.
    fw_ztco1011-sprctr  = <sprctr>.
    fw_ztco1011-eprctr  = <eprctr>.
    fw_ztco1011-gprctr  = <gprctr>.
    fw_ztco1011-sspart  = <sspart>.
    fw_ztco1011-espart  = <espart>.
    fw_ztco1011-gspart  = <gspart>.

  ENDLOOP.

ENDFORM.                    " GET_ZTCO1011
*&---------------------------------------------------------------------*
*&      Form  ADD_TO_ZTCO1012_V
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
FORM add_to_ztco1012_v TABLES ft_ztco1012 STRUCTURE ztco1012.
  DATA: BEGIN OF lw_ztco1012_v.
          INCLUDE STRUCTURE ztco1012_v.
          INCLUDE STRUCTURE vimflagtab.
  DATA: END OF lw_ztco1012_v.
  DATA: l_error_flag TYPE c.
*-------TOT_WA needs to be aligned for assigning the
*-------------structured field symbol <TOT_WA_STRUC>
  DATA: align TYPE f,
        tot_wa(1000) TYPE c,
        eflag TYPE vcl_flag_type.
  FIELD-SYMBOLS: <tot_wa_struc> TYPE ztco1012_v,
                 <tot_wax> TYPE x,
                 <tot_action> TYPE vcl_flag_type,
                 <header_wa> TYPE vimdesc.
*----------------Assign structure and action-flag.
  FIELD-SYMBOLS: <erkrs> TYPE ANY,
                 <seqname> TYPE ANY,
                 <begda> TYPE ANY,
                 <prctr> TYPE ANY,
                 <spart> TYPE ANY,
                 <weight> TYPE ANY.

  IF ft_ztco1012[] IS INITIAL.
    EXIT.
  ENDIF.

*-Assign <VCL_TOTAL> to data container and <VCL_HEADER> header data of
*--------------------------------------------------------desired view.
  PERFORM vcl_set_table_access_for_obj USING 'ZTCO1012_V'
                                       CHANGING l_error_flag.
  READ TABLE <vcl_header> INDEX 1 ASSIGNING <header_wa>.


*-Assign component
  ASSIGN: tot_wa TO <tot_wa_struc> CASTING,
          COMPONENT 'ERKRS' OF STRUCTURE <tot_wa_struc> TO <erkrs>,
       COMPONENT 'SEQNAME' OF STRUCTURE <tot_wa_struc> TO <seqname>,
          COMPONENT 'BEGDA' OF STRUCTURE <tot_wa_struc> TO <begda>,
          COMPONENT 'SPART' OF STRUCTURE <tot_wa_struc> TO <spart>,
          COMPONENT 'PRCTR' OF STRUCTURE <tot_wa_struc> TO <prctr>,
          COMPONENT 'WEIGHT' OF STRUCTURE <tot_wa_struc> TO <weight>,
          tot_wa TO <tot_wax> CASTING,
          <tot_wax>+<header_wa>-after_tabc TO <tot_action> CASTING.


*-Fileld exist data
  LOOP AT <vcl_total> INTO tot_wa.
    DELETE ft_ztco1012 WHERE erkrs   EQ <erkrs>
                         AND seqname EQ <seqname>
                         AND begda   EQ <begda>
                         AND prctr   EQ <prctr>
                         AND spart   EQ <spart>.

  ENDLOOP.

  IF ft_ztco1012[] IS INITIAL.
    EXIT.
  ENDIF.

*-Put new data for output
  LOOP AT ft_ztco1012.
    CLEAR: tot_wa.

    <erkrs>   = ft_ztco1012-erkrs.
    <seqname> = ft_ztco1012-seqname.
    <begda>   = ft_ztco1012-begda.
    <prctr>   = ft_ztco1012-prctr.
    <spart>   = ft_ztco1012-spart.
    <weight>  = ft_ztco1012-weight.

    APPEND tot_wa TO <vcl_total>.
  ENDLOOP.

ENDFORM.                    " ADD_TO_ZTCO1012_V
*&---------------------------------------------------------------------*
*&      Form  NEW_DATA_FOR_ZTCO1012
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
FORM new_data_for_ztco1012  TABLES ft_ztco1012 STRUCTURE ztco1012
                             USING fw_ztco1011 STRUCTURE ztco1011.
  DATA: l_tabix LIKE sy-tabix.

  CLEAR: ft_ztco1012, ft_ztco1012[].

*-Get Profit center
  PERFORM get_profit_center TABLES ft_ztco1012
                             USING fw_ztco1011.

*-Get Division
  PERFORM get_division TABLES ft_ztco1012
                        USING fw_ztco1011.

  IF ft_ztco1012[] IS INITIAL.
    EXIT.
  ENDIF.

*-Put other data
  LOOP AT ft_ztco1012.
    l_tabix = sy-tabix.

    ft_ztco1012-erkrs    = fw_ztco1011-erkrs.
    ft_ztco1012-seqname  = fw_ztco1011-seqname.
    ft_ztco1012-begda    = fw_ztco1011-begda.

    MODIFY ft_ztco1012 INDEX l_tabix.
  ENDLOOP.

ENDFORM.                    " NEW_DATA_FOR_ZTCO1012
*&---------------------------------------------------------------------*
*&      Form  GET_PROFIT_CENTER
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
*  -->  p1        text
*  <--  p2        text
*----------------------------------------------------------------------*
FORM get_profit_center TABLES ft_ztco1012 STRUCTURE ztco1012
                        USING fw_ztco1011 STRUCTURE ztco1011.
  DATA: lr_char24 LIKE range_c24 OCCURS 0 WITH HEADER LINE,
        lr_prctr  LIKE range_prctr OCCURS 0 WITH HEADER LINE,
        lt_prctr  LIKE ztco1012-prctr OCCURS 0 WITH HEADER LINE,
        l_kokrs   LIKE tka01-kokrs.


*-Get Controlling Area
  SELECT SINGLE kokrs
    INTO l_kokrs
    FROM tka01
    WHERE erkrs EQ fw_ztco1011-erkrs.

  IF sy-subrc NE 0.
    MESSAGE w020(zco1).
    EXIT.
  ENDIF.

*-Get profit center by group
  IF fw_ztco1011-gprctr NE space.
    PERFORM get_range_by_group TABLES lr_char24
                               USING  fw_ztco1011-gprctr
                                      '0106'
                                      l_kokrs.

    LOOP AT lr_char24.
      MOVE-CORRESPONDING lr_char24 TO lr_prctr.
      APPEND lr_prctr.
    ENDLOOP.
  ENDIF.

*-Put profit center range
  CLEAR: lr_prctr.
  IF NOT fw_ztco1011-sprctr IS INITIAL.
    lr_prctr-sign = 'I'.
    lr_prctr-low  = fw_ztco1011-sprctr.

    IF fw_ztco1011-eprctr IS INITIAL.
      lr_prctr-option = 'EQ'.
    ELSE.
      lr_prctr-option = 'BT'.
      lr_prctr-high   = fw_ztco1011-eprctr.
    ENDIF.

    APPEND lr_prctr.
  ENDIF.

  IF lr_prctr[] IS INITIAL.
    EXIT.
  ENDIF.

*-Get all profit center
  SELECT prctr
    INTO TABLE lt_prctr
    FROM cepc
    WHERE prctr IN lr_prctr.

*-Put profit center for return
  LOOP AT lt_prctr.
    CLEAR: ft_ztco1012.
    ft_ztco1012-prctr = lt_prctr.
    COLLECT ft_ztco1012.
  ENDLOOP.

ENDFORM.                    " GET_PROFIT_CENTER
*&---------------------------------------------------------------------*
*&      Form  GET_DIVISION
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
FORM get_division TABLES ft_ztco1012 STRUCTURE ztco1012
                   USING fw_ztco1011 STRUCTURE ztco1011.
  DATA: lr_char24 LIKE range_c24 OCCURS 0 WITH HEADER LINE,
        lr_spart LIKE bapi_rangesspart OCCURS 0 WITH HEADER LINE.
  DATA: lt_ztco1012 LIKE ztco1012 OCCURS 0 WITH HEADER LINE,
        lt_spart LIKE ztco1012-spart OCCURS 0 WITH HEADER LINE.
  DATA: l_kokrs LIKE tka01-kokrs.


*-Get divison range by group
  IF fw_ztco1011-gspart NE space.
    PERFORM get_range_by_group TABLES lr_char24
                               USING  fw_ztco1011-gspart
                                      '0000'
                                      l_kokrs.
    LOOP AT lr_char24.
      CLEAR: lr_spart.
      MOVE-CORRESPONDING lr_char24 TO lr_spart.
      APPEND lr_spart.
    ENDLOOP.
  ENDIF.

*-Put division range
  CLEAR: lr_spart.
  IF NOT fw_ztco1011-sspart IS INITIAL.
    lr_spart-sign = 'I'.
    lr_spart-low  = fw_ztco1011-sspart.

    IF fw_ztco1011-espart IS INITIAL.
      lr_spart-option = 'EQ'.
    ELSE.
      lr_spart-option = 'BT'.
      lr_spart-high   = fw_ztco1011-espart.
    ENDIF.

    APPEND lr_spart.
  ENDIF.

  IF lr_spart[] IS INITIAL.
    EXIT.
  ENDIF.

*-Select all spart
  SELECT spart
    INTO TABLE lt_spart
    FROM tspa
    WHERE spart IN lr_spart.

*-Put division data for return
  LOOP AT lt_spart.
    LOOP AT ft_ztco1012.
      CLEAR lt_ztco1012.
      lt_ztco1012 = ft_ztco1012.
      lt_ztco1012-spart = lt_spart.
      APPEND lt_ztco1012.

    ENDLOOP.

    IF sy-subrc NE 0.
      CLEAR: lt_ztco1012.
      lt_ztco1012-spart = lt_spart.
      APPEND lt_ztco1012.
    ENDIF.
  ENDLOOP.

  IF NOT lt_ztco1012[] IS INITIAL.
    ft_ztco1012[] = lt_ztco1012[].
  ENDIF.

ENDFORM.                    " GET_DIVISION
*&---------------------------------------------------------------------*
*&      Form  GET_RANGE_BY_GROUP
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
FORM get_range_by_group TABLES fr_char24 STRUCTURE range_c24
                         USING fi_phinr
                               fi_class
                               fi_kokrs.
  DATA: lt_setlist   LIKE setlist    OCCURS 0 WITH HEADER LINE,
        lt_nodes     LIKE grpobjects OCCURS 0 WITH HEADER LINE,
        lt_values    LIKE grpvalues  OCCURS 0 WITH HEADER LINE.
  DATA: l_kokrs      LIKE sethier-kokrs,
        l_prfgp      LIKE sethier-setclass,
        l_prftgp     LIKE rgsbs-setnr,
        lw_info      LIKE grphinfo,
        lw_overwrite LIKE sy-datar.

  IF fi_phinr IS INITIAL OR fi_class IS INITIAL.
    EXIT.
  ENDIF.

  CLEAR: fr_char24, fr_char24[].

*-Set hard code
  l_prfgp = fi_class.
  l_kokrs = fi_kokrs.

*-Convert profit center group
  CALL FUNCTION 'G_SET_LIST_SELECT'
    EXPORTING
      client        = sy-mandt
      setclass      = l_prfgp
      shortname     = fi_phinr
      kokrs         = l_kokrs
    TABLES
      matching_sets = lt_setlist.

  IF lt_setlist IS INITIAL.
    MESSAGE w010(zco1).
    EXIT.
  ENDIF.

  READ TABLE lt_setlist INDEX 1.
  l_prftgp = lt_setlist-setname.

*-Get profit center data by profit center group
  CALL FUNCTION 'K_HIERARCHY_TABLES_READ'
    EXPORTING
      e_class                     = l_prfgp
      e_setid                     = l_prftgp
      e_kokrs                     = l_kokrs
      e_mandt                     = sy-mandt
    TABLES
      t_nodes                     = lt_nodes
      t_values                    = lt_values
    CHANGING
      c_info                      = lw_info
      c_overwrite                 = lw_overwrite
    EXCEPTIONS
      no_controlling_area         = 1
      no_chart_of_account         = 2
      different_controlling_areas = 3
      different_chart_of_accounts = 4
      set_not_found               = 5
      illegal_field_replacement   = 6
      illegal_table_replacement   = 7
      fm_raise                    = 8
      convert_error               = 9
      no_overwrite_standard_hier  = 10
      no_bukrs_for_kokrs          = 11
      OTHERS                      = 12.

  IF sy-subrc <> 0.
    MESSAGE w010(zco1).
    EXIT.
  ENDIF.

*-Append to profit center range
  LOOP AT lt_values.
    CLEAR: fr_char24.

    fr_char24-sign   = 'I'.
    fr_char24-option = 'BT'.
    fr_char24-low    = lt_values-vfrom.
    fr_char24-high   = lt_values-vto.

    APPEND fr_char24.
  ENDLOOP.

ENDFORM.                    " GET_RANGE_BY_GROUP
⚠️ **GitHub.com Fallback** ⚠️