2008年12月8日 星期一

[更新20081208]跨月回帳檢核報表最新ABAP邏輯

原始文章
http://www.domino.club.tw/bbs/bbs2002.nsf/($All)/405816716959408A4825750D000E4424?OpenDocument
2008/12/8 更新
http://www.domino.club.tw/bbs/bbs2002.nsf/($All)/E3499F04F80F4D5B482575190042B999?OpenDocument

核心程式如下:
*共通欄位
*1. MSEG~MBLNR 物料文件
*2. MSEG~MJAHR 物料年度
*3. MSEG~ZEILE 項目
*4. MSEG~LGORT 儲位
*5. MSEG~WERKS 工廠
*6. MKPF~BUDAT 過帳日期
*
*共通SQL
*1. MSEG~SMBLN NE '空白'
*2. MSEG~LFBNR NE '空白'
*
*無採購單的SQL & Outpout
*SQL
*1. MSEG~EBELN 採購單="空白"
*2. MSEG~SJAHR = MSEG~MJAHR 迴轉年度相等
*3. MSEG~SMBLN = MSEG~MBLNR 迴轉物料文件相等
*4. MSEG~SMBLP = MSEG~ZEILE 迴轉物料項目
*
*有採購單的SQL
*SQL
*1. MSEG~EBELN 採購單="非空白"
*2. MSEG~SJAHR = MSEG~LFBJA 迴轉年度相等
*3. MSEG~SMBLN = MSEG~LFBNR 迴轉物料文件相等
*4. MSEG~SMBLP = MSEG~LFPOS 迴轉物料項目

*ITAB特別定義有採購單與無採購單的欄位
LFBNR LIKE MSEG-LFBNR,"參考文件號碼 (採購)
LFBJA LIKE MSEG-MJAHR,"文件號碼年度 (採購)
LFPOS LIKE MSEG-ZEILE,"文件號碼項次 (採購)
SMBLN LIKE MSEG-SMBLN,"物料文件號碼 (無採購)
SJAHR LIKE MSEG-MJAHR,"文件號碼年度 (無採購)
SMBLP LIKE MSEG-ZEILE,"文件號碼項次 (無採購)

SELECT MSEG~WERKS MSEG~LGORT MSEG~MENGE MSEG~BWART
MSEG~EBELN MSEG~EBELP
MSEG~MBLNR MSEG~MJAHR MSEG~ZEILE
MSEG~SJAHR MSEG~SMBLN MSEG~SMBLP
MSEG~LFBJA MSEG~LFBNR MSEG~LFPOS
MKPF~MBLNR MKPF~BUDAT MKPF~MJAHR
FROM MSEG
INNER JOIN MKPF ON MSEG~MBLNR = MKPF~MBLNR AND MSEG~MJAHR = MKPF~MJAHR
INTO CORRESPONDING FIELDS OF TABLE ITAB3
WHERE ( MSEG~MBLNR NE MSEG~LFBNR AND MSEG~ZEILE NE MSEG~LFPOS )
AND ( MSEG~SMBLN NE '' OR MSEG~LFBNR NE '' )
AND MSEG~BWART NE ''
AND MSEG~WERKS IN P_WERKS
AND MSEG~MATNR IN P_MATNR
AND MSEG~BWART IN P_BWART
AND MSEG~MBLNR IN P_MBLNR
AND MKPF~BUDAT IN P_BUDAT.

*有採購單的部份
LOOP AT ITAB3. "抓參考文件號碼的月份
IF ITAB3-EBELN NE ''.
SELECT SINGLE * FROM MSEG
WHERE MBLNR = ITAB3-LFBNR
AND MJAHR = ITAB3-LFBJA
AND ZEILE = ITAB3-LFPOS.
MOVE MSEG-MBLNR TO ITAB3-LFBNR.
MOVE MSEG-MATNR TO ITAB3-MATNR.

SELECT SINGLE * FROM MKPF
WHERE MBLNR = ITAB3-LFBNR
AND MJAHR = ITAB3-LFBJA.
MOVE MKPF-BUDAT TO ITAB3-RBUDAT.
STRING = ITAB3-RBUDAT .
* 轉換日期到字串月
V_YMD = STRING.
V_OFFSET_START = 4 .
V_OFFSET_LENGTH = 2.
V_MONTH = V_YMD+V_OFFSET_START(V_OFFSET_LENGTH).
MOVE V_MONTH TO ITAB3-RBUDAT_M.

*進行物料文件與回帳文件的月份比較,相等就刪除。
IF ITAB3-BUDAT_M = ITAB3-RBUDAT_M.
CLEAR ITAB3.
ENDIF.
MODIFY ITAB3.

*ENDIF.
ENDIF.
ENDLOOP.

LOOP AT ITAB3. "抓參考文件號碼的月份
*無採購單的部份
IF ITAB3-EBELN = ''.
SELECT SINGLE * FROM MSEG
WHERE MBLNR = ITAB3-SMBLN
AND MJAHR = ITAB3-SJAHR
AND ZEILE = ITAB3-SMBLP.
MOVE MSEG-MBLNR TO ITAB3-LFBNR.
MOVE MSEG-MATNR TO ITAB3-MATNR.

SELECT SINGLE * FROM MKPF
WHERE MBLNR = ITAB3-LFBNR
AND MJAHR = ITAB3-SJAHR.
MOVE MKPF-BUDAT TO ITAB3-RBUDAT.
STRING = ITAB3-RBUDAT .
* 轉換日期到字串月
V_YMD = STRING.
V_OFFSET_START = 4 .
V_OFFSET_LENGTH = 2.
V_MONTH = V_YMD+V_OFFSET_START(V_OFFSET_LENGTH).
*WRITE / L_C.
MOVE V_MONTH TO ITAB3-RBUDAT_M.

*進行物料文件與回帳文件的月份比較,相等就刪除。
IF ITAB3-BUDAT_M = ITAB3-RBUDAT_M.
CLEAR ITAB3.
ENDIF.
MODIFY ITAB3.
ENDIF.
ENDLOOP.

2008年12月6日 星期六

SAP 讀書會分享: 資料批次上傳前的NotesFlow簽核卡關的方法

前提:
因為SAP ERP 很多公司都會客製很多批次上傳更改Table資料,而這樣的程序往往會因為使用者的失誤而造成很大的困擾;又因為很多公司礙於SAP帳號貴,無法一次買足而使用共用帳號的方式,所以如果在程式執行前可以有個行為作卡關,這樣就可以減少一些錯誤發生。

方法:
程式執行前端可以增設一個欄位,內容是Notes電子表單的單號,那這個單號可以透過Notes 簽核流程完成後,透過代理程式把單號寫入到SAP 的Add On Table,每次SAP程式執行前就去檢核此Add On Table 的單號紀錄,執行後再把此單號給記錄取消,後續在執行都需要在跑簽核流程才可以執行。

影響面:
目前僅能針對客製的程式做檢核的控管,標準程式就無法修改;另外很多大批程式上傳不見得要層層控管,也可以透過其他方式來管理,例如:大批程式執行前可以請使用者輸入你的姓名或是工號之類,執行後系統就會通知相關承辦的窗口這些異動資訊與紀錄,當然也可以自動記錄在Notes Mail In 收件資料庫中,畢竟Notes屬於OA 管理層面,會比SAP ERP 資料庫層面更容易管理行政電子資料應用。

以上