ZSD017出货达成率

    其实早就应该写了,但一直落下来了。现在什么都记不得了,咳。直接上代码吧。

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


猜你喜欢

转载自blog.csdn.net/jiali765/article/details/7268209
017