繼上次寫到的用BAPI_ACC_DOCUMENT_POST 建立Park文件之後出現了新的問題:
在vendor的line item上面只寫入payment term是不夠的,baseline date會變成空的,post時還要再補上baseline date。
以下是計算vendor baseline date的function module
FI_TERMS_OF_PAYMENT_PROPOSE
要計算customer時用這個:GET_BASELINE_DATE
2011年2月10日
2011年1月6日
parked document posting問題
新project在parked document posting時出現了
error message 00 349
'Field COBL-FKBER does not exist in the screen SAPLKACB'
在SAP找到了note 1020574就解決了
Reason and Prerequisites
The function module CODING_BLOCK_FIELD_CLEAR is not generated.
The field status of the field is defined as HIDE. The field contents were derived and not entered manually.
Solution
Run the generation report RFBIPPG1.
error message 00 349
'Field COBL-FKBER does not exist in the screen SAPLKACB'
在SAP找到了note 1020574就解決了
Reason and Prerequisites
The function module CODING_BLOCK_FIELD_CLEAR is not generated.
The field status of the field is defined as HIDE. The field contents were derived and not entered manually.
Solution
Run the generation report RFBIPPG1.
2010年11月24日
預留單MB_RESERVATION_BADI method DATA_CHECK處理
有一個客戶希望在預留單Movement 201時進行成本中心及費用科目預算檢查(利用KP06設定),不通過時不允許save。
以下是利用BADI MB_RESERVATION_BADI時的重點:
1 IS_RESB有成本中心和會計科目,可以利用來讀COSP的計劃值。
2 讀取未刪除的預留單,需求數量減去領料數量才是要卡控的數量。
3 金額可考慮抓標準價格或異動平均單價。
4 利用I_NEW_ITEM = 'X'判斷create時沒有科目指派,要直接去table T030找出會計科目,規則要問一下MM顧問。
以下是利用BADI MB_RESERVATION_BADI時的重點:
1 IS_RESB有成本中心和會計科目,可以利用來讀COSP的計劃值。
2 讀取未刪除的預留單,需求數量減去領料數量才是要卡控的數量。
3 金額可考慮抓標準價格或異動平均單價。
4 利用I_NEW_ITEM = 'X'判斷create時沒有科目指派,要直接去table T030找出會計科目,規則要問一下MM顧問。
2010年11月22日
BADI ME_PROCESS_PO_CUST method CHECK拋出多筆message
使用BADI ME_PROCESS_PO_CUST時,method CHECK可以一次檢查所有的PO內容
要將訊息輸出時,從doc看不到該怎麼處理,以下是help的提醒:
Never use the ABAP statement MESSAGE in the BAdI ME_PROCESS_PO_CUST.
再進一步找尋,發現要用macro處理:
INCLUDE MM_MESSAGES_MAC.
MMPUR_MESSAGE_FORCED 'E' 'ZMM01' '001' LV_MSGV1 LV_MSGV2 LV_MSGV3 LV_MSGV4.
要將訊息輸出時,從doc看不到該怎麼處理,以下是help的提醒:
Never use the ABAP statement MESSAGE in the BAdI ME_PROCESS_PO_CUST.
再進一步找尋,發現要用macro處理:
INCLUDE MM_MESSAGES_MAC.
MMPUR_MESSAGE_FORCED 'E' 'ZMM01' '001' LV_MSGV1 LV_MSGV2 LV_MSGV3 LV_MSGV4.
MMPUR_MESSAGE_FORCED 'E' 'ZMM01' '002' LV_MSGV1 LV_MSGV2 LV_MSGV3 LV_MSGV4.
2010年11月17日
利用BADI ME_PROCESS_PO_CUST進行PO check
BADI ME_PROCESS_PO_CUST當中有一個method CHECK可以進行整個PO的檢查。
要注意的是parameter只有IM_HEADER,並且是object形態。
以下是取得內容的範例:
*取得header
IM_HEADER->GET_DATA( ).
*取得item,一樣是object形態
IM_HEADER->GET_ITEMS( ).
檢查後若要拋出錯誤,直接用message即可。
MESSAGE E888(SABAPDOCU) WITH LV_MSGV1 LV_MSGV2 LV_MSGV3 LV_MSGV4.
要注意的是parameter只有IM_HEADER,並且是object形態。
以下是取得內容的範例:
*取得header
IM_HEADER->GET_DATA( ).
*取得item,一樣是object形態
IM_HEADER->GET_ITEMS( ).
檢查後若要拋出錯誤,直接用message即可。
MESSAGE E888(SABAPDOCU) WITH LV_MSGV1 LV_MSGV2 LV_MSGV3 LV_MSGV4.
利用BADI ME_PURCHDOC_POSTED將PO資訊在SAVE後寫入Addon Table
PO在save之後的BADI ME_PURCHDOC_POSTED只有一個Method POSTED,作用是在這個時間得到完整的PO資訊,可以寫到Addon Table。
要注意的地方是PO create時, IM_EKPO不會有PO number,只存在 IM_EKKO-EBELN當中。
要注意的地方是PO create時, IM_EKPO不會有PO number,只存在 IM_EKKO-EBELN當中。
2010年11月15日
用K_GROUP_SELECT查詢Cost Object Group
寫CO的報表時,用到Cost Object的選擇條件時常會加上Group來查詢,在處理VALUE-REQUEST時可以用FM K_GROUP_SELECT處理,以下是範例:
1 Profit Center Group
CALL FUNCTION 'K_GROUP_SELECT'
EXPORTING
CLASS = '0106'
FIELD_NAME = 'RPRCTR '
TABLE = 'GLPCT '
IMPORTING
SET_NAME = P_PCGRU
EXCEPTIONS
NO_SET_PICKED = 1.
2 Cost Center Group
CALL FUNCTION 'K_GROUP_SELECT'
EXPORTING
FIELD_NAME = 'KOSTL'
IMPORTING
SET_NAME = P_KSGRU
EXCEPTIONS
NO_SET_PICKED = 1
3 Internal Order Group
CALL FUNCTION 'K_GROUP_SELECT'
EXPORTING
FIELD_NAME = 'AUFNR'
IMPORTING
SET_NAME = P_AUFGR
EXCEPTIONS
NO_SET_PICKED = 1.
4 Cost Element Group
CALL FUNCTION 'K_GROUP_SELECT'
EXPORTING
FIELD_NAME = 'KSTAR'
KTOPL = 'XXX'
IMPORTING
SET_NAME = P_GRP
EXCEPTIONS
NO_SET_PICKED = 1.
1 Profit Center Group
CALL FUNCTION 'K_GROUP_SELECT'
EXPORTING
CLASS = '0106'
FIELD_NAME = 'RPRCTR '
TABLE = 'GLPCT '
IMPORTING
SET_NAME = P_PCGRU
EXCEPTIONS
NO_SET_PICKED = 1.
2 Cost Center Group
CALL FUNCTION 'K_GROUP_SELECT'
EXPORTING
FIELD_NAME = 'KOSTL'
IMPORTING
SET_NAME = P_KSGRU
EXCEPTIONS
NO_SET_PICKED = 1
3 Internal Order Group
CALL FUNCTION 'K_GROUP_SELECT'
EXPORTING
FIELD_NAME = 'AUFNR'
IMPORTING
SET_NAME = P_AUFGR
EXCEPTIONS
NO_SET_PICKED = 1.
4 Cost Element Group
CALL FUNCTION 'K_GROUP_SELECT'
EXPORTING
FIELD_NAME = 'KSTAR'
KTOPL = 'XXX'
IMPORTING
SET_NAME = P_GRP
EXCEPTIONS
NO_SET_PICKED = 1.
2010年11月9日
Park Document Posting使用SGL Ind 的item寫入Profit Center
遇到一個需求在FI Park Document使用SGL Ind,此時不能輸入Profit Center,希望能夠有機會自行決定。
SAP的New GL有一個default profit center的BADI FAGL_3KEH_DEFPRCTR,透過這個就可以達到目的。
作法是在park doc的doc header reference寫入要決定的profit center,再利用FAGL_3KEH_DEFPRCTR的interface IF_SET_DEFPRCTR 的Method SET_DEFAULTPRCTR處理。
以下是sample:
METHOD IF_SET_DEFPRCTR~SET_DEFAULTPRCTR.
CHECK IS_ACCIT-XBLNR NE SPACE.
CD_PRCTR = IS_ACCIT-XBLNR.
ENDMETHOD.
SAP的New GL有一個default profit center的BADI FAGL_3KEH_DEFPRCTR,透過這個就可以達到目的。
作法是在park doc的doc header reference寫入要決定的profit center,再利用FAGL_3KEH_DEFPRCTR的interface IF_SET_DEFPRCTR 的Method SET_DEFAULTPRCTR處理。
以下是sample:
METHOD IF_SET_DEFPRCTR~SET_DEFAULTPRCTR.
CHECK IS_ACCIT-XBLNR NE SPACE.
CD_PRCTR = IS_ACCIT-XBLNR.
ENDMETHOD.
2010年11月5日
BAPI_ACC_DOCUMENT_POST 建立Park文件
遇到客戶的新需求:透過interface轉進SAP建立會計文件時,只需要建立Park文件,不要Post。
系統上並沒有這樣功能的的FM及BAPI,只好把辦法想到enhancement及BADI。找到之前寫過的BADI ACC_DOCUMENT直接使用CHANGE這個Method。
只要在Method中指定欄位值C_ACCHD-STATUS_NEW = 2.建立的文件就是Park文件。
系統上並沒有這樣功能的的FM及BAPI,只好把辦法想到enhancement及BADI。找到之前寫過的BADI ACC_DOCUMENT直接使用CHANGE這個Method。
只要在Method中指定欄位值C_ACCHD-STATUS_NEW = 2.建立的文件就是Park文件。
2010年10月29日
FI posting 替換 RECN account
最近有個需求是要在VF01及MIRO時,把RECN科目替換成關係人的RECN科目。但是SAP Note 42615裡特別提到有些fields在substitution不會work,也不會有message。
改往BTE去處理,用event1120替換科目。找到1120的interface之後,copy至ZPROCESS_00001120。發現structure BSEG_SUBST並沒有提供科目的field HKONT。直接append structure把field加進去,之後再寫code。
以下範例僅供參考:
改往BTE去處理,用event1120替換科目。找到1120的interface之後,copy至ZPROCESS_00001120。發現structure BSEG_SUBST並沒有提供科目的field HKONT。直接append structure把field加進去,之後再寫code。
以下範例僅供參考:
FIELD-SYMBOLS: , TYPE BSEG_SUBST.
DATA: VAR_NAME(30).
**MIRO
DATA: XEKBE LIKE EKBE OCCURS 10 WITH HEADER LINE,
XEKPO LIKE EKPO OCCURS 10 WITH HEADER LINE,
TMP_EKPO LIKE EKPO.
**billing
DATA: XVBRPVB LIKE VBRPVB OCCURS 10 WITH HEADER LINE.
**Logic
READ TABLE T_BKPF INDEX 1.
CASE T_BKPF-BLART.
WHEN 'RE'.
VAR_NAME = '(SAPLMRMP)XEKBE[]'.
ASSIGN (VAR_NAME) TO.
CHECK SY-SUBRC = 0.
XEKBE[] =.
LOOP AT XEKBE.
SELECT * FROM EKPO WHERE EBELN = XEKBE-EBELN
AND EBELP = XEKBE-EBELP
AND ( KNTTP = 'A' OR KNTTP = 'K' ).
APPEND EKPO TO XEKPO.
ENDSELECT.
ENDLOOP.
CHECK XEKPO[] IS NOT INITIAL.
LOOP AT XEKPO.
IF XEKPO-NETWR > TMP_EKPO-NETWR.
TMP_EKPO = XEKPO.
ENDIF.
ENDLOOP.
CLEAR LFA1.
LOOP AT T_BSEG WHERE KOART = 'K'.
READ TABLE T_BSEGSUB WITH KEY TABIX = SY-TABIX ASSIGNING.
SELECT SINGLE * FROM LFA1 WHERE LIFNR = T_BSEG-LIFNR
AND KTOKK = 'Z101'.
IF SY-SUBRC = 0. "關係人
CASE TMP_EKPO-KNTTP.
WHEN 'A'.
-HKONT = '0021460001'.
WHEN 'K'.
-HKONT = '0021901001'.
ENDCASE.
ELSE. "非關係人
CASE TMP_EKPO-KNTTP.
WHEN 'A'.
-HKONT = '0021450001'.
WHEN 'K'.
-HKONT = '0021700002'.
ENDCASE.
ENDIF.
ENDLOOP.
WHEN 'RV'.
VAR_NAME = '(SAPMV60A)XVBRP[]'.
ASSIGN (VAR_NAME) TO.
CHECK SY-SUBRC = 0.
XVBRPVB[] =.
READ TABLE XVBRPVB INDEX 1.
CHECK SY-SUBRC = 0.
SELECT SINGLE * FROM VBAK WHERE VBELN = XVBRPVB-AUBEL
AND AUART = 'ZSLA'.
CHECK SY-SUBRC = 0.
SELECT SINGLE * FROM KNA1 WHERE KUNNR = VBAK-KUNNR AND KTOKD = 'Z005'.
IF SY-SUBRC = 0.
LOOP AT T_BSEG WHERE KOART = 'D'.
READ TABLE T_BSEGSUB WITH KEY TABIX = SY-TABIX ASSIGNING.
IF SY-SUBRC = 0.
-HKONT = '0011550001'.
ENDIF.
ENDLOOP.
ELSE.
LOOP AT T_BSEG WHERE KOART = 'D'.
READ TABLE T_BSEGSUB WITH KEY TABIX = SY-TABIX ASSIGNING.
IF SY-SUBRC = 0.
-HKONT = '0011460001'.
ENDIF.
ENDLOOP.
ENDIF.
ENDCASE.
DATA: VAR_NAME(30).
**MIRO
DATA: XEKBE LIKE EKBE OCCURS 10 WITH HEADER LINE,
XEKPO LIKE EKPO OCCURS 10 WITH HEADER LINE,
TMP_EKPO LIKE EKPO.
**billing
DATA: XVBRPVB LIKE VBRPVB OCCURS 10 WITH HEADER LINE.
**Logic
READ TABLE T_BKPF INDEX 1.
CASE T_BKPF-BLART.
WHEN 'RE'.
VAR_NAME = '(SAPLMRMP)XEKBE[]'.
ASSIGN (VAR_NAME) TO
CHECK SY-SUBRC = 0.
XEKBE[] =
LOOP AT XEKBE.
SELECT * FROM EKPO WHERE EBELN = XEKBE-EBELN
AND EBELP = XEKBE-EBELP
AND ( KNTTP = 'A' OR KNTTP = 'K' ).
APPEND EKPO TO XEKPO.
ENDSELECT.
ENDLOOP.
CHECK XEKPO[] IS NOT INITIAL.
LOOP AT XEKPO.
IF XEKPO-NETWR > TMP_EKPO-NETWR.
TMP_EKPO = XEKPO.
ENDIF.
ENDLOOP.
CLEAR LFA1.
LOOP AT T_BSEG WHERE KOART = 'K'.
READ TABLE T_BSEGSUB WITH KEY TABIX = SY-TABIX ASSIGNING
SELECT SINGLE * FROM LFA1 WHERE LIFNR = T_BSEG-LIFNR
AND KTOKK = 'Z101'.
IF SY-SUBRC = 0. "關係人
CASE TMP_EKPO-KNTTP.
WHEN 'A'.
WHEN 'K'.
ENDCASE.
ELSE. "非關係人
CASE TMP_EKPO-KNTTP.
WHEN 'A'.
WHEN 'K'.
ENDCASE.
ENDIF.
ENDLOOP.
WHEN 'RV'.
VAR_NAME = '(SAPMV60A)XVBRP[]'.
ASSIGN (VAR_NAME) TO
CHECK SY-SUBRC = 0.
XVBRPVB[] =
READ TABLE XVBRPVB INDEX 1.
CHECK SY-SUBRC = 0.
SELECT SINGLE * FROM VBAK WHERE VBELN = XVBRPVB-AUBEL
AND AUART = 'ZSLA'.
CHECK SY-SUBRC = 0.
SELECT SINGLE * FROM KNA1 WHERE KUNNR = VBAK-KUNNR AND KTOKD = 'Z005'.
IF SY-SUBRC = 0.
LOOP AT T_BSEG WHERE KOART = 'D'.
READ TABLE T_BSEGSUB WITH KEY TABIX = SY-TABIX ASSIGNING
IF SY-SUBRC = 0.
ENDIF.
ENDLOOP.
ELSE.
LOOP AT T_BSEG WHERE KOART = 'D'.
READ TABLE T_BSEGSUB WITH KEY TABIX = SY-TABIX ASSIGNING
IF SY-SUBRC = 0.
ENDIF.
ENDLOOP.
ENDIF.
ENDCASE.
訂閱:
文章 (Atom)