ZPO006采购单收货报表

9 篇文章 0 订阅
2 篇文章 0 订阅

      最近来了新的需求就是依据PO日期查询到采购单收货但未开发票的报表,当然这一部分还是运用ALV来实现是比较实在。先来看看界面吧.

执行后的结果是:

代码包括三还包括三部分:INCLUDE ZPO006F00.    "构建ALV

INCLUDE ZPO006F01.    "取得数据

INCLUDE ZCOMMON.       "通用模组 

其中通用模组上次有讲到过,就是一些平常用的比较多的程式集合。有不了解的童鞋可以参考我的另一篇博文:ZCOMMON通用模组http://blog.csdn.net/jiali765/article/details/7285667

 

现在来上code,先看入口ZPO006

 

*&---------------------------------------------------------------------*
*& Report  ZPO006
*&---------------------------------------------------------------------*
* Author : Jasson.Lee
* Date   : 2011/10/06
* Purpose: 采购单收货但未开发票一览表(含根本未收货的采购信息)
*已开票的数量与采购单中的数量做比较,如果相同则说明已完全开完发票
* Change History :
*    Date       Author        Descriptions
* ========== ================ ==========================================

*-----------------------------------------------------------------------
REPORT  ZPO006.

TABLES: EKKO, EKPO, EKBE, EKET, T023T.
*--------------------------------
* Global Types
* Essential Declaration for ALV Display
*--------------------------------
INCLUDE ZPO006TOP.

*--------------------------------
* Selection Screen
*--------------------------------
SELECTION-SCREEN BEGIN OF BLOCK B1 WITH FRAME TITLE TEXT-001.
  SELECT-OPTIONS:
    S_PODATE FOR EKKO-BEDAT.        "PO日期选择
SELECTION-SCREEN END OF BLOCK B1.

SELECTION-SCREEN BEGIN OF BLOCK B2 WITH FRAME TITLE TEXT-002.
PARAMETERS:
    D1 RADIOBUTTON GROUP GRP DEFAULT 'X',    "收完货
    D2 RADIOBUTTON GROUP GRP,                "收完货未开票
    D3 RADIOBUTTON GROUP GRP.                "收完货已开票
SELECTION-SCREEN END OF BLOCK B2.

INCLUDE ZPO006F00.    "构建ALV
INCLUDE ZPO006F01.    "取得数据
INCLUDE ZCOMMON.

INITIALIZATION.

AT SELECTION-SCREEN OUTPUT.

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


    再来看包含的 INCLUDE ZPO006F00.    "构建ALV

*&---------------------------------------------------------------------*
*&  Include           ZMM070F00
*&---------------------------------------------------------------------*
*--------------------------------
* Layout_Build
*--------------------------------
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.
    APPEND I_FIELDCAT To I_FIELDCAT_ALV.
    Clear I_FIELDCAT.
  End-Of-Definition.

  Tmp_pos = Tmp_pos + 1.
  FieldCatSet Tmp_pos 'EBELN' 'PO' ' '.

  Tmp_pos = Tmp_pos + 1.
  FieldCatSet Tmp_pos 'EBELP' 'PO_Item' ' '.

  Tmp_pos = Tmp_pos + 1.
  FieldCatSet Tmp_pos 'MATKL' '物料组' ' '.

  Tmp_pos = Tmp_pos + 1.
  FieldCatSet Tmp_pos 'WGBEZ' '物料组描述' ' '.

  Tmp_pos = Tmp_pos + 1.
  FieldCatSet Tmp_pos 'AEDAT' '创建日期' ' '.

  Tmp_pos = Tmp_pos + 1.
  FieldCatSet Tmp_pos 'EINDT' '计划交货日期' ' '.

  Tmp_pos = Tmp_pos + 1.
  FieldCatSet Tmp_pos 'PQTY' '采购单数量' ' '.

  Tmp_pos = Tmp_pos + 1.
  FieldCatSet Tmp_pos 'PNETWR' '订单净值' ' '.

  Tmp_pos = Tmp_pos + 1.
  FieldCatSet Tmp_pos 'WAERS' '货币码' ' '.

  Tmp_pos = Tmp_pos + 1.
  FieldCatSet Tmp_pos 'RATE' '汇率' ' '.

  Tmp_pos = Tmp_pos + 1.
  FieldCatSet Tmp_pos 'MQTY' '收货数量' ' '.

  Tmp_pos = Tmp_pos + 1.
  FieldCatSet Tmp_pos 'IPOQTY' '发票(订单单位)数量' ' '.

  Tmp_pos = Tmp_pos + 1.
  FieldCatSet Tmp_pos 'IQTY' '发票(订单价格单位)数量' 'X'.

  Tmp_pos = Tmp_pos + 1.
  FieldCatSet Tmp_pos 'INETWR' '发票金额' ' '.

  Tmp_pos = Tmp_pos + 1.
  FieldCatSet Tmp_pos 'ZUOM' '采购单计量单位' ' '.

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 = 'EBELN'.
  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_PONOInvoice 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_PONOInvoice.

ENDFORM.
*---------------------------------------------------------------------*
*       FORM user_command                                             *
*---------------------------------------------------------------------*
FORM USER_COMMAND USING I_UCOMM LIKE SY-UCOMM
                           SELFIELD TYPE SLIS_SELFIELD.
 CASE I_UCOMM.
  WHEN '&IC1'.
    READ TABLE T_PONOInvoice 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/07'.
  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


   最后就是看包含的 INCLUDE ZPO006F01.    "取得数据

*&---------------------------------------------------------------------*
*&  Include           ZPO006F01
*&---------------------------------------------------------------------*
*--------------------------------
* CheckData
*--------------------------------
FORM CheckData.
  IF S_PODATE[] IS INITIAL.
    MESSAGE I000(ZMSG) WITH '起止日期至少要输入一项'.
    LEAVE LIST-PROCESSING.
  ENDIF.
ENDFORM.

*--------------------------------
* GetData
*--------------------------------
Form GetData.

  S_DATE = S_PODATE-LOW.
  E_DATE = S_PODATE-HIGH.

  IF S_PODATE-LOW IS INITIAL.
    S_DATE = '00000000'.
  ENDIF.

  IF S_PODATE-HIGH IS INITIAL.
    E_DATE = '99991231'.
  ENDIF.

  SELECT * FROM EKPO WHERE LOEKZ = ' ' AND EREKZ = ' ' AND ELIKZ = 'X'
    AND EBELN IN ( SELECT DISTINCT EBELN FROM EKKO WHERE BEDAT >= S_DATE And BEDAT <= E_DATE ).

*取出已收货数量与项目计划交货日期
    ZMIGO_QTY = 0.
    SELECT SUM( WEMNG ) MIN( EINDT ) INTO (ZMIGO_QTY, ZEINDT) FROM EKET
    WHERE EBELN = EKPO-EBELN AND EBELP = EKPO-EBELP.

*如果没有收货,不处理
    If ZMIGO_QTY = 0.
      Continue.
    EndIf.

    SELECT SINGLE AEDAT WAERS WKURS ZBD1T ZBD2T ZBD3T
      INTO (ZCDATE,ZCURR,ZPO_RATE,ZPAY_DAY1,ZPAY_DAY2,ZPAY_DAY3)
      FROM EKKO WHERE EBELN = EKPO-EBELN.

    SELECT SINGLE WGBEZ INTO T_PONOInvoice-WGBEZ FROM T023T     "取出物料组描述
      WHERE SPRAS = SY-LANGU AND MATKL = EKPO-MATKL.

*从表(采购凭证历史)EKBE中,汇总该采购单价格单位的数量与凭证货币金额
    ZINVOICED_VALUE = 0.     "发票金额
    ZINVOICED_QTY = 0.       "采购订单价格单位数量
    ZINVPO_QTY = 0.          "采购订单单位数量
    RowCount = 0.            "开票
    SELECT COUNT( * )  into (RowCount) FROM EKBE
      WHERE EBELN = EKPO-EBELN AND EBELP = EKPO-EBELP AND VGABE IN ('2', '3').

*收完货未开票情况
    IF D3 = 'X' AND RowCount = 0.
      CONTINUE.
    ENDIF.

*收完货已开票情况
    IF D2 = 'X' AND RowCount > 0.
      CONTINUE.
    ENDIF.

    SELECT * FROM EKBE
      WHERE EBELN = EKPO-EBELN AND EBELP = EKPO-EBELP AND VGABE IN ('2', '3').

*"SHKZG H贷方 S借方
*"Order Unit Quantities
      IF EKBE-SHKZG = 'H'.
        EKBE-BPMNG = EKBE-BPMNG * -1.
      ENDIF.
      ZINVOICED_QTY = ZINVOICED_QTY + EKBE-BPMNG.

*"Order Price Unit Quantities
      IF EKBE-SHKZG = 'H'.
        EKBE-MENGE = EKBE-MENGE * -1.
      ENDIF.
      ZINVPO_QTY = ZINVPO_QTY + EKBE-MENGE.

      IF EKBE-SHKZG = 'H'.
        EKBE-WRBTR = EKBE-WRBTR * -1.
      ENDIF.
      ZINVOICED_VALUE = ZINVOICED_VALUE + EKBE-WRBTR.

    ENDSELECT.

**如果发票中订单数量和小于采购订单数量,则把记录填充到表INTABH中
*    IF ZINVPO_QTY < EKPO-MENGE.
      MOVE EKPO-EBELN TO T_PONOInvoice-EBELN.      "PO
      MOVE EKPO-EBELP TO T_PONOInvoice-EBELP.      "PO_ITEM
      MOVE EKPO-MATKL TO T_PONOInvoice-MATKL.      "Material Group
      MOVE EKPO-NETWR TO T_PONOInvoice-PNETWR.     "采购订单货币的订单净值
      MOVE EKPO-MENGE TO T_PONOInvoice-PQTY.       "采购订单数量
      MOVE EKPO-MEINS TO T_PONOInvoice-ZUOM.       "采购订单计量单位
      T_PONOInvoice-INETWR = ZINVOICED_VALUE.      "凭证货币金额和(发票金额)
      T_PONOInvoice-IQTY   = ZINVOICED_QTY.        "采购订单 价格单位的数量(发票数量)
      T_PONOInvoice-IPOQTY = ZINVPO_QTY.           "采购订单位数量(发票数量)
      T_PONOInvoice-MQTY   = ZMIGO_QTY.            "采购订单收货数量
      MOVE ZPO_RATE   TO T_PONOInvoice-RATE.       "汇率
      MOVE ZCURR      TO T_PONOInvoice-WAERS.      "货币码
      T_PONOInvoice-AEDAT = ZCDATE.                "记录创建日期
      T_PONOInvoice-EINDT = ZEINDT.                "项目计划交货日期
      APPEND T_PONOInvoice.
*    ENDIF.
  ENDSELECT.
EndForm.                    "GetData


完成了,只是做了Mark,以后参考!也给用得到的童鞋个提示。

 

 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值