BAPI_ACC_DOCUMENT_POST F-02凭证过账

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.
  • 17
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值