其实早就应该写了,但一直落下来了。现在什么都记不得了,咳。直接上代码吧。
*&---------------------------------------------------------------------*
*& 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