2010年10月19日

FI park document 檢查 2/2

前篇提到park document save時,借貸要相等的做法是用BTE event 2213,但是error時會整個交易Exit。


我想解法應該不只一種,就用ECC6以後才有的Enhancement Implementation處理:
1 以F-65為例,先找到save時在PAI檢查的PAI module。
2 進一步找到include program LF040F00裡面的form beleg_parken_pruefen,從這段code當中發現是用來做save檢查的。
3 直接在form上面enhance,Enhancement Implementation名稱就取叫ZEH_LF040F00。
4 在enhancement加入以下code:


data: h_wrbtr type wrbtr,
      s_wrbtr 
type wrbtr.
  
LOOP AT xbseg .
    
case xbseg-SHKZG.
      
when 'H'.
        h_wrbtr = h_wrbtr + xbseg-wrbtr.
      
when 'S'.
        s_wrbtr = s_wrbtr + xbseg-wrbtr.
    endcase.
  ENDLOOP.
  
check h_wrbtr ne s_wrbtr.
  
message e888(SABAPDOCU) with '借貸金額不平,請修改明細項目!'.


5 最後記得要active。

FI park document 檢查 1/2

新project在FI有個很特殊的需求:
1 park document的item輸入時檢查利潤中心和成本中心不可空白。
2 park document save時,借貸要相等。

需求1本想用validation做,一試之下發現不行。
退而求其次,改用BTE event 2213,試了之後檢查是可行的,但有個缺點只能在save時檢查,並且一旦檢查出錯誤時,就Exit,失敗!

想來想去差點就無解了,突然想到一個幾乎失傳的技術(RWIN_CHECK),我最早看到是在R/3 4.0有人這麼做過。

考慮利潤中心和成本中心是在item的coding block,所以就copy標準的function FI_COBL_CHECK到ZFI_COBL_CHECK。
在裡面加入以下park doc的檢查code:

IF I_COBL-VORGN = 'RFBV'. * BREAK IBM_KEN.
CASE I_COBL-HKONT(3).
WHEN '006' OR '007'.
IF I_COBL-KOSTL = ''.
SUBRC = 12.
ENDIF.
ENDCASE.

SELECT SINGLE FSTAG INTO FSTAG FROM SKB1
WHERE BUKRS = I_COBL-BUKRS
AND SAKNR = I_COBL-HKONT
AND FSTAG = 'G005'.
IF SY-SUBRC = 0 AND I_COBL-PRCTR = ''.
SUBRC = 13.
ENDIF.
ENDIF.

之後再補上message

WHEN 12.
MESSAGE E888(SABAPDOCU) WITH '成本中心欄位不可空白!!'.
WHEN 13.
MESSAGE E888(SABAPDOCU) WITH '利潤中心欄位不可空白!!'.

完成之後要將table TRWPR補上ZFI_COBL_CHECK設定。

park document save可用失敗的BTE來做,但一樣會Exit,解法下篇再說。