2009年12月13日

TR交易新增欄位


在TR交易中,Tcode FTR_CREATE或是FTR_EDIT中有很多欄位,針對客戶的特定需求有時候還是得要新增一些欄位,尤其是後續有管理目的和會計編表目的時,新增欄位很有幫助。
以下是作法:
  • 先在SE11找到table vtbfha以display模式顯示,並點選附加欄位結構






  • 完成結構欄位定義,記住field name一定要ZZ打頭才行喔


















  • 建立一個功能群組ZTRF001,並在TOP宣告:
TYPE-POOLS: FTROP, FTRG.
* TABLES
TABLES: ZAVTBFHA1, ZAVTBFHA2.

* References to TRTM objects
DATA:
G_PROXY_TRANSACTION
TYPE REF TO IF_OPEN_TRTM_PROXY_DEAL_DATA,
G_PROXY_CUST_DATA
TYPE REF TO IF_OPEN_TRTM_CUSTOMER_DATA,
G_PROXY_MESSAGES
TYPE REF TO IF_OPEN_TRTM_PROXY_MESSAGE,
G_PROXY_FCODE
TYPE REF TO IF_OPEN_TRTM_PROXY_FCODE,
G_PROXY_FMOD
TYPE REF TO IF_OPEN_TRTM_PROXY_FMOD.

* Append structures of VTBFHA
DATA:
G_TAB_FHA_APPENDS
TYPE FTROP_TAB_CUST_APPEND.

* supported FCODES with subscreen
CONSTANTS:
C_CUSTOM_GUI_FCODE1
TYPE SYUCOMM VALUE 'OPEN_TRTM_CUST_01',
C_CUSTOM_GUI_FCODE2
TYPE SYUCOMM VALUE 'OPEN_TRTM_CUST_02'.

  • 在功能群組新增FM Z_FTR_CUSTOM_BADI_START
*"*"區域介面:
*" IMPORTING
*" REFERENCE(PI_PROXY_TRANSACTION) TYPE REF TO
*" IF_OPEN_TRTM_PROXY_DEAL_DATA
*" REFERENCE(PI_PROXY_MESSAGES) TYPE REF TO
*" IF_OPEN_TRTM_PROXY_MESSAGE
*" REFERENCE(PI_PROXY_FCODE) TYPE REF TO IF_OPEN_TRTM_PROXY_FCODE
*" REFERENCE(PI_PROXY_FMOD) TYPE REF TO IF_OPEN_TRTM_PROXY_FMOD
*" REFERENCE(PI_CUST_TRANSACTION) TYPE REF TO
*" IF_OPEN_TRTM_CUSTOMER_DATA
*" CHANGING
*" REFERENCE(PC_TAB_BADI_TABS) TYPE FTROP_TAB_BADI_SUBSCREEN

DATA: L_BADI_TABS
LIKE LINE OF PC_TAB_BADI_TABS.
DATA: L_TAB_MOD_FIELDS
TYPE FTRG_TAB_FIELD_MODIFY.
DATA: L_MOD_FIELDS
LIKE LINE OF L_TAB_MOD_FIELDS.
* save references in the global memory of the function module first
G_PROXY_TRANSACTION = PI_PROXY_TRANSACTION.
G_PROXY_CUST_DATA = PI_CUST_TRANSACTION.
G_PROXY_MESSAGES = PI_PROXY_MESSAGES.
G_PROXY_FCODE = PI_PROXY_FCODE.
G_PROXY_FMOD = PI_PROXY_FMOD.

** process the first FCODE
L_BADI_TABS-REPID =
'SAPLZTRF001'. "REPORT
L_BADI_TABS-DYNNR =
'0100'. "Subscreen
L_BADI_TABS-TEXT_TAB = TEXT-001.
MODIFY PC_TAB_BADI_TABS FROM L_BADI_TABS
TRANSPORTING REPID DYNNR TEXT_TAB
WHERE FCODE = C_CUSTOM_GUI_FCODE1. "1st FCODE
CALL METHOD G_PROXY_FMOD->SET_FIELDMOD
EXPORTING
PI_MODIFIED_FIELDS = L_TAB_MOD_FIELDS.
  • Implement BADI FTR_CUSTOMER_EXTENT,命名為ZFTR_CUSTOMER_EXTENT,並在interface EVT_APPLICATION_START加上以下code
CALL FUNCTION 'Z_FTR_CUSTOM_BADI_START'
EXPORTING
PI_PROXY_TRANSACTION = PI_PROXY_TRANSACTION
PI_PROXY_MESSAGES = PI_PROXY_MESSAGES
PI_PROXY_FCODE = PI_PROXY_FCODE
PI_PROXY_FMOD = PI_PROXY_FMOD
PI_CUST_TRANSACTION = PI_CUST_TRANSACTION
CHANGING
PC_TAB_BADI_TABS = PC_TAB_BADI_TABS.

  • 在功能群組新增SCREEN 100,定義新增欄位的layout
  • SCREEN 100的PBO module
DATA: L_ZAVTBFHA1 LIKE ZAVTBFHA1.
DATA: L_PBO_FHA_APPENDS
LIKE LINE OF G_TAB_FHA_APPENDS.
*取得客製新增結構
CALL METHOD G_PROXY_CUST_DATA->GET_CUST_DATA
IMPORTING
PE_TAB_FHA_APPENDS = G_TAB_FHA_APPENDS
EXCEPTIONS
INVALID_CALL =
1
OTHERS = 2.

READ TABLE G_TAB_FHA_APPENDS INDEX 1 INTO L_PBO_FHA_APPENDS.
L_ZAVTBFHA1 = L_PBO_FHA_APPENDS-CONTENT.
IF L_ZAVTBFHA1 NE ZAVTBFHA1.
ZAVTBFHA1 = L_ZAVTBFHA1.
ENDIF.

  • SCREEN 100的PAI module
DATA: L_PAI_FHA_APPENDS LIKE LINE OF G_TAB_FHA_APPENDS.

CALL METHOD G_PROXY_CUST_DATA->GET_CUST_DATA
IMPORTING
PE_TAB_FHA_APPENDS = G_TAB_FHA_APPENDS
EXCEPTIONS
INVALID_CALL =
1
OTHERS = 2.
IF SY-SUBRC <> 0.
* MESSAGE ID SY-MSGID TYPE SY-MSGTY NUMBER SY-MSGNO
* WITH SY-MSGV1 SY-MSGV2 SY-MSGV3 SY-MSGV4.
ENDIF.

** prepare return table with changes from dynpro
LOOP AT G_TAB_FHA_APPENDS INTO L_PAI_FHA_APPENDS.
L_PAI_FHA_APPENDS-CONTENT = ZAVTBFHA1.
MODIFY G_TAB_FHA_APPENDS FROM L_PAI_FHA_APPENDS.
ENDLOOP.

CALL METHOD G_PROXY_CUST_DATA->SET_CUST_DATA
EXPORTING
PI_TAB_FHA_APPENDS = G_TAB_FHA_APPENDS
EXCEPTIONS
INVALID_DATA =
1
INVALID_CALL =
2
OTHERS = 3.
IF SY-SUBRC <> 0.
* MESSAGE ID SY-MSGID TYPE SY-MSGTY NUMBER SY-MSGNO
* WITH SY-MSGV1 SY-MSGV2 SY-MSGV3 SY-MSGV4.
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月23日

Listbox範例

在Selection Screen上面要做出listbox不是一件困難的事情,參照下面的寫法就很簡單了

REPORT  ZLISTBOX.

*引用type-pool VRM
TYPE-POOLS: VRM.

*宣告internal table及workarea 
DATA: IT_VAL1 TYPE VRM_VALUES.      "第一個下拉選單
DATA: IT_VAL2 TYPE VRM_VALUES.      "第二個下拉選單
DATA: W_LINE LIKE LINE OF IT_VAL1.    "work area

*選擇畫面欄位,指定為LISTBOX
PARAMETERS: P_BUKRS LIKE T001-BUKRS AS LISTBOX 
VISIBLE LENGTH 25 OBLIGATORY.
PARAMETERS: P_MONTH LIKE T247-MNR AS LISTBOX 
VISIBLE LENGTH 12 OBLIGATORY.

*初始化時將資料讀入下拉選單table
INITIALIZATION.
  SELECT BUKRS BUTXT FROM T001 INTO (W_LINE-KEY, W_LINE-TEXT).
    APPEND W_LINE TO IT_VAL1.
    CHECK P_BUKRS IS INITIAL.
    P_BUKRS = W_LINE-KEY.
  ENDSELECT.

  SELECT MNR LTX FROM T247 INTO (W_LINE-KEY, W_LINE-TEXT) 
WHERE SPRAS = SY-LANGU.
    APPEND W_LINE TO IT_VAL2.
    CHECK P_MONTH IS INITIAL.
    P_MONTH = W_LINE-KEY.
  ENDSELECT.

*選擇畫面出現時將下拉選單的值指到table的
AT SELECTION-SCREEN OUTPUT.
  CALL FUNCTION 'VRM_SET_VALUES'
    EXPORTING
      ID     = 'P_BUKRS'
      VALUES = IT_VAL1.
  CALL FUNCTION 'VRM_SET_VALUES'
    EXPORTING
      ID     = 'P_MONTH'
      VALUES = IT_VAL2.

*印出下拉選單選出來的資料
END-OF-SELECTION.
  WRITE: / 'Company Code:', P_BUKRS.
  WRITE: / 'Month:', P_MONTH.


執行結果如下:

2009年4月16日

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

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










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

2009年4月15日

Loan Management交易轉檔不過帳

最近導入一個新案子包含了Loan Management,遇到一個情況:上線前已存在的交易部分流量已過帳,交易在SAP轉入後需將流量補過帳,但不產生會計文件,直接由FI入帳。
問過數位TR顧問,在IMG中並沒有這樣的設定,只好往ABAP方面去進行,剛好SAP提供了一個BADI:FVD_LOAN_POST似乎答案就在裡面

用SE18查查看,好像發現了……









看看BADI提供的介面














參數C_FLG_SUPPRESS_FI就是關鍵









經過測試(範例略),確實成功了

2009年4月13日

Regular Expressions(正規表示式) 驗證工具

SAP 一開始並沒有支援正規表示式,
有一支程式叫做DEMO_REGEX_TOY可以直接驗證自己寫的正規表示式。

進入SE38執行後畫面如下:


2009年4月9日

Line Item Display新增欄位無法正常顯示

在FI的line item display報表透過IMG設定新增欄位之後,卻發現新增的欄位無法在報表中出現,這是因為在IMG設定的資料在變更之後會同時調整相關程式及報表欄位,但transport到另一server時只會傳輸設定,程式及相關Data Dictionary不會改變,因此報表也沒有變化。

好在SAP Notes提供了解法:執行程式RFPOSXEXTEND,自動調整structure RFPOSXEXT就正常了