***********************************************************************
**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