PERFORM frm_acc_document.
*&---------------------------------------------------------------------*
*& Form FRM_ACC_DOCUMENT
*&---------------------------------------------------------------------*
*& text
*&---------------------------------------------------------------------*
*& --> p1 text
*& <-- p2 text
*&---------------------------------------------------------------------*
FORM frm_acc_document .
DATA: ls_header TYPE bapiache09,
lv_type TYPE bapiache09-obj_type,
lv_key TYPE bapiache09-obj_key,
lv_sys TYPE bapiache09-obj_sys,
lt_accountgl TYPE TABLE OF bapiacgl09,
lt_accountre TYPE TABLE OF bapiacar09,
lt_accountpa TYPE TABLE OF bapiacap09,
lt_amount TYPE TABLE OF bapiaccr09,
lt_return TYPE TABLE OF bapiret2,
ls_exten_val TYPE zifs_accitem_ext, " 扩展表
lt_exten TYPE TABLE OF bapiparex,
ls_exten TYPE bapiparex.
CLEAR: ls_header, lv_type, lv_key, lv_sys.
REFRESH: lt_accountgl , lt_accountre, lt_accountpa, lt_amount, lt_exten.
" 抬头
ls_header-username = 'USNAM'. " 用户名
ls_header-doc_date = 'BLDAT'. " 凭证日期
ls_header-pstng_date = 'BUDAT'. " 过账日期
ls_header-fisc_year = 'GJAHR'. " 会计年度
ls_header-fis_period = 'MONAT'. " 会计期间
ls_header-header_txt = '抬头文本'. " 抬头文本
ls_header-ledger_group = '0L'. " 分类帐组
ls_header-comp_code = 'BUKRS'. " 公司代码
ls_header-ref_doc_no = 'XBLNR'. " 参考凭证编号
ls_header-obj_type = 'AWTYP'. " 参考过程
ls_header-obj_key = 'AWKEY'. " 参考键值
ls_header-obj_sys = 'AWSYS'. " 逻辑系统
ls_header-doc_type = 'SA'. " 凭证类型
ls_header-bus_act = 'RFBU'. " 逻辑系统
" 利润中心获取成本中心
SELECT SINGLE verak INTO @DATA(lv_verak) FROM cepc WHERE prctr = 'PRCTR' AND kokrs = 'KOKRS'.
IF sy-subrc = 0.
SELECT SINGLE kostl INTO @DATA(lv_kostl) FROM csks WHERE func_area = @lv_verak AND bukrs = 'BUKRS'.
ENDIF.
" 总账
" 1. 根据HKON取SKB1的MITKZ的值, 判断MITKZ科目类型, 决定往哪个参数里赋值
" 2. 根据BSCHL取TBSL的KOART/SHKZG, 判断KOART科目类型, 决定往哪个参数里赋值, 同时可根据SHKZG来确定借贷方向
SELECT SINGLE koart INTO @DATA(lv_koart) FROM tbsl WHERE bschl = 'BSCHL'.
SELECT SINGLE mitkz INTO @lv_koart FROM skb1 WHERE bukrs = 'BUKRS' AND saknr = 'HKONT'.
CASE lv_koart.
WHEN 'S' OR 'A'. " 总账/资产
APPEND VALUE #(
itemno_acc = 'POSNR_ACC'
gl_account = 'HKONT'
costcenter = 'KOSTL'
profit_ctr = 'PRCTR'
tax_code = 'MWKSZ'
item_text = 'SGTXT'
) TO lt_accountgl.
WHEN 'D'. " 客户-应收
APPEND VALUE #(
itemno_acc = 'POSNR_ACC'
customer = 'KUNNR'
gl_account = 'HKONT' " 如没有科目, 取KNB1表AKONT统驭科目, 作为总账科目
profit_ctr = 'PRCTR'
tax_code = 'MWSKZ'
pmnttrms = 'ZTERM'
item_text = 'SGTXT'
) TO lt_accountre.
WHEN 'K'. " 供应商-应付
APPEND VALUE #(
itemno_acc = 'POSNR_ACC'
vendor_no = 'LIFNR'
gl_account = 'HKONT' " 如没有科目, 取LFB1表AKONT统驭科目, 作为总账科目
profit_ctr = 'PRCTR'
tax_code = 'MWSKZ'
pmnttrms = 'ZTERM'
item_text = 'SGTXT'
) TO lt_accountpa.
ENDCASE.
" 00 凭证货币
" 10 公司代码货币
" 20 成本控制范围的记帐货币
" 30 集团公司记帐货币
" 不确认一定有金额的情况, 先判断金额, 再对金额赋值
" 凭证货币金额 00
APPEND VALUE #(
itemno_acc = 'POSNR_ACC'
amt_doccur = 'WRBTR'
currency = 'WAERS'
curr_type = '00'
) TO lt_amount .
" 公司代码货币金额
APPEND VALUE #(
itemno_acc = 'POSNR_ACC'
amt_doccur = 'DMBTR'
currency = 'WAERS'
curr_type = '10'
) TO lt_amount .
" 扩展字段
ls_exten_val = VALUE #(
posnr = 'POSNR_ACC'
rstgr = 'RSTGR'
bschl = 'BSCHL'
umskz = 'UMSKZ'
xnegp = 'XNEGP'
kidno = 'KIDNO'
anbwa = 'ANBWA'
).
ls_exten-structure = 'ZIFS_ACCITEM_EXT'.
CALL METHOD cl_abap_container_utilities=>fill_container_c
EXPORTING
im_value = ls_exten_val
IMPORTING
ex_container = ls_exten+30
EXCEPTIONS
illegal_parameter_type = 1
OTHERS = 2.
APPEND ls_exten TO lt_exten.
CLEAR ls_exten.
" BAPI
CALL FUNCTION 'BAPI_ACC_DOCUMENT_POST'
EXPORTING
documentheader = ls_header
IMPORTING
obj_type = lv_type
obj_key = lv_key
obj_sys = lv_sys
TABLES
accountgl = lt_accountgl
accountreceivable = lt_accountre
accountpayable = lt_accountpa
currencyamount = lt_amount
return = lt_return
extension2 = lt_exten.
LOOP AT lt_return INTO DATA(ls_return) WHERE type CA 'EAX'.
CONCATENATE lv_zmsg ls_return-message INTO DATA(lv_zmsg) SEPARATED BY '/'.
ENDLOOP.
IF lv_zmsg IS NOT INITIAL.
CALL FUNCTION 'BAPI_TRANSACTION_ROLLBACK'.
ELSE.
IF lv_key IS NOT INITIAL.
" lv_key+0(10) BELNR
" lv_key+10(4) BUKRS
" lv_key+14(4) GJAHR
CALL FUNCTION 'BAPI_TRANSACTION_COMMIT'
EXPORTING
wait = abap_true.
ELSE.
CALL FUNCTION 'BAPI_TRANSACTION_ROLLBACK'.
ENDIF.
ENDIF.
*--------------------------------------------------------------------*
* 扩展字段增强(代码可以直接复制, 扩展结构必须有POSNR字段, POSNR有值是行项目更新, 无值抬头更新. 参考POSNR_ACC)
* BADI: ACC_DOCUMENT 参考过程: BKPFF
* 增强点: BADI_ACC_DOCUMENT 实施方法: CHANGE
*--------------------------------------------------------------------*
**C_ACCHD TYPE ACCHD
**C_ACCIT TYPE ACCIT_TAB
**C_ACCCR TYPE ACCCR_TAB
**C_ACCWT TYPE ACCWT_TAB
**C_ACCTX TYPE ACCTX_TAB
**C_ACCFI TYPE ACCFI_T OPTIONAL
METHOD if_ex_acc_document~change.
DATA: wa_extension TYPE bapiparex,
ext_value(960) TYPE c,
wa_accit TYPE accit,
l_ref TYPE REF TO data.
FIELD-SYMBOLS: <l_struc> TYPE any,
<l_field> TYPE any.
SORT c_extension2 BY structure.
LOOP AT c_extension2 INTO wa_extension.
AT NEW structure.
CREATE DATA l_ref TYPE (wa_extension-structure).
ASSIGN l_ref->* TO <l_struc>.
ENDAT.
<l_struc> = wa_extension+30 .
** CONCATENATE wa_extension-valuepart1 " 上下2种任选一种写法
** wa_extension-valuepart2
** wa_extension-valuepart3
** wa_extension-valuepart4 INTO ext_value.
** <l_struc> = ext_value.
ASSIGN COMPONENT 'POSNR' OF STRUCTURE <l_struc> TO <l_field>.
IF sy-subrc = 0 AND <l_field> IS NOT INITIAL. " 行项目赋值
READ TABLE c_accit WITH KEY posnr = <l_field> INTO wa_accit.
IF sy-subrc IS INITIAL.
MOVE-CORRESPONDING <l_struc> TO wa_accit.
MODIFY c_accit FROM wa_accit INDEX sy-tabix.
ENDIF.
ELSE. " 抬头赋值"
MOVE-CORRESPONDING <l_struc> TO c_acchd.
ENDIF.
ENDLOOP.
ENDMETHOD.
ENDFORM.
BAPI_ACC_DOCUMENT_POST F-02凭证过账
于 2023-12-20 11:56:49 首次发布