Thursday, November 27, 2008

SAP讀書會:呆滯庫存的關鍵技術分享

呆滯庫存的報表原由:
呆滯庫存報表一般可以由MB5B依據過帳資訊來產生呆滯物料的資訊,但是如果遇到需要客製報表的需求,我們可以自己設計。

關鍵Table:
呆滯庫存的設計需要運用到過帳相關紀錄資訊,如 MSEG & MKPF,兩者透過文件號碼做關聯(MBLNR);另外其他的物料資訊可以由MARD 取得。

邏輯關鍵SQL:
首先要以物料主檔(MARD)為主要的Table並JOIN 物料異動紀錄(MSEG) & 過帳資訊紀錄(MKPF),其中物料主檔(MARD)與物料異動紀錄(MSEG)以物料號碼做為關聯(KEY),另外物料異動紀錄(MSEG)與過帳記錄資訊(MKPF)用物料文件號碼(MBLNR)做關聯。

輸入的主要參數有(Input):
P_WERKS FOR MARD-WERKS DEFAULT 'TW11', "工廠
P_MATNR FOR MARD-MATNR,"物料號碼
P_SDATE FOR MARD-ERSDA. "開始與結束日期

輸出的主要參數有(Output):
LIKE MARD-MATNR,"物料號碼
LIKE MARD-LABST,"未使用庫存數量
LIKE MARD-WERKS,"工廠
LIKE MARD-LGORT,"庫位
LIKE MBEW-VERPR,"異動平均價
LIKE MBEW-LBKUM,"庫存總值

主要的宣告:
DATA: I_SA TYPE P DECIMALS 4. "庫存總值
* 定義日期的字串月份擷取
DATA: STRING(10),
V_OFFSET_START TYPE I,
V_OFFSET_LENGTH TYPE I,
V_YMD(10) TYPE C,
T_YEAR(4) TYPE C,
V_YEAR(4) TYPE C.

主要SQL 有兩個ITAB,分別是ITAB3 & ITAB4:
ITAB3 主要是抓出所有的資訊,而ITAB4 主要抓出跟相關呆滯有關的關鍵異動類型,最後再用LOOP AT ITAB的方式,ITAB4就是把不符合呆滯的物料都抓出來放到ITAB4,這樣ITAB3 去比對ITAB4 就可以排出MSEG 跟非符合呆滯的物料。

不然單一一個SQL去排除,通常只會排除當筆的MSEG紀錄,其他的相同物料一樣會在列出來。

以下是ITAB3 主要SQL
SELECT
MARD~MATNR MARD~LABST MARD~WERKS MARD~LGORT
MSEG~BWART MKPF~BUDAT
FROM MARD
INNER JOIN MSEG ON MARD~MATNR = MSEG~MATNR
INNER JOIN MKPF ON MSEG~MBLNR = MKPF~MBLNR AND MSEG~MJAHR = MKPF~MJAHR
INTO CORRESPONDING FIELDS OF TABLE ITAB3
WHERE MARD~MATNR = MSEG~MATNR
AND MARD~WERKS = MSEG~WERKS
AND MSEG~MBLNR = MKPF~MBLNR
AND MSEG~MJAHR = MKPF~MJAHR
AND MSEG~BWART NE '261'
AND MSEG~BWART NE '311'
AND MSEG~BWART NE '309'
AND MSEG~BWART NE '901'
AND MSEG~BWART NE '903'
AND MSEG~BWART NE '913'
AND MSEG~BWART NE '915'
AND MSEG~BWART NE '917'
AND MSEG~BWART NE '919'
AND MSEG~BWART NE '101'
AND MARD~MATNR IN P_MATNR
AND MARD~WERKS IN P_WERKS
AND MARD~LGORT IN P_LGORT
AND MKPF~BUDAT IN P_SDATE.


以下是主要的ITAB4 SQL
*ITAB4
SELECT
MSEG~MBLNR "Number of Material Document
MSEG~MJAHR "Material Document Year
MSEG~BWART "Moving Type
MSEG~MATNR "Material Number
MSEG~WERKS "Plant
MSEG~LGORT "Storage Location
MSEG~LIFNR "Vendor Number
MKPF~BUDAT
FROM MSEG
INNER JOIN MKPF ON MSEG~MBLNR = MKPF~MBLNR AND MSEG~MJAHR = MKPF~MJAHR
INTO CORRESPONDING FIELDS OF TABLE ITAB4
WHERE MSEG~MBLNR = MKPF~MBLNR
AND MSEG~MJAHR = MKPF~MJAHR
AND ( MSEG~BWART = '101'
OR MSEG~BWART = '261'
OR MSEG~BWART = '311'
OR MSEG~BWART = '309'
OR MSEG~BWART = '901'
OR MSEG~BWART = '903'
OR MSEG~BWART = '913'
OR MSEG~BWART = '915'
OR MSEG~BWART = '917'
OR MSEG~BWART = '919' )
AND MSEG~MATNR IN P_MATNR
AND MSEG~WERKS IN P_WERKS
AND MSEG~LGORT IN P_LGORT
AND MKPF~BUDAT IN P_SDATE.

*將ITAB3 有涉及到的異動類型都Clear
SORT ITAB3 BY MATNR.
SORT ITAB4 BY MATNR.
DELETE ADJACENT DUPLICATES FROM ITAB4 COMPARING MATNR.

LOOP AT ITAB3.
LOOP AT ITAB4.
IF ITAB3-MATNR = ITAB4-MATNR.
CLEAR ITAB3.
MODIFY ITAB3.
ENDIF.
ENDLOOP.
ENDLOOP.

Tuesday, November 25, 2008

SAP 財務成本跨月回帳的檢核報表開發的心得分享

SAP 財務成本跨月回帳的檢核報表開發的心得分享

1.報表開發的目的:

雖然SAP標準系統有提供MB51供相關物料文件異動類型查詢,但是財務每月做成本的稽核時,就會發現一堆迴轉異動類型不知道頭尾,這時候財務成本人員要忙著對帳,於是如果有一個報表可以提供所有”跨月”異動的帳作呈現,是不是就可以大大降低檢核人員的負擔,同時也可以提供各單位有需要的人員作襙做異常管理用,如倉管主管可以依據此報表查看收貨、發料人員是否有異常回帳,船務主管也可以檢核出貨的VL02N是否正常運行。

整個設計主要以EKBE為主,其中物料文件的過帳與迴轉的關連性並非”出貨單號”,因為很多業務角度的ABAP會抓出貨單號,很多異動類型跟出貨沒關係。

例如101 與 102 的物料文件關係為何? 101 的物料文件號碼(BELNR)與參考文件號碼(LFBNR)一定是相同,只要不是迴轉的這兩個欄位都會相同。

只要是迴轉的交易,物料文件的參考文件號碼(LFBNR)就是他回帳對象的文件號碼(BELNR),例如102的文件參考號碼(LFBNR)就是101的文件號碼(BELNR)。

抓到相關資料後,我們可以針對過帳文件與迴轉文件的日期月份做比較,如果不是一樣,就表示過帳與迴轉是跨月。

要注意的是庫位,庫位必須抓EKPO採購單身的,必須用採購單號與項目與物料與工廠去關連出來。

2.報表設計需要的Table:
EKBE 主要
MARD, MARA, MAKT

3.報表輸入的參數部份:
EKBE-WERKS 工廠
EKBE-BWART 異動類型
EKBE-MATNR 物料號碼
EKBE-BELNR 物料文件號碼
EKBE-BUDAT 過帳日期

4.輸出的部份:
BELNR 文件號碼
BWART 異動號碼
BUDAT 過帳日期
BUDAT_Month 過帳月份
LFBNR 參考號碼
BUDAT_Reference 參考文件的過帳日期
BUDAT_Reference_Month 參考文件的過帳月份
WERKS 工廠
LGORT 庫位
MAKTX 物料說明
EBELN 採購單
EBELP 採購單項目
MENGE 過帳數量

5.核心的SQL部分
SELECT EKBE~BELNR EKBE~EBELN EKBE~EBELP EKBE~BWART EKBE~BUDAT EKBE~LFBNR EKBE~MATNR EKBE~WERKS EKBE~MENGE

FROM EKBE
INTO CORRESPONDING FIELDS OF TABLE ITAB3
WHERE EKBE~BELNR NE EKBE~LFBNR
AND EKBE~WERKS IN P_WERKS
AND EKBE~MATNR IN P_MATNR
AND EKBE~BWART IN P_BWART
AND EKBE~BELNR IN P_BELNR
*AND EKBE~XBLNR IN P_XBLNR
AND EKBE~BUDAT IN P_BUDAT
AND EKBE~BELNR NE ''
AND EKBE~LFBNR NE ''
AND EKBE~BWART NE ''.

6. 庫位部份需要利用採購單號與項次關連到EKPO單身找出庫位
LOOP AT ITAB3. "抓庫位
SELECT LGORT INTO EKPO-LGORT
FROM EKPO WHERE MATNR = ITAB3-MATNR AND WERKS = ITAB3-WERKS AND EBELN = ITAB3-EBELN AND EBELP = ITAB3-EBELP.
IF SY-SUBRC = 0.
MOVE EKPO-LGORT TO ITAB3-LGORT.
MODIFY ITAB3.
ENDIF.
ENDSELECT.
ENDLOOP.

7. 回帳月份的抓取,透過字串切割
LOOP AT ITAB3. "回帳月份
IF SY-SUBRC = 0.
* WRITE / ITAB3-BUDAT.
STRING = ITAB3-BUDAT .
* WRITE / STRING.
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-BUDAT_M.

MODIFY ITAB3.
ENDIF.
ENDLOOP.

8. 參考文件的過帳月份抓取,如果是102為物料參考文件,那此段的月份就是101的過帳月份
LOOP AT ITAB3. "抓參考文件號碼的月份
SELECT SINGLE * FROM EKBE
WHERE MATNR = ITAB3-MATNR
AND BELNR = ITAB3-LFBNR.
IF SY-SUBRC = 0.

MOVE EKBE-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.

9. 我們只要過帳與迴轉不同月份的資料,所以相同就刪除
*進行物料文件與回帳文件的月份比較,相等就刪除。
IF ITAB3-BUDAT_M = ITAB3-RBUDAT_M.
CLEAR ITAB3.
ENDIF.
ENDIF.
MODIFY ITAB3.
ENDLOOP.

10. ITAB3 異動後,再把重複的刪除列移除,重新寫入。
SORT ITAB3 BY BELNR. "依據文件號碼排序
DELETE ADJACENT DUPLICATES FROM ITAB3.

Sunday, November 09, 2008

SAP_ERP 庫存週轉率_設計的心得分享

大家好

SAP 中的標準程式裡面雖然也有庫存週轉率的項目
,但是大家都知道很多使用者的需求都是需要客製
,以下我就針對客製一個庫存週轉率的報表需要注
意哪些觀念、項目。

所謂的"週轉率"也可以說是"某個過帳區間的出貨次
數",也可以應用在"週轉天數"。

週轉率的公式為"某個過帳區間的出貨總金額除以平
均庫存總值",而出貨總金額可以透過MSEG與物料異
動類型261來抓取,一般來說以物料的角度看出貨行
為,261生產領料就是最佳的參考指標;

另外"平均庫存總值"的原由,因為大部分的報表統
計都集中在月底,但是偏偏月底的庫存通常都是比
較低,因為月底出貨領料比較多,所以平均庫存總
值大家可以抓每日庫存再除以天數的平均再乘以異
動平均價就可以。

一般會在庫存週轉率的輸入與輸出欄位各需要哪些
?輸入的主要部分有"過帳區間"、"物料號碼"、"工
廠"、"儲位",而輸出的部分主要有"物料號碼"、
"品名"、"工廠"、"儲位"、"庫存"、"平均價"、"
庫存總值"、"出貨總數量"、"出貨總金額"、"庫存
週轉率"、"庫存週轉天數"。

一般來說週轉率可以讓庫存管理者知道目前哪些物
料的使用率比較高,以便物料基本檔的MRP安全庫
存設定。

以上如果相關心得經驗也請跟我分享

Skype : LotusNotes
MSN : brucesap@hotmail.com

SAP-Bruce

Thursday, November 06, 2008

SAP ERP 呆滯庫存報表設計心得分享。

大家早

又一陣子沒有寫文章,這次來發表幾篇SAP ERP Logistic 會遇到的ABAP需求設計分享。

何謂”呆滯庫存”呢? 就是長期呆在公司庫存無法轉換成現金的物料、成品、半成品、組件等等。一般來說透過SAP T-Code MB5B 其實就可以查出呆滯庫存,但如果使用者要加上一些客製需求,那我們就另外寫ABAP程式。

呆滯庫存也有人用”呆滯庫位”來表示,但是我覺得那是”人為”的管理方式,都已經使用 SAP 系統為何還要用”人為”的管理模式??

呆滯庫存主要以”物料過帳日期”為查詢區間,以物料各種異動類型作為關鍵值,例如:異動類型261 就是一個生產領料的異動類型,如果物料在某個過帳記錄區間完全沒有作領料的動作,我們也可以稱為呆滯庫存,因為無法消耗公司的庫存金額!!

常見應用於呆滯的異動類型有幾下幾種,'261' '311''309' '901' '903' '913'
'915' '917' '919' '101'.在SQL 中進行過濾就可以。

需要應用到的Table 如下參考:
TABLES: MARD,MSEG,MARA,MDKP,MBEW,MSLB,LFA1,MKPF,MAKT.

常用的輸入查詢欄位有以下幾種:
儲存地點,工廠,物料號碼,MRP類型,物料群組,採購群組,MRP範圍,檢核期間。

而關鍵的查詢欄位有”儲存地點”、”工廠”、”檢核期間”。

常用輸出查詢欄位有以下幾種:
物料號碼' '未限制庫存數量' '物料說明' '工廠' '儲位' '圖號' '前置期' '物料群組' '異動平均價' '庫存總值' '供應商代號' '供應商名稱' '最小批量' '安全庫存' '呆滯天數(年/月/日)'。

有興趣大家在討論。


SAP-Bruce 2008/11/7