ALV TREE + 动态显示列

以下程序不代表企业PRD中的真实程序.
程序中带有 select * 的代码请见谅,由于并不十分影响此程序性能,因此没有修改.
Description: YCOR1005_N
单船收入成本表

*---------------------------------------------------------------------*
* PROGRAM ID          : YCOR1005                                      *
* APPLICATION NAME    : CO                                            *
* AUTHOR              : Victor.Pan                                    *
* TRANSACTION         : ZCOR05                                        *
* PROGRAM TYPE        : REPORT                                        *
* OUTPUT              : ALV_GRID DYNAMIC OUTPUT                       *
* SAP RELEASE         : 4.6C                                          *
* DESCRIPTION         : 单船收入成本表                                *
* CREATED TIME        : 2006-11-11                                    *
*---------------------------------------------------------------------*
*  LOG  DATE     REL  CHANGE DESCRIPTION                  WHO         *
*=====================================================================*
*  001 2006-12-01 LAST-CHANGED  COMMENTARY  Victor.Pan                *
*---------------------------------------------------------------------*

REPORT  YCOR1005                      .
include YCOR1005_TOP_N.
*INCLUDE YCOR1005_TOP.
include YCOR1005_CONTROL_N.
*INCLUDE YCOR1005_CONTROL.
* screen elements
SELECTION-SCREEN BEGIN OF BLOCK RAD1
	WITH FRAME TITLE TEXT-003.
PARAMETERS: BUKRS LIKE BSIS-BUKRS OBLIGATORY.
SELECT-OPTIONS: ABPER FOR BSEG-ABPER OBLIGATORY."期间
PARAMETERS: VR TYPE ZCO04_A-ZVARIANT DEFAULT '1'
            MATCHCODE OBJECT ZCOVARIANT.

SELECTION-SCREEN END OF BLOCK RAD1.
SELECTION-SCREEN BEGIN OF BLOCK RAD2
	WITH FRAME TITLE TEXT-002.
PARAMETERS: H1 RADIOBUTTON GROUP A1 USER-COMMAND SELE DEFAULT 'X'.
"半成品
PARAMETERS: H2 RADIOBUTTON GROUP A1 ."产成品
PARAMETERS: ORDER_10(10) .
SELECTION-SCREEN END OF BLOCK RAD2.


AT SELECTION-SCREEN ON ORDER_10.
*IF H1 = 'X'.
*    TH1 = '1121020100'.
*  ELSEIF H2 = 'X'.
*    TH1 = '1121040100'.
*  ENDIF.
  IF ORDER_10 IS INITIAL.
    MESSAGE W000(ZFI01) WITH '订单组不能为空'.
    STOP.
  ENDIF.
AT SELECTION-SCREEN ON ABPER.
IF ABPER-LOW = '' OR ABPER-HIGH = ''.
   MESSAGE E000(ZFI01) WITH '期间不能为空'.
ENDIF.

AT SELECTION-SCREEN ON VALUE-REQUEST FOR ORDER_10.

IF H1 = 'X'.
    TH1 = '1121020100'.
  ELSEIF H2 = 'X'.
    TH1 = '1121040100'.
  ENDIF.

  DATA : f4help LIKE TABLE OF ddshretval WITH HEADER LINE.
  DATA: dynpprog LIKE SY-REPID.
  DATA: F4_LIST1 LIKE F4_LIST OCCURS 0.
  dynpprog = SY-REPID.
  perFORM GET_ORDER_F4_10 TABLES F4_LIST1.."获得订单与f4列表
  CALL FUNCTION 'F4IF_INT_TABLE_VALUE_REQUEST'
       EXPORTING
            retfield     = 'ORDER_10'
            dynpprog     = dynpprog
            dynpnr       = sy-dynnr
            stepl        = '1'
            window_title = '选择值'
            value_org    = 'S'
       TABLES
            value_tab    = F4_LIST1
            return_tab   = f4help.
  ORDER_10 = f4help-fieldval.

*AT SELECTION-SCREEN ON ORDER_10.
*  IF ORDER_10 IS INITIAL.
*    MESSAGE W000(ZFI01) WITH '订单组不能为空'.
*    STOP.
*  ENDIF.
AT SELECTION-SCREEN.
AUTHORITY-CHECK OBJECT 'ZBUKRS' ID 'BUKRS'  FIELD BUKRS.
IF SY-SUBRC <> 0.
   MESSAGE E000(ZFI01) WITH '没有此公司代码权限'.
ENDIF.
*AT SELECTION-SCREEN OUTPUT.
*BREAK ZHENPAN.
START-OF-SELECTION.

  DATA: LAST_UCOMM TYPE SY-UCOMM.
  DATA: SALE_NODE TYPE LVC_NKEY.
  CLEAR SALE_COST_ELEMENT[].
  "获得输出列表组
  PERFORM GET_DISPLAY_LIST_GROUP
          TABLES OUT_CG
          USING VR .
  PERFORM GET_SALE_COST_ELEMENT TABLES SALE_COST_ELEMENT
          USING VR. "获得销售成本要素
  CLEAR: ORDER_LIST ,ORDER_LIST[].
  PERFORM GET_ORDER TABLES ORDER_LIST."获得订单

END-OF-SELECTION.
  CALL SCREEN 100.
  include YCOR1005_PROCESS_DATA_N.
  include YCOR1005_100_N.
  include YCOR1005_TEST_N.

*Text elements
*----------------------------------------------------------
* 001 成本要素组
* 002 半成品/产成品
* 003 选择条件


*Selection texts
*----------------------------------------------------------
* ABPER         期间
* BUKRS         公司代码
* H1         半成品
* H2         产成品
* ORDER_10         订单组(前10位)
* VR         变式


*Messages
*----------------------------------------------------------
*
* Message class: 00
* 208 &
*
* Message class: ZFI01
* 000 &1&2&3&4&5

Extracted by Direct Download 46cd version 1.3.1 - E.G.Mellodew. 1998-2005 UK. Sap Release 46C
Description: YCOR1005_TOP_N
Include YCOR1005_TOP

*----------------------------------------------------------------------*
*   INCLUDE YCOR1005_TOP                                               *
*----------------------------------------------------------------------*
TABLES: BSIS,AUFK,COSP,BSEG,COSS,ZCO04_A,BKPF,COAS,CSKA.
DATA: BEGIN OF BELNR_LIST OCCURS 0, "凭证列表
      BUKRS LIKE BSIS-BUKRS,
      GJAHR LIKE BSIS-GJAHR,
      BELNR LIKE BSIS-BELNR,
      END OF BELNR_LIST.
DATA: BEGIN OF ORDER_LIST OCCURS 0, "订单列表
      ORDER LIKE AUFK-AUFNR,
      END OF ORDER_LIST.
DATA: BEGIN OF F4_LIST OCCURS 0,
      ORDER_10 LIKE AUFK-AUFNR,
      TEXT LIKE COAS-KTEXT,
      END OF F4_LIST.

DATA: BEGIN OF COST_ELEMENT OCCURS 0,"成本要素列表
      ELEMENT LIKE COSP-KSTAR,
      Z1   LIKE ZCO04_A-Z1,"取数属性
      ATTR LIKE ZCO04_A-ATTR,"+/-属性
      END OF COST_ELEMENT.
DATA: BEGIN OF COST_ELEMENT_GROUP OCCURS 0,"成本要素组列表
      ZINDEX LIKE ZCO04_A-ZINDEX,"list_index
      ELEMENT_GROUP LIKE GRPDYNP-NAME_COALL,
      Z1   LIKE ZCO04_A-Z1,"取数属性
      ATTR LIKE ZCO04_A-ATTR,"+/-属性
      END OF COST_ELEMENT_GROUP.
DATA: BEGIN OF LIST_STRUCTURE OCCURS 0,
      ELEMENT_GROUP LIKE GRPDYNP-NAME_COALL,
      ELEMENT LIKE COSP-KSTAR,
      TP(1), "G: GROUP ; E: ELEMENT
      END OF LIST_STRUCTURE.
DATA: SALE_COST_ELEMENT LIKE COST_ELEMENT OCCURS 0 WITH HEADER LINE.
DATA: new_table TYPE REF TO data."out_data table space
DATA: new_line  TYPE REF TO data."out_data line space
DATA: SALE_line  TYPE REF TO data. "销售收入数据行 space
DATA: COST_LINE TYPE REF TO DATA.  "成本行 space
DATA: JUDGE_LINE TYPE REF TO DATA. "判断行
DATA: JUDGE_TABLE TYPE REF TO DATA. "判断表
FIELD-SYMBOLS: <J_TABLE> TYPE ANY TABLE,
               <J_LINE> TYPE ANY.
FIELD-SYMBOLS: <l_table> TYPE ANY TABLE,
               <l_line>  TYPE ANY,
               <l_field> TYPE ANY,
               <SALE_LINE> TYPE ANY,"销售收入
               <COST_LINE> TYPE ANY,"成本
               <GP_LINE> TYPE ANY,"毛利
               <TCOST_LINE> TYPE ANY."暂估成本

DATA: OUT_table TYPE REF TO data.
DATA: OUT_line  TYPE REF TO data.
DATA: GP_LINE TYPE REF TO DATA.
DATA: TCOST_LINE TYPE REF TO DATA."暂估成本

FIELD-SYMBOLS: <OUT_TABLE> TYPE ANY TABLE,
               <OUT_line>  TYPE ANY,
               <OUT_field> TYPE ANY.
"INORDER TO GET HIGH PERFORMANCE,GET DATA INTO DB_TABLE
"FIRST
FIELD-SYMBOLS: <DB_TABLE> TYPE ANY TABLE,
               <DB_LINE> TYPE ANY,
               <DB_FIELD> TYPE ANY.
DATA: DB_TABLE TYPE REF TO DATA.
DATA: DB_LINE TYPE REF TO DATA.
DATA: top_key TYPE lvc_nkey.
DATA: SHIPNAME(100).
  DATA: BEGIN OF EXPAND_key1 OCCURS 0,
        GROUP LIKE GRPDYNP-NAME_COALL,
        CKEY TYPE lvc_nkey,
        END OF EXPAND_KEY1.
DATA: OUT_CG LIKE COST_ELEMENT_GROUP OCCURS 0 WITH HEADER LINE."输出结构
DATA: TH1 TYPE BSIS-HKONT."判断产成品还是半成品

Extracted by Direct Download 46cd version 1.3.1 - E.G.Mellodew. 1998-2005 UK. Sap Release 46C
 
Description: YCOR1005_CONTROL_N
Include YCOR1005_CONTROL

*----------------------------------------------------------------------*
*   INCLUDE YCOR1005_CONTROL                                           *
*----------------------------------------------------------------------*
DATA: g_alv_tree         TYPE REF TO cl_gui_alv_tree,
      g_custom_container TYPE REF TO cl_gui_custom_container.
DATA: gt_fieldcatalog TYPE lvc_t_fcat.
DATA: it_fieldcat TYPE lvc_t_fcat.
CLASS lcl_tree_event_receiver DEFINITION.

  PUBLIC SECTION.
* §2. Define an event handler method to build up a context menu
*     (postfix of event name: _CONTEXT_MENU_REQUEST).
* This event is fired each time the user klick with the right
* mouse button on a node.
    METHODS: handle_node_cm_req
      FOR EVENT node_context_menu_request OF cl_gui_alv_tree
      IMPORTING node_key menu.

* §3. Define an event handler method to respond to a function code
*     triggered by your menu (postfix: _CONTEXT_MENU_SELECTED).
* This event is fired when the user selects an entry of the
* build up context menu.
    METHODS: handle_node_cm_sel
      FOR EVENT node_context_menu_selected OF cl_gui_alv_tree
      IMPORTING node_key fcode sender.
* 'sender' is an implicit event parameter that is provided by
* ABAP Objects runtime system. It contains a reference to the
* object that fired the event. You may directly use it to
* call methods of this instance.

ENDCLASS.
******************************************************************
CLASS lcl_tree_event_receiver IMPLEMENTATION.
* §4. Implement your event handler methods.

  METHOD handle_node_cm_req.
* Event parameter 'menu' holds a reference to the standard context
* menu of ALV Tree (functions 'Expand'/'Collapse' on nodes).
* You may either append your own functions (separated by a line)
* or clear the menu if you do not want to allow standard functions.

* In this case the standard menu is cleared.
    CALL METHOD menu->clear.
* The next line defines one line of the context menu.
    CALL METHOD menu->add_function
        EXPORTING
           fcode = 'DEL_SUBTREE'
           text  = text-901.        "Delete Subtree

  ENDMETHOD.
*--------------------------------------------
  METHOD handle_node_cm_sel.
* At this point of execution, the user selected a menu entry of the
* menu build up in event handler method handle_node_cm_req.
* Query your own function codes and react accordingly.
    DATA l_rc TYPE c.

    case fcode.
    when 'DEL_SUBTREE'.
      CALL FUNCTION 'POPUP_TO_CONFIRM_STEP'
           EXPORTING
                textline1      = 'Do you really want to delete'(902)
                textline2      = 'this node and all its subnodes?'(903)
                titel          = 'Confirmation'(904)
                cancel_display = ' '
           IMPORTING
                answer         = l_rc.
      IF l_rc EQ 'J'.
        CALL METHOD sender->delete_subtree
           EXPORTING i_node_key = node_key.
* Do not forget to refresh the display when you change the contents
* of your list.
        CALL METHOD sender->frontend_update.
      ENDIF.
    endcase.
  ENDMETHOD.
*---------------------------------------------
ENDCLASS.

Extracted by Direct Download 46cd version 1.3.1 - E.G.Mellodew. 1998-2005 UK. Sap Release 46C
Description: YCOR1005_PROCESS_DATA_N
Include YCOR1005_PROCESS_DATA

*----------------------------------------------------------------------*
*   INCLUDE YCOR1005_PROCESS_DATA                                      *
*----------------------------------------------------------------------*
* 获得销售成本要素
FORM GET_SALE_COST_ELEMENT TABLES SE STRUCTURE COST_ELEMENT
                           USING VR TYPE ZCO04_A-ZVARIANT.
  CLEAR SE[].
  DATA: CE LIKE COST_ELEMENT OCCURS 0 WITH HEADER LINE.
  SELECT * FROM ZCO04_A WHERE ZVARIANT = VR
        AND Z1 = 'A'."get data from custom
    PERFORM GET_COST_ELEMENT_LIST  TABLES CE
                           USING ZCO04_A-COST_GROUP
                                 ZCO04_A-Z1
                                 ZCO04_A-ATTR
                                 0.
    APPEND LINES OF CE TO  SALE_COST_ELEMENT.
  ENDSELECT.
ENDFORM.
*"2.	提取BSIS表半成品科目(1121020100)
* 或产成品(1121040100)过帐日期为在选定日期范围内,
* 凭证类型为SB的所有凭证。
FORM GET_BELNR_01 TABLES BELNR STRUCTURE BELNR_LIST .
  CLEAR: BELNR,BELNR[].

  DATA: T1 TYPE BSEG-ABPER.
  SELECT * FROM BSIS WHERE BLART = 'SB'
                     AND BUKRS = BUKRS
                     AND HKONT = TH1..
    T1 = BSIS-BUDAT(6).
    IF T1 IN ABPER.
      BELNR-GJAHR = BSIS-GJAHR.
      BELNR-BUKRS = BSIS-BUKRS.
      BELNR-BELNR = BSIS-BELNR.
      APPEND BELNR.
      CLEAR BELNR.
    ENDIF.
  ENDSELECT.
ENDFORM.
*3.	根据凭证查询BSEG的ZUONR字段, 得出订单号。
FORM GET_ORDER_LIST TABLES ORDER STRUCTURE ORDER_LIST.
  CLEAR: ORDER,ORDER[].
  DATA: BELNR LIKE BELNR_LIST OCCURS 0 WITH HEADER LINE.
  PERFORM GET_BELNR_01 TABLES BELNR.
  DATA: T1 TYPE BSEG-ABPER.
  LOOP AT BELNR.
    CLEAR: BSEG,ORDER_LIST.
    SELECT SINGLE ZUONR FROM BSEG INTO ORDER-ORDER
           WHERE BELNR = BELNR-BELNR
           AND GJAHR = BELNR-GJAHR
           AND BUKRS = BELNR-BUKRS.
    IF ORDER-ORDER <> ''.
      APPEND ORDER.
      CLEAR ORDER.
    ENDIF.
  ENDLOOP.
  SORT ORDER BY ORDER.
  DELETE ADJACENT DUPLICATES FROM ORDER.
ENDFORM.
"获得订单组F4订单列表
*---------------------------------------------------------------------*
*       FORM GET_ORDER_F4_10                                          *
*---------------------------------------------------------------------*
*       ........                                                      *
*---------------------------------------------------------------------*
*  -->  F4_LIST                                                       *
*---------------------------------------------------------------------*
FORM GET_ORDER_F4_10 TABLES F4_LIST STRUCTURE F4_LIST.
  CLEAR: F4_LIST,F4_LIST[].
  DATA: ORDER LIKE ORDER_LIST OCCURS 0 WITH HEADER LINE.
  PERFORM GET_ORDER_LIST TABLES ORDER.
  CLEAR ORDER_10.
  CLEAR ORDER_LIST[].
  CLEAR F4_LIST[].
  LOOP AT ORDER.
    PERFORM GET_ORDER_TEXT USING ORDER-ORDER
                 CHANGING F4_LIST-TEXT.
    DATA: S1(100).
    SPLIT F4_LIST-TEXT AT '-' INTO SHIPNAME S1.
    F4_LIST-TEXT = SHIPNAME.
    F4_LIST-ORDER_10   = ORDER-ORDER(10).
    APPEND F4_LIST.
    CLEAR F4_LIST.
  ENDLOOP.
  SORT F4_LIST BY ORDER_10.
  DELETE ADJACENT DUPLICATES FROM F4_LIST.
ENDFORM.
"根据选择屏幕,获得订单列表
*---------------------------------------------------------------------*
*       FORM GET_ORDER                                                *
*---------------------------------------------------------------------*
*       获取订单                                                      *
*---------------------------------------------------------------------*
FORM GET_ORDER TABLES OLIST STRUCTURE ORDER_LIST.
  DATA: S1(100).
  CLEAR: OLIST,OLIST[].
  CONCATENATE ORDER_10 '%' INTO S1.
  CONDENSE S1 NO-GAPS.
  SELECT * FROM COAS WHERE AUFNR LIKE S1.
    OLIST-ORDER = COAS-AUFNR.
    APPEND OLIST.
    CLEAR OLIST.
  ENDSELECT.
ENDFORM.
"根据成本要素组获得子成本要素组
*---------------------------------------------------------------------*
*       FORM GET_COST_ELEMENT_LIST                                    *
*---------------------------------------------------------------------*
*       ........                                                      *
*---------------------------------------------------------------------*
*  -->  T1                                                            *
*  -->  COST_GROUP                                                    *
*  -->  LEVEL = 0 : 返回所有子组
*  -->  LEVEL = 1 : 返回一级子组
*---------------------------------------------------------------------*
FORM GET_COST_ELEMENT_GROUP_LIST  TABLES T1 STRUCTURE COST_ELEMENT_GROUP
                                  USING COST_GROUP
                                         LEVEL.
  CLEAR T1[].

  DATA: T_NODES LIKE GRPOBJECTS OCCURS 0 WITH HEADER LINE.
  DATA:  T_VALUES LIKE GRPVALUES OCCURS 0 WITH HEADER LINE.
  DATA: C_INFO LIKE GRPHINFO.
  DATA: C_OVERWRITE LIKE SY-DATAR.
  DATA: E_SETID LIKE SETHIER-SETID.
  CONCATENATE '01022300' COST_GROUP INTO E_SETID.
  CALL FUNCTION 'K_HIERARCHY_TABLES_READ'
       EXPORTING
            E_CLASS          = '0102'
            E_SETID          = E_SETID
            E_KOKRS          = '2300'
            E_OLD_LINE_LEVEL = 1
       TABLES
            T_NODES          = T_NODES
            T_VALUES         = T_VALUES
       CHANGING
            C_INFO           = C_INFO
            C_OVERWRITE      = C_OVERWRITE.
  IF LEVEL = 1.
    LOOP AT T_NODES WHERE HLEVEL = LEVEL.
      CLEAR T1.
      T1-ELEMENT_GROUP = T_NODES-SHORTNAME.
      APPEND  T1.
    ENDLOOP.
  ELSEIF LEVEL = 0.
    LOOP AT T_NODES WHERE HLEVEL > 0.
      CLEAR T1.
      T1-ELEMENT_GROUP = T_NODES-SHORTNAME.
      APPEND  T1.
    ENDLOOP.
  ENDIF.
ENDFORM.
"根据成本要素组获得子成本要素
*---------------------------------------------------------------------*
*       FORM GET_COST_ELEMENT_LIST                                    *
*---------------------------------------------------------------------*
*       ........                                                      *
*---------------------------------------------------------------------*
*  -->  T1                                                            *
*  -->  COST_GROUP                                                    *
*  -->  LEVEL = 0 : 返回所有子要素
*  -->  LEVEL = 1 : 返回一级子素
*---------------------------------------------------------------------*
FORM GET_COST_ELEMENT_LIST  TABLES T1 STRUCTURE COST_ELEMENT
                            USING COST_GROUP
                                  Z1
                                  ATTR
                                  LEVEL.
  CLEAR T1[].
  DATA: CG LIKE COST_ELEMENT_GROUP OCCURS 0 WITH HEADER LINE.
  DATA: T_NODES LIKE GRPOBJECTS OCCURS 0 WITH HEADER LINE.
  DATA:  T_VALUES LIKE GRPVALUES OCCURS 0 WITH HEADER LINE.
  DATA: C_INFO LIKE GRPHINFO.
  DATA: C_OVERWRITE LIKE SY-DATAR.
  DATA: E_SETID LIKE SETHIER-SETID.
  CONCATENATE '01022300' COST_GROUP INTO E_SETID.
  CALL FUNCTION 'K_HIERARCHY_TABLES_READ'
       EXPORTING
            E_CLASS          = '0102'
            E_SETID          = E_SETID
            E_KOKRS          = '2300'
            E_OLD_LINE_LEVEL = 1
       TABLES
            T_NODES          = T_NODES
            T_VALUES         = T_VALUES
       CHANGING
            C_INFO           = C_INFO
            C_OVERWRITE      = C_OVERWRITE.
  IF LEVEL = 1.
    LOOP AT T_VALUES WHERE SETID = E_SETID.
      CLEAR T1.
      T1-Z1 = Z1.
      T1-ATTR = ATTR.
      IF T_VALUES-VTO = ''.
        T1-ELEMENT = T_VALUES-VFROM.
        APPEND  T1.
      ELSE.
        SELECT * FROM CSKA WHERE KTOPL = '2300'
                 AND ( KSTAR BETWEEN T_VALUES-VFROM
                       AND T_VALUES-VTO ).
          T1-ELEMENT =  CSKA-KSTAR.
          APPEND  T1.
        ENDSELECT.
      ENDIF.

    ENDLOOP.
  ELSEIF LEVEL = 0.
    PERFORM GET_COST_ELEMENT_GROUP_LIST TABLES CG
                           USING COST_GROUP 0.
    CG-ELEMENT_GROUP = COST_GROUP.
    APPEND CG.
    LOOP AT CG.
      CLEAR E_SETID.
      CONCATENATE '01022300' CG-ELEMENT_GROUP INTO E_SETID.
      LOOP AT T_VALUES WHERE SETID = E_SETID.
        CLEAR T1.
         T1-Z1 = Z1.
        T1-ATTR = ATTR.
        IF T_VALUES-VTO = ''.
          T1-ELEMENT = T_VALUES-VFROM.
          APPEND  T1.
        ELSE.
          SELECT * FROM CSKA WHERE KTOPL = '2300'
                   AND ( KSTAR BETWEEN T_VALUES-VFROM
                         AND T_VALUES-VTO ).
            T1-ELEMENT =  CSKA-KSTAR.
            APPEND  T1.
          ENDSELECT.
        ENDIF.
      ENDLOOP.
    ENDLOOP.
  ENDIF.
ENDFORM.

*---------------------------------------------------------------------*
*       FORM GET_COSP_WTG_VIA_GROUP                                   *
*---------------------------------------------------------------------*
*       根据成本要素组/订单获得业务货币值

*---------------------------------------------------------------------*
*  -->  ORDER                                                         *
*  -->  COST_GROUP                                                    *
*  -->  P1                                                            *
*  -->  P2                                                            *
*  -->  WTG                                                           *
*---------------------------------------------------------------------*
FORM GET_COSP_WTG_VIA_GROUP USING ORDER
                        COST_GROUP
                        Z1
                        ATTR
                        P1    "期间开始
                        P2    "期间结束
                  CHANGING WTG.
  CLEAR WTG.
  DATA: WTG_TAB LIKE COSP-WTG001.
  DATA: COST_ELEM LIKE COST_ELEMENT OCCURS 0 WITH HEADER LINE.

  PERFORM GET_COST_ELEMENT_LIST  TABLES COST_ELEM
                         USING COST_GROUP
                               Z1
                               ATTR
                               0  .
  LOOP AT COST_ELEM.
    PERFORM GET_COSP_WTG_VIA_ORDER USING ORDER
                  COST_ELEM-ELEMENT
                  P1    "期间开始
                  P2    "期间结束
            CHANGING WTG_TAB.
    WTG = WTG + WTG_TAB.
  ENDLOOP.
ENDFORM.
"根据订单号/成本要素/期间 获得业务货币值
*---------------------------------------------------------------------*
*       FORM GET_COSP_WTG                                             *
*---------------------------------------------------------------------*
*       ........                                                      *
*---------------------------------------------------------------------*
*  -->  ORDER                                                         *
*  -->  COST_ELEMENT                                                  *
*  -->  P1     期间开始   TYPE I
*  -->  P2   期间结束     TYPE I
*  -->  WTG                                                           *
*---------------------------------------------------------------------*
FORM GET_COSP_WTG_VIA_ORDER USING ORDER
                        COST_ELEMENT
                        P1    "期间开始
                        P2    "期间结束
                  CHANGING WTG.
  CLEAR WTG.
  DATA: FN(30).
  DATA: FN_P(3) TYPE N VALUE '000'.
  DATA: TMP(10).
  DATA: PERIOD TYPE I.

  FIELD-SYMBOLS: <F1> TYPE ANY.
  DATA: OBJNR TYPE COSP-OBJNR.
  CONCATENATE 'OR' ORDER INTO OBJNR.
  DATA: P1_IN TYPE I.
  IF P1(4) = P2(4).
    PERIOD = P2 - P1 + 1.
    SELECT * FROM COSP WHERE GJAHR = P1(4)
             AND OBJNR = OBJNR
             AND WRTTP = '04'
             AND KSTAR = COST_ELEMENT.
      DO PERIOD TIMES.
        IF SY-INDEX = 1.
          FN_P = P1+4(2)..
        ELSE.
          FN_P = P1+4(2) + SY-INDEX - 1.
        ENDIF.
        CLEAR FN.
        CONCATENATE 'WKG' FN_P INTO FN.
        ASSIGN COMPONENT FN OF STRUCTURE COSP TO <F1> .
        WTG = WTG + <F1>.
      ENDDO.
    ENDSELECT.
    SELECT * FROM COSS WHERE GJAHR  = P1(4)
             AND OBJNR = OBJNR
             AND WRTTP = '04'
             AND KSTAR = COST_ELEMENT.
      DO PERIOD TIMES.
        IF SY-INDEX = 1.
          FN_P = P1+4(2).
        ELSE.
          FN_P = P1+4(2) + SY-INDEX - 1.
        ENDIF.
        CLEAR FN.
        CONCATENATE 'WKG' FN_P INTO FN.
        ASSIGN COMPONENT FN OF STRUCTURE COSS TO <F1> .
        WTG = WTG + <F1>.
      ENDDO.
    ENDSELECT.
  ELSE.
    PERIOD = 12 - P1+4(2) + 1.
    SELECT * FROM COSP WHERE GJAHR = P1(4)
             AND OBJNR = OBJNR
             AND WRTTP = '04'
             AND KSTAR = COST_ELEMENT.
      DO PERIOD TIMES.
        IF SY-INDEX = 1.
          FN_P = P1+4(2).
        ELSE.
          FN_P = P1+4(2) + SY-INDEX - 1.
        ENDIF.
        CLEAR FN.
        CONCATENATE 'WKG' FN_P INTO FN.
        ASSIGN COMPONENT FN OF STRUCTURE COSP TO <F1> .
        WTG = WTG + <F1>.
      ENDDO.
    ENDSELECT.
    SELECT * FROM COSS WHERE GJAHR  = P1(4)
             AND OBJNR = OBJNR
             AND WRTTP = '04'
             AND KSTAR = COST_ELEMENT.
      DO PERIOD TIMES.
        IF SY-INDEX = 1.
          FN_P = P1+4(2).
        ELSE.
          FN_P = P1+4(2) + SY-INDEX - 1.
        ENDIF.
        CLEAR FN.
        CONCATENATE 'WKG' FN_P INTO FN.
        ASSIGN COMPONENT FN OF STRUCTURE COSS TO <F1> .
        WTG = WTG + <F1>.
      ENDDO.
    ENDSELECT.

    PERIOD = P2+4(2).
    SELECT * FROM COSP WHERE GJAHR = P2(4)
             AND OBJNR = OBJNR
             AND WRTTP = '04'
             AND KSTAR = COST_ELEMENT.
      DO PERIOD TIMES.
        IF SY-INDEX = 1.
          FN_P = 1.
        ELSE.
          FN_P = SY-INDEX.
        ENDIF.
        CLEAR FN.
        CONCATENATE 'WKG' FN_P INTO FN.
        ASSIGN COMPONENT FN OF STRUCTURE COSP TO <F1> .
        WTG = WTG + <F1>.
      ENDDO.
    ENDSELECT.
    SELECT * FROM COSS WHERE GJAHR  = P2(4)
             AND OBJNR = OBJNR
             AND WRTTP = '04'
             AND KSTAR = COST_ELEMENT.
      DO PERIOD TIMES.
        IF SY-INDEX = 1.
          FN_P = 1.
        ELSE.
          FN_P = SY-INDEX.
        ENDIF.
        CLEAR FN.
        CONCATENATE 'WKG' FN_P INTO FN.
        ASSIGN COMPONENT FN OF STRUCTURE COSS TO <F1> .
        WTG = WTG + <F1>.
      ENDDO.
    ENDSELECT.

  ENDIF.

ENDFORM.
"获得成本要素组文本
*---------------------------------------------------------------------*
*       FORM GET_COST_GROUP_TEXT                                      *
*---------------------------------------------------------------------*
*       获得成本要素组文本                                             *
*---------------------------------------------------------------------*
*  -->  COST_GROUP                                                    *
*  -->  TEXT                                                          *
*---------------------------------------------------------------------*
FORM GET_COST_GROUP_TEXT USING COST_GROUP
                         CHANGING TEXT.
  CLEAR TEXT.
  SELECT SINGLE DESCRIPT FROM SETHEADERT INTO TEXT
         WHERE SETCLASS = '0102'
         AND SETNAME = COST_GROUP.
ENDFORM.
"获得成本要素文本
*---------------------------------------------------------------------*
*       FORM GET_COST_ELEMENT_TEXT                                    *
*---------------------------------------------------------------------*
*       获得成本要素文本                                              *
*---------------------------------------------------------------------*
*  -->  ELEMENT                                                       *
*  -->  TEXT                                                          *
*---------------------------------------------------------------------*
FORM GET_COST_ELEMENT_TEXT USING ELEMENT
                           CHANGING TEXT.
  CLEAR TEXT.
  SELECT SINGLE KTEXT FROM CSKU
  INTO TEXT WHERE KSTAR = ELEMENT
            AND SPRAS = '1' AND KTOPL = '2300'.
ENDFORM.
"获得订单描述
*---------------------------------------------------------------------*
*       FORM GET_ORDER_TEXT                                           *
*---------------------------------------------------------------------*
*       获得订单文本                                                  *
*---------------------------------------------------------------------*
*  -->  ORDER                                                         *
*  -->  TEXT                                                          *
*---------------------------------------------------------------------*
FORM GET_ORDER_TEXT USING ORDER
                    CHANGING TEXT.
  CALL FUNCTION 'CONVERSION_EXIT_ALPHA_INPUT'
       EXPORTING
            INPUT  = ORDER
       IMPORTING
            OUTPUT = ORDER.
  CLEAR TEXT.
  SELECT SINGLE KTEXT FROM COAS INTO TEXT
         WHERE AUFNR = ORDER.
ENDFORM.
*&---------------------------------------------------------------------*
*&      Form  GENERATE_SALE_LINE_DATA
*&---------------------------------------------------------------------*
*       生成销售收入行
*----------------------------------------------------------------------*
*  -->  p1        text
*  <--  p2        text
*----------------------------------------------------------------------*
FORM GENERATE_SALE_LINE_DATA
                    CHANGING SALE_LINE.
  clear sale_line.
  DATA: FN(3) TYPE N VALUE '000'.
  DATA: FD(30).
  DATA: T1 LIKE COST_ELEMENT OCCURS 0 WITH HEADER LINE.
  FIELD-SYMBOLS: <ELEMENT_GROUP> TYPE ANY,
                 <TOTAL> TYPE ANY,
                 <TOTAL_PERCENT> TYPE ANY,
                 <FIELD> TYPE ANY,
                 <PERCENT_FIELD> TYPE ANY,
                 <OUT_FIELD> TYPE ANY.
  ASSIGN COMPONENT 'ELEMENT_GROUP'
          OF STRUCTURE SALE_LINE TO <ELEMENT_GROUP>.
  ASSIGN COMPONENT 'TOTAL'
           OF STRUCTURE SALE_LINE TO <TOTAL>.

  SELECT * FROM ZCO04_A WHERE Z1 = 'A'.
    <ELEMENT_GROUP> = ZCO04_A-COST_GROUP.
    CLEAR T1[].
    PERFORM GET_COST_ELEMENT_LIST  TABLES T1
                       USING ZCO04_A-COST_GROUP
                             ZCO04_A-Z1
                             ZCO04_A-ATTR
                             0.
    LOOP AT T1.
*      clear <db_line>.
      PERFORM GET_INTERNAL_LINE_DATA  USING T1-ELEMENT
                 CHANGING <DB_LINE>.
      LOOP AT ORDER_LIST.
        FN = SY-TABIX.
        CLEAR FD.
        CONCATENATE 'ORDER' FN INTO FD.
        ASSIGN COMPONENT FD
              OF STRUCTURE <DB_LINE> TO <OUT_FIELD>.
        ASSIGN COMPONENT FD
       OF STRUCTURE SALE_LINE TO <FIELD>.
        <FIELD> = <FIELD> + <OUT_FIELD>.
        <TOTAL> = <TOTAL> + <OUT_FIELD>.

      ENDLOOP.
    ENDLOOP.
  ENDSELECT.
ENDFORM.                    " GENERATE_SALE_LINE_DATA
*---------------------------------------------------------------------*
*       FORM GENERATE_COST_LINE_DATA                                  *
*---------------------------------------------------------------------*
*       计算毛利                                                      *
*---------------------------------------------------------------------*
*  -->  COST_LINE                                                     *
*---------------------------------------------------------------------*
FORM GENERATE_GP_LINE_DATA.
  DATA: FN(3) TYPE N VALUE '000'.
  DATA: FD(30).
  FIELD-SYMBOLS: <PERCENT_FIELD> TYPE ANY,"ITEM_LINE
                 <OUT_FIELD> TYPE ANY, "ITEM_LINE
                 <TOTAL> TYPE ANY,
                 <PERCENT> TYPE ANY,
                 <SALE_FIELD> TYPE ANY,
                 <SALE_TOTAL> TYPE ANY,
                 <ELEMENT> TYPE ANY,
                 <GP_TOTAL> TYPE ANY,
                 <GP_TOTAL_PERCENT> TYPE ANY,
                 <GP_FIELD> TYPE ANY,
                 <GP_PERCENT> TYPE ANY,
                 <Z1> TYPE ANY,
                 <ATTR> TYPE ANY.

  ASSIGN COMPONENT 'TOTAL'
       OF STRUCTURE <GP_LINE> TO <GP_TOTAL>.
  ASSIGN COMPONENT 'PERCENT'
       OF STRUCTURE <GP_LINE> TO <GP_TOTAL_PERCENT>.

  LOOP AT <DB_TABLE> ASSIGNING <DB_LINE>.
    ASSIGN COMPONENT 'ELEMENT'
       OF STRUCTURE <DB_LINE> TO <ELEMENT>.
    ASSIGN COMPONENT 'Z1'
       OF STRUCTURE <DB_LINE> TO <Z1>.
    IF <Z1> = 'B' OR <Z1> = 'C'.
*    READ TABLE SALE_COST_ELEMENT WITH KEY ELEMENT = <ELEMENT>.
*    IF SY-SUBRC <> 0.
      ASSIGN COMPONENT 'TOTAL'
            OF STRUCTURE <DB_LINE> TO <TOTAL>.
      ASSIGN COMPONENT 'PERCENT'
            OF STRUCTURE <DB_LINE> TO <PERCENT>.
      <GP_TOTAL> = <GP_TOTAL> + <TOTAL>.
      LOOP AT ORDER_LIST.
        FN = SY-TABIX.
        "---------PERCENT
        CLEAR FD.
        CONCATENATE 'PERCENT' FN INTO FD.
        ASSIGN COMPONENT FD
            OF STRUCTURE <GP_LINE> TO <PERCENT_FIELD>.
        CLEAR FD.
        CONCATENATE 'ORDER' FN INTO FD.
        ASSIGN COMPONENT FD
              OF STRUCTURE <DB_LINE> TO <OUT_FIELD>.
        ASSIGN COMPONENT FD
              OF STRUCTURE <GP_LINE> TO <GP_FIELD>.
        <GP_FIELD> = <GP_FIELD> + <OUT_FIELD>.
      ENDLOOP.
    ENDIF.
  ENDLOOP.
  ASSIGN COMPONENT 'TOTAL'
            OF STRUCTURE <SALE_LINE> TO <SALE_TOTAL>.
  DATA: T2 TYPE P DECIMALS 2.
  T2 = <SALE_TOTAL> - <GP_TOTAL>.
  <GP_TOTAL> = T2."<SALE_TOTAL> - <GP_TOTAL>.
  IF <SALE_TOTAL> <> 0.
    <GP_TOTAL_PERCENT> = <GP_TOTAL> / <SALE_TOTAL>.
    DATA: P1 TYPE P DECIMALS 2.
    P1 = <GP_TOTAL_PERCENT>.
    <GP_TOTAL_PERCENT> = P1.
  ENDIF.

  LOOP AT ORDER_LIST.
    FN = SY-TABIX.
    "---------PERCENT
    CLEAR FD.
    CONCATENATE 'PERCENT' FN INTO FD.
    ASSIGN COMPONENT FD
        OF STRUCTURE <GP_LINE> TO <PERCENT_FIELD>.
    CLEAR FD.
    CONCATENATE 'ORDER' FN INTO FD.
    ASSIGN COMPONENT FD
          OF STRUCTURE <SALE_LINE> TO <SALE_FIELD>.
    ASSIGN COMPONENT FD
          OF STRUCTURE <GP_LINE> TO <GP_FIELD>.
    <GP_FIELD> = <SALE_FIELD> - <GP_FIELD>.
    IF <SALE_FIELD> <> 0.
      <PERCENT_FIELD> = <GP_FIELD> / <SALE_FIELD>.
      P1 = <PERCENT_FIELD>.
      <PERCENT_FIELD> = P1.
    ENDIF.
  ENDLOOP.

ENDFORM.
*&---------------------------------------------------------------------*
*&      Form  GET_DATA_INTO_DB_TABLE
*&---------------------------------------------------------------------*
*       从数据库获得成本元素/订单对应表
*----------------------------------------------------------------------*
*  -->  p1        text
*  <--  p2        text
*----------------------------------------------------------------------*
FORM GET_DATA_INTO_DB_TABLE.
  DATA: ELEM_LIST LIKE COST_ELEMENT OCCURS 0 WITH HEADER LINE.
  DATA: EL LIKE COST_ELEMENT OCCURS 0 WITH HEADER LINE.
  LOOP AT OUT_CG.
    PERFORM GET_COST_ELEMENT_LIST
       TABLES EL
       USING OUT_CG-ELEMENT_GROUP
       OUT_CG-Z1
       OUT_CG-ATTR
       0  .
    LOOP AT  EL.
      EL-Z1 = OUT_CG-Z1.
      EL-ATTR = OUT_CG-ATTR.
      MODIFY EL.
    ENDLOOP.
    APPEND LINES OF EL TO ELEM_LIST.
  ENDLOOP.

  LOOP AT ELEM_LIST.
    PERFORM GET_DB_LINE_DATA USING ELEM_LIST-ELEMENT
                                   ELEM_LIST-Z1
                                   ELEM_LIST-ATTR
                         CHANGING <DB_LINE>.
    INSERT <DB_LINE> INTO TABLE <DB_TABLE>.
  ENDLOOP.

ENDFORM.                    " GET_DATA_INTO_DB_TABLE
*---------------------------------------------------------------------*
*       FORM GET_INTERNAL_LINE_DATA                                   *
*---------------------------------------------------------------------*
*       根据成本元素,从内表中取得相关行数据                          *
*---------------------------------------------------------------------*
*  -->  ELEMENT                                                       *
*  -->  CLINE                                                         *
*---------------------------------------------------------------------*
FORM GET_INTERNAL_LINE_DATA  USING ELEMENT
                       CHANGING CLINE.

  LOOP AT <DB_TABLE> ASSIGNING <DB_LINE>.
    ASSIGN COMPONENT 'ELEMENT'
        OF STRUCTURE <DB_LINE> TO <DB_FIELD>.
    IF <DB_FIELD> = ELEMENT.
      CLINE = <DB_LINE>.
      EXIT.
    ENDIF.
  ENDLOOP.
ENDFORM.
*---------------------------------------------------------------------*
*       FORM GET_DB_LINE_DATA                                         *
*---------------------------------------------------------------------*
*       从数据库中读取成本元素/订单对应的值 到工作区

*---------------------------------------------------------------------*
*  -->  ELEMENT                                                       *
*  -->  CLINE                                                         *
*---------------------------------------------------------------------*
FORM GET_DB_LINE_DATA  USING ELEMENT  "成本要素
                             Z1    "  取数属性
                             ATTR  "+/-属性
                       CHANGING CLINE.
  CLEAR CLINE.
  DATA: FN(3) TYPE N VALUE '000'.
  DATA: FD(30).
  DATA: WTG_TAB TYPE COSP-WTG001.
  FIELD-SYMBOLS: <OUT_FIELD> TYPE ANY, "ITEM_LINE
                 <PERCENT_FIELD> TYPE ANY,"ITEM_LINE
                 <TOTAL_PERCENT> TYPE ANY,"ITEM_LINE
                 <SUM_FIELD> TYPE ANY,"ITEM_LINE
                 <Z1> TYPE ANY,
                 <ATTR> TYPE ANY.
  ASSIGN COMPONENT 'ELEMENT'
              OF STRUCTURE CLINE TO <OUT_FIELD>.
  <OUT_FIELD> = ELEMENT.
  ASSIGN COMPONENT 'Z1'
              OF STRUCTURE CLINE TO <Z1>.
  <Z1> =  Z1.
  ASSIGN COMPONENT 'ATTR'
              OF STRUCTURE CLINE TO <ATTR>.
  <ATTR> = ATTR.
  ASSIGN COMPONENT 'TOTAL'
           OF STRUCTURE CLINE TO <SUM_FIELD>.
  ASSIGN COMPONENT 'PERCENT'
          OF STRUCTURE CLINE TO <TOTAL_PERCENT>.
  LOOP AT ORDER_LIST.
    FN = SY-TABIX.
    "---------AMOUNT
    CLEAR FD.
    CONCATENATE 'ORDER' FN INTO FD.
    ASSIGN COMPONENT FD
          OF STRUCTURE CLINE TO <OUT_FIELD>.
    "-------------------------------------------
    "--------PERCENT
    CLEAR FD.
    CONCATENATE 'PERCENT' FN INTO FD.
    ASSIGN COMPONENT FD
          OF STRUCTURE CLINE TO <PERCENT_FIELD>.
    "--------------------------------------------
    CLEAR WTG_TAB.
    IF Z1 = 'A' OR Z1 = 'B'.
      PERFORM GET_COSP_WTG_VIA_ORDER USING ORDER_LIST-ORDER
                          ELEMENT
                          ABPER-LOW    "期间开始
                          ABPER-HIGH    "期间结束
                    CHANGING WTG_TAB.
      IF Z1 = 'A'AND H1 = 'X'.
        WTG_TAB = 0.
      ENDIF.

    ELSEIF Z1 = 'C'. "佣金
      SELECT * FROM BSEG WHERE BUKRS = BUKRS
               AND ZUONR = ORDER_LIST-ORDER
               AND HKONT = ELEMENT.
        SELECT SINGLE * FROM BKPF WHERE BELNR = BSEG-BELNR
                        AND BUKRS = BUKRS.
        IF SY-SUBRC = 0.
          DATA: D6 TYPE BSEG-ABPER.
          CLEAR D6.
          CONCATENATE BKPF-GJAHR BKPF-MONAT INTO D6.
          IF D6 BETWEEN ABPER-LOW AND ABPER-HIGH.
            WTG_TAB = WTG_TAB + BSEG-DMBTR.
          ENDIF.
        ENDIF.

      ENDSELECT.
    ENDIF.
    IF ATTR = '-'.
      WTG_TAB = WTG_TAB * -1.
    ENDIF.
    <OUT_FIELD> = WTG_TAB.
    <SUM_FIELD> = <SUM_FIELD> + WTG_TAB.
  ENDLOOP.
ENDFORM.
*&---------------------------------------------------------------------*
*&      Form  MODIFY_INTERNAL_TABLE
*&---------------------------------------------------------------------*
*       计算百分比
*----------------------------------------------------------------------*
*  -->  p1        text
*  <--  p2        text
*----------------------------------------------------------------------*
FORM MODIFY_INTERNAL_DB_TABLE.
  DATA: FN(3) TYPE N VALUE '000'.
  DATA: FD(30).
  FIELD-SYMBOLS: <PERCENT_FIELD> TYPE ANY,"ITEM_LINE
                 <OUT_FIELD> TYPE ANY, "ITEM_LINE
                 <TOTAL> TYPE ANY,
                 <PERCENT> TYPE ANY,
                 <SALE_FIELD> TYPE ANY,
                 <SALE_TOTAL> TYPE ANY,
                 <ELEMENT> TYPE ANY.
  LOOP AT <DB_TABLE> ASSIGNING <DB_LINE>.
    ASSIGN COMPONENT 'ELEMENT'
       OF STRUCTURE <DB_LINE> TO <ELEMENT>.
    READ TABLE SALE_COST_ELEMENT WITH KEY ELEMENT = <ELEMENT>.
    IF SY-SUBRC <> 0.
      ASSIGN COMPONENT 'TOTAL'
            OF STRUCTURE <DB_LINE> TO <TOTAL>.
      ASSIGN COMPONENT 'PERCENT'
            OF STRUCTURE <DB_LINE> TO <PERCENT>.
      ASSIGN COMPONENT 'TOTAL'
            OF STRUCTURE <SALE_LINE> TO <SALE_TOTAL>.
      IF <SALE_TOTAL> <> 0.
        <PERCENT> = <TOTAL> / <SALE_TOTAL>.
        DATA: P1 TYPE P DECIMALS 2.
        P1 = <PERCENT>.
        <PERCENT> = P1.
      ENDIF.
      LOOP AT ORDER_LIST.
        FN = SY-TABIX.
        "---------PERCENT
        CLEAR FD.
        CONCATENATE 'PERCENT' FN INTO FD.
        ASSIGN COMPONENT FD
            OF STRUCTURE <DB_LINE> TO <PERCENT_FIELD>.
        CLEAR FD.
        CONCATENATE 'ORDER' FN INTO FD.
        ASSIGN COMPONENT FD
              OF STRUCTURE <DB_LINE> TO <OUT_FIELD>.
        ASSIGN COMPONENT FD
              OF STRUCTURE <SALE_LINE> TO <SALE_FIELD>.
        IF <SALE_FIELD> <> 0.
          <PERCENT_FIELD> = <OUT_FIELD> / <SALE_FIELD>.
          P1 = <PERCENT_FIELD>.
          <PERCENT_FIELD> = P1.
        ENDIF.
      ENDLOOP.
    ENDIF.
  ENDLOOP.
ENDFORM.                    " MODIFY_INTERNAL_TABLE
*&---------------------------------------------------------------------*
*&      Form  GENERATE_TCOST_LINE_DATA
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
*  -->  p1        text
*  <--  p2        text
*----------------------------------------------------------------------*
FORM GENERATE_TCOST_LINE_DATA.
  DATA: FN(3) TYPE N VALUE '000'.
  DATA: T1 TYPE D.
  DATA: FD(30).
  FIELD-SYMBOLS: <PERCENT_FIELD> TYPE ANY,"ITEM_LINE
                 <OUT_FIELD> TYPE ANY, "ITEM_LINE
                 <TOTAL> TYPE ANY,
                 <PERCENT> TYPE ANY,
                 <SALE_FIELD> TYPE ANY,
                 <SALE_TOTAL> TYPE ANY,
                 <ELEMENT> TYPE ANY,
                 <TCOST_TOTAL> TYPE ANY,
                 <TCOST_TOTAL_PERCENT> TYPE ANY,
                 <TCOST_FIELD> TYPE ANY,
                 <TCOST_PERCENT> TYPE ANY.

  ASSIGN COMPONENT 'TOTAL'
       OF STRUCTURE <TCOST_LINE> TO <TCOST_TOTAL>.

  SELECT * FROM BSIS WHERE HKONT = '1121020200'
        AND BUKRS = BUKRS
        AND SGTXT <> '2006年末在制品'.
    IF BSIS-ZUONR(10) = ORDER_10.
      T1 = BSIS-BUDAT(6).
      IF T1 IN ABPER.
        IF BSIS-SHKZG = 'H'.
          BSIS-DMBTR = BSIS-DMBTR * -1.
        ENDIF.
        "暂估成本到订单
        LOOP AT ORDER_LIST.
          FN = SY-TABIX.
          "---------PERCENT
          CLEAR FD.
          CONCATENATE 'PERCENT' FN INTO FD.
          ASSIGN COMPONENT FD
              OF STRUCTURE <TCOST_LINE> TO <PERCENT_FIELD>.
          CLEAR FD.
          CONCATENATE 'ORDER' FN INTO FD.
          ASSIGN COMPONENT FD
                OF STRUCTURE <TCOST_LINE> TO <TCOST_FIELD>.
          IF ORDER_LIST-ORDER = BSIS-ZUONR.
            <TCOST_FIELD> = <TCOST_FIELD> + BSIS-DMBTR.
          ENDIF.
        ENDLOOP.
        "--------------
        <TCOST_TOTAL> = <TCOST_TOTAL> + BSIS-DMBTR.
      ENDIF.
    ENDIF.
  ENDSELECT.
  IF H2 = 'X'.
    <TCOST_TOTAL> = <TCOST_TOTAL> * -1.
  ENDIF.
ENDFORM.                    " GENERATE_TCOST_LINE_DATA
*&---------------------------------------------------------------------*
*&      Form  GET_DISPLAY_LIST_GROUP
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
*  -->  p1        text
*  <--  p2        text
*----------------------------------------------------------------------*
FORM GET_DISPLAY_LIST_GROUP TABLES CG STRUCTURE COST_ELEMENT_GROUP
                            USING VR TYPE ZCO04_A-ZVARIANT.
  CLEAR: CG[].
  SELECT * FROM ZCO04_A WHERE ZVARIANT = VR.
    MOVE-CORRESPONDING ZCO04_A TO CG.
    CG-ELEMENT_GROUP = ZCO04_A-COST_GROUP.
    APPEND CG.
    CLEAR CG.
  ENDSELECT.

ENDFORM.                    " GET_DISPLAY_LIST_GROUP

Extracted by Direct Download 46cd version 1.3.1 - E.G.Mellodew. 1998-2005 UK. Sap Release 46C
 
Description: YCOR1005_100_N
Include YCOR1005_100

*----------------------------------------------------------------------*
*   INCLUDE YCOR1005_100                                               *
*----------------------------------------------------------------------*
MODULE STATUS_0100 OUTPUT.
  SET PF-STATUS 'MAIN100'.
*  SET TITLEBAR 'xxx'.

ENDMODULE.                 " STATUS_0100  OUTPUT
*&---------------------------------------------------------------------*
*&      Module  USER_COMMAND_0100  INPUT
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
MODULE USER_COMMAND_0100 INPUT.
  LAST_UCOMM = SY-UCOMM.
  DATA: ET_CHILDREN1 TYPE LVC_T_NKEY.
  DATA: CL TYPE I.
        DATA: ET_CHILDREN TYPE LVC_T_NKEY.
  CALL METHOD G_ALV_TREE->COLLAPSE_ALL_NODES.

  CASE SY-UCOMM.
    WHEN 'BACK'.
      SET SCREEN 0.LEAVE SCREEN.
    WHEN 'F1'.
*      CALL METHOD G_ALV_TREE->COLLAPSE_ALL_NODES.
    WHEN 'F2'.

      LOOP AT EXPAND_KEY1.
        CONDENSE EXPAND_KEY1-GROUP NO-GAPS.
        CL = STRLEN( EXPAND_KEY1-GROUP ).
        CLEAR  ET_CHILDREN[].
        CALL METHOD G_ALV_TREE->GET_CHILDREN
                    EXPORTING I_NODE_KEY = EXPAND_KEY1-CKEY
                    IMPORTING ET_CHILDREN = ET_CHILDREN.
        IF NOT ET_CHILDREN[] IS INITIAL.
            CALL METHOD g_alv_tree->expand_node
      EXPORTING i_node_key = EXPAND_KEY1-CKEY
                  I_EXPAND_SUBTREE = 'X'.
        ENDIF.
      ENDLOOP.


      LOOP AT EXPAND_KEY1.
*        CLEAR  ET_CHILDREN1[].
*        CALL METHOD G_ALV_TREE->GET_CHILDREN
*                    EXPORTING I_NODE_KEY = EXPAND_KEY1-CKEY
*                    IMPORTING ET_CHILDREN = ET_CHILDREN1.
*        IF NOT ET_CHILDREN1[] IS INITIAL.
*           CALL METHOD g_alv_tree->COLLAPSE_SUBTREE
*            EXPORTING I_NODE_KEY = EXPAND_KEY1-CKEY.
*        ENDIF.


        IF EXPAND_KEY1-GROUP = 'GD0101'
          OR EXPAND_KEY1-GROUP = 'GD0102'
          OR EXPAND_KEY1-GROUP = 'GD0103'.
          CALL METHOD g_alv_tree->expand_node
    EXPORTING i_node_key = EXPAND_KEY1-CKEY
              I_LEVEL_COUNT = 1.

        ENDIF.
        CONDENSE EXPAND_KEY1-GROUP NO-GAPS.
        CL = STRLEN( EXPAND_KEY1-GROUP ).
        IF CL > 6 .
          CALL METHOD g_alv_tree->COLLAPSE_SUBTREE
            EXPORTING I_NODE_KEY = EXPAND_KEY1-CKEY.
        ENDIF.

      ENDLOOP.
    WHEN 'F3'.


      LOOP AT EXPAND_KEY1.
        CONDENSE EXPAND_KEY1-GROUP NO-GAPS.
        CL = STRLEN( EXPAND_KEY1-GROUP ).
        CLEAR  ET_CHILDREN[].
        CALL METHOD G_ALV_TREE->GET_CHILDREN
                    EXPORTING I_NODE_KEY = EXPAND_KEY1-CKEY
                    IMPORTING ET_CHILDREN = ET_CHILDREN.
        IF NOT ET_CHILDREN[] IS INITIAL.
            CALL METHOD g_alv_tree->expand_node
      EXPORTING i_node_key = EXPAND_KEY1-CKEY
                  I_EXPAND_SUBTREE = 'X'.
        ENDIF.
      ENDLOOP.
  ENDCASE.
ENDMODULE.                 " USER_COMMAND_0100  INPUT
*&---------------------------------------------------------------------*
*&      Module  CONTROL_INIT  OUTPUT
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
MODULE CONTROL_INIT OUTPUT.
  IF g_alv_tree IS INITIAL.
    PERFORM init_tree.

    CALL METHOD cl_gui_cfw=>flush
            EXCEPTIONS cntl_system_error = 1
                       cntl_error        = 2.
    IF sy-subrc NE 0.
      CALL FUNCTION 'POPUP_TO_INFORM'
           EXPORTING
                titel = 'Automation Queue failure'(801)
                txt1  = 'Internal error:'(802)
                txt2  = 'A method in the automation queue'(803)
                txt3  = 'caused a failure.'(804).
    ENDIF.
  ENDIF.
  CALL METHOD cl_gui_cfw=>flush
        EXCEPTIONS cntl_system_error = 1
                   cntl_error        = 2.
  CALL METHOD g_alv_tree->frontend_update.


ENDMODULE.                 " CONTROL_INIT  OUTPUT
*&---------------------------------------------------------------------*
*&      Form  init_tree
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
*  -->  p1        text
*  <--  p2        text
*----------------------------------------------------------------------*
FORM init_tree.
  CREATE OBJECT g_alv_tree
      EXPORTING
          parent              = cl_gui_container=>screen0
         node_selection_mode = cl_gui_column_tree=>node_sel_mode_single
          item_selection      = ' '
          no_html_header      = ''
          no_toolbar          = ''
      EXCEPTIONS
          cntl_error                   = 1
          cntl_system_error            = 2
          create_error                 = 3
          lifetime_error               = 4
          illegal_node_selection_mode  = 5
          failed                       = 6
          illegal_column_name          = 7.
  IF sy-subrc <> 0.
    MESSAGE x208(00) WITH 'ERROR'.                          "#EC NOTEXT
  ENDIF.

  PERFORM BUILD_OUT_TABLE.
  PERFORM GET_DATA_INTO_DB_TABLE.
*  IF H1 <> 'X'.
  PERFORM GENERATE_SALE_LINE_DATA CHANGING <SALE_LINE>.
*  ENDIF.
  PERFORM MODIFY_INTERNAL_DB_TABLE.
  PERFORM GENERATE_GP_LINE_DATA.
  PERFORM GENERATE_TCOST_LINE_DATA.
  PERFORM build_fieldcatalog.
  DATA l_hierarchy_header TYPE treev_hhdr.
  PERFORM build_hierarchy_header CHANGING l_hierarchy_header.
  data: IT_LIST_COMMENTARY type SLIS_T_LISTHEADER.
  DATA: HEADER_TEXT(100).
*  PERFORM GET_COST_GROUP_TEXT USING CGP
*                         CHANGING HEADER_TEXT.
  perform build_comment using
      it_list_commentary
      HEADER_TEXT.
  CALL METHOD g_alv_tree->set_table_for_first_display
     EXPORTING
               is_hierarchy_header  = l_hierarchy_header
               IT_LIST_COMMENTARY = IT_LIST_COMMENTARY
               I_BACKGROUND_ID = 'ALV_BACKGROUND'

     CHANGING
               it_fieldcatalog      = gt_fieldcatalog
               it_outtab            = <out_table>[].
  "table must be empty


  perFORM create_hierarchy_all.


  PERFORM register_events.
* Update calculations which were initially defined by field DO_SUM
* of the fieldcatalog. (see build_fieldcatalog).
  CALL METHOD g_alv_tree->update_calculations.


* Send data to frontend.
  CALL METHOD g_alv_tree->frontend_update.


ENDFORM.                    " init_tree
*&---------------------------------------------------------------------*
*&      Form  build_hierarchy_header
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
*      <--P_L_HIERARCHY_HEADER  text
*----------------------------------------------------------------------*
FORM build_hierarchy_header
           CHANGING p_hierarchy_header TYPE treev_hhdr.
  p_hierarchy_header-heading = '成本要素组'.
  p_hierarchy_header-tooltip = '成本要素组'.
  p_hierarchy_header-width = 35.
  p_hierarchy_header-width_pix = ''.
ENDFORM.                    " build_hierarchy_header
*&---------------------------------------------------------------------*
*&      Form  build_fieldcatalog
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
*  -->  p1        text
*  <--  p2        text
*----------------------------------------------------------------------*
FORM build_fieldcatalog.

  DATA: is_fieldcat LIKE LINE OF it_fieldcat.
  DATA: ls_fieldcatalog TYPE lvc_s_fcat.
  DATA: INDEX TYPE I VALUE 0.
  LOOP AT IT_FIELDCAT INTO IS_FIELDCAT.
    CLEAR ls_fieldcatalog.
    MOVE-CORRESPONDING IS_FIELDCAT TO ls_fieldcatalog.
    IF ls_fieldcatalog-FIELDNAME = 'ELEMENT_GROUP'
       OR ls_fieldcatalog-FIELDNAME = 'ELEMENT'
       OR ls_fieldcatalog-FIELDNAME = 'Z1'
       OR ls_fieldcatalog-FIELDNAME = 'ATTR'.
      ls_fieldcatalog-no_out = 'X'.
    ELSE.
      LS_FIELDCATALOG-DATATYPE = 'CURR'.
      LS_FIELDCATALOG-INTTYPE = 'P'.
      LS_FIELDCATALOG-INTLEN = 15.
      LS_FIELDCATALOG-DECIMALS = 2.
      LS_FIELDCATALOG-DECIMALS_O = 2.
      ls_fieldcatalog-do_sum = 'X'.
      ls_fieldcatalog-REF_FIELD = 'WTG001'.
      ls_fieldcatalog-REF_TABLE = 'COSP'.
*      ls_fieldcatalog-CFIELDNAME = 'CURRENCY'.
      ls_fieldcatalog-h_ftype = 'SUM'.
    ENDIF.
    INDEX = INDEX + 1.
    ls_fieldcatalog-col_pos = INDEX.
    APPEND ls_fieldcatalog to gt_fieldcatalog.
  ENDLOOP.

ENDFORM.                    " build_fieldcatalog
*&---------------------------------------------------------------------*
*&      Form  create_hierarchy
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
*  -->  p1        text
*  <--  p2        text
*----------------------------------------------------------------------*
*---------------------------------------------------------------------*
*       FORM add_element                                              *
*---------------------------------------------------------------------*
*       ........                                                      *
*---------------------------------------------------------------------*
*  -->  ELEMENT                                                       *
*  -->  P_RELAT_KEY                                                   *
*  -->  P_NODE_KEY                                                    *
*---------------------------------------------------------------------*
FORM add_element  USING     element
                          p_relat_key TYPE lvc_nkey
                CHANGING  p_node_key TYPE lvc_nkey.
  DATA: l_node_text TYPE lvc_value,
        l_month(15) TYPE c.            "output string for month
  FIELD-SYMBOLS: <FIELD> TYPE ANY.
  ASSIGN COMPONENT 'ELEMENT' OF STRUCTURE element
          TO <FIELD>.
* get name for node text
  PERFORM GET_COST_ELEMENT_TEXT USING <FIELD>
                         CHANGING l_node_text.
  CONCATENATE <FIELD> l_node_text INTO l_node_text.
* add node
  CALL METHOD g_alv_tree->add_node
    EXPORTING
          i_relat_node_key = p_relat_key
          i_relationship   = cl_gui_column_tree=>relat_last_child
          i_node_text      = l_node_text
          is_outtab_line   = element
       IMPORTING
          e_new_node_key = p_node_key.

ENDFORM.

*---------------------------------------------------------------------*
*       FORM add_element_group                                        *
*---------------------------------------------------------------------*
*       ........                                                      *
*---------------------------------------------------------------------*
*  -->  ELEMENT_GROUP                                                 *
*  -->  P_RELAT_KEY                                                   *
*  -->  P_NODE_KEY                                                    *
*---------------------------------------------------------------------*
FORM add_element_group  USING  CLINE TYPE ANY
                          p_relat_key TYPE lvc_nkey
                CHANGING  p_node_key TYPE lvc_nkey.
  DATA: l_node_text TYPE lvc_value,
        l_month(15) TYPE c.            "output string for month
  FIELD-SYMBOLS: <FIELD> TYPE ANY.
  ASSIGN COMPONENT 'ELEMENT_GROUP' OF STRUCTURE CLINE
          TO <FIELD>.
* get name for node text
  PERFORM GET_COST_GROUP_TEXT USING <FIELD>
                         CHANGING l_node_text.
* add node
  CALL METHOD g_alv_tree->add_node
    EXPORTING
          i_relat_node_key = p_relat_key
          i_relationship   = cl_gui_column_tree=>relat_last_child
          i_node_text      = l_node_text
          is_outtab_line   = CLINE
       IMPORTING
          e_new_node_key = p_node_key.

ENDFORM.
*---------------------------------------------------------------------*
*       FORM add_L1                                                   *
*---------------------------------------------------------------------*
*       ........                                                      *
*---------------------------------------------------------------------*
*  -->  CLINE                                                         *
*  -->  P_RELAT_KEY                                                   *
*  -->  P_NODE_KEY                                                    *
*---------------------------------------------------------------------*
FORM add_L1  USING  CLINE TYPE ANY
                          p_relat_key TYPE lvc_nkey
                CHANGING  p_node_key TYPE lvc_nkey.
  CALL METHOD g_alv_tree->add_node
 EXPORTING
       i_relat_node_key = p_relat_key
       i_relationship   = cl_gui_column_tree=>relat_last_child
       i_node_text      = '毛利'
       is_outtab_line   = CLINE
    IMPORTING
       e_new_node_key = p_node_key.

ENDFORM.
*---------------------------------------------------------------------*
*       FORM add_L2                                                   *
*---------------------------------------------------------------------*
*       ........                                                      *
*---------------------------------------------------------------------*
*  -->  CLINE                                                         *
*  -->  P_RELAT_KEY                                                   *
*  -->  P_NODE_KEY                                                    *
*---------------------------------------------------------------------*
FORM add_L2  USING  CLINE TYPE ANY
                          p_relat_key TYPE lvc_nkey
                CHANGING  p_node_key TYPE lvc_nkey.
  CALL METHOD g_alv_tree->add_node
 EXPORTING
       i_relat_node_key = p_relat_key
       i_relationship   = cl_gui_column_tree=>relat_last_child
       i_node_text      = '暂估成本'
       is_outtab_line   = CLINE
    IMPORTING
       e_new_node_key = p_node_key.

ENDFORM.
*&---------------------------------------------------------------------*
*&      Form  register_events
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
*  -->  p1        text
*  <--  p2        text
*----------------------------------------------------------------------*
FORM register_events.
  DATA: lt_events TYPE cntl_simple_events,
         l_event TYPE cntl_simple_event,
         l_event_receiver TYPE REF TO lcl_tree_event_receiver.
*................................................................
* The following four tree events registers ALV Tree in the constructor
* method itself.
*    - cl_gui_column_tree=>eventid_expand_no_children
* (needed to load data to frontend when a user expands a node)
*    - cl_gui_column_tree=>eventid_header_context_men_req
* (needed for header context menu)
*    - cl_gui_column_tree=>eventid_header_click
* (allows selection of columns (only when item selection activated))
*   - cl_gui_column_tree=>eventid_item_keypress
* (needed for F1-Help (only when item selection activated))
*
* Nevertheless you have to provide their IDs again if you register
* additional events with SET_REGISTERED_EVENTS (see below).
* To do so, call first method  GET_REGISTERED_EVENTS (this way,
* all already registered events remain registered, even your own):
  call method g_alv_tree->get_registered_events
        importing events = lt_events.

* (If you do not these events will be deregistered!!!).
* You do not have to register events of the toolbar again.
*....................................................................
* Register additional events for your own purposes:
* §5. Register first context menu event on frontend (with postfix
*     (_REQUEST). The second is registered automatically.
  l_event-eventid = cl_gui_column_tree=>eventid_node_context_menu_req.
  APPEND l_event TO lt_events.

* register events on frontend
  CALL METHOD g_alv_tree->set_registered_events
    EXPORTING
      events = lt_events
    EXCEPTIONS
      cntl_error                = 1
      cntl_system_error         = 2
      illegal_event_combination = 3.
  IF sy-subrc <> 0.
    MESSAGE x208(00) WITH 'ERROR'.                          "#EC NOTEXT
  ENDIF.
*--------------------
* §6. Register both context menu events on backend (ABAP Objects
*    event handling).
  CREATE OBJECT l_event_receiver.
  SET HANDLER l_event_receiver->handle_node_cm_req
              FOR g_alv_tree.
  SET HANDLER l_event_receiver->handle_node_cm_sel
              FOR g_alv_tree.

ENDFORM.                    " register_events
*&---------------------------------------------------------------------*
*&      Form  BUILD_OUT_TABLE
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
*  -->  p1        text
*  <--  p2        text
*----------------------------------------------------------------------*
FORM BUILD_OUT_TABLE.

  CLEAR it_fieldcat[].
  DATA: is_fieldcat LIKE LINE OF it_fieldcat.
  is_fieldcat-fieldname = 'ELEMENT_GROUP'.
  is_fieldcat-ref_field = 'NAME_COALL'..
  is_fieldcat-ref_table = 'GRPDYNP'.
  is_fieldcat-COLTEXT = '成本要素组'.
  APPEND is_fieldcat TO it_fieldcat.
  clear is_fieldcat.
  is_fieldcat-fieldname = 'ELEMENT'.
  is_fieldcat-ref_field = 'KSTAR'..
  is_fieldcat-ref_table = 'COSP'.
  is_fieldcat-COLTEXT = '成本要素'.
  APPEND is_fieldcat TO it_fieldcat.
  clear is_fieldcat.
  is_fieldcat-fieldname = 'Z1'.
  is_fieldcat-ref_field = 'Z1'..
  is_fieldcat-ref_table = 'ZCO04_A'.
  is_fieldcat-COLTEXT = '取数属性'.
  APPEND is_fieldcat TO it_fieldcat.
  clear is_fieldcat.
  is_fieldcat-fieldname = 'ATTR'.
  is_fieldcat-ref_field = 'ATTR'..
  is_fieldcat-ref_table = 'ZCO04_A'.
  is_fieldcat-COLTEXT = '+/-属性'.
  APPEND is_fieldcat TO it_fieldcat.
  clear is_fieldcat.
  is_fieldcat-fieldname = 'TOTAL'.
  is_fieldcat-datatype = 'DEC'.
  is_fieldcat-decimals = 2.
*  is_fieldcat-ref_field = 'AUFNR'..
*  is_fieldcat-ref_table = 'AUFK'.
  is_fieldcat-COLTEXT = '合计'.
  APPEND is_fieldcat TO it_fieldcat.
  clear is_fieldcat.
  is_fieldcat-fieldname = 'PERCENT'.
  is_fieldcat-datatype = 'DEC'.
  is_fieldcat-decimals = 2.
  is_fieldcat-EDIT_MASK = '____%'.
  is_fieldcat-NO_ZERO = 'X'.
  is_fieldcat-LZERO = 'X'.
*  is_fieldcat-ref_field = 'AUFNR'..
*  is_fieldcat-ref_table = 'AUFK'.
  is_fieldcat-COLTEXT = '成本占收入比例'.
  is_fieldcat-decimals = 2.
  APPEND is_fieldcat TO it_fieldcat.

  DATA: ORDER_N(3) TYPE N VALUE '000'.
  LOOP AT ORDER_LIST.
    ORDER_N = SY-TABIX.
    CLEAR is_fieldcat.

    CONCATENATE 'ORDER' ORDER_N INTO is_fieldcat-fieldname.
*    is_fieldcat-ref_field = 'AUFNR'..
*    is_fieldcat-ref_table = 'AUFK'.
  is_fieldcat-datatype = 'DEC'.
  is_fieldcat-decimals = 2.
*  is_fieldcat-NO_ZERO = 'X'.
    PERFORM GET_ORDER_TEXT USING ORDER_LIST-ORDER
                      CHANGING is_fieldcat-COLTEXT.
    APPEND is_fieldcat TO it_fieldcat.
    CLEAR: is_fieldcat-fieldname,is_fieldcat-COLTEXT,
           is_fieldcat-ref_field,is_fieldcat-ref_table,
           is_fieldcat-EDIT_MASK.
    CONCATENATE 'PERCENT' ORDER_N INTO is_fieldcat-fieldname.
    is_fieldcat-COLTEXT = '成本占收入比例'.
    is_fieldcat-decimals = 2.
    is_fieldcat-EDIT_MASK = '____%'.
    APPEND is_fieldcat TO it_fieldcat.

  ENDLOOP.
  CALL METHOD cl_alv_table_create=>create_dynamic_table
    EXPORTING
      it_fieldcatalog = it_fieldcat
    IMPORTING
      ep_table        = new_table.

  CALL METHOD cl_alv_table_create=>create_dynamic_table
  EXPORTING
    it_fieldcatalog = it_fieldcat
  IMPORTING
    ep_table        = OUT_table.

  ASSIGN new_table->* TO <l_table>.
  CREATE DATA new_line LIKE LINE OF <l_table>.
  ASSIGN new_line->* TO <l_line>.
  clear <l_table>[].

  ASSIGN OUT_TABLE->* TO <OUT_TABLE>.
  CREATE DATA OUT_LINE LIKE LINE OF <OUT_TABLE>.
  ASSIGN OUT_LINE->* TO <OUT_LINE>.
  CLEAR <OUT_TABLE>[].

  "-----------CREATE SALE LINE TO CALC SALE DATA
  CREATE DATA SALE_line LIKE LINE OF <l_table>.
  ASSIGN SALE_line->* TO <SALE_line>.
  "-------------------------------
  "-----------CREATE COST LINE TO CALC SALE DATA
  CREATE DATA COST_line LIKE LINE OF <l_table>.
  ASSIGN COST_line->* TO <COST_line>.
  "-------------------------------
  "-----------CREATE DB_TABLE-------------------
  CALL METHOD cl_alv_table_create=>create_dynamic_table
  EXPORTING
    it_fieldcatalog = it_fieldcat
  IMPORTING
    ep_table        = DB_table.
  ASSIGN DB_TABLE->* TO <DB_TABLE>.
  CREATE DATA DB_LINE LIKE LINE OF <DB_TABLE>.
  ASSIGN DB_LINE->* TO <DB_LINE>.
  CLEAR <DB_TABLE>[].
  "--------------CREATE GP_LINE
  CREATE DATA GP_LINE LIKE LINE OF <DB_TABLE>.
  ASSIGN GP_LINE->* TO <GP_LINE>.

  CREATE DATA JUDGE_LINE LIKE LINE OF <DB_TABLE>.
  ASSIGN JUDGE_LINE->* TO <J_LINE>.

  CREATE DATA TCOST_LINE LIKE LINE OF <DB_TABLE>.
  ASSIGN TCOST_LINE->* TO <TCOST_LINE>.
ENDFORM.                    " BUILD_OUT_TABLE
"清空line,除了成本要素组和成本要素
*---------------------------------------------------------------------*
*       FORM CLEAR_NEW_LINE                                           *
*---------------------------------------------------------------------*
*       ........                                                      *
*---------------------------------------------------------------------*
*  -->  CLINE                                                         *
*---------------------------------------------------------------------*
FORM CLEAR_NEW_LINE USING CLINE.
  DATA: GP LIKE GRPDYNP-NAME_COALL.
  DATA: EM LIKE COSP-KSTAR.
  DATA: FN(3) TYPE N VALUE '000'.
  DATA: FD(30).

  FIELD-SYMBOLS: <FIELD1> TYPE ANY,
                 <FIELD2> TYPE ANY.
  ASSIGN COMPONENT 'ELEMENT_GROUP'
            OF STRUCTURE CLINE TO <FIELD1>.
  GP = <FIELD1>.
  ASSIGN COMPONENT 'ELEMENT'
            OF STRUCTURE CLINE TO <FIELD2>.
  EM = <FIELD2>.
  <FIELD1> = GP.
  <FIELD2> = EM.
  LOOP AT ORDER_LIST.
    FN = SY-TABIX.
    CLEAR FD.
    CONCATENATE 'ORDER' FN INTO FD.
    ASSIGN COMPONENT FD
          OF STRUCTURE CLINE TO <FIELD1>.
    <FIELD1>  = 0.
  ENDLOOP.



ENDFORM.
*---------------------------------------------------------------------*
*       FORM GET_NEW_LINE                                             *
*---------------------------------------------------------------------*
*       获得输出行内容
*---------------------------------------------------------------------*
*  -->  CLINE                                                         *
*  -->  G_E                                                           *
*---------------------------------------------------------------------*
FORM GET_NEW_LINE USING CLINE
                        G_E
                        Z1
                        ATTR. "'G': GROUP  : 'E' : ELEMENT.

  DATA: FN(3) TYPE N VALUE '000'.
  DATA: FD(30).
  DATA: WTG_TAB TYPE COSP-WTG001.
  FIELD-SYMBOLS: <OUT_FIELD> TYPE ANY, "ITEM_LINE
                 <PERCENT_FIELD> TYPE ANY,"ITEM_LINE
                 <TOTAL_PERCENT> TYPE ANY,"ITEM_LINE
                 <SUM_FIELD> TYPE ANY,"ITEM_LINE
                 <G_E> TYPE ANY,"ITEM_LINE
                 <COST_FIELD> TYPE ANY, "COST_LINE
                 <COST_PERCENT> TYPE ANY,"COST_LINE PERCENT
                 <SALE_FIELD> TYPE ANY." SALE_LINE

  IF G_E = 'G'.
    ASSIGN COMPONENT 'ELEMENT_GROUP'
            OF STRUCTURE CLINE TO <G_E>.
  ELSEIF G_E = 'E'.
    ASSIGN COMPONENT 'ELEMENT'
            OF STRUCTURE CLINE TO <G_E>.
  ENDIF.
  ASSIGN COMPONENT 'TOTAL'
          OF STRUCTURE CLINE TO <SUM_FIELD>.
  ASSIGN COMPONENT 'PERCENT'
          OF STRUCTURE CLINE TO <TOTAL_PERCENT>.
  ASSIGN COMPONENT 'PERCENT'
           OF STRUCTURE CLINE TO <COST_PERCENT>.

  LOOP AT ORDER_LIST.
    FN = SY-TABIX.
    "---------AMOUNT
    CLEAR FD.
    CONCATENATE 'ORDER' FN INTO FD.
    ASSIGN COMPONENT FD
          OF STRUCTURE CLINE TO <OUT_FIELD>.
    "-------------------------------------------
    "-----------COST LINE FIELD AMOUNT
    ASSIGN COMPONENT FD
              OF STRUCTURE <COST_LINE> TO <COST_FIELD>.
    "
    "--------PERCENT
    CLEAR FD.
    CONCATENATE 'PERCENT' FN INTO FD.
    ASSIGN COMPONENT FD
          OF STRUCTURE CLINE TO <PERCENT_FIELD>.
    "--------------------------------------------
    "-----------SALE FIELD
    ASSIGN COMPONENT FD
     OF STRUCTURE <SALE_LINE> TO <SALE_FIELD>.
    "-----------------------------------------------

    CLEAR WTG_TAB.
    IF G_E = 'G'.
      PERFORM GET_COSP_WTG_VIA_GROUP USING ORDER_LIST-ORDER
                         <G_E>
                         Z1
                         ATTR
                         ABPER-LOW    "期间开始
                         ABPER-HIGH    "期间结束
                   CHANGING WTG_TAB.
    ELSEIF G_E = 'E'.
      PERFORM GET_COSP_WTG_VIA_ORDER USING ORDER_LIST-ORDER
                          <G_E>
                          ABPER-LOW    "期间开始
                         ABPER-HIGH    "期间结束
                    CHANGING WTG_TAB.
      READ TABLE SALE_COST_ELEMENT WITH KEY ELEMENT = <G_E>.
      IF SY-SUBRC <> 0.
        IF <SALE_FIELD> <> 0.
          <PERCENT_FIELD> = WTG_TAB / <SALE_FIELD>.
        ENDIF.
        <TOTAL_PERCENT> = <TOTAL_PERCENT> + <PERCENT_FIELD>.
        <COST_FIELD> = <COST_FIELD> + WTG_TAB.
        <COST_PERCENT> = <COST_PERCENT> + <PERCENT_FIELD>.
      ENDIF.
    ENDIF.
    <OUT_FIELD> = WTG_TAB.
    <SUM_FIELD> = <SUM_FIELD> + WTG_TAB.

  ENDLOOP.

ENDFORM.
*&---------------------------------------------------------------------*
*&      Form  BUILD_OUT_TABLE_DATA
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
*  -->  p1        text
*  <--  p2        text
*----------------------------------------------------------------------*
FORM BUILD_OUT_TABLE_DATA.
  "<L_LINE>
  "<L_TABLE>
  FIELD-SYMBOLS: <L_FIELD> TYPE ANY,
                 <Z1> TYPE ANY,
                 <ATTR> TYPE ANY.

  DATA: FN(3) TYPE N VALUE '000'.
  DATA: FD(30).
  DATA: WTG_TAB TYPE COSP-WTG001.
  LOOP AT COST_ELEMENT_GROUP.
    CLEAR <OUT_LINE>.
    LOOP AT ORDER_LIST.
      FN = SY-TABIX.
      CLEAR FD.
      CONCATENATE 'ORDER' FN INTO FD.
      ASSIGN COMPONENT FD
            OF STRUCTURE <OUT_LINE> TO <OUT_FIELD>.
      CLEAR WTG_TAB.
      PERFORM GET_COSP_WTG_VIA_GROUP USING ORDER_LIST-ORDER
                         COST_ELEMENT_GROUP-ELEMENT_GROUP
                         COST_ELEMENT_GROUP-Z1
                         COST_ELEMENT_GROUP-ATTR
                          ABPER-LOW    "期间开始
                         ABPER-HIGH    "期间结束
                   CHANGING WTG_TAB.
      <OUT_FIELD> = <OUT_FIELD> + WTG_TAB.
*      <OUT_FIELD> = 1000000.
    ENDLOOP.
    ASSIGN COMPONENT 'Z1'
            OF STRUCTURE <OUT_LINE> TO <Z1>.
    <Z1> = COST_ELEMENT_GROUP-Z1.
    ASSIGN COMPONENT 'ATTR'
            OF STRUCTURE <OUT_LINE> TO <ATTR>.
    <ATTR> = COST_ELEMENT_GROUP-ATTR.
    INSERT <OUT_LINE> INTO TABLE <OUT_TABLE>.
    CLEAR <OUT_LINE>.
  ENDLOOP.
ENDFORM.                    " BUILD_OUT_TABLE_DATA

Extracted by Direct Download 46cd version 1.3.1 - E.G.Mellodew. 1998-2005 UK. Sap Release 46C
Description: YCOR1005_TEST_N
Include YCOR1005_TEST
*----------------------------------------------------------------------*
*   INCLUDE YCOR1005_TEST                                              *
*----------------------------------------------------------------------*
FORM create_hierarchy_all.
  DATA: l_GROUP_key TYPE lvc_nkey,
        l_last_key TYPE lvc_nkey,
        l_top_key TYPE lvc_nkey.
  DATA: HEADER_TEXT TYPE LVC_VALUE.
*  PERFORM GET_COST_GROUP_TEXT USING CGP
*                       CHANGING HEADER_TEXT.
* data: IS_NODE_LAYOUT type LVC_S_LAYN.
* IS_NODE_LAYOUT-DISABLED = 'X'.
*  CALL METHOD g_alv_tree->add_node
*     EXPORTING
*           i_relat_node_key = ''
*           i_relationship   = cl_gui_column_tree=>relat_last_child
*           i_node_text      = HEADER_TEXT
*           IS_NODE_LAYOUT = IS_NODE_LAYOUT
*        IMPORTING
*           e_new_node_key = l_top_key.
  TOP_KEY = L_TOP_KEY.
  PERFORM create_hierarchy_group USING ''
                                  '' ''
                                  0
                                  ''."l_top_key.

  PERFORM add_L1  USING  <GP_LINE>
                            l_top_key
                  CHANGING  l_GROUP_key.
  PERFORM add_L2  USING  <TCOST_LINE>
                          l_top_key
                CHANGING  l_GROUP_key.
*  PERFORM add_L2  USING  <OUT_LINE>
*                          l_top_key
*                CHANGING  l_GROUP_key.

ENDFORM.                    " create_hierarchy
*---------------------------------------------------------------------*
*       FORM build_comment                                            *
*---------------------------------------------------------------------*
*       ........                                                      *
*---------------------------------------------------------------------*
*  -->  PT_LIST_COMMENTARY                                            *
*  -->  HEADER_TEXT                                                   *
*---------------------------------------------------------------------*
form build_comment using
      pt_list_commentary type slis_t_listheader
      HEADER_TEXT.
  data: ls_line type slis_listheader.
*
* LIST HEADING LINE: TYPE H
  clear ls_line.
  ls_line-typ  = 'H'.
* LS_LINE-KEY:  NOT USED FOR THIS TYPE
  ls_line-info = '单船车间收入成本表'.                      "#EC NOTEXT
  append ls_line to pt_list_commentary.
* STATUS LINE: TYPE S
  clear ls_line.
  ls_line-typ  = 'S'.
  ls_line-key  = '期间:'.                                   "#EC NOTEXT
  CONCATENATE ABPER-low '-' ABPER-high
             into ls_line-info.
                                                            "#EC NOTEXT
  append ls_line to pt_list_commentary.
  ls_line-key  = '船名:'.
  DATA: S1(100).
  DATA: ST(12).
  CLEAR ST.
  CONCATENATE ORDER_10 '%' INTO ST.
  SELECT SINGLE KTEXT FROM COAS INTO S1
         WHERE AUFNR LIKE ST.
  CLEAR SHIPNAME.
  SPLIT S1 AT '-' INTO SHIPNAME S1.
  ls_line-info = SHIPNAME.                                  "#EC NOTEXT
  append ls_line to pt_list_commentary.
* ACTION LINE: TYPE A
*  clear ls_line.
*  ls_line-typ  = 'A'.
** LS_LINE-KEY:  NOT USED FOR THIS TYPE
*  ls_line-info = 'actual data'.                             "#EC NOTEXT
*  append ls_line to pt_list_commentary.

ENDFORM.
*---------------------------------------------------------------------*
*       FORM create_hierarchy_group                                   *
*---------------------------------------------------------------------*
*       ........                                                      *
*---------------------------------------------------------------------*
*  -->  L_GROUP_KEY                                                   *
*  -->  L_LAST_KEY                                                    *
*  -->  L_TOP_KEY                                                     *
*---------------------------------------------------------------------*
FORM create_hierarchy_group USING ELEMENT_GROUP
                                  Z1
                                  ATTR
                                  LEVEL
                                  l_top_key TYPE lvc_nkey.
  DATA: l_GROUP_key TYPE lvc_nkey.
  FIELD-SYMBOLS: <L_FIELD> TYPE ANY,
                  <FIELD> TYPE ANY.
  DATA: FN(3) TYPE N VALUE '000'.
  DATA: FD(30).
  DATA: WTG_TAB TYPE COSP-WTG001.
  DATA: ELEM_LIST LIKE COST_ELEMENT OCCURS 0 WITH HEADER LINE.
  DATA: GP_LIST LIKE COST_ELEMENT_GROUP OCCURS 0 WITH HEADER LINE.
  DATA: GP LIKE GRPDYNP-NAME_COALL.
  DATA: EM LIKE COSP-KSTAR.
  DATA: INDEX TYPE I.
*  GP_LIST[]  = OUT_CG[].
  IF LEVEL = 0.
     GP_LIST[] = OUT_CG[].
  ELSE.
       PERFORM GET_COST_ELEMENT_GROUP_LIST  TABLES GP_LIST
                                USING ELEMENT_GROUP
                                      1.
  ENDIF.
  LOOP AT GP_LIST.
    CLEAR <OUT_LINE>.
    ASSIGN COMPONENT 'ELEMENT_GROUP' OF STRUCTURE <OUT_LINE> TO <FIELD>.
    <FIELD> = GP_LIST-ELEMENT_GROUP.
    GP = GP_LIST-ELEMENT_GROUP.
    PERFORM CLEAR_NEW_LINE USING <OUT_LINE>.
    DATA: B(1).
    CLEAR B.
    PERFORM JUDGE_GROUP_OUTPUT USING GP_LIST-ELEMENT_GROUP
                         GP_LIST-Z1
                          GP_LIST-ATTR
                        CHANGING B.
    IF B <> 'X'.
      PERFORM add_element_group USING    <OUT_LINE>
                                          l_top_key
                                 CHANGING l_GROUP_key.

      EXPAND_key1-GROUP = GP_LIST-ELEMENT_GROUP.
      EXPAND_key1-CKEY = l_GROUP_key.
      APPEND EXPAND_key1.

      PERFORM create_hierarchy_group USING GP_LIST-ELEMENT_GROUP
                                           GP_LIST-Z1
                                           GP_LIST-ATTR
                                           -1
                                     l_GROUP_key.
    ENDIF.
  ENDLOOP.

  "add element
  IF GP_LIST[] IS INITIAL.

    PERFORM GET_COST_ELEMENT_LIST
            TABLES ELEM_LIST
            USING ELEMENT_GROUP
                  Z1
                  ATTR
                            1  .
    LOOP AT ELEM_LIST.
      ASSIGN COMPONENT 'ELEMENT' OF STRUCTURE <OUT_LINE> TO <FIELD>.
      <FIELD> = ELEM_LIST-ELEMENT.
      EM = ELEM_LIST-ELEMENT.
      PERFORM GET_INTERNAL_LINE_DATA  USING ELEM_LIST-ELEMENT
                       CHANGING <OUT_LINE>.
      ASSIGN COMPONENT 'TOTAL' OF STRUCTURE <OUT_LINE> TO <FIELD>.
      IF <FIELD> <> 0.
        PERFORM add_element USING
                                       <OUT_LINE>
                                       l_top_key
                              CHANGING l_GROUP_key.
      ENDIF.
      PERFORM CLEAR_NEW_LINE USING <OUT_LINE>.
    ENDLOOP.

  ENDIF.
ENDFORM.
"JUDGE GROUP IF OUTPUT   B = 'X' MEANS NO-OUTPUT.
*---------------------------------------------------------------------*
*       FORM JUDGE_GROUP_OUTPUT                                       *
*---------------------------------------------------------------------*
*       ........                                                      *
*---------------------------------------------------------------------*
*  -->  GROUP                                                         *
*  -->  B                                                             *
*---------------------------------------------------------------------*
FORM JUDGE_GROUP_OUTPUT USING GROUP
                        Z1
                        ATTR
                        CHANGING B.
  DATA: ELEM_LIST LIKE COST_ELEMENT OCCURS 0 WITH HEADER LINE.
  CLEAR ELEM_LIST[].
  DATA: W1 TYPE COSP-WTG001.
  CLEAR W1.
  FIELD-SYMBOLS: <FIELD1> TYPE ANY.
  PERFORM GET_COST_ELEMENT_LIST
          TABLES ELEM_LIST
                          USING GROUP Z1 ATTR 0  .
  LOOP AT ELEM_LIST.
*      PERFORM CLEAR_NEW_LINE USING <OUT_LINE>.
    CLEAR <J_LINE>.
    PERFORM GET_INTERNAL_LINE_DATA  USING ELEM_LIST-ELEMENT
                     CHANGING <J_LINE>.
    ASSIGN COMPONENT 'TOTAL' OF STRUCTURE <J_LINE> TO <FIELD1>.
    W1 = W1 + <FIELD1>.
  ENDLOOP.
  IF W1 = 0.
    B = 'X'.
  ENDIF.

ENDFORM.
 
  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值