ALV TREE 实例

REPORT  ZRPT_PS_PS021TREE                          .

TABLES: PROJ,          "项目定义数据
PRPS, "WBS元素数据
ZCJ30, "AFCEID
TCJ04, "项目负责人数据
TCJ1, "项目类型数据
TJ30, "项目状态数据
TJ30T, "项目状态文本
TBP1T, "预算参数文件文本
EKKN, "采购凭证中的帐户设置
EKBE, "采购凭证历史
EKPO, "采购订单明细
COEP, "成本控制对象
BPGE, "总计值的总计记录
ZPS001, "项目属性
BSEG, "会计凭证行项目
RBKP, "凭证表头:发票收据
ZPS006, "行业分类
JEST. DATA:T_GJAHR() TYPE C,
H_GJAHR() TYPE C,
G_MONTH LIKE BSIK-MONAT, "当前月份
G_MONTH2 LIKE BSIK-MONAT, "当前月份下一月
G_DATE LIKE SY-UCOMM, "截止当前月份为止时间
G_DATE2 LIKE SY-UCOMM, "截止去年年底为止时间
G_DATE3 LIKE SY-UCOMM, "当月时间
G_CONUT() TYPE N, "项目行数
G_PSPHI LIKE PRPS-PSPHI, "用来判断项目是否相同
G_PSPNR LIKE PRPS-PSPNR, "用来判断WBS是否相同
G_NETPR LIKE BPGE-WTGES, "WBS的凭证和PO金额合计
G_NETPRSUM LIKE BPGE-WTGES. "项目金额总记 *权限对象使用
DATA: BEGIN OF TAB_G_BUKRS OCCURS ,
BUKRS LIKE T001-BUKRS,
END OF TAB_G_BUKRS. *内表定义
DATA: BEGIN OF TAB_G_PROJ OCCURS ,
VBUKR LIKE PROJ-VBUKR, "公司代码
PSPHI LIKE PRPS-PSPHI, "项目编号
PSPNR LIKE PRPS-PSPNR, "WBS编号
CON(), "项目行数序号
PSPID LIKE PROJ-PSPID, "项目定义
POST1 LIKE PRPS-POST1, "项目名称
POSID LIKE PRPS-POSID, "WBS元素
POST2 LIKE PRPS-POST1, "项目名称
STUFE LIKE PRPS-STUFE, "项目层次
UP LIKE PRHI-UP, "层级关系
EBELN LIKE EKPO-EBELN, "采购订单/凭证号
TXZ01(), "采购订单文本/凭证文本/成本要素文本
OBJNR LIKE PRPS-OBJNR, "项目对象号
ZBMOUNT LIKE BPGE-WTGES, "预算金额(Budget)
ZNETPR LIKE BPGE-WTGES, "PO总金额(含税)
EXPSUM LIKE ZPS001-EXPSUM, "预计完工金额
ZEMOUNT LIKE BPGE-WTGES, "剩余预算金额
GJAHR LIKE BSEG-GJAHR, "年度
ID LIKE ICON-ID, "层次打开图标
COLOR() TYPE C, "颜色
END OF TAB_G_PROJ. *ALV输出用
DATA: TAB_G_OUT LIKE TAB_G_PROJ OCCURS WITH HEADER LINE,
REC_G_OUT LIKE TAB_G_OUT.
*计算总值
DATA: TAB_G_OUTSUM LIKE TAB_G_PROJ OCCURS WITH HEADER LINE.
*展开WBS用
DATA:TAB_G_OUTID LIKE TAB_G_PROJ OCCURS WITH HEADER LINE.
*判断数据重复用
DATA: TAB_G_OUTDEL LIKE TAB_G_PROJ OCCURS WITH HEADER LINE. *判断同一WBS元素不同凭证用数据用
DATA: TAB_G_OUTWBS LIKE TAB_G_PROJ OCCURS WITH HEADER LINE. *项目层级表
DATA:TAB_G_PSHI LIKE PRHI OCCURS WITH HEADER LINE.
*实际合同金额用表
DATA TAB_G_RPSCO TYPE STANDARD TABLE OF RPSCO WITH HEADER LINE. *带WBS的采购订单
DATA:BEGIN OF TAB_G_EKKN OCCURS ,
PSPNR LIKE EKKN-PS_PSP_PNR,"WBS元素
EBELN LIKE EKPO-EBELN,"PO号
EBELP LIKE EKPO-EBELP,"PO行项目
END OF TAB_G_EKKN.
*PO金额表
DATA:BEGIN OF TAB_G_EKPO OCCURS ,
BUKRS LIKE EKPO-BUKRS,"公司
PSPNR LIKE EKKN-PS_PSP_PNR,"WBS元素
PSPID LIKE ZPS003-PSPID,"项目
POSID LIKE ZPS003-POSID, "WBS元素
EBELN LIKE EKPO-EBELN,"PO号
EBELP LIKE EKPO-EBELP,"行项目
GJAHR LIKE COVP-GJAHR, "年度
TXZ01 LIKE EKPO-TXZ01,"PO文本
NETWR LIKE EKPO-NETWR,"PO金额
RETPO LIKE EKPO-RETPO,"退货标识
NETPR LIKE EKPO-NETWR, "净价格(以凭证货币计)
MENGE LIKE EKPO-MENGE, "采购订单数量
PEINH LIKE EKPO-PEINH, "价格单位
MWSKZ LIKE EKPO-MWSKZ, "税代码
WKURS LIKE EKKO-WKURS, "汇率
KBETR LIKE KONP-KBETR, "率
WAERS LIKE EKKO-WAERS, "货币符号
KNUMV LIKE EKKO-KNUMV, "单据条件数
KBETR1 LIKE KONV-KBETR, "运费
END OF TAB_G_EKPO. *运费计算
DATA:BEGIN OF TAB_G_KONV OCCURS ,
KNUMV LIKE KONV-KNUMV,
KPOSN LIKE KONV-KPOSN,
KSCHL LIKE KONV-KSCHL,
KBETR LIKE KONV-KBETR,
END OF TAB_G_KONV. *PO项目文本用
DATA: TAB_G_EKPODEL LIKE TAB_G_EKPO OCCURS WITH HEADER LINE.
*PO金额汇总表
DATA: TAB_G_EKPOSUM LIKE TAB_G_EKPO OCCURS WITH HEADER LINE.
*合同期初用
DATA: TAB_G_ZPS003 LIKE TAB_G_EKPO OCCURS WITH HEADER LINE.
*外币用
DATA:AMOUNT_EX LIKE BAPICURR-BAPICURR,
AMOUNT_IN LIKE BAPICURR-BAPICURR.
*无PO凭证表
DATA: BEGIN OF TAB_G_COVP OCCURS ,
BUKRS LIKE T001-BUKRS,"公司
OBJNR LIKE PRPS-OBJNR,"对象号
BELNR LIKE COVP-REFBN,"凭证号
BUDAT LIKE BSIS-BUDAT,"记账日期
GJAHR LIKE COVP-GJAHR, "年度
BUZEI LIKE COVP-BUZEI,
BELNR1 LIKE COVP-BELNR,
KSTAR LIKE COVP-KSTAR,"成本要素
TXT20 LIKE SKAT-TXT20,"成本要素名称
WOGBTR LIKE COVP-WOGBTR,"本位币
SGTXT LIKE COVP-SGTXT, "凭证文本
END OF TAB_G_COVP.
* 无PO凭证项目文本用
DATA:TAB_G_COVPDEL LIKE TAB_G_COVP OCCURS WITH HEADER LINE.
*无PO凭证金额汇总用
DATA:TAB_G_COVPSUM LIKE TAB_G_COVP OCCURS WITH HEADER LINE. *成本要素用
DATA:BEGIN OF TAB_G_SKAT OCCURS ,
SAKNR LIKE SKAT-SAKNR,"成本要素名称
TXT20 LIKE SKAT-TXT20,"成本要素名称
END OF TAB_G_SKAT. DATA: G_ALV_FIELDCAT TYPE LVC_T_FCAT,
*参照 LVC_S_FCAT 结构定义字段列工作区
G_ALV_FIELD TYPE LVC_S_FCAT,
G_TOOLBAR TYPE REF TO CL_GUI_TOOLBAR. DATA: G_ALV_TREE TYPE REF TO CL_GUI_ALV_TREE,
G_CUSTOM_CONTAINER TYPE REF TO CL_GUI_CUSTOM_CONTAINER. TYPES: BEGIN OF TY_WBS,
POSID TYPE PRPS-POSID, "WBS元素
POST2() TYPE C, "WBS描述
STUFE TYPE PRPS-STUFE, "层次
ZBMOUNT LIKE BPGE-WTGES, "预算金额(Budget)
ZNETPR LIKE BPGE-WTGES, "PO总金额(含税)
EXPSUM LIKE ZPS001-EXPSUM, "预计完工金额
ZEMOUNT LIKE BPGE-WTGES, "剩余预算金额
VBUKR LIKE PROJ-VBUKR, "公司代码
GJAHR LIKE COVP-GJAHR, "年度
EBELN LIKE EKKO-EBELN,
END OF TY_WBS. DATA: GT_WBS TYPE STANDARD TABLE OF TY_WBS,
GS_WBS TYPE TY_WBS. DATA: OK_CODE LIKE SY-UCOMM,
SAVE_OK LIKE SY-UCOMM, "OK-Code
G_MAX TYPE I VALUE . DATA: GT_FCAT TYPE LVC_T_FCAT,
GS_FCAT TYPE LVC_S_FCAT.
*下载抬头数据用
DATA: BEGIN OF TAB_G_XIZA OCCURS ,
TEXT() TYPE C,
END OF TAB_G_XIZA.
DATA: BEGIN OF TAB_G_XIZAITEM OCCURS ,
POSID() TYPE C, "WBS元素
POST2() TYPE C, "WBS描述
ZBMOUNT() TYPE C, "预算金额(Budget)
ZNETPR() TYPE C, "PO总金额(含税)
ZEMOUNT() TYPE C, "剩余预算金额
EXPSUM() TYPE C, "预计完工金额
END OF TAB_G_XIZAITEM.
*---------------------------------------------------------------------*
* SELECTION-SCREEN
*---------------------------------------------------------------------*
SELECTION-SCREEN BEGIN OF BLOCK A WITH FRAME TITLE TEXT-.
PARAMETERS: P_GJAHR LIKE BSIK-GJAHR DEFAULT SY-DATUM+() OBLIGATORY,
P_MONTH LIKE BSIK-MONAT DEFAULT SY-DATUM+() OBLIGATORY.
SELECT-OPTIONS: S_VBUKR FOR PROJ-VBUKR OBLIGATORY, "公司代码
S_PSPID FOR PROJ-PSPID, "项目定义
* S_POSID FOR PRPS-POSID, "WBS元素
S_PRART FOR TCJ1-PRART, "项目类型
S_VERNR FOR TCJ04-VERNR, "项目负责
S_USR00 FOR ZPS006-USR00. "行业分类
*PARAMETERS: R1 AS CHECKBOX. "展开
SELECTION-SCREEN END OF BLOCK A. SELECTION-SCREEN BEGIN OF BLOCK C WITH FRAME TITLE TEXT-.
PARAMETERS: R3 RADIOBUTTON GROUP B DEFAULT 'X', "显示全部
R4 RADIOBUTTON GROUP B. "显示未完工
SELECTION-SCREEN END OF BLOCK C. AT SELECTION-SCREEN.
*权限检查
SELECT BUKRS FROM T001 INTO TABLE TAB_G_BUKRS
WHERE BUKRS IN S_VBUKR.
DELETE ADJACENT DUPLICATES FROM TAB_G_BUKRS COMPARING BUKRS.
LOOP AT TAB_G_BUKRS.
AUTHORITY-CHECK OBJECT 'ZPS021'
ID 'ACTVT' FIELD ''
ID 'BUKRS' FIELD TAB_G_BUKRS-BUKRS.
IF SY-SUBRC <> .
MESSAGE '您没有权限!' TYPE 'E'.
ENDIF.
ENDLOOP.
*屏幕数据检查
IF P_GJAHR = '' OR P_GJAHR+() = .
MESSAGE '输入年度不存在!' TYPE 'E'.
ENDIF.
IF P_MONTH > '' OR P_MONTH = .
MESSAGE '输入月份不存在!' TYPE 'E'.
ENDIF. *----------------------------------------------------------------------*
* CLASS lcl_tree_event_receiver DEFINITION
*----------------------------------------------------------------------*
*
*----------------------------------------------------------------------*
CLASS LCL_TREE_EVENT_RECEIVER DEFINITION. PUBLIC SECTION.
METHODS HANDLE_NODE_DOUBLE_CLICK
FOR EVENT NODE_DOUBLE_CLICK OF CL_GUI_ALV_TREE
IMPORTING NODE_KEY SENDER.
METHODS HANDLE_ITEM_DOUBLE_CLICK
FOR EVENT ITEM_DOUBLE_CLICK OF CL_GUI_ALV_TREE
IMPORTING FIELDNAME NODE_KEY.
ENDCLASS. "lcl_tree_event_receiver DEFINITION
*----------------------------------------------------------------------*
* CLASS lcl_toolbar_event_receive DEFINITION
*----------------------------------------------------------------------*
*
*----------------------------------------------------------------------*
CLASS LCL_TOOLBAR_EVENT_RECEIVER DEFINITION. PUBLIC SECTION.
* ?4. Define an event handler method to react to fired function codes
* of the toolbar. .
METHODS: ON_FUNCTION_SELECTED
FOR EVENT FUNCTION_SELECTED OF CL_GUI_TOOLBAR
IMPORTING FCODE. ENDCLASS. "lcl_toolbar_event_receiver DEFINITION
*----------------------------------------------------------------------*
* CLASS LCL_TREE_EVENT_RECEIVER IMPLEMENTATION
*----------------------------------------------------------------------*
*
*----------------------------------------------------------------------*
CLASS LCL_TREE_EVENT_RECEIVER IMPLEMENTATION. METHOD HANDLE_NODE_DOUBLE_CLICK.
DATA: LT_CHILDREN TYPE LVC_T_NKEY. CALL METHOD SENDER->GET_CHILDREN
EXPORTING
I_NODE_KEY = NODE_KEY
IMPORTING
ET_CHILDREN = LT_CHILDREN. IF NOT LT_CHILDREN IS INITIAL. CALL METHOD SENDER->EXPAND_NODE
EXPORTING
I_NODE_KEY = NODE_KEY
I_LEVEL_COUNT = .
ENDIF. ENDMETHOD. "handle_node_double_click METHOD HANDLE_ITEM_DOUBLE_CLICK.
DATA: L_VALUE TYPE LVC_VALUE,
L_LAYI TYPE LVC_T_LAYI,
L_LAYN TYPE LVC_S_LAYN .
DATA:G_EBELN LIKE EKKN-EBELN.
CALL METHOD G_ALV_TREE->GET_OUTTAB_LINE
EXPORTING
I_NODE_KEY = NODE_KEY
IMPORTING
E_OUTTAB_LINE = GS_WBS
E_NODE_TEXT = L_VALUE
ET_ITEM_LAYOUT = L_LAYI
ES_NODE_LAYOUT = L_LAYN
EXCEPTIONS
NODE_NOT_FOUND =
OTHERS = .
IF SY-SUBRC = .
IF GS_WBS-POSID+() = 'CN'.
SET PARAMETER ID 'PRO' FIELD GS_WBS-POSID.
CALL TRANSACTION 'CJ03' AND SKIP FIRST SCREEN.
ELSEIF GS_WBS-POSID+() = ''.
SET PARAMETER ID 'BLN' FIELD GS_WBS-POSID.
SET PARAMETER ID 'BUK' FIELD GS_WBS-VBUKR.
SET PARAMETER ID 'GJR' FIELD GS_WBS-GJAHR.
CALL TRANSACTION 'FB03' AND SKIP FIRST SCREEN.
ELSE.
CLEAR:G_EBELN.
SELECT SINGLE EBELN
FROM EKKN
INTO G_EBELN
WHERE EBELN = GS_WBS-POSID.
IF SY-SUBRC = .
SET PARAMETER ID 'BES' FIELD GS_WBS-POSID.
CALL TRANSACTION 'ME23N' AND SKIP FIRST SCREEN.
ELSE.
MESSAGE '无此PO!' TYPE 'S'.
ENDIF.
ENDIF.
ENDIF. ENDMETHOD. "handle_item_double_click ENDCLASS. "lcl_tree_event_receiver IMPLEMENTATION
*---------------------------------------------------------------------*
* CLASS lcl_toolbar_event_receiver IMPLEMENTATION
*---------------------------------------------------------------------*
* ........ *
*---------------------------------------------------------------------*
CLASS LCL_TOOLBAR_EVENT_RECEIVER IMPLEMENTATION.
*
METHOD ON_FUNCTION_SELECTED.
DATA: LT_SELECTED_NODES TYPE LVC_T_NKEY,
L_SELECTED_NODE TYPE LVC_NKEY,
L_RC TYPE C. * ?5. Query the function codes of the toolbar in your implementation.
CASE FCODE.
WHEN 'XIZA'."下载数据
PERFORM XIZA_DATA.
ENDCASE.
ENDMETHOD. "on_function_selected ENDCLASS. "lcl_toolbar_event_receiver IMPLEMENTATION END-OF-SELECTION. CALL SCREEN . *&---------------------------------------------------------------------*
*& Module PBO OUTPUT
*&---------------------------------------------------------------------*
* process before output
*----------------------------------------------------------------------*
MODULE PBO OUTPUT. SET PF-STATUS 'MAIN100'.
SET TITLEBAR 'MAINTITLE'. IF G_ALV_TREE IS INITIAL.
PERFORM INIT_TREE. CALL METHOD CL_GUI_CFW=>FLUSH
EXCEPTIONS
CNTL_SYSTEM_ERROR =
CNTL_ERROR = .
IF SY-SUBRC NE .
CALL FUNCTION 'POPUP_TO_INFORM'
EXPORTING
TITEL = 'Automation Queue failure'()
TXT1 = 'Internal error:'()
TXT2 = 'A method in the automation queue'()
TXT3 = 'caused a failure.'().
ENDIF.
ENDIF. ENDMODULE. " PBO OUTPUT
*&---------------------------------------------------------------------*
*& Module PAI INPUT
*&---------------------------------------------------------------------*
* process after input
*----------------------------------------------------------------------*
MODULE PAI INPUT.
SAVE_OK = OK_CODE.
CLEAR OK_CODE. CASE SAVE_OK.
WHEN 'EXIT' OR 'BACK' OR 'CANC'.
PERFORM EXIT_PROGRAM. WHEN OTHERS.
CALL METHOD CL_GUI_CFW=>DISPATCH. ENDCASE. CALL METHOD CL_GUI_CFW=>FLUSH.
ENDMODULE. " PAI INPUT *&---------------------------------------------------------------------*
*& Form init_tree
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
* --> p1 text
* <-- p2 text
*----------------------------------------------------------------------*
FORM INIT_TREE. DATA: L_TREE_CONTAINER_NAME() TYPE C. L_TREE_CONTAINER_NAME = 'CCONTAINER1'. CREATE OBJECT G_CUSTOM_CONTAINER
EXPORTING
CONTAINER_NAME = L_TREE_CONTAINER_NAME
EXCEPTIONS
CNTL_ERROR =
CNTL_SYSTEM_ERROR =
CREATE_ERROR =
LIFETIME_ERROR =
LIFETIME_DYNPRO_DYNPRO_LINK = .
IF SY-SUBRC <> .
MESSAGE X208() WITH 'ERROR'().
ENDIF. * create tree control
CREATE OBJECT G_ALV_TREE
EXPORTING
PARENT = G_CUSTOM_CONTAINER
NODE_SELECTION_MODE = CL_GUI_COLUMN_TREE=>NODE_SEL_MODE_SINGLE
ITEM_SELECTION = 'X'
NO_HTML_HEADER = 'X'
NO_TOOLBAR = ''
EXCEPTIONS
CNTL_ERROR =
CNTL_SYSTEM_ERROR =
CREATE_ERROR =
LIFETIME_ERROR =
ILLEGAL_NODE_SELECTION_MODE =
FAILED =
ILLEGAL_COLUMN_NAME = .
IF SY-SUBRC <> .
MESSAGE X208() WITH 'ERROR'. "#EC NOTEXT
ENDIF. *主节点抬头描述
DATA L_HIERARCHY_HEADER TYPE TREEV_HHDR.
PERFORM BUILD_HIERARCHY_HEADER CHANGING L_HIERARCHY_HEADER.
*项目内表抬头描述
PERFORM BUILD_FIELDCATEGORY.
DATA: G_LAYOUT1 TYPE LVC_S_LAYO."布局结构
DATA: LS_VARIANT TYPE DISVARIANT."格式 (外部使用)
LS_VARIANT-REPORT = SY-REPID."ABAP 程序名称 CALL METHOD G_ALV_TREE->SET_TABLE_FOR_FIRST_DISPLAY
EXPORTING
I_SAVE = 'A'
IS_HIERARCHY_HEADER = L_HIERARCHY_HEADER
IS_VARIANT = LS_VARIANT
CHANGING
IT_OUTTAB = GT_WBS "table must be empty !
IT_FIELDCATALOG = GT_FCAT. PERFORM CREATE_HIERARCHY."读取数据 PERFORM CHANGE_TOOLBAR."增加工具栏
PERFORM REGISTER_EVENTS_TOOLBAR."增加工具栏触发
PERFORM REGISTER_EVENTS. CALL METHOD G_ALV_TREE->FRONTEND_UPDATE. ENDFORM. " init_tree
*&---------------------------------------------------------------------*
*& Form build_hierarchy_header
*&---------------------------------------------------------------------*
* build hierarchy-header-information
*----------------------------------------------------------------------*
* -->P_L_HIERARCHY_HEADER strucxture for hierarchy-header
*----------------------------------------------------------------------*
FORM BUILD_HIERARCHY_HEADER CHANGING
P_HIERARCHY_HEADER TYPE TREEV_HHDR.
P_HIERARCHY_HEADER-HEADING = 'WBS元素/合同号/凭证号'().
P_HIERARCHY_HEADER-TOOLTIP = 'WBS'().
P_HIERARCHY_HEADER-WIDTH = .
P_HIERARCHY_HEADER-WIDTH_PIX = ' '. ENDFORM. " build_hierarchy_header
*&---------------------------------------------------------------------*
*& Form exit_program
*&---------------------------------------------------------------------*
* free object and leave program
*----------------------------------------------------------------------*
FORM EXIT_PROGRAM. CALL METHOD G_CUSTOM_CONTAINER->FREE.
LEAVE PROGRAM. ENDFORM. " exit_program
*&---------------------------------------------------------------------*
*& Form create_hierarchy
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
* --> p1 text
* <-- p2 text
*----------------------------------------------------------------------*
FORM CREATE_HIERARCHY. DATA: LS_WBS TYPE TY_WBS,
LT_WBS TYPE TY_WBS OCCURS . DATA: LT_NODES TYPE TABLE OF LVC_NKEY WITH HEADER LINE,
L_CUR_NODE TYPE LVC_NKEY,
L_FORMER_STUFE TYPE PRPS-STUFE,
L_INDEX TYPE I. * 读取数据
PERFORM FRM_DATA_GET.
LOOP AT TAB_G_OUT.
CLEAR:LS_WBS.
MOVE-CORRESPONDING TAB_G_OUT TO LS_WBS.
APPEND LS_WBS TO LT_WBS.
ENDLOOP. * SELECT PRPS~POSID PRPS~POST1 PRPS~STUFE
* FROM PRPS
* INNER JOIN PROJ ON PROJ~PSPNR = PRPS~PSPHI
* INTO TABLE LT_WBS
* WHERE PROJ~PSPID = 'CNJX00A10001'.
* UP TO 200 ROWS. * SORT LT_WBS BY POSID. LOOP AT LT_WBS INTO LS_WBS. IF LS_WBS-STUFE = ''.
REFRESH LT_NODES.
L_INDEX = LS_WBS-STUFE.
PERFORM ADD_NODES USING LS_WBS
''
CHANGING L_CUR_NODE.
READ TABLE LT_NODES INDEX L_INDEX.
IF SY-SUBRC NE .
APPEND L_CUR_NODE TO LT_NODES.
ENDIF. ELSEIF LS_WBS-STUFE > L_FORMER_STUFE. "on change of l_yyyymm
L_INDEX = LS_WBS-STUFE - .
READ TABLE LT_NODES INDEX L_INDEX. PERFORM ADD_NODES USING LS_WBS
LT_NODES
CHANGING L_CUR_NODE.
*---->保存新的当前节点
APPEND L_CUR_NODE TO LT_NODES.
ELSEIF LS_WBS-STUFE < L_FORMER_STUFE.
L_INDEX = LS_WBS-STUFE - .
READ TABLE LT_NODES INDEX L_INDEX. PERFORM ADD_NODES USING LS_WBS
LT_NODES
CHANGING L_CUR_NODE.
*---->将当前节点及之后后的所有临时存储节点KEY删除
L_INDEX = L_INDEX + .
DELETE LT_NODES INDEX L_INDEX.
DO.
READ TABLE LT_NODES INDEX L_INDEX.
IF SY-SUBRC = .
DELETE LT_NODES INDEX L_INDEX.
ELSE.
EXIT.
ENDIF.
ENDDO.
*---->保存新的当前节点
APPEND L_CUR_NODE TO LT_NODES.
ELSE.
L_INDEX = LS_WBS-STUFE - .
READ TABLE LT_NODES INDEX L_INDEX.
PERFORM ADD_NODES USING LS_WBS
LT_NODES
CHANGING L_CUR_NODE.
ENDIF.
L_FORMER_STUFE = LS_WBS-STUFE.
IF LS_WBS-EBELN IS INITIAL.
*---->将当前节点及之后后的所有临时存储节点KEY删除
L_INDEX = L_INDEX + .
DELETE LT_NODES INDEX L_INDEX.
DO.
READ TABLE LT_NODES INDEX L_INDEX.
IF SY-SUBRC = .
DELETE LT_NODES INDEX L_INDEX.
ELSE.
EXIT.
ENDIF.
ENDDO.
*---->保存新的当前节点
APPEND L_CUR_NODE TO LT_NODES.
ENDIF.
ENDLOOP. ENDFORM. " create_hierarchy
*&---------------------------------------------------------------------*
*& Form add_nodes
*&---------------------------------------------------------------------*
FORM ADD_NODES USING PS_WBS TYPE TY_WBS
P_CNODE_KEY TYPE LVC_NKEY
CHANGING P_NNODE_KEY TYPE LVC_NKEY. DATA: L_NODE_TEXT TYPE LVC_VALUE. CALL FUNCTION 'CONVERSION_EXIT_ABPSN_OUTPUT'
EXPORTING
INPUT = PS_WBS-POSID
IMPORTING
OUTPUT = L_NODE_TEXT. CALL METHOD G_ALV_TREE->ADD_NODE
EXPORTING
I_RELAT_NODE_KEY = P_CNODE_KEY
I_RELATIONSHIP = CL_GUI_COLUMN_TREE=>RELAT_LAST_CHILD
I_NODE_TEXT = L_NODE_TEXT
IS_OUTTAB_LINE = PS_WBS
IMPORTING
E_NEW_NODE_KEY = P_NNODE_KEY. ENDFORM. " add_month
*&---------------------------------------------------------------------*
*& Form build_fieldcategory
*&---------------------------------------------------------------------*
FORM BUILD_FIELDCATEGORY .
CLEAR:GS_FCAT,GT_FCAT,GT_FCAT[].
GS_FCAT-FIELDNAME = 'POST2'.
GS_FCAT-SELTEXT = 'WBS描述/合同描述/成本要素描述/凭证描述'. " 字段输出名称
GS_FCAT-COLTEXT = 'WBS描述/合同描述/成本要素描述/凭证描述'. " 字段输出名称
GS_FCAT-JUST = 'L'.
GS_FCAT-OUTPUTLEN = ''. " 输出长度
APPEND GS_FCAT TO GT_FCAT.
CLEAR GS_FCAT. GS_FCAT-FIELDNAME = 'ZBMOUNT'.
GS_FCAT-SELTEXT = '预算(元)'. " 字段输出名称
GS_FCAT-COLTEXT = '预算(元)'. " 字段输出名称
GS_FCAT-COL_OPT = 'X'.
GS_FCAT-JUST = 'L'.
GS_FCAT-DATATYPE = 'CURR'.
GS_FCAT-OUTPUTLEN = ''. " 输出长度
APPEND GS_FCAT TO GT_FCAT.
CLEAR GS_FCAT. GS_FCAT-FIELDNAME = 'ZNETPR'.
GS_FCAT-SELTEXT = '合同金额/无PO金额(元)'. " 字段输出名称
GS_FCAT-COLTEXT = '合同金额/无PO金额(元)'. " 字段输出名称
GS_FCAT-COL_OPT = 'X'.
GS_FCAT-JUST = 'L'.
GS_FCAT-DATATYPE = 'CURR'.
GS_FCAT-OUTPUTLEN = ''. " 输出长度
APPEND GS_FCAT TO GT_FCAT.
CLEAR GS_FCAT. GS_FCAT-FIELDNAME = 'ZEMOUNT'.
GS_FCAT-SELTEXT = '差额(元)'. " 字段输出名称
GS_FCAT-COLTEXT = '差额(元)'. " 字段输出名称
GS_FCAT-COL_OPT = 'X'.
GS_FCAT-JUST = 'L'.
GS_FCAT-DATATYPE = 'CURR'.
GS_FCAT-OUTPUTLEN = ''. " 输出长度
APPEND GS_FCAT TO GT_FCAT.
CLEAR GS_FCAT. GS_FCAT-FIELDNAME = 'EXPSUM'.
GS_FCAT-SELTEXT = '项目预计完成(元)'. " 字段输出名称
GS_FCAT-COLTEXT = '项目预计完成(元)'. " 字段输出名称
GS_FCAT-COL_OPT = 'X'.
GS_FCAT-JUST = 'L'.
GS_FCAT-DATATYPE = 'CURR'.
GS_FCAT-OUTPUTLEN = ''. " 输出长度
APPEND GS_FCAT TO GT_FCAT.
CLEAR GS_FCAT. ENDFORM. " build_fieldcategory
*&---------------------------------------------------------------------*
*& Form register_events
*&---------------------------------------------------------------------*
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. CALL METHOD G_ALV_TREE->GET_REGISTERED_EVENTS
IMPORTING
EVENTS = LT_EVENTS. L_EVENT-EVENTID = CL_GUI_COLUMN_TREE=>EVENTID_NODE_DOUBLE_CLICK.
APPEND L_EVENT TO LT_EVENTS.
L_EVENT-EVENTID = CL_GUI_COLUMN_TREE=>EVENTID_ITEM_DOUBLE_CLICK.
APPEND L_EVENT TO LT_EVENTS. CALL METHOD G_ALV_TREE->SET_REGISTERED_EVENTS
EXPORTING
EVENTS = LT_EVENTS
EXCEPTIONS
CNTL_ERROR =
CNTL_SYSTEM_ERROR =
ILLEGAL_EVENT_COMBINATION = .
IF SY-SUBRC <> .
MESSAGE X208() WITH 'ERROR'. "#EC NOTEXT
ENDIF. CREATE OBJECT L_EVENT_RECEIVER.
SET HANDLER L_EVENT_RECEIVER->HANDLE_NODE_DOUBLE_CLICK FOR G_ALV_TREE.
SET HANDLER L_EVENT_RECEIVER->HANDLE_ITEM_DOUBLE_CLICK FOR G_ALV_TREE. ENDFORM. " register_events
*&---------------------------------------------------------------------*
*& Form FRM_DATA_GET
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
* --> p1 text
* <-- p2 text
*----------------------------------------------------------------------*
FORM FRM_DATA_GET .
* 付款金额用时间设定
G_MONTH = P_MONTH.
G_MONTH2 = P_MONTH + .
CONCATENATE P_GJAHR G_MONTH2 '' INTO G_DATE. "截止当前月份为止时间
CONCATENATE P_GJAHR '' '' INTO G_DATE2. "截止去年年底为止时间
CONCATENATE P_GJAHR P_MONTH '' INTO G_DATE3. "当月时间 *取已分配预算项目和AFCE数据
SELECT PROJ~VBUKR "公司
PROJ~PSPID "项目定义
PROJ~POST1 AS POST1 "项目描述
PRPS~PSPHI "项目号码
PRPS~POSID "WBS元素
PRPS~POST1 AS POST2 "WBS描述
PRPS~PSPNR "WBS编号
PRPS~OBJNR "项目对象号
PRPS~STUFE "项目层次
FROM PROJ
INNER JOIN PRPS ON PRPS~PSPHI = PROJ~PSPNR
INTO CORRESPONDING FIELDS OF TABLE TAB_G_PROJ
WHERE PROJ~VBUKR IN S_VBUKR "公司
AND PROJ~PSPID IN S_PSPID "项目定义
* AND PRPS~POSID IN S_POSID "WBS元素
AND PROJ~VERNR IN S_VERNR "项目负责人
AND PRPS~PRART IN S_PRART "项目类型
AND PRPS~USR00 IN S_USR00 "行业分类
AND PRPS~LOEVM = ''."删除标识 *项目状态
IF R4 = 'X'.
LOOP AT TAB_G_PROJ.
SELECT SINGLE *
FROM JEST
WHERE OBJNR = TAB_G_PROJ-OBJNR
AND STAT = 'I0046'
AND INACT = ''.
IF SY-SUBRC = .
DELETE TAB_G_PROJ.
ENDIF.
CLEAR:TAB_G_PROJ.
ENDLOOP.
ENDIF. IF NOT TAB_G_PROJ[] IS INITIAL.
*取项目层级关系
SELECT *
FROM PRHI
INTO TABLE TAB_G_PSHI
FOR ALL ENTRIES IN TAB_G_PROJ
WHERE PSPHI = TAB_G_PROJ-PSPHI "项目定义编号
AND POSNR = TAB_G_PROJ-PSPNR."WBS编号 *取带WBS的PO
SELECT PS_PSP_PNR AS PSPNR "WBS编号
EBELN "PO号
EBELP "PO行项目
FROM EKKN
INTO TABLE TAB_G_EKKN
FOR ALL ENTRIES IN TAB_G_PROJ
WHERE AEDAT < G_DATE "PO创建日期
AND PS_PSP_PNR = TAB_G_PROJ-PSPNR "WBS编号
AND PS_PSP_PNR <> ''. "WBS编号 SORT TAB_G_EKKN BY EBELN.
*PO总金额
IF TAB_G_EKKN[] IS NOT INITIAL.
SELECT EKPO~BUKRS "公司
EKPO~EBELN "PO号
EKPO~EBELP "PO项目
EKPO~NETWR "PO货币的净订单价值
EKPO~RETPO "退货项目
EKPO~NETPR "净价格(以凭证货币计)
EKPO~MENGE "采购订单数量
EKPO~PEINH "价格单位
EKPO~MWSKZ "税代码
EKKO~WKURS "汇率
EKKO~WAERS"货币符号
EKPO~TXZ01 "PO文本
EKKO~KNUMV "单据条件数
FROM EKPO
INNER JOIN EKKO ON EKKO~EBELN = EKPO~EBELN
INTO CORRESPONDING FIELDS OF TABLE TAB_G_EKPO
FOR ALL ENTRIES IN TAB_G_EKKN
WHERE EKKO~BUKRS IN S_VBUKR "公司
AND EKPO~EBELN = TAB_G_EKKN-EBELN "PO号
AND EKPO~EBELP = TAB_G_EKKN-EBELP "PO行项目
AND EKPO~LOEKZ <> 'L'. "删除标识 SORT TAB_G_EKPO BY BUKRS EBELN.
IF TAB_G_EKPO[] IS NOT INITIAL. ENDIF.
LOOP AT TAB_G_EKPO.
READ TABLE TAB_G_EKKN WITH KEY EBELN = TAB_G_EKPO-EBELN
EBELP = TAB_G_EKPO-EBELP.
IF SY-SUBRC = .
TAB_G_EKPO-PSPNR = TAB_G_EKKN-PSPNR.
*取税率
SELECT SINGLE KONP~KBETR
FROM A003
INNER JOIN KONP ON KONP~KNUMH = A003~KNUMH
INTO TAB_G_EKPO-KBETR
WHERE A003~KAPPL = 'TX'
AND A003~MWSKZ = TAB_G_EKPO-MWSKZ
AND A003~KSCHL IN ('MWVS', 'MWCN')
AND A003~ALAND = 'CN'
AND KONP~KOPOS = ''.
MODIFY TAB_G_EKPO. IF TAB_G_EKPO-RETPO = 'X'."退货订单判断
*PO总金额(含税)
IF TAB_G_EKPO-KBETR = ''.
TAB_G_EKPO-NETPR = TAB_G_EKPO-NETPR * TAB_G_EKPO-MENGE *
TAB_G_EKPO-WKURS / TAB_G_EKPO-PEINH. TAB_G_EKPO-NETPR = - TAB_G_EKPO-NETPR .
ELSE.
IF TAB_G_EKPO-MWSKZ = 'T0'.
TAB_G_EKPO-NETPR = TAB_G_EKPO-NETPR * TAB_G_EKPO-MENGE *
TAB_G_EKPO-WKURS / TAB_G_EKPO-PEINH / ( - / ).
ELSE.
TAB_G_EKPO-NETPR = TAB_G_EKPO-NETPR * TAB_G_EKPO-MENGE *
TAB_G_EKPO-WKURS / TAB_G_EKPO-PEINH + TAB_G_EKPO-NETPR *
TAB_G_EKPO-MENGE * TAB_G_EKPO-KBETR * TAB_G_EKPO-WKURS / /
TAB_G_EKPO-PEINH.
ENDIF.
* 运费
CLEAR:TAB_G_KONV,TAB_G_KONV[].
SELECT KNUMV
KPOSN
KSCHL
KBETR
FROM KONV
INTO TABLE TAB_G_KONV
WHERE KNUMV = TAB_G_EKPO-KNUMV
AND KPOSN = TAB_G_EKPO-EBELP
AND KSCHL IN ('FRB2','ZKG1').
LOOP AT TAB_G_KONV.
TAB_G_EKPO-KBETR1 = TAB_G_EKPO-KBETR1 + TAB_G_KONV-KBETR.
ENDLOOP.
TAB_G_EKPO-NETWR = TAB_G_EKPO-NETWR + TAB_G_EKPO-KBETR1.
TAB_G_EKPO-NETPR = TAB_G_EKPO-NETPR + TAB_G_EKPO-KBETR1.
TAB_G_EKPO-NETPR = - TAB_G_EKPO-NETPR ."PO总金额(含税)
TAB_G_EKPO-NETWR = - TAB_G_EKPO-NETWR."*PO总金额
ENDIF.
*PO总金额
TAB_G_EKPO-NETWR = TAB_G_EKPO-NETWR * TAB_G_EKPO-WKURS.
ELSE. *PO总金额(含税)
IF TAB_G_EKPO-KBETR = ''.
TAB_G_EKPO-NETPR = TAB_G_EKPO-NETPR * TAB_G_EKPO-MENGE *
TAB_G_EKPO-WKURS / TAB_G_EKPO-PEINH.
ELSE.
IF TAB_G_EKPO-MWSKZ = 'T0'.
TAB_G_EKPO-NETPR = TAB_G_EKPO-NETPR * TAB_G_EKPO-MENGE *
TAB_G_EKPO-WKURS / TAB_G_EKPO-PEINH / ( - / ).
ELSE.
TAB_G_EKPO-NETPR = TAB_G_EKPO-NETPR * TAB_G_EKPO-MENGE *
TAB_G_EKPO-WKURS / TAB_G_EKPO-PEINH + TAB_G_EKPO-NETPR *
TAB_G_EKPO-MENGE * TAB_G_EKPO-KBETR * TAB_G_EKPO-WKURS /
/ TAB_G_EKPO-PEINH.
ENDIF.
ENDIF.
*PO总金额
TAB_G_EKPO-NETWR = TAB_G_EKPO-NETWR * TAB_G_EKPO-WKURS.
* 运费
CLEAR:TAB_G_KONV,TAB_G_KONV[].
SELECT KNUMV
KPOSN
KSCHL
KBETR
FROM KONV
INTO TABLE TAB_G_KONV
WHERE KNUMV = TAB_G_EKPO-KNUMV
AND KPOSN = TAB_G_EKPO-EBELP
AND KSCHL IN ('FRB2','ZKG1').
LOOP AT TAB_G_KONV.
TAB_G_EKPO-KBETR1 = TAB_G_EKPO-KBETR1 + TAB_G_KONV-KBETR.
ENDLOOP.
TAB_G_EKPO-NETWR = TAB_G_EKPO-NETWR + TAB_G_EKPO-KBETR1.
TAB_G_EKPO-NETPR = TAB_G_EKPO-NETPR + TAB_G_EKPO-KBETR1.
ENDIF.
ENDIF.
MODIFY TAB_G_EKPO.
CLEAR:TAB_G_EKPO.
ENDLOOP. *取合同期初金额
CLEAR:TAB_G_ZPS003,TAB_G_ZPS003[].
SELECT VBUKR AS BUKRS
PSPID
EBELN
POSID
GJAHR
NETPRALL AS NETPR
TXZ01
FROM ZPS003
INTO CORRESPONDING FIELDS OF TABLE TAB_G_ZPS003
FOR ALL ENTRIES IN TAB_G_PROJ
WHERE VBUKR = TAB_G_PROJ-VBUKR "公司
AND PSPID = TAB_G_PROJ-PSPID "项目定义
AND GJAHR =< SY-DATUM+(). *查找WBS编号
LOOP AT TAB_G_ZPS003.
CALL FUNCTION 'CONVERSION_EXIT_ABPSN_INPUT'
EXPORTING
INPUT = TAB_G_ZPS003-POSID
IMPORTING
OUTPUT = TAB_G_ZPS003-POSID.
READ TABLE TAB_G_PROJ WITH KEY PSPID = TAB_G_ZPS003-PSPID
POSID = TAB_G_ZPS003-POSID.
IF SY-SUBRC = .
TAB_G_ZPS003-PSPNR = TAB_G_PROJ-PSPNR.
CLEAR:TAB_G_ZPS003-PSPID,TAB_G_ZPS003-POSID.
MODIFY TAB_G_ZPS003.
ELSE.
DELETE TAB_G_ZPS003.
ENDIF.
ENDLOOP. *根据PO,年度确定最新数据
SORT TAB_G_ZPS003 BY BUKRS PSPNR EBELN GJAHR DESCENDING.
*删除重复数据取出最新PO期初
DELETE ADJACENT DUPLICATES FROM TAB_G_ZPS003 COMPARING BUKRS PSPNR EBELN. APPEND LINES OF TAB_G_ZPS003 TO TAB_G_EKPO.
*PO总金额汇总
APPEND LINES OF TAB_G_EKPO TO TAB_G_EKPODEL.
CLEAR:TAB_G_EKPO-EBELP,TAB_G_EKPO-RETPO,TAB_G_EKPO-TXZ01,
TAB_G_EKPO-WKURS,TAB_G_EKPO-MWSKZ,TAB_G_EKPO-KBETR,
TAB_G_EKPO-PSPID,TAB_G_EKPO-POSID, TAB_G_EKPO-WAERS, TAB_G_EKPO-KNUMV.
MODIFY TAB_G_EKPO TRANSPORTING EBELP TXZ01 RETPO WKURS MWSKZ KBETR PSPID POSID WAERS KNUMV
WHERE EBELN <> ''.
SORT TAB_G_EKPO BY BUKRS PSPNR EBELN.
LOOP AT TAB_G_EKPO.
COLLECT TAB_G_EKPO INTO TAB_G_EKPOSUM.
APPEND TAB_G_EKPOSUM.
ENDLOOP.
ENDIF.
ENDIF.
DELETE TAB_G_EKPOSUM WHERE BUKRS = ''. *无PO凭证
IF TAB_G_PROJ[] IS NOT INITIAL.
SELECT BUKRS "公司代码
BELNR AS BELNR1
BUZEI
OBJNR "对象号
GJAHR "年度
REFBN AS BELNR "凭证号
BUDAT "记账日期
KSTAR "成本要素
WOGBTR "本位币
SGTXT
FROM COVP
INTO CORRESPONDING FIELDS OF TABLE TAB_G_COVP
FOR ALL ENTRIES IN TAB_G_PROJ
WHERE KOKRS = 'YHGP' "控制范围
AND LEDNR = ''
AND BUKRS = TAB_G_PROJ-VBUKR "公司
AND OBJNR = TAB_G_PROJ-OBJNR "对象
AND VERSN = ''
AND AWTYP = 'BKPF'
AND WRTTP = ''
AND BUDAT < G_DATE "凭证日期
AND AWREF_REV = ''
%_HINTS
DB2 '&SUBSTITUTE VALUES&'
ORACLE '&SUBSTITUTE VALUES&'.
ENDIF. *成本要素
IF TAB_G_COVP[] IS NOT INITIAL.
SELECT SAKNR "成本要素
TXT20 "成本要素名称
FROM SKAT
INTO TABLE TAB_G_SKAT
FOR ALL ENTRIES IN TAB_G_COVP
WHERE KTOPL = 'YHGP' "控制范围
AND SPRAS = SY-LANGU "语言
AND SAKNR = TAB_G_COVP-KSTAR. "成本要素
ENDIF. LOOP AT TAB_G_COVP.
*判断是否有现金,银行科目
SELECT SINGLE *
FROM BSEG
WHERE BUKRS = TAB_G_COVP-BUKRS "公司
AND BELNR = TAB_G_COVP-BELNR "凭证号
AND GJAHR = TAB_G_COVP-GJAHR "年度
AND HKONT BETWEEN '' AND ''."科目
IF SY-SUBRC <> .
*判断是否有供应商
SELECT SINGLE *
FROM BSEG
WHERE BUKRS = TAB_G_COVP-BUKRS "公司
AND BELNR = TAB_G_COVP-BELNR "凭证号
AND GJAHR = TAB_G_COVP-GJAHR "年度
AND LIFNR <> ''. "供应商
IF SY-SUBRC <> .
DELETE TAB_G_COVP.
ELSE.
*成本要素名称
READ TABLE TAB_G_SKAT WITH KEY SAKNR = TAB_G_COVP-KSTAR. "成本要素
IF SY-SUBRC = .
TAB_G_COVP-TXT20 = TAB_G_SKAT-TXT20."成本要素名称
MODIFY TAB_G_COVP.
ENDIF.
ENDIF.
ELSE.
*成本要素名称
READ TABLE TAB_G_SKAT WITH KEY SAKNR = TAB_G_COVP-KSTAR. "成本要素
IF SY-SUBRC = .
TAB_G_COVP-TXT20 = TAB_G_SKAT-TXT20."成本要素名称
MODIFY TAB_G_COVP.
ENDIF.
ENDIF.
CLEAR:TAB_G_COVP.
ENDLOOP.
SORT TAB_G_COVP BY OBJNR BELNR GJAHR.
APPEND LINES OF TAB_G_COVP TO TAB_G_COVPDEL. CLEAR: TAB_G_COVP-BELNR1, "凭证号
TAB_G_COVP-BUDAT, "记账日期
TAB_G_COVP-KSTAR, "成本要素
TAB_G_COVP-SGTXT. " 文本
MODIFY TAB_G_COVP TRANSPORTING BELNR1 BUDAT KSTAR SGTXT
WHERE BELNR <> ''.
SORT TAB_G_COVP BY OBJNR BELNR. *凭证金额汇总
LOOP AT TAB_G_COVP.
COLLECT TAB_G_COVP INTO TAB_G_COVPSUM.
APPEND TAB_G_COVPSUM.
ENDLOOP.
*删除为空的凭证
DELETE TAB_G_COVPSUM WHERE BELNR = ''. CLEAR:TAB_G_OUT,TAB_G_OUT[].
*无PO凭证金额明细
LOOP AT TAB_G_COVPSUM.
READ TABLE TAB_G_PROJ WITH KEY OBJNR = TAB_G_COVPSUM-OBJNR.
IF SY-SUBRC = .
TAB_G_OUT-VBUKR = TAB_G_PROJ-VBUKR. "公司
TAB_G_OUT-PSPID = TAB_G_PROJ-PSPID. "项目定义
TAB_G_OUT-PSPHI = TAB_G_PROJ-PSPHI. "项目定义
TAB_G_OUT-POST1 = TAB_G_PROJ-POST1. "项目描述
TAB_G_OUT-PSPNR = TAB_G_PROJ-PSPNR. "WBS号码
TAB_G_OUT-OBJNR = TAB_G_PROJ-OBJNR. "对象号
TAB_G_OUT-POSID = TAB_G_PROJ-POSID. "WBS元素
TAB_G_OUT-POST2 = TAB_G_PROJ-POST2. "WBS描述
TAB_G_OUT-STUFE = TAB_G_PROJ-STUFE. "层次
ENDIF.
*合并同WBS元素及同一凭证不同行项目文本
LOOP AT TAB_G_COVPDEL WHERE OBJNR = TAB_G_COVPSUM-OBJNR
AND BELNR = TAB_G_COVPSUM-BELNR.
IF TAB_G_OUT-TXZ01 IS INITIAL.
CONCATENATE TAB_G_COVPDEL-TXT20 ';' TAB_G_COVPDEL-SGTXT INTO TAB_G_OUT-TXZ01.
ELSE.
CONCATENATE TAB_G_OUT-TXZ01 '/' TAB_G_COVPDEL-TXT20 ';' TAB_G_COVPDEL-SGTXT INTO TAB_G_OUT-TXZ01.
ENDIF.
CLEAR:TAB_G_COVPDEL.
ENDLOOP.
TAB_G_OUT-EBELN = TAB_G_COVPSUM-BELNR. "无PO凭证
TAB_G_OUT-ZNETPR = TAB_G_COVPSUM-WOGBTR. "无PO金额
TAB_G_OUT-GJAHR = TAB_G_COVPSUM-GJAHR.
COLLECT TAB_G_OUT.
CLEAR:TAB_G_OUT,TAB_G_COVPSUM,TAB_G_PROJ.
ENDLOOP. * PO金额明细
LOOP AT TAB_G_EKPOSUM.
READ TABLE TAB_G_PROJ WITH KEY PSPNR = TAB_G_EKPOSUM-PSPNR.
IF SY-SUBRC = .
TAB_G_OUT-VBUKR = TAB_G_PROJ-VBUKR. "公司
TAB_G_OUT-PSPID = TAB_G_PROJ-PSPID. "项目定义
TAB_G_OUT-PSPHI = TAB_G_PROJ-PSPHI. "项目定义
TAB_G_OUT-POST1 = TAB_G_PROJ-POST1. "项目描述
TAB_G_OUT-PSPNR = TAB_G_PROJ-PSPNR. "WBS号码
TAB_G_OUT-OBJNR = TAB_G_PROJ-OBJNR. "对象号
TAB_G_OUT-POSID = TAB_G_PROJ-POSID. "WBS元素
TAB_G_OUT-POST2 = TAB_G_PROJ-POST2. "WBS描述
TAB_G_OUT-STUFE = TAB_G_PROJ-STUFE. "层次
ENDIF.
* 取出PO项目文本
LOOP AT TAB_G_EKPODEL WHERE PSPNR = TAB_G_EKPOSUM-PSPNR
AND EBELN = TAB_G_EKPOSUM-EBELN.
IF TAB_G_OUT-TXZ01 IS INITIAL.
TAB_G_OUT-TXZ01 = TAB_G_EKPODEL-TXZ01.
ELSE.
CONCATENATE TAB_G_OUT-TXZ01 '/' TAB_G_EKPODEL-TXZ01 INTO TAB_G_OUT-TXZ01.
ENDIF.
CLEAR:TAB_G_EKPODEL.
ENDLOOP. TAB_G_OUT-EBELN = TAB_G_EKPOSUM-EBELN. "PO号
TAB_G_OUT-ZNETPR = TAB_G_EKPOSUM-NETPR. "PO金额(含税)
APPEND TAB_G_OUT.
CLEAR:TAB_G_OUT,TAB_G_PROJ,TAB_G_EKPOSUM.
ENDLOOP. SORT TAB_G_OUT BY PSPHI PSPNR.
CLEAR:G_NETPR,TAB_G_OUTSUM,TAB_G_OUTSUM[],G_NETPRSUM.
*汇总凭证及PO金额
LOOP AT TAB_G_OUT.
G_NETPR = G_NETPR + TAB_G_OUT-ZNETPR. "WBS金额汇总
G_NETPRSUM = G_NETPRSUM + TAB_G_OUT-ZNETPR. "项目金额汇总
*汇总同一WBS的凭证及PO金额
AT END OF PSPNR.
TAB_G_OUTSUM-PSPNR = TAB_G_OUT-PSPNR.
TAB_G_OUTSUM-ZNETPR = G_NETPR.
APPEND TAB_G_OUTSUM.
CLEAR:G_NETPR,TAB_G_OUTSUM.
ENDAT.
*汇总同一项目凭证及PO金额
AT END OF PSPHI.
TAB_G_OUTSUM-PSPHI = TAB_G_OUT-PSPHI.
TAB_G_OUTSUM-ZNETPR = G_NETPRSUM.
APPEND TAB_G_OUTSUM.
CLEAR:G_NETPRSUM,TAB_G_OUTSUM.
ENDAT.
ENDLOOP. *无凭证的WBS元素
SORT TAB_G_PROJ BY PSPID POSID.
APPEND LINES OF TAB_G_PROJ TO TAB_G_OUT.
SORT TAB_G_OUT BY PSPID POSID EBELN. CLEAR:TAB_G_OUTDEL,TAB_G_OUTDEL[],G_CONUT,G_PSPHI.
LOOP AT TAB_G_OUT.
*计算同一项目的WBS行数
G_CONUT = G_CONUT + .
IF G_PSPHI <> TAB_G_OUT-PSPHI."不同项目时行数为1
G_CONUT = .
ENDIF.
TAB_G_OUT-CON = G_CONUT. *层级关系
READ TABLE TAB_G_PSHI WITH KEY POSNR = TAB_G_OUT-PSPNR.
IF SY-SUBRC = .
TAB_G_OUT-UP = TAB_G_PSHI-UP.
ENDIF. *PO和凭证为空时代表此行为同一WBS多凭证和PO的汇总行.
IF TAB_G_OUT-EBELN = ''.
READ TABLE TAB_G_OUTDEL WITH KEY OBJNR = TAB_G_OUT-OBJNR.
IF SY-SUBRC <> .
APPEND TAB_G_OUT TO TAB_G_OUTDEL.
*项目预算
SELECT SINGLE WTGES
FROM BPGE
INTO TAB_G_OUT-ZBMOUNT
WHERE OBJNR = TAB_G_OUT-OBJNR
AND WRTTP = ''
AND VORGA = 'KBUD'.
ENDIF. * 凭证及合同金额
READ TABLE TAB_G_OUTSUM WITH KEY PSPNR = TAB_G_OUT-PSPNR.
IF SY-SUBRC = .
TAB_G_OUT-ZNETPR = TAB_G_OUTSUM-ZNETPR."凭证及合同金额
*差额=预算金额-凭证及PO金额
TAB_G_OUT-ZEMOUNT = TAB_G_OUT-ZBMOUNT - TAB_G_OUTSUM-ZNETPR. "差额
ELSE.
*无PO及凭证金额时,直接取预算金额
TAB_G_OUT-ZEMOUNT = TAB_G_OUT-ZBMOUNT."差额
ENDIF.
ENDIF. IF TAB_G_OUT-STUFE = ''."主项目相关处理
READ TABLE TAB_G_OUTSUM WITH KEY PSPHI = TAB_G_OUT-PSPHI.
IF SY-SUBRC = .
TAB_G_OUT-ZNETPR = TAB_G_OUTSUM-ZNETPR."凭证及合同金额
*差额=预算金额-凭证及PO金额
TAB_G_OUT-ZEMOUNT = TAB_G_OUT-ZBMOUNT - TAB_G_OUTSUM-ZNETPR."差额
ELSE.
*无PO及凭证金额时,直接取预算金额
TAB_G_OUT-ZEMOUNT = TAB_G_OUT-ZBMOUNT."差额
ENDIF. *读取工程相关数据
SELECT SINGLE EXPSUM "预计完工金额
FROM ZPS001
INTO TAB_G_OUT-EXPSUM
WHERE PSPID = TAB_G_OUT-PSPID.
TAB_G_OUT-ID = '@0E@'."主项目的展开标志
TAB_G_OUT-COLOR = 'C310'."颜色设置
ELSE.
TAB_G_OUT-COLOR = 'C100'."颜色设置
ENDIF. * WBS相同时,凭证及PO号,描述放入WBS元素及WBS描述字段
IF G_PSPNR = TAB_G_OUT-PSPNR.
TAB_G_OUT-POSID = TAB_G_OUT-EBELN.
TAB_G_OUT-POST2 = TAB_G_OUT-TXZ01.
TAB_G_OUT-STUFE = TAB_G_OUT-STUFE + .
TAB_G_OUT-COLOR = 'C101'."颜色设置
ENDIF. G_PSPNR = TAB_G_OUT-PSPNR. "WBS编号
G_PSPHI = TAB_G_OUT-PSPHI. "项目编号 MODIFY TAB_G_OUT.
CLEAR:TAB_G_OUT.
ENDLOOP. SORT TAB_G_OUT BY VBUKR PSPHI STUFE DESCENDING.
CLEAR:TAB_G_OUTID,TAB_G_OUTID[],G_NETPR,G_NETPRSUM,REC_G_OUT. *把WBS元素的下层WBS元素的PO及凭证金额汇总放入上一层.
LOOP AT TAB_G_OUT WHERE STUFE <> ''
AND EBELN = ''.
LOOP AT TAB_G_OUT INTO REC_G_OUT WHERE UP = TAB_G_OUT-PSPNR
AND EBELN = ''.
G_NETPR = G_NETPR + REC_G_OUT-ZNETPR.
CLEAR:REC_G_OUT.
ENDLOOP.
TAB_G_OUT-ZNETPR = TAB_G_OUT-ZNETPR + G_NETPR.
TAB_G_OUT-ZEMOUNT = TAB_G_OUT-ZBMOUNT - TAB_G_OUT-ZNETPR.
MODIFY TAB_G_OUT.
CLEAR: G_NETPR,TAB_G_OUT.
ENDLOOP.
SORT TAB_G_OUT BY VBUKR PSPHI CON ASCENDING. ENDFORM. " FRM_DATA_GET
*&---------------------------------------------------------------------*
*& Form CHANGE_TOOLBAR
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
* --> p1 text
* <-- p2 text
*----------------------------------------------------------------------*
FORM CHANGE_TOOLBAR . CALL METHOD G_ALV_TREE->GET_TOOLBAR_OBJECT
IMPORTING
ER_TOOLBAR = G_TOOLBAR. CHECK NOT G_TOOLBAR IS INITIAL. "could happen if you do not use the
"standard toolbar CALL METHOD G_TOOLBAR->ADD_BUTTON
EXPORTING
FCODE = ''
ICON = ''
BUTN_TYPE = CNTB_BTYPE_SEP. * add Standard Button to toolbar (for Delete Subtree)
CALL METHOD G_TOOLBAR->ADD_BUTTON
EXPORTING
FCODE = 'XIZA'
ICON = '@49@'
BUTN_TYPE = CNTB_BTYPE_BUTTON
TEXT = '下载数据'
QUICKINFO = TEXT-. "Delete subtree
ENDFORM. " CHANGE_TOOLBAR
*&---------------------------------------------------------------------*
*& Form REGISTER_EVENTS_TOOLBAR
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
* --> p1 text
* <-- p2 text
*----------------------------------------------------------------------*
FORM REGISTER_EVENTS_TOOLBAR .
DATA: IT_EVENTS TYPE CNTL_SIMPLE_EVENTS,
I_EVENT TYPE CNTL_SIMPLE_EVENT,
I_EVENT_RECEIVER TYPE REF TO LCL_TOOLBAR_EVENT_RECEIVER. CALL METHOD G_ALV_TREE->GET_REGISTERED_EVENTS
IMPORTING
EVENTS = IT_EVENTS. * register events on frontend
CALL METHOD G_ALV_TREE->SET_REGISTERED_EVENTS
EXPORTING
EVENTS = IT_EVENTS
EXCEPTIONS
CNTL_ERROR =
CNTL_SYSTEM_ERROR =
ILLEGAL_EVENT_COMBINATION = .
IF SY-SUBRC <> .
MESSAGE X208() WITH 'ERROR'. "#EC NOTEXT
ENDIF. CREATE OBJECT I_EVENT_RECEIVER.
SET HANDLER I_EVENT_RECEIVER->ON_FUNCTION_SELECTED FOR G_TOOLBAR.
ENDFORM. " REGISTER_EVENTS_TOOLBAR
*&---------------------------------------------------------------------*
*& Form XIZA_DATA
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
* --> p1 text
* <-- p2 text
*----------------------------------------------------------------------*
FORM XIZA_DATA .
DATA: V_PASS_PATH1 LIKE RLGRAP-FILENAME .
DATA: V_PASS_PATH TYPE STRING .
DATA: FILENAME TYPE STRING .
DATA: ACTION TYPE I.
DATA:G_STUFE LIKE PRPS-STUFE. *抬头数据
CLEAR:TAB_G_XIZA,TAB_G_XIZA[],GS_FCAT.
TAB_G_XIZA-TEXT = 'WBS元素/合同号/凭证号'.
APPEND TAB_G_XIZA.
LOOP AT GT_FCAT INTO GS_FCAT.
TAB_G_XIZA-TEXT = GS_FCAT-SELTEXT.
APPEND TAB_G_XIZA.
CLEAR:GS_FCAT,TAB_G_XIZA.
ENDLOOP. *项目数据
CLEAR:TAB_G_XIZAITEM,TAB_G_XIZAITEM[],GS_WBS,G_STUFE.
LOOP AT GT_WBS INTO GS_WBS.
IF G_STUFE IS NOT INITIAL.
IF GS_WBS-STUFE = .
IF GS_WBS-STUFE <> G_STUFE.
APPEND TAB_G_XIZAITEM.
ENDIF.
ENDIF.
ENDIF.
TAB_G_XIZAITEM-POSID = GS_WBS-POSID. "WBS元素
TAB_G_XIZAITEM-POST2 = GS_WBS-POST2. "WBS描述
TAB_G_XIZAITEM-ZBMOUNT = GS_WBS-ZBMOUNT."预算金额(Budget)
TAB_G_XIZAITEM-ZNETPR = GS_WBS-ZNETPR. "PO总金额(含税)
TAB_G_XIZAITEM-ZEMOUNT = GS_WBS-ZEMOUNT."剩余预算金额
TAB_G_XIZAITEM-EXPSUM = GS_WBS-EXPSUM. "预计完工金额 CONDENSE:TAB_G_XIZAITEM-ZBMOUNT,TAB_G_XIZAITEM-ZNETPR,TAB_G_XIZAITEM-EXPSUM, TAB_G_XIZAITEM-ZEMOUNT.
APPEND TAB_G_XIZAITEM.
G_STUFE = GS_WBS-STUFE.
CLEAR:GS_WBS,TAB_G_XIZAITEM.
ENDLOOP. CLEAR FILENAME .
CALL FUNCTION 'GUI_FILE_SAVE_DIALOG'
EXPORTING
FILE_FILTER = '.XLS'
DEFAULT_EXTENSION = 'DAT'
DEFAULT_FILE_NAME = 'PS项目工程月报表'
IMPORTING
FULLPATH = V_PASS_PATH
USER_ACTION = ACTION.
IF ACTION <> .
V_PASS_PATH1 = V_PASS_PATH .
CALL FUNCTION 'MS_EXCEL_OLE_STANDARD_DAT'
EXPORTING
FILE_NAME = V_PASS_PATH1
TABLES
DATA_TAB = TAB_G_XIZAITEM[]
FIELDNAMES = TAB_G_XIZA.
ENDIF.
ENDFORM. " XIZA_DATA

ALV TREE 实例的更多相关文章

  1. OO方式下,ALV TREE和ALV GRID的不同之处

    作为大部分报表程序的基础,ALV GRID差不多是每个ABAP开发者必须了解和掌握的内容,因此网上也不乏相关资料,而ALV TREE的应用相对较少,中文资料也就比较少见了.实际上,ALV TREE和A ...

  2. ALV TREE中双击触发PAI事件的方法

    用事件类实现双击事件,实例化后使用set handler注册到ALV对象.斜体部分为事件方法的具体实现. 代码如下 CLASS lcl_tree_event_receiver DEFINITION. ...

  3. ALV Tree demo(WBS元素分层显示)[引用别人的]

    原文地址:http://www.xuebuyuan.com/1666753.html 按层次显示WBS编码及描述,附加节点双击展开事件和Item双击跳转CJ03功能. 因为本人懒,本例代码都是从标准的 ...

  4. ALV tree标准DEMO

    BCALV_TREE_01 ALV 树控制:构建层次树 BCALV_TREE_02 ALV 树控制:事件处理 BCALV_TREE_03 ALV 树控制:使用自己的上下文菜单 BCALV_TREE_0 ...

  5. 动态ALV表实例-移动类型汇总

    TABLES:MSEG,MAKT. "定义结构 TYPES:BEGIN OF TY_DATA, MJAHR LIKE MSEG-MJAHR, "物料凭证的年份 MBLNR LIKE ...

  6. ligerUI Tree 实例 代码

    http://www.oschina.net/code/snippet_1762525_47819#68813

  7. ALV tree DUMP 问题处理-20180328

    Category ABAP Programming Error Runtime Errors MESSAGE_TYPE_X ABAP Program SAPLOLEA Application Comp ...

  8. ALV详解:OO ALV

    声明:原创作品,转载时请注明文章来自SAP师太技术博客( 博/客/园www.cnblogs.com):www.cnblogs.com/jiangzhengjun,并以超链接形式标明文章原始出处,否则将 ...

  9. 泛函编程(8)-数据结构-Tree

    上节介绍了泛函数据结构List及相关的泛函编程函数设计使用,还附带了少许多态类型(Polymorphic Type)及变形(Type Variance)的介绍.有关Polymorphism的详细介绍会 ...

随机推荐

  1. 发现一个直播录制工具you-get

    地址:https://github.com/soimort/you-get 截至到今天,支持的平台如下: Site URL Videos? Images? Audios? YouTube https: ...

  2. 安全搜索引擎Shodan(搜蛋)命令行模式使用TIPS

    https://www.shodan.io/ 与谷歌通过网址来搜索互联网的方式不同,Shodan通过互联网背后的通道来搜索信息.它就象是一种“黑暗”的谷歌,不断在寻找服务器.网络摄像头.打印机.路由器 ...

  3. 解决vagrant不能正常挂载目录的问题

    解决方案: vagrant plugin install vagrant-vbguest

  4. Ajax 控件列表名称简介

    ylbtech-ASP.NET AJAX: Ajax 控件列表名称简介   1.A,返回顶部 1) Accordion 可折叠的 2) AlwaysVisibleControl 始终可见控制 3) A ...

  5. 访问C指针的指针

    #include <stdio.h> #include <stdlib.h> int main(int argc,char **argv){ void* vp; void** ...

  6. Flak快速上手

    本文介绍如何上手 Flask . 这里假定你已经安装好了 Flask ,否则请先阅读< 安装>. 如果已安装好Flask,通过以下命令查看 一个简单的例子: from flask impo ...

  7. Unity3D开发基础组件提取总结

    在游戏开发过程中,除了逻辑功能的开发之外,还有非常多基础的模块.这些模块,对大部分手机网络游戏来说都是一样的.所以,在上个游戏已经上线运营大半年之际,我认为有必要将这些模块整理出来.让后面其它游戏的开 ...

  8. phonegap(cordova) 自己定义插件代码篇(三)----支付宝支付工具整合

    建议读者,先阅读官方文档,知晓其支付流程之后再来使用此代码,比方客户须要做什么,服务端须要做什么(非常重要!非常重要! 非常重要!),由于这几个篇幅都是纯代码篇,由于阅读前面的入门篇之后看这些应该毫无 ...

  9. Android 百度地图开发(二)

    这一篇文章主要解说的是百度地图的定位功能,然后还有MyLocationOverlay和PopupOverlay两个地图覆盖物的使用.Overlay是"图层"或"覆盖物&q ...

  10. Shell脚本之:if-else

    Shell 有三种 if ... else 语句: 1.if ... fi 语句: 2.if ... else ... fi 语句: 3.if ... elif ... else ... fi 语句. ...