最近来了新的需求就是依据PO日期查询到采购单收货但未开发票的报表,当然这一部分还是运用ALV来实现是比较实在。先来看看界面吧.
执行后的结果是:
代码包括三还包括三部分:INCLUDE ZPO006F00. "构建ALV
INCLUDE ZPO006F01. "取得数据
INCLUDE ZCOMMON. "通用模组
其中通用模组上次有讲到过,就是一些平常用的比较多的程式集合。有不了解的童鞋可以参考我的另一篇博文:ZCOMMON通用模组:http://blog.youkuaiyun.com/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,以后参考!也给用得到的童鞋个提示。