其实早就应该写了,但一直落下来了。现在什么都记不得了,咳。直接上代码吧。
- *&---------------------------------------------------------------------*
- *& Report ZSD017
- *&---------------------------------------------------------------------*
- * Author : Jasson.Lee
- * Date : 2011/12/28
- * Purpose: 销售订单达成率,注意日期选择不同,数据算法不同
- * Change History :
- * Date Author Descriptions
- * ========== ================ ==========================================
- * 2011/12/28 Jasson.Lee Create
- *-----------------------------------------------------------------------
- REPORT zsd017.
- *--------------------------------
- * Global Types
- * Essential Declaration for ALV Display
- *--------------------------------
- TYPE-POOLS: slis.
- DATA :
- i_fieldcat_alv TYPE slis_t_fieldcat_alv ,
- i_fieldcat_alv_t TYPE slis_t_fieldcat_alv,
- i_fieldcat_alv_p TYPE slis_t_fieldcat_alv,
- i_layout TYPE slis_layout_alv,
- i_fieldcat TYPE slis_fieldcat_alv,
- i_events TYPE slis_t_event,
- w_events LIKE LINE OF i_events,
- i_list_comments TYPE slis_t_listheader,
- w_list_comments LIKE LINE OF i_list_comments,
- it_sort TYPE slis_t_sortinfo_alv,
- w_repid LIKE sy-repid.
- TABLES: vbak, vbap, vbkd, vbep, likp, lips, mara.
- *销售单信息
- DATA: BEGIN OF t_vbap OCCURS 0,
- vbeln LIKE vbap-vbeln, "ORDER NO
- posnr LIKE vbap-posnr, "销售项目编号
- END OF t_vbap.
- *SD计划行项目信息VBEP
- DATA: BEGIN OF t_orderinfoAll OCCURS 0,
- vbeln LIKE vbep-vbeln, "ORDER NO
- posnr LIKE vbep-posnr, "销售项目编号
- etenr LIKE vbep-etenr, "行计划
- edatu LIKE vbep-edatu, "计划交货日期
- wmeng LIKE vbep-wmeng, "计划交货数量
- bmeng LIKE vbep-bmeng, "确认的数量
- END OF t_orderinfoAll.
- DATA: BEGIN OF t_orderinfo OCCURS 0,
- vbeln LIKE vbak-vbeln, "ORDER NO
- kunnr LIKE vbak-kunnr, "售达方
- posnr LIKE vbap-posnr, "销售项目编号
- matnr LIKE vbap-matnr, "物料号
- vdatu LIKE vbak-vdatu, "请求交货日
- kwmeng LIKE vbap-kwmeng, "销售订单数量
- edatu LIKE vbep-edatu, "计划交货日期
- wmeng LIKE vbep-wmeng, "计划交货数量
- bmeng LIKE vbep-bmeng, "确认的数量
- erdat LIKE lips-erdat, "实际交货日期
- kcmeng LIKE lips-kcmeng, "实际交货数量
- qty_p LIKE lips-kcmeng, "计划内交货数量
- qty_n LIKE lips-kcmeng, "未完成数量
- comple(6) TYPE C, "达成率
- END OF t_orderinfo.
- *交货信息表
- *DATA: BEGIN OF t_lips OCCURS 0,
- * vbeln LIKE lips-vbeln, "交货单号
- * posnr LIKE lips-posnr, "项目
- * vgbel LIKE lips-vgbel, "销售单号
- * vgpos LIKE lips-vgpos, "销售单项目号
- * matnr LIKE lips-matnr, "物料号
- * wadat_ist LIKE likp-wadat_ist, "实际交货日期
- * kcmeng LIKE lips-kcmeng, "合计出货数
- *END OF t_lips.
- DATA: str_where TYPE TABLE OF edpline.
- DATA: l_loop TYPE i, l_ordrow TYPE i, l_rowcount TYPE i.
- DATA: rcount TYPE i, rowcount TYPE i.
- DATA: scount(8).
- DATA: lstr(20).
- DATA: s_date TYPE d, e_date TYPE d.
- DATA:
- ss_matnr LIKE vbap-matnr,
- ss_qty LIKE lips-kcmeng.
- *--------------------------------
- * Selection Screen
- *--------------------------------
- SELECTION-SCREEN BEGIN OF BLOCK b1 WITH FRAME TITLE text-001.
- SELECTION-SCREEN BEGIN OF LINE.
- SELECTION-SCREEN POSITION 1.
- PARAMETERS:
- d1 RADIOBUTTON GROUP d DEFAULT 'X'. "计划交货日期
- SELECTION-SCREEN COMMENT 6(10) stext01 FOR FIELD d1.
- SELECTION-SCREEN POSITION 18.
- PARAMETERS:
- d2 RADIOBUTTON GROUP d. "实际交货日期
- SELECTION-SCREEN COMMENT 21(10) stext02 FOR FIELD d2.
- SELECTION-SCREEN END OF LINE.
- SELECT-OPTIONS:
- s_dndate FOR vbep-edatu. "日期选择
- SELECTION-SCREEN END OF BLOCK b1.
- SELECTION-SCREEN BEGIN OF BLOCK b2 WITH FRAME TITLE text-002.
- SELECT-OPTIONS:
- s_custom FOR vbak-kunnr LOWER CASE, "客户
- s_matnr FOR vbap-matnr, "物料 PN
- s_ordno FOR vbep-vbeln. "销售单
- SELECTION-SCREEN END OF BLOCK b2.
- *INCLUDE zcommon.
- INITIALIZATION.
- AT SELECTION-SCREEN OUTPUT.
- stext01 = '计划交货日期'.
- stext02 = '实际交货日期'.
- *--------------------------------
- * Start of Selection
- *--------------------------------
- START-OF-SELECTION.
- PERFORM checkdata.
- PERFORM getdata.
- PERFORM events_build.
- PERFORM layout_build.
- PERFORM fields_build.
- PERFORM display_data.
- END-OF-SELECTION.
- *--------------------------------
- * Top of Page
- *--------------------------------
- TOP-OF-PAGE.
- *--------------------------------
- * At User Command
- *--------------------------------
- AT USER-COMMAND.
- *--------------------------------
- * At Line Selection
- *--------------------------------
- AT LINE-SELECTION.
- *&---------------------------------------------------------------------*
- *& Form LAYOUT_BUILD
- *&---------------------------------------------------------------------*
- * text
- *----------------------------------------------------------------------*
- FORM layout_build.
- w_repid = sy-repid. "程序为当前程序
- i_layout-info_fieldname = 'COLOR'. "颜色值
- i_layout-colwidth_optimize = 'X'. "优化列宽选项是否设置
- i_layout-detail_initial_lines = 'X'.
- i_layout-detail_titlebar = ''. "设置弹出窗口的标题栏
- ENDFORM. "layout_build
- *--------------------------------
- * Fields_Build
- *--------------------------------
- FORM fields_build.
- DATA: tmp_pos TYPE i.
- REFRESH i_fieldcat_alv.
- CLEAR i_fieldcat.
- * 定义宏设置FieldCat属性
- DEFINE fieldcatset.
- i_fieldcat-col_pos = &1.
- i_fieldcat-fieldname = &2.
- i_fieldcat-seltext_l = &3.
- i_fieldcat-no_out = &4.
- i_fieldcat-no_zero = &5.
- append i_fieldcat to i_fieldcat_alv.
- clear i_fieldcat.
- END-OF-DEFINITION.
- tmp_pos = tmp_pos + 1.
- fieldcatset tmp_pos 'VBELN' '订单号' ' ' 'X'.
- * tmp_pos = tmp_pos + 1.
- * fieldcatset tmp_pos 'KUNNR' '售达方' ' ' ' '.
- tmp_pos = tmp_pos + 1.
- fieldcatset tmp_pos 'POSNR' '项目' ' ' ' '.
- tmp_pos = tmp_pos + 1.
- fieldcatset tmp_pos 'VDATU' '请求交货日' ' ' ' '.
- tmp_pos = tmp_pos + 1.
- fieldcatset tmp_pos 'MATNR' '物料PN' ' ' ' '.
- tmp_pos = tmp_pos + 1.
- fieldcatset tmp_pos 'KWMENG' '销售订单数量' ' ' ' '.
- tmp_pos = tmp_pos + 1.
- fieldcatset tmp_pos 'EDATU' '计划交货日期' ' ' ' '.
- tmp_pos = tmp_pos + 1.
- fieldcatset tmp_pos 'WMENG' '计划交货数量' ' ' ' '.
- tmp_pos = tmp_pos + 1.
- fieldcatset tmp_pos 'BMENG' 'SAP确认数' ' ' ' '.
- * tmp_pos = tmp_pos + 1.
- * fieldcatset tmp_pos 'ERDAT' '实际交货日期' ' ' ' '.
- * tmp_pos = tmp_pos + 1.
- * fieldcatset tmp_pos 'KCMENG' '实际交货数量' ' ' ' '.
- * tmp_pos = tmp_pos + 1.
- * fieldcatset tmp_pos 'QTY_P' '计划内交货数量' ' ' ' '.
- tmp_pos = tmp_pos + 1.
- fieldcatset tmp_pos 'QTY_N' '未完成数量' ' ' ' '.
- tmp_pos = tmp_pos + 1.
- fieldcatset tmp_pos 'COMPLE' '达成率' ' ' ' '.
- ENDFORM. "Fields_Build
- *&---------------------------------------------------------------------*
- *& Form layout_sort_build
- *&---------------------------------------------------------------------*
- FORM layout_sort_build CHANGING lt_sort TYPE slis_t_sortinfo_alv.
- DATA ls_sort TYPE slis_sortinfo_alv.
- CLEAR ls_sort.
- ls_sort-fieldname = 'VBELN'.
- ls_sort-spos = 1.
- ls_sort-up = 'X'.
- ls_sort-subtot = 'X'.
- APPEND ls_sort TO lt_sort.
- ENDFORM. "Layout_sort_build
- *--------------------------------
- * DISPLAY_DATA
- *--------------------------------
- FORM display_data.
- DESCRIBE TABLE t_orderinfo LINES rcount.
- scount = rcount.
- CONCATENATE '符合条件的记录数:' scount INTO lstr.
- PERFORM layout_sort_build CHANGING it_sort.
- CALL FUNCTION 'REUSE_ALV_GRID_DISPLAY'
- EXPORTING
- i_callback_user_command = 'USER_COMMAND'
- "用户触发事件
- i_callback_program = w_repid "当前程序
- is_layout = i_layout
- "子函数Layout_build填充的格式定义
- it_fieldcat = i_fieldcat_alv[]
- "子函数Fields填充的各列
- it_events = i_events[]
- i_save = 'A' "保存变式
- it_sort = it_sort[]
- TABLES
- t_outtab = t_orderinfo.
- ENDFORM. "DISPLAY_DATA
- *---------------------------------------------------------------------*
- * FORM user_command *
- *---------------------------------------------------------------------*
- FORM user_command USING i_ucomm LIKE sy-ucomm
- selfield TYPE slis_selfield.
- * CASE I_UCOMM.
- * WHEN '&IC1'.
- * READ TABLE T_ORDERINFO INDEX SELFIELD-TABINDEX.
- * IF Sy-Subrc <> 0.
- * LEAVE LIST-PROCESSING.
- * ENDIF.
- *
- * SET PARAMETER ID 'BES' FIELD T_PONOInvoice-EBELN.
- * CALL TRANSACTION 'ME23N' AND SKIP FIRST SCREEN.
- *
- * ENDCASE.
- ENDFORM. "user_command
- *&---------------------------------------------------------------------*
- *& Form EVENTS_BUILD
- *&---------------------------------------------------------------------*
- FORM events_build.
- CALL FUNCTION 'REUSE_ALV_EVENTS_GET'
- EXPORTING
- i_list_type = 0
- IMPORTING
- et_events = i_events.
- * READ TABLE I_EVENTS WITH KEY NAME = 'END_OF_LIST' INTO W_EVENTS.
- IF sy-subrc = 0.
- MOVE 'ALV_END_OF_LIST' TO w_events-form.
- MODIFY i_events FROM w_events INDEX sy-tabix.
- ENDIF.
- * READ TABLE I_EVENTS WITH KEY NAME = 'USER_COMMAND' INTO W_EVENTS.
- * IF SY-SUBRC = 0.
- * MOVE 'USER_COMMAND' TO W_EVENTS-FORM.
- * MODIFY I_EVENTS FROM W_EVENTS INDEX SY-TABIX.
- * ENDIF.
- ENDFORM. "events_build
- *&--------------------------------------------------------------------*
- *& Form ALV_END_OF_LIST
- *&--------------------------------------------------------------------*
- FORM alv_end_of_list.
- CLEAR: i_list_comments.
- w_list_comments-typ = 'H'.
- w_list_comments-key = ''.
- w_list_comments-info = lstr.
- APPEND w_list_comments TO i_list_comments.
- CLEAR w_list_comments.
- w_list_comments-typ = 'S'.
- w_list_comments-info = '报表开发者:IT部 开发日期:2011/10/26'.
- APPEND w_list_comments TO i_list_comments.
- CLEAR w_list_comments.
- CALL FUNCTION 'REUSE_ALV_COMMENTARY_WRITE'
- EXPORTING
- it_list_commentary = i_list_comments
- i_end_of_list_grid = 'X'.
- ENDFORM. "ALV_END_OF_LIST
- *--------------------------------
- * CheckData
- *--------------------------------
- FORM checkdata.
- IF s_dndate[] IS INITIAL AND s_custom[] IS INITIAL AND s_matnr[] IS
- INITIAL AND s_ordno[] IS INITIAL.
- MESSAGE i000(zmsg) WITH '数据条件选项至少要输入一项!'.
- LEAVE LIST-PROCESSING.
- ENDIF.
- ENDFORM. "CheckData
- *--------------------------------
- * GetData根据计划交货日期取得资料
- *--------------------------------
- FORM getdata.
- l_loop = 0.
- s_date = s_dndate-low.
- e_date = s_dndate-high.
- *日期条件
- IF s_dndate-low IS INITIAL.
- s_date = '19000101'.
- ENDIF.
- APPEND ' VP~EDATU >= S_DATE ' TO str_where.
- IF s_dndate-high IS NOT INITIAL.
- APPEND ' AND VP~EDATU <= E_DATE ' TO str_where.
- ENDIF.
- *客户条件
- IF s_custom[] IS NOT INITIAL.
- APPEND ' AND VM~KUNNR IN S_CUSTOM ' TO str_where.
- ENDIF.
- *物料条件
- IF s_matnr[] IS NOT INITIAL.
- APPEND ' AND VD~MATNR IN S_MATNR ' TO str_where.
- ENDIF.
- *销售单号
- IF s_ordno[] IS NOT INITIAL.
- APPEND ' AND VD~VBELN IN S_ORDNO ' TO str_where.
- ENDIF.
- *-------------------------------
- *销售单数据信息
- *-------------------------------
- *销售单号及项目信息
- IF d1 = 'X'.
- SELECT DISTINCT vd~vbeln vd~posnr
- FROM vbak AS vm INNER JOIN vbap AS vd ON vm~vbeln = vd~vbeln
- INNER JOIN vbep AS vp ON vd~vbeln = vp~vbeln AND vd~posnr = vp~posnr
- INTO CORRESPONDING FIELDS OF TABLE t_vbap
- WHERE (str_where) AND vp~wmeng > 0 ORDER BY vd~vbeln vd~posnr.
- ELSEIF d2 = 'X'.
- SELECT DISTINCT vd~vbeln vd~posnr
- FROM vbak AS vm INNER JOIN vbap AS vd ON vm~vbeln = vd~vbeln
- INNER JOIN vbep AS vp ON vd~vbeln = vp~vbeln AND vd~posnr = vp~posnr
- INTO CORRESPONDING FIELDS OF TABLE t_vbap
- WHERE (str_where) AND vp~BMENG > 0 ORDER BY vd~vbeln vd~posnr.
- ELSE.
- MESSAGE i000(zmsg) WITH '请先选择是计划交货还是实际交货!'.
- LEAVE LIST-PROCESSING.
- ENDIF.
- IF t_vbap[] IS INITIAL .
- MESSAGE i000(zmsg) WITH '没找到对应的数据,请更改查询条件'.
- LEAVE LIST-PROCESSING .
- ENDIF.
- *从表VBAK(销售单抬头) VBAP(销售单项目数据) VBEP(销售单计划行数据)
- *取出销售单数据:销售单号、售达方、项目、物料编号、订单总数量、
- *计划交货日期、计划交货量、确认的数量
- * SELECT vm~vbeln vm~kunnr vd~posnr vd~matnr vd~kwmeng
- * vp~edatu SUM( vp~wmeng ) AS wmeng SUM( vp~bmeng ) AS bmeng
- * INTO CORRESPONDING FIELDS OF TABLE t_orderinfo
- * FROM vbak AS vm INNER JOIN vbap AS vd ON vm~vbeln = vd~vbeln
- * INNER JOIN vbep AS vp ON vd~vbeln = vp~vbeln AND vd~posnr = vp~posnr
- * WHERE (str_where)
- * GROUP BY vm~vbeln vm~kunnr vd~posnr vd~matnr vd~kwmeng vp~edatu
- * ORDER BY vm~kunnr vm~vbeln vd~posnr vd~matnr vp~edatu.
- * 提取基本数据 VBAK,VBAP
- SELECT vm~vbeln vm~kunnr vd~posnr vd~matnr vm~vdatu vd~kwmeng
- vp~edatu vp~wmeng vp~bmeng
- INTO CORRESPONDING FIELDS OF TABLE t_orderinfo
- FROM vbak AS vm INNER JOIN vbap AS vd ON vm~vbeln = vd~vbeln
- INNER JOIN vbep AS vp ON vd~vbeln = vp~vbeln AND vd~posnr = vp~posnr
- FOR ALL ENTRIES IN t_vbap
- WHERE vd~vbeln = t_vbap-vbeln and vd~posnr = t_vbap-posnr.
- * 提取计划数据 VBEP
- SELECT v~vbeln v~posnr v~etenr v~edatu v~wmeng v~bmeng
- INTO CORRESPONDING FIELDS OF TABLE t_orderinfoAll
- FROM vbep as v
- FOR ALL ENTRIES IN t_vbap
- WHERE v~vbeln = t_vbap-vbeln and v~posnr = t_vbap-posnr.
- *-------------------------------
- *销售单交货数据信息
- *-------------------------------
- *取出交货单信息:交货单号、项目、销售单号、销售单项目、物料编号、实际货物移动日期、合计出货数
- * LOOP AT t_vbap.
- * SELECT ld~vbeln ld~posnr ld~vgbel ld~vgpos ld~matnr lm~wadat_ist
- *SUM( ld~kcmeng ) AS kcmeng
- * INTO CORRESPONDING FIELDS OF TABLE t_lips
- * FROM lips AS ld INNER JOIN likp AS lm ON ld~vbeln = lm~vbeln
- * WHERE ld~vgbel = t_vbap-vbeln AND ld~vgpos = t_vbap-posnr
- * AND ld~posnr < '900001' AND ld~kcmeng > 0
- * GROUP BY ld~vbeln ld~matnr ld~posnr ld~vgbel ld~vgpos lm~wadat_ist
- * ORDER BY ld~vbeln ld~posnr ld~vgbel ld~vgpos .
- * ENDLOOP.
- * SORT t_orderinfo BY matnr.
- * l_loop = 0.
- * LOOP AT t_orderinfo.
- * l_loop = sy-tabix.
- * CLEAR t_lips.
- * READ TABLE t_lips WITH KEY vgbel = t_orderinfo-vbeln
- * vgpos = t_orderinfo-posnr.
- * IF sy-subrc = 0.
- * t_orderinfo-kcmeng = t_lips-kcmeng.
- * t_orderinfo-erdat = t_lips-wadat_ist.
- * IF ss_matnr <> t_orderinfo-matnr.
- * ss_qty = 0.
- * t_orderinfo-qty_p = t_orderinfo-kwmeng.
- * t_orderinfo-qty_n = t_lips-kcmeng - t_orderinfo-wmeng + ss_qty.
- * IF t_orderinfo-qty_p = 0.
- * t_orderinfo-comple = 1.
- * ELSE.
- * t_orderinfo-comple = 1 - ( t_orderinfo-qty_n / t_orderinfo-qty_p
- * ).
- * ENDIF.
- * ELSE.
- * t_orderinfo-qty_p = t_orderinfo-kwmeng.
- * t_orderinfo-qty_n = t_lips-kcmeng - t_orderinfo-wmeng + ss_qty.
- * ss_qty = t_lips-kcmeng - t_orderinfo-wmeng + ss_qty.
- * IF t_orderinfo-qty_p = 0.
- * t_orderinfo-comple = 1 .
- * ELSE.
- * t_orderinfo-comple = 1 - ( t_orderinfo-qty_n / t_orderinfo-qty_p
- * ).
- * ENDIF.
- * ENDIF.
- * ELSE.
- * t_orderinfo-comple = 0.
- * ENDIF.
- * ss_matnr = t_orderinfo-matnr.
- * MODIFY t_orderinfo INDEX l_loop.
- * sy-tabix = l_loop + 1.
- * ENDLOOP.
- l_loop = 0.
- ss_matnr = ''.
- ss_qty = 0.
- ss_matnr = ''.
- ss_qty = 0.
- LOOP AT t_orderinfo.
- l_loop = sy-tabix.
- if ss_matnr <> t_orderinfo-matnr.
- ss_qty = 0.
- t_orderinfo-qty_n = t_orderinfo-bmeng - t_orderinfo-wmeng.
- ss_qty = t_orderinfo-bmeng - t_orderinfo-wmeng.
- t_orderinfo-comple = ( t_orderinfo-bmeng / t_orderinfo-kwmeng ) *
- 100 .
- else.
- t_orderinfo-qty_n = t_orderinfo-bmeng - t_orderinfo-wmeng + ss_qty.
- ss_qty = t_orderinfo-bmeng - t_orderinfo-wmeng + ss_qty.
- t_orderinfo-comple = ( 1 - ss_qty / t_orderinfo-kwmeng ) * 100 .
- endif.
- t_orderinfo-comple = t_orderinfo-comple(5).
- CONCATENATE t_orderinfo-comple '%' INTO t_orderinfo-comple.
- ss_matnr = t_orderinfo-matnr.
- MODIFY t_orderinfo INDEX l_loop.
- sy-tabix = l_loop + 1.
- ENDLOOP.
- ENDFORM. "getdata
*&---------------------------------------------------------------------*
*& Report ZSD017
*&---------------------------------------------------------------------*
* Author : Jasson.Lee
* Date : 2011/12/28
* Purpose: 销售订单达成率,注意日期选择不同,数据算法不同
* Change History :
* Date Author Descriptions
* ========== ================ ==========================================
* 2011/12/28 Jasson.Lee Create
*-----------------------------------------------------------------------
REPORT zsd017.
*--------------------------------
* Global Types
* Essential Declaration for ALV Display
*--------------------------------
TYPE-POOLS: slis.
DATA :
i_fieldcat_alv TYPE slis_t_fieldcat_alv ,
i_fieldcat_alv_t TYPE slis_t_fieldcat_alv,
i_fieldcat_alv_p TYPE slis_t_fieldcat_alv,
i_layout TYPE slis_layout_alv,
i_fieldcat TYPE slis_fieldcat_alv,
i_events TYPE slis_t_event,
w_events LIKE LINE OF i_events,
i_list_comments TYPE slis_t_listheader,
w_list_comments LIKE LINE OF i_list_comments,
it_sort TYPE slis_t_sortinfo_alv,
w_repid LIKE sy-repid.
TABLES: vbak, vbap, vbkd, vbep, likp, lips, mara.
*销售单信息
DATA: BEGIN OF t_vbap OCCURS 0,
vbeln LIKE vbap-vbeln, "ORDER NO
posnr LIKE vbap-posnr, "销售项目编号
END OF t_vbap.
*SD计划行项目信息VBEP
DATA: BEGIN OF t_orderinfoAll OCCURS 0,
vbeln LIKE vbep-vbeln, "ORDER NO
posnr LIKE vbep-posnr, "销售项目编号
etenr LIKE vbep-etenr, "行计划
edatu LIKE vbep-edatu, "计划交货日期
wmeng LIKE vbep-wmeng, "计划交货数量
bmeng LIKE vbep-bmeng, "确认的数量
END OF t_orderinfoAll.
DATA: BEGIN OF t_orderinfo OCCURS 0,
vbeln LIKE vbak-vbeln, "ORDER NO
kunnr LIKE vbak-kunnr, "售达方
posnr LIKE vbap-posnr, "销售项目编号
matnr LIKE vbap-matnr, "物料号
vdatu LIKE vbak-vdatu, "请求交货日
kwmeng LIKE vbap-kwmeng, "销售订单数量
edatu LIKE vbep-edatu, "计划交货日期
wmeng LIKE vbep-wmeng, "计划交货数量
bmeng LIKE vbep-bmeng, "确认的数量
erdat LIKE lips-erdat, "实际交货日期
kcmeng LIKE lips-kcmeng, "实际交货数量
qty_p LIKE lips-kcmeng, "计划内交货数量
qty_n LIKE lips-kcmeng, "未完成数量
comple(6) TYPE C, "达成率
END OF t_orderinfo.
*交货信息表
*DATA: BEGIN OF t_lips OCCURS 0,
* vbeln LIKE lips-vbeln, "交货单号
* posnr LIKE lips-posnr, "项目
* vgbel LIKE lips-vgbel, "销售单号
* vgpos LIKE lips-vgpos, "销售单项目号
* matnr LIKE lips-matnr, "物料号
* wadat_ist LIKE likp-wadat_ist, "实际交货日期
* kcmeng LIKE lips-kcmeng, "合计出货数
*END OF t_lips.
DATA: str_where TYPE TABLE OF edpline.
DATA: l_loop TYPE i, l_ordrow TYPE i, l_rowcount TYPE i.
DATA: rcount TYPE i, rowcount TYPE i.
DATA: scount(8).
DATA: lstr(20).
DATA: s_date TYPE d, e_date TYPE d.
DATA:
ss_matnr LIKE vbap-matnr,
ss_qty LIKE lips-kcmeng.
*--------------------------------
* Selection Screen
*--------------------------------
SELECTION-SCREEN BEGIN OF BLOCK b1 WITH FRAME TITLE text-001.
SELECTION-SCREEN BEGIN OF LINE.
SELECTION-SCREEN POSITION 1.
PARAMETERS:
d1 RADIOBUTTON GROUP d DEFAULT 'X'. "计划交货日期
SELECTION-SCREEN COMMENT 6(10) stext01 FOR FIELD d1.
SELECTION-SCREEN POSITION 18.
PARAMETERS:
d2 RADIOBUTTON GROUP d. "实际交货日期
SELECTION-SCREEN COMMENT 21(10) stext02 FOR FIELD d2.
SELECTION-SCREEN END OF LINE.
SELECT-OPTIONS:
s_dndate FOR vbep-edatu. "日期选择
SELECTION-SCREEN END OF BLOCK b1.
SELECTION-SCREEN BEGIN OF BLOCK b2 WITH FRAME TITLE text-002.
SELECT-OPTIONS:
s_custom FOR vbak-kunnr LOWER CASE, "客户
s_matnr FOR vbap-matnr, "物料 PN
s_ordno FOR vbep-vbeln. "销售单
SELECTION-SCREEN END OF BLOCK b2.
*INCLUDE zcommon.
INITIALIZATION.
AT SELECTION-SCREEN OUTPUT.
stext01 = '计划交货日期'.
stext02 = '实际交货日期'.
*--------------------------------
* Start of Selection
*--------------------------------
START-OF-SELECTION.
PERFORM checkdata.
PERFORM getdata.
PERFORM events_build.
PERFORM layout_build.
PERFORM fields_build.
PERFORM display_data.
END-OF-SELECTION.
*--------------------------------
* Top of Page
*--------------------------------
TOP-OF-PAGE.
*--------------------------------
* At User Command
*--------------------------------
AT USER-COMMAND.
*--------------------------------
* At Line Selection
*--------------------------------
AT LINE-SELECTION.
*&---------------------------------------------------------------------*
*& Form LAYOUT_BUILD
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
FORM layout_build.
w_repid = sy-repid. "程序为当前程序
i_layout-info_fieldname = 'COLOR'. "颜色值
i_layout-colwidth_optimize = 'X'. "优化列宽选项是否设置
i_layout-detail_initial_lines = 'X'.
i_layout-detail_titlebar = ''. "设置弹出窗口的标题栏
ENDFORM. "layout_build
*--------------------------------
* Fields_Build
*--------------------------------
FORM fields_build.
DATA: tmp_pos TYPE i.
REFRESH i_fieldcat_alv.
CLEAR i_fieldcat.
* 定义宏设置FieldCat属性
DEFINE fieldcatset.
i_fieldcat-col_pos = &1.
i_fieldcat-fieldname = &2.
i_fieldcat-seltext_l = &3.
i_fieldcat-no_out = &4.
i_fieldcat-no_zero = &5.
append i_fieldcat to i_fieldcat_alv.
clear i_fieldcat.
END-OF-DEFINITION.
tmp_pos = tmp_pos + 1.
fieldcatset tmp_pos 'VBELN' '订单号' ' ' 'X'.
* tmp_pos = tmp_pos + 1.
* fieldcatset tmp_pos 'KUNNR' '售达方' ' ' ' '.
tmp_pos = tmp_pos + 1.
fieldcatset tmp_pos 'POSNR' '项目' ' ' ' '.
tmp_pos = tmp_pos + 1.
fieldcatset tmp_pos 'VDATU' '请求交货日' ' ' ' '.
tmp_pos = tmp_pos + 1.
fieldcatset tmp_pos 'MATNR' '物料PN' ' ' ' '.
tmp_pos = tmp_pos + 1.
fieldcatset tmp_pos 'KWMENG' '销售订单数量' ' ' ' '.
tmp_pos = tmp_pos + 1.
fieldcatset tmp_pos 'EDATU' '计划交货日期' ' ' ' '.
tmp_pos = tmp_pos + 1.
fieldcatset tmp_pos 'WMENG' '计划交货数量' ' ' ' '.
tmp_pos = tmp_pos + 1.
fieldcatset tmp_pos 'BMENG' 'SAP确认数' ' ' ' '.
* tmp_pos = tmp_pos + 1.
* fieldcatset tmp_pos 'ERDAT' '实际交货日期' ' ' ' '.
* tmp_pos = tmp_pos + 1.
* fieldcatset tmp_pos 'KCMENG' '实际交货数量' ' ' ' '.
* tmp_pos = tmp_pos + 1.
* fieldcatset tmp_pos 'QTY_P' '计划内交货数量' ' ' ' '.
tmp_pos = tmp_pos + 1.
fieldcatset tmp_pos 'QTY_N' '未完成数量' ' ' ' '.
tmp_pos = tmp_pos + 1.
fieldcatset tmp_pos 'COMPLE' '达成率' ' ' ' '.
ENDFORM. "Fields_Build
*&---------------------------------------------------------------------*
*& Form layout_sort_build
*&---------------------------------------------------------------------*
FORM layout_sort_build CHANGING lt_sort TYPE slis_t_sortinfo_alv.
DATA ls_sort TYPE slis_sortinfo_alv.
CLEAR ls_sort.
ls_sort-fieldname = 'VBELN'.
ls_sort-spos = 1.
ls_sort-up = 'X'.
ls_sort-subtot = 'X'.
APPEND ls_sort TO lt_sort.
ENDFORM. "Layout_sort_build
*--------------------------------
* DISPLAY_DATA
*--------------------------------
FORM display_data.
DESCRIBE TABLE t_orderinfo LINES rcount.
scount = rcount.
CONCATENATE '符合条件的记录数:' scount INTO lstr.
PERFORM layout_sort_build CHANGING it_sort.
CALL FUNCTION 'REUSE_ALV_GRID_DISPLAY'
EXPORTING
i_callback_user_command = 'USER_COMMAND'
"用户触发事件
i_callback_program = w_repid "当前程序
is_layout = i_layout
"子函数Layout_build填充的格式定义
it_fieldcat = i_fieldcat_alv[]
"子函数Fields填充的各列
it_events = i_events[]
i_save = 'A' "保存变式
it_sort = it_sort[]
TABLES
t_outtab = t_orderinfo.
ENDFORM. "DISPLAY_DATA
*---------------------------------------------------------------------*
* FORM user_command *
*---------------------------------------------------------------------*
FORM user_command USING i_ucomm LIKE sy-ucomm
selfield TYPE slis_selfield.
* CASE I_UCOMM.
* WHEN '&IC1'.
* READ TABLE T_ORDERINFO INDEX SELFIELD-TABINDEX.
* IF Sy-Subrc <> 0.
* LEAVE LIST-PROCESSING.
* ENDIF.
*
* SET PARAMETER ID 'BES' FIELD T_PONOInvoice-EBELN.
* CALL TRANSACTION 'ME23N' AND SKIP FIRST SCREEN.
*
* ENDCASE.
ENDFORM. "user_command
*&---------------------------------------------------------------------*
*& Form EVENTS_BUILD
*&---------------------------------------------------------------------*
FORM events_build.
CALL FUNCTION 'REUSE_ALV_EVENTS_GET'
EXPORTING
i_list_type = 0
IMPORTING
et_events = i_events.
* READ TABLE I_EVENTS WITH KEY NAME = 'END_OF_LIST' INTO W_EVENTS.
IF sy-subrc = 0.
MOVE 'ALV_END_OF_LIST' TO w_events-form.
MODIFY i_events FROM w_events INDEX sy-tabix.
ENDIF.
* READ TABLE I_EVENTS WITH KEY NAME = 'USER_COMMAND' INTO W_EVENTS.
* IF SY-SUBRC = 0.
* MOVE 'USER_COMMAND' TO W_EVENTS-FORM.
* MODIFY I_EVENTS FROM W_EVENTS INDEX SY-TABIX.
* ENDIF.
ENDFORM. "events_build
*&--------------------------------------------------------------------*
*& Form ALV_END_OF_LIST
*&--------------------------------------------------------------------*
FORM alv_end_of_list.
CLEAR: i_list_comments.
w_list_comments-typ = 'H'.
w_list_comments-key = ''.
w_list_comments-info = lstr.
APPEND w_list_comments TO i_list_comments.
CLEAR w_list_comments.
w_list_comments-typ = 'S'.
w_list_comments-info = '报表开发者:IT部 开发日期:2011/10/26'.
APPEND w_list_comments TO i_list_comments.
CLEAR w_list_comments.
CALL FUNCTION 'REUSE_ALV_COMMENTARY_WRITE'
EXPORTING
it_list_commentary = i_list_comments
i_end_of_list_grid = 'X'.
ENDFORM. "ALV_END_OF_LIST
*--------------------------------
* CheckData
*--------------------------------
FORM checkdata.
IF s_dndate[] IS INITIAL AND s_custom[] IS INITIAL AND s_matnr[] IS
INITIAL AND s_ordno[] IS INITIAL.
MESSAGE i000(zmsg) WITH '数据条件选项至少要输入一项!'.
LEAVE LIST-PROCESSING.
ENDIF.
ENDFORM. "CheckData
*--------------------------------
* GetData根据计划交货日期取得资料
*--------------------------------
FORM getdata.
l_loop = 0.
s_date = s_dndate-low.
e_date = s_dndate-high.
*日期条件
IF s_dndate-low IS INITIAL.
s_date = '19000101'.
ENDIF.
APPEND ' VP~EDATU >= S_DATE ' TO str_where.
IF s_dndate-high IS NOT INITIAL.
APPEND ' AND VP~EDATU <= E_DATE ' TO str_where.
ENDIF.
*客户条件
IF s_custom[] IS NOT INITIAL.
APPEND ' AND VM~KUNNR IN S_CUSTOM ' TO str_where.
ENDIF.
*物料条件
IF s_matnr[] IS NOT INITIAL.
APPEND ' AND VD~MATNR IN S_MATNR ' TO str_where.
ENDIF.
*销售单号
IF s_ordno[] IS NOT INITIAL.
APPEND ' AND VD~VBELN IN S_ORDNO ' TO str_where.
ENDIF.
*-------------------------------
*销售单数据信息
*-------------------------------
*销售单号及项目信息
IF d1 = 'X'.
SELECT DISTINCT vd~vbeln vd~posnr
FROM vbak AS vm INNER JOIN vbap AS vd ON vm~vbeln = vd~vbeln
INNER JOIN vbep AS vp ON vd~vbeln = vp~vbeln AND vd~posnr = vp~posnr
INTO CORRESPONDING FIELDS OF TABLE t_vbap
WHERE (str_where) AND vp~wmeng > 0 ORDER BY vd~vbeln vd~posnr.
ELSEIF d2 = 'X'.
SELECT DISTINCT vd~vbeln vd~posnr
FROM vbak AS vm INNER JOIN vbap AS vd ON vm~vbeln = vd~vbeln
INNER JOIN vbep AS vp ON vd~vbeln = vp~vbeln AND vd~posnr = vp~posnr
INTO CORRESPONDING FIELDS OF TABLE t_vbap
WHERE (str_where) AND vp~BMENG > 0 ORDER BY vd~vbeln vd~posnr.
ELSE.
MESSAGE i000(zmsg) WITH '请先选择是计划交货还是实际交货!'.
LEAVE LIST-PROCESSING.
ENDIF.
IF t_vbap[] IS INITIAL .
MESSAGE i000(zmsg) WITH '没找到对应的数据,请更改查询条件'.
LEAVE LIST-PROCESSING .
ENDIF.
*从表VBAK(销售单抬头) VBAP(销售单项目数据) VBEP(销售单计划行数据)
*取出销售单数据:销售单号、售达方、项目、物料编号、订单总数量、
*计划交货日期、计划交货量、确认的数量
* SELECT vm~vbeln vm~kunnr vd~posnr vd~matnr vd~kwmeng
* vp~edatu SUM( vp~wmeng ) AS wmeng SUM( vp~bmeng ) AS bmeng
* INTO CORRESPONDING FIELDS OF TABLE t_orderinfo
* FROM vbak AS vm INNER JOIN vbap AS vd ON vm~vbeln = vd~vbeln
* INNER JOIN vbep AS vp ON vd~vbeln = vp~vbeln AND vd~posnr = vp~posnr
* WHERE (str_where)
* GROUP BY vm~vbeln vm~kunnr vd~posnr vd~matnr vd~kwmeng vp~edatu
* ORDER BY vm~kunnr vm~vbeln vd~posnr vd~matnr vp~edatu.
* 提取基本数据 VBAK,VBAP
SELECT vm~vbeln vm~kunnr vd~posnr vd~matnr vm~vdatu vd~kwmeng
vp~edatu vp~wmeng vp~bmeng
INTO CORRESPONDING FIELDS OF TABLE t_orderinfo
FROM vbak AS vm INNER JOIN vbap AS vd ON vm~vbeln = vd~vbeln
INNER JOIN vbep AS vp ON vd~vbeln = vp~vbeln AND vd~posnr = vp~posnr
FOR ALL ENTRIES IN t_vbap
WHERE vd~vbeln = t_vbap-vbeln and vd~posnr = t_vbap-posnr.
* 提取计划数据 VBEP
SELECT v~vbeln v~posnr v~etenr v~edatu v~wmeng v~bmeng
INTO CORRESPONDING FIELDS OF TABLE t_orderinfoAll
FROM vbep as v
FOR ALL ENTRIES IN t_vbap
WHERE v~vbeln = t_vbap-vbeln and v~posnr = t_vbap-posnr.
*-------------------------------
*销售单交货数据信息
*-------------------------------
*取出交货单信息:交货单号、项目、销售单号、销售单项目、物料编号、实际货物移动日期、合计出货数
* LOOP AT t_vbap.
* SELECT ld~vbeln ld~posnr ld~vgbel ld~vgpos ld~matnr lm~wadat_ist
*SUM( ld~kcmeng ) AS kcmeng
* INTO CORRESPONDING FIELDS OF TABLE t_lips
* FROM lips AS ld INNER JOIN likp AS lm ON ld~vbeln = lm~vbeln
* WHERE ld~vgbel = t_vbap-vbeln AND ld~vgpos = t_vbap-posnr
* AND ld~posnr < '900001' AND ld~kcmeng > 0
* GROUP BY ld~vbeln ld~matnr ld~posnr ld~vgbel ld~vgpos lm~wadat_ist
* ORDER BY ld~vbeln ld~posnr ld~vgbel ld~vgpos .
* ENDLOOP.
* SORT t_orderinfo BY matnr.
* l_loop = 0.
* LOOP AT t_orderinfo.
* l_loop = sy-tabix.
* CLEAR t_lips.
* READ TABLE t_lips WITH KEY vgbel = t_orderinfo-vbeln
* vgpos = t_orderinfo-posnr.
* IF sy-subrc = 0.
* t_orderinfo-kcmeng = t_lips-kcmeng.
* t_orderinfo-erdat = t_lips-wadat_ist.
* IF ss_matnr <> t_orderinfo-matnr.
* ss_qty = 0.
* t_orderinfo-qty_p = t_orderinfo-kwmeng.
* t_orderinfo-qty_n = t_lips-kcmeng - t_orderinfo-wmeng + ss_qty.
* IF t_orderinfo-qty_p = 0.
* t_orderinfo-comple = 1.
* ELSE.
* t_orderinfo-comple = 1 - ( t_orderinfo-qty_n / t_orderinfo-qty_p
* ).
* ENDIF.
* ELSE.
* t_orderinfo-qty_p = t_orderinfo-kwmeng.
* t_orderinfo-qty_n = t_lips-kcmeng - t_orderinfo-wmeng + ss_qty.
* ss_qty = t_lips-kcmeng - t_orderinfo-wmeng + ss_qty.
* IF t_orderinfo-qty_p = 0.
* t_orderinfo-comple = 1 .
* ELSE.
* t_orderinfo-comple = 1 - ( t_orderinfo-qty_n / t_orderinfo-qty_p
* ).
* ENDIF.
* ENDIF.
* ELSE.
* t_orderinfo-comple = 0.
* ENDIF.
* ss_matnr = t_orderinfo-matnr.
* MODIFY t_orderinfo INDEX l_loop.
* sy-tabix = l_loop + 1.
* ENDLOOP.
l_loop = 0.
ss_matnr = ''.
ss_qty = 0.
ss_matnr = ''.
ss_qty = 0.
LOOP AT t_orderinfo.
l_loop = sy-tabix.
if ss_matnr <> t_orderinfo-matnr.
ss_qty = 0.
t_orderinfo-qty_n = t_orderinfo-bmeng - t_orderinfo-wmeng.
ss_qty = t_orderinfo-bmeng - t_orderinfo-wmeng.
t_orderinfo-comple = ( t_orderinfo-bmeng / t_orderinfo-kwmeng ) *
100 .
else.
t_orderinfo-qty_n = t_orderinfo-bmeng - t_orderinfo-wmeng + ss_qty.
ss_qty = t_orderinfo-bmeng - t_orderinfo-wmeng + ss_qty.
t_orderinfo-comple = ( 1 - ss_qty / t_orderinfo-kwmeng ) * 100 .
endif.
t_orderinfo-comple = t_orderinfo-comple(5).
CONCATENATE t_orderinfo-comple '%' INTO t_orderinfo-comple.
ss_matnr = t_orderinfo-matnr.
MODIFY t_orderinfo INDEX l_loop.
sy-tabix = l_loop + 1.
ENDLOOP.
ENDFORM. "getdata