顯示具有 FI 標籤的文章。 顯示所有文章
顯示具有 FI 標籤的文章。 顯示所有文章

2011年2月11日

BAPI_ACC_DOCUMENT_POST 建立Park文件TAX item問題

還是用BAPI_ACC_DOCUMENT_POST 建立Park文件的問題。TAX item要在code裡面先處理好,借貸才會相等。步驟如下:

1 Tax不存入internal table ACCOUNTGL,要存入ACCOUNTTAX,指定的ITEMNO_ACC要正確。
2 處理 CURRENCYAMOUNT時,除了field AMT_DOCCUR要有稅額,field AMT_BASE稅基也要一併處理。

處理完成後進行測試,發現以下新的問題,金額借貸不相等,但是item相加是正常的???



檢查tax amount多了,要清除為0


做法:用BADI ACC_DOCUMENT的method CHANGE

DATA: WA_ACCTX TYPE ACCBSET.
LOOP AT C_ACCTX INTO WA_ACCTX.
CLEAR WA_ACCTX-FWSTE.
MODIFY C_ACCTX FROM WA_ACCTX .
ENDLOOP.

再RUN一次BAPI_ACC_DOCUMENT_POST這次正常:

2011年2月10日

由payment term決定baseline date的function module

繼上次寫到的用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年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.



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.

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文件。

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。


以下範例僅供參考:

  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.


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,解法下篇再說。

2010年9月24日

TBB1過帳替換special GL indicator科目

友人提問:TR的TBB1可以替換vendor的special GL indicator科目嗎?


1 進入IDES測試,建立一筆TR交易後執行TBB1測試


2 執行後結果,借方科目是總帳科目,過帳碼是40


3 Implement BADI TPM_ACCIF_TRAC,在Method ACCIT_EXIT修改借方的內容
過帳對象是vendor 1000
科目是160000
過帳碼 21
科目類型 K


  CH_ACCIT_D-LIFNR = '0000001000'.
  CH_ACCIT_D-HKONT = 
'0000160000'.
  CH_ACCIT_D-BSCHL = 
'21'.
  CH_ACCIT_D-KOART = 
'K'.


4 再執行一次TBB1測試,會計科目及過帳碼已經修改成功


5 再修改一次Method ACCIT_EXIT,過帳碼改為29,特殊總帳指示碼改為A,再加入稅碼V0(IDES設定替換後的科目要帶稅碼,在此不特別處理)


  CH_ACCIT_D-LIFNR = '0000001000'.
  CH_ACCIT_D-HKONT = 
'0000160000'.
  CH_ACCIT_D-BSCHL = 
'29'.
  CH_ACCIT_D-UMSKZ = 
'A'.
  CH_ACCIT_D-KOART = 
'K'.
  CH_ACCIT_D-MWSKZ = 
'V0'.


6 再執行一次TBB1測試,過帳碼29已經修改成功,會計科目還是160000


7 正式過帳看看傳票結果,TBB1的科目160000已替換成A類的科目159000



2010年9月17日

從BSEG找COPA特性值

友人提問,從FI doc上面要怎麼找到COPA的特性值?

從上圖可以看到FB03直接可查到COPA的特性值,找BSEG只能找到FIELD PAOBJNR,原來COPA的table和img有關,可用CE4*_ACCT在SE11找到table


以IDES為例,company code 1000對應的table就是CE4IDEA_ACCT,在SE16輸入PAOBJNR號碼來找看看:


執行後結果:



2010年9月15日

F110 找出下次付款日

友人提問:在F110自動付款中如何找出下次付款日




檢查標準程式發現是用Data Clusters方式存在,不方便直接使用SQL查詢
要改用Import,以下節錄F110VFP0中的程式碼:


  F110ID-LAUFD   = F110V-LAUFD.
  F110ID-LAUFI   = F110V-LAUFI.
  F110ID-OBJKT   = KON_PARAM.
  F110VERSIONPAR = SPACE.
  REFRESH: BUKTAB, FKTTAB, SLKTAB, SLDTAB, TRCTAB, USRTAB,
           FAETAB, JOBTAB.
  CLEAR:   BUKTAB, FKTTAB, SLKTAB, SLDTAB, TRCTAB, USRTAB,
           FAETAB, JOBTAB, F110C,  TRCOPT, F110VERSIONPAR.
  
IMPORT BUKTAB FKTTAB SLKTAB SLDTAB TRCTAB USRTAB
         FAETAB JOBTAB F110C  TRCOPT F110VERSIONPAR
         
FROM DATABASE RFDT(FB) ID F110ID.


FKTTAB就是parameter的internal table

2010年7月3日

BAPI_ACC_DOCUMENT_POST寫入COPA特性值

1 宣告
DATA: IT_CRITERIA LIKE TABLE OF BAPIACKEC9 WITH HEADER LINE

2 依需求填入值
IT_CRITERIA-ITEMNO_ACC = ITAB-BUZEI.
IT_CRITERIA-FIELDNAME = 'VTWEG'.
IT_CRITERIA-CHARACTER = ITAB-VTWEG.
APPEND IT_CRITERIA. CLEAR IT_CRITERIA.

3 過帳
CALL FUNCTION 'BAPI_ACC_DOCUMENT_POST'
EXPORTING
DOCUMENTHEADER = GD_DOCUMENTHEADER
IMPORTING
OBJ_TYPE = GS_BAPIACHE09-OBJ_TYPE
OBJ_KEY = GS_BAPIACHE09-OBJ_KEY
OBJ_SYS = GS_BAPIACHE09-OBJ_SYS
TABLES
ACCOUNTGL = IT_ACCOUNTGL
CURRENCYAMOUNT = IT_CURRENCYAMOUNT
CRITERIA = IT_CRITERIA
RETURN = IT_RETURN.

2010年6月30日

Coding block客製欄位,BAPI_ACC_DOCUMENT_POST傳票過帳寫入做法

BAPI拋僄票的寫法,遇上cobl欄位的處理需要加上BADI ACCDOCUMENT


Implement 名稱取ZACC_DOCUMENT即可,需特別注意filter值要選BKPFF

這時只有BAPI才會進去

Implement Method: CHANGE

貼入以下程式碼:

DATA: LW_CI_COBL TYPE CI_COBL,

WA_ACCIT TYPE ACCIT,

WA_EXT2 TYPE BAPIPAREX .

LOOP AT C_ACCIT INTO WA_ACCIT.

READ TABLE C_EXTENSION2 INTO WA_EXT2 INDEX WA_ACCIT-POSNR.

IF SY-SUBRC = 0.

LW_CI_COBL = WA_EXT2-VALUEPART1.

MOVE-CORRESPONDING LW_CI_COBL TO WA_ACCIT.

MODIFY C_ACCIT FROM WA_ACCIT.

ENDIF.

ENDLOOP.

2010年1月15日

TR評價類別移轉,會計文件不過帳處理

繼之前提到的Loan Management交易不過帳,最近友人提到客戶有個需求在交易的評價類別移轉時(Tcode TPM15),需考慮到不產生會計文件。
例:
以交易為目的(評價類別0001)移轉到備供出售(評價類別0002)時,需產生會計文件。
以交易為目的(評價類別0001)移轉到持有至到期日(評價類別0003)時,不需產生會計文件。

做法:採用BADI TPM_ACCIF_TRAC的Method FLOW_POSTING_RELEVANCE,依邏輯判斷後,將CH_FLG_POSTING_RELEVANT值設定為space後,系統即不產生會計文件。

進行時發生一個困難,FLOW_POSTING_RELEVANCE這個Method並不提供參數判斷TPM15交易時移轉前後的評價類別資訊。實際以Debug方式測試後,發現可用Field Symbol將TPM15程式的變數以參考方式取得進行判斷,程式碼如下:

DATA: TRLY_TRQ_QTY_SELECT TYPE TABLE OF TRLS_TRQ_QTY_SELECT,
TRLY_TRQ_QTY TYPE TRLS_TRQ_QTY_SELECT.
FIELD-SYMBOLS: <> TYPE ANY.
DATA: OBJNAME TYPE STRING VALUE '(SAPLTPM_TRL_VAL_CLASS_TRANSFER)G_TAB_TRQ_QTY_SELECT[]'.

CHECK SY-TCODE = 'TPM15'.
ASSIGN (OBJNAME) TO <>.
IF SY-SUBRC = 0.
TRLY_TRQ_QTY_SELECT = .
***判斷TRLY_TRQ_QTY_SELECT裡面的前後二個class
READ TABLE TRLY_TRQ_QTY_SELECT INTO TRLY_TRQ_QTY INDEX 1.
IF SY-SUBRC = 0.
IF TRLY_TRQ_QTY-COM_VAL_CLASS = '0001' AND
TRLY_TRQ_QTY-TGT_COM_VAL_CLASS = '0002'.
CH_FLG_POSTING_RELEVANT = SPACE.
ENDIF.
ENDIF.
ENDIF.

2009年5月13日

在BTE 00001030使用call screen 發生E type message

前因:
在台灣的GUI系統客製時,user做FI 立帳的AP時常會用到多張進項發票輸入,想要在傳票過帳時處理通常會使用BTE在event 00001030已經取得傳票號碼時,進行客製畫面呼叫,讓user將進項發票明細補上。

問題點:
這種解法看起來很容易,但是卻忽略了一個情況,就是此時傳票已經取號,發生異常時,系統無法回復。同時還有更嚴重的問題,那就是萬一呼叫出來的screen中發生error message時,無法由自身的機制補捉(chain), 會在之前就被event 00001030補抓,並且程式直接跳出,此情況亦算是一種異常,傳票一樣會發生空號。

解法:
會發生error message情況不外乎是客製欄位在定義時參考日期/金額等有自我檢查機制的資料型態,user光是輸入錯誤格式便會產生error message,慘案也就發生了。針對這種問題,最好是把資料型態設成Char,在chain當中自行撰寫程式碼檢查,若發生格式錯誤時,不可拋出E type message, 改用FM POPUP_TO_DISPLAY_TEXT,將錯誤訊息直接pop up。

例子:
以日期欄位為例,考慮日期在display時會帶有符號,客製欄位直接定義為10碼長度。user輸入後進入chain檢查時,用FM PERIOD_AND_DATE_CONVERT_INPUT將char type的日期直接轉換成D type日期, 若SY-SUBRC = 0時表示輸入的日期格式正確。若SY-SUBRC <> 0時,Call 'POPUP_TO_DISPLAY_TEXT',提示user 重新輸入。
金額欄位略。


2009年4月16日

生效日期(BSEG-VALUT)修改與規劃日期(BSEG-FDTAG)不一致)

今天在客戶系統發生一件奇怪的事情,User執行了客製程式網銀放行功能,修改了生效日期,造成了與規劃日期不一致,客製程式銀行帳戶餘額表抓取規劃日期計算出的餘額不正確。
 
採用FB02直接修改line item的生效日期時,系統會自動update規劃日期與生效日期一致,但客製程式執行結果卻不相同,只好檢查一下程式的寫法,後來找到了呼叫的FM CHANGE_DOCUMENT










原來是直接把document讀出來,資料修改後再寫回去,只改了生效日期,規劃日期還是原封不動,造成的不一致。
結論:以後還是少用直接修改資料庫Table欄位的程式吧!