結構定義:
ZS_POST_HEADERBUKRS | BUKRS | CHAR | 4 | 公司代碼 | |
NUMPG | J_1ANOPG | NUMC | 3 | 發票的頁數 | |
BLART | BLART | CHAR | 2 | 憑證類型 | |
BLDAT | BLDAT | DATS | 8 | 憑證中的憑證日期 | |
BUDAT | BUDAT | DATS | 8 | 憑證中的過帳日期 | |
BKTXT | BKTXT | CHAR | 25 | 憑證擡頭文本 | |
XBLNR | XBLNR | CHAR | 16 | 參考憑證編号 | |
WAERS | WAERS | CUKY | 5 | 貨币碼 | |
KURSF | KURSF | DEC | 9 | 5 | 匯率 |
結構定義:ZS_post_item
SHKZG | SHKZG | CHAR | 1 | 借方/貸方辨別 | |
KOART | KOART | CHAR | 1 | 科目類型 | |
BSCHL | BSCHL | CHAR | 2 | 記帳代碼 | |
HKONT | HKONT | CHAR | 10 | 總分類帳帳目 | |
KUNNR | KUNNR | CHAR | 10 | 客戶編号 | |
LIFNR | LIFNR | CHAR | 10 | 供應商或債權人的帳号 | |
UMSKZ | UMSKZ | CHAR | 1 | 特殊總帳辨別 | |
KOSTL | KOSTL | CHAR | 10 | 成本中心 | |
PRCTR | PRCTR | CHAR | 10 | 利潤中心 | |
DMBTR | DMBTR | CURR | 13 | 2 | 按本位币計的金額 |
ZUONR | DZUONR | CHAR | 18 | 配置設定編号 | |
SGTXT | SGTXT | CHAR | 50 | 項目文本 | |
RSTGR | RSTGR | CHAR | 3 | 現金流量事務代碼 | |
ZFBDT | ZFBDT | DATS | 8 | 到期日 | |
WDATE | WDATE | DATS | 8 | 彙票簽發日 | |
WBANK | WBANK | CHAR | 60 | 票據号 | |
WLZBP | WLZBP | CHAR | 60 | 出票行 | |
XNEGP | XNEGP | CHAR | 1 | 辨別: 反記帳 | |
KKBER | KKBER | CHAR | 4 | 信貸控制範圍 | |
ZLSCH | SCHZW_BSEG | CHAR | 1 | 付款方式 |
增強結構定義 zs_post_exten
POSNR | POSNR_ACC | NUMC | 10 | 會計憑證行項目編号 |
BSCHL | BSCHL | CHAR | 2 | 記帳代碼 |
SHKZG | SHKZG | CHAR | 1 | 借方/貸方辨別 |
NUMPG | J_1ANOPG | NUMC | 3 | 發票的頁數 |
RSTGR | RSTGR | CHAR | 3 | 現金流量事務代碼 |
WDATE | WDATE | DATS | 8 | 彙票簽發日 |
WBANK | WBANK | CHAR | 60 | 票據号 |
WLZBP | WLZBP | CHAR | 60 | 出票行 |
XNEGP | XNEGP | CHAR | 1 | 辨別: 反記帳 |
KKBER | KKBER | CHAR | 4 | 信貸控制範圍 |
ZLSCH | SCHZW_BSEG | CHAR | 1 | 付款方式 |
WNAME | WNAME | 彙票受票人的名字 | ||
WBZOG | WBZOG | 彙票出票人 |
增強1:
BADI ACC_DOCUMENT裡指派

這裡建議加上增強結構名稱的校驗,防止影響别人
而且直接這麼move 可能會出現空值覆寫原來的值的情況,建議判斷非空再複制
或者參考一個工具代碼
FUNCTION zfm_move_value .
*"----------------------------------------------------------------------
*"*"Local interface:
*" IMPORTING
*" VALUE(IS_INPUT)
*" VALUE(IV_STRUCTURE)
*" VALUE(CV_STRUCTURE)
*" CHANGING
*" VALUE(CS_INPUT) OPTIONAL
*"----------------------------------------------------------------------
FIELD-SYMBOLS :
TYPE any , "從工作區結構
TYPE any . "到工作區結構
*
DATA : lt_idetails TYPE abap_compdescr_tab WITH HEADER LINE .
DATA : lr_ref_table_des TYPE REF TO cl_abap_structdescr .
DATA : ct_idetails TYPE abap_compdescr_tab WITH HEADER LINE .
DATA : cr_ref_table_des TYPE REF TO cl_abap_structdescr .
lr_ref_table_des ?=
cl_abap_typedescr => describe_by_name ( iv_structure ) .
CLEAR lt_idetails[] .
lt_idetails[] = lr_ref_table_des -> components[] .
cr_ref_table_des ?=
cl_abap_typedescr => describe_by_name ( cv_structure ) .
CLEAR ct_idetails[] .
ct_idetails[] = cr_ref_table_des -> components[] .
"循環判斷結構每個字段
LOOP AT lt_idetails .
ASSIGN COMPONENT lt_idetails - name OF STRUCTURE is_input TO .
CHECK sy - subrc = 0 .
READ TABLE ct_idetails WITH KEY name = lt_idetails - name .
CHECK sy - subrc = 0 .
ASSIGN COMPONENT ct_idetails - name OF STRUCTURE cs_input TO .
CHECK sy - subrc = 0 .
IF IS NOT INITIAL .
= .
ENDIF .
ENDLOOP .
ENDFUNCTION .
增強2 隐士增強
增強位置1: FI_DOCUMENT_CHECK
一進來,先檢查是否是W類型特殊總賬(用get函數擷取,set操作在 調用bapi的時候 指派) 如果是,把char_w 改為U
在函數最後,改回去
增強位置2: LFACIF5D form最後的地方 把exten 資料傳過來,傳給bsed資料
這裡特殊聲明下:
因為這個demo隻涉及特殊總賬類型為W的,其他特殊總賬不考慮BSED,
這個得根據所在項目業務來确定,如果除了W還有 S或者其他等類型的,再多加個判斷即可。
FUNCTION zfm_ac_post .
*"----------------------------------------------------------------------
*"*"Local interface:
*" IMPORTING
*" REFERENCE(IS_HEADER) TYPE ZS_POST_HEADER
*" EXPORTING
*" VALUE(EV_BELNR) TYPE BELNR_D
*" VALUE(EV_MSG) TYPE STRING
*" TABLES
*" IT_ITEM STRUCTURE ZS_POST_ITEM
*" RETURN STRUCTURE BAPIRET2
*"----------------------------------------------------------------------
DATA : gs_bkpf TYPE bapiache09 ,
gt_account TYPE TABLE OF bapiacgl09 , "總帳
gs_account TYPE bapiacgl09 ,
gt_customer TYPE TABLE OF bapiacar09 , "客戶
gs_customer TYPE bapiacar09 ,
gt_vendor TYPE TABLE OF bapiacap09 , "供應商
gs_vendor TYPE bapiacap09 ,
gt_currency TYPE TABLE OF bapiaccr09 , "貨币
gs_currency TYPE bapiaccr09 ,
gt_etx TYPE TABLE OF bapiparex , "擴充結構
gs_etx TYPE bapiparex ,
gt_etxend TYPE TABLE OF zs_post_exten , "擴充結構
gs_etxend TYPE zs_post_exten ,
gt_return TYPE TABLE OF bapiret2 WITH HEADER LINE .
DATA : l_itemno TYPE posnr_acc . "行項目編号
DATA : lv_number1 TYPE i .
DATA : lv_flag_w TYPE flag . "W 類型特殊總賬
DATA :ls_item LIKE LINE OF it_item .
*header
CLEAR gs_bkpf .
gs_bkpf -comp_code = is_header -bukrs .
gs_bkpf -doc_type = is_header -blart .
gs_bkpf -doc_date = is_header -bldat .
gs_bkpf -pstng_date = is_header -budat .
gs_bkpf -header_txt = is_header -bktxt .
gs_bkpf -ref_doc_no = is_header -xblnr .
gs_bkpf -username = sy -uname .
*item
REFRESH :gt_account ,gt_customer ,gt_vendor ,gt_currency ,gt_etxend ,gt_etx ,gt_return .
CLEAR : gs_account ,gs_customer ,gs_vendor ,gs_currency ,gs_etxend ,gs_etx .
CLEAR ls_item .
l_itemno = '0000000000' . "行項目編号
LOOP AT it_item INTO ls_item .
** gs_bkpf-neg_postng = ls_item-xnegp." header 的,但是為啥到了item
CALL FUNCTION 'CONVERSION_EXIT_ALPHA_INPUT'
EXPORTING
input = ls_item -kunnr
IMPORTING
output = ls_item -kunnr .
CALL FUNCTION 'CONVERSION_EXIT_ALPHA_INPUT'
EXPORTING
input = ls_item -lifnr