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.