1. 程式人生 > >ZPO006採購單收貨報表

ZPO006採購單收貨報表

      最近來了新的需求就是依據PO日期查詢到採購單收貨但未開發票的報表,當然這一部分還是運用ALV來實現是比較實在。先來看看介面吧.

執行後的結果是:

程式碼包括三還包括三部分:INCLUDE ZPO006F00.    "構建ALV

INCLUDE ZPO006F01.    "取得資料

INCLUDE ZCOMMON.       "通用模組 

現在來上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,以後參考!也給用得到的童鞋個提示。

相關推薦

ZPO006採購報表

      最近來了新的需求就是依據PO日期查詢到採購單收貨但未開發票的報表,當然這一部分還是運用ALV來實現是比較實在。先來看看介面吧. 執行後的結果是: 程式碼包括三還包括三部分:INCLUDE ZPO006F00.    "構建ALV INCLUDE ZPO00

採購訂單後不能修改價格的增強

SE19  說明,非教程,所以控制點如下。 1 價格和資訊記錄不符不能控制 2 反審批、ZUB訂單、無價值、自定義表某使用者名稱給'X'跳出增強 3 Z005 退貨訂單入庫不能修改價格(因為小數點的問題,淨值差小於0.03 不算修改價格,如果用原值就比價麻

SAP 採購時與FICO科目的對應關係,關聯點 Account Assignment Category

轉自:http://blog.163.com/sap_chuanshuo/blog/static/205045020201242884854678/ 今天一個MM的哥們,有個疑問問了我下,因為我相信對於比較多的MM初級的顧問,可能會存在同樣的疑問,所以我這裡

SAP 如何設定採購直接轉到供應商庫存

如何設定採購收貨直接轉到供應商庫存,  正常的業務流程是先是下采購訂單,然後收貨,再通過 541 委外發料發給供應商, 現在介紹另一種方法實現。 即下一張採購訂單從A供應商採購,收貨時直接發到供應商B。 利用採購訂單裡的“交貨地址”下的“供應商” 和 “源供應” 選項,

微信支付v3開發(6) 地址共享接口

方式 word .com overflow rda over spa agent 電話 請看新版教程 微信支付開發(7) 收貨地址共享接口V2本文介紹微信支付下的收貨地址共享接口的開發過程。一. 簡單介紹微信收貨地址共享,是指用戶在微信瀏覽器內打開網頁,填寫過地址後,

ios仿地址管理

項目 管理 tor ber queue 更新 con view recreate 最近公司項目增加了一個需求,然後要有收貨地址的管理,有單選框的設置,我昨晚也是寫了很晚才寫出來的,然偶今天就分享一下吧,同時也是我自己積累的過程,當然了,我今天給的是一個demo的例子,我不可

【小程序】獲取微信 自帶的 地址獲取和整理

code blog itl ucc success span .info toa pan 1、wx.chooseAddress(OBJECT) if(wx.chooseAddress){ wx.chooseAddress({ success: function (r

地址--實現省市區三級聯動和使用drf-extensions擴展使用緩存

onf area trie resp 圖集 lan 路由 iso 輸入 主要實現省市區三級聯動和在Django REST framework中使用緩存。 在用戶錄入地址時,需要進行省市區的選擇。在頁面加載時,向後端請求省份數據,當用戶選擇確定省份後,向後端請求該省份的城市數

微信支付開發(7) 地址共享介面V2

在這篇微信公眾平臺開發教程中,我們將介紹如何在網頁中實現獲取收貨地址的功能。 收貨地址共享介面 在2016年4月13日 進行過升級,2016年5月20日之後只能使用新介面,本教程為新版介面的教程! 本文分為以下二個部分: 生成JS-SDK許可權驗證簽名 實現獲取共享收貨地址

微信支付v3開發(6) 地址共享介面

請看新版教程  微信支付開發(7) 收貨地址共享介面V2 本文介紹微信支付下的收貨地址共享介面的開發過程。 一. 簡介 微信收貨地址共享,是指使用者在微信瀏覽器內開啟網頁,填寫過地址後,後續可以免填寫支援快速選擇,也可增加和編輯。此地址為使用者屬性,可在各商戶的網頁中

22、【地址管理模組】——地址增、刪、改、查、分頁列表、地址詳情的功能開發

####1、介面開發: 新建ShippingController類 在類上新增相關注解 @Controller @RequestMapping("/shipping/") public class ShippingController { } #####1、收貨地址的增

微商城---傻瓜式教你微信支付地址介面開發(PHP)

微信中比較好用的介面功能裡,微信收貨地址介面應該算一個,它本身提供了地址的新增刪除使用,可以使微商城省去收貨地址開發的步驟。微支付這個步驟並不難,本身有提供demo給你,稍微改改就能用,看一下概念也清晰了。收貨地址卻沒有。 此文章是以PHP來實現。 在做之前先確定自己有微信公眾平臺的賬號,並

jsp+servlet+jdbc專案

1:<% String path = request.getContextPath(); String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+

【14】MUI 仿拼多多 待

點選此處:MUI仿拼多多總目錄 <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-

設定地址預設介面思路

控制層 @ApiOperation(value = "買家收貨地址設定預設介面", notes = "買家收貨地址設定預設業務", produces = "application/json") @PostMapping("/setDefault") public Bas

Django商城專案筆記No.16使用者部分-使用者中心地址

首先完成省市區三級聯動 新建areas應用 python ../../manage.py startapp areas 模型類程式碼 class Area(models.Model): """ 行政區劃 """ name = models.CharF

地址表

                         

漫話:如何給女朋友解釋為什麼雙11無法修改地址

2018年11月11日上午11點,我拖著疲憊身軀回到家中,準備美美的睡上一覺,洗去身上值班一宿而帶來的疲憊。突然想到之前有交代女朋友讓她幫我搶東西,不知道怎麼樣了。 QPS、TR、併發使用者數、最佳執行緒數等等這些都是系統對併發處理上有關的概念。可以用來

按固定格式批量輸入地址下單

需求如下:按固定格式批量輸入收貨地址下單,前端識別地址資訊,傳送給服務端,傳送前再做個格式檢驗。  placeholder顯示在頁面的格式:在檔案中輸入的什麼樣子,出來就是什麼樣子。   commit() {     &

java自定義排程定時器工具類(java電商訂單自動失效或

java電商訂單超時改狀態工具類 最近在做一個電商專案,要求在使用者下單後未付款30分鐘後就將訂單的狀態改為失效,最初想的是用定時器沒幾秒去資料庫檢視有哪些訂單未付款但超過30分的,就修改狀態,這個方式有兩種缺點,一:如果時間設定的較短,就會導致一直在讀寫資料庫,二:如果時間設定較長就會