ABAP会计凭证生成接口

FUNCTION zfifm057.
*"----------------------------------------------------------------------
""本地接口:
*" EXPORTING
*" VALUE(HLYNUMBER) TYPE CHAR50
*" VALUE(TRANSACTIONNUMBER) TYPE CHAR50
*" VALUE(BELNR) TYPE BELNR_D
*" VALUE(ZMSGTYP) TYPE CHAR01
*" VALUE(ZMSGTXT) TYPE CHAR200
*" TABLES
*" IT_HEAD STRUCTURE ZFIFM057_HEAD
*" IT_ITEM STRUCTURE ZFIFM057_ITEM
*"----------------------------------------------------------------------

DATA:wa_documentheader    TYPE bapiache09, "待传凭证抬头 工作区
       wa_accountgl         TYPE bapiacgl09, "总帐科目项 工作区
       it_accountgl         TYPE STANDARD TABLE OF bapiacgl09, "总帐科目项内表
       wa_accountreceivable TYPE bapiacar09, "客户项目 工作区
       it_accountreceivable TYPE STANDARD TABLE OF bapiacar09, "客户项目 内表
       wa_accountpayable    TYPE bapiacap09, "供应商项目 工作区
       it_accountpayable    TYPE STANDARD TABLE OF bapiacap09, "供应商项目内表
       wa_currencyamount    TYPE bapiaccr09, "货币项目 工作区
       it_currencyamount    TYPE STANDARD TABLE OF bapiaccr09, "货币项目 内表
       wa_extension2        TYPE bapiparex, "参考结构 工作区
       it_extension2        TYPE STANDARD TABLE OF bapiparex, "参考结构 内表
       wa_return            TYPE bapiret2, "返回参数 工作区
       it_return            TYPE STANDARD TABLE OF bapiret2,
       l_obj_key            TYPE bapiache09-obj_key.

  DATA: wa_zexten LIKE zsfi001.

  DATA: l_itemno TYPE char10 VALUE '0000000000'."行项目

  DATA: lt_log_head TYPE TABLE OF ztwf004 WITH HEADER LINE,
        lt_log_item TYPE TABLE OF ztwf005 WITH HEADER LINE.

  CHECK it_head IS NOT INITIAL.
  READ TABLE it_head INTO DATA(ls_head) INDEX 1 .
*  wa_documentheader-ref_doc_no_long = ls_head-xblnr.
  wa_documentheader-comp_code  = ls_head-bukrs.           "公司代码
  wa_documentheader-doc_type   = 'SA'.                    "凭证类型
  wa_documentheader-doc_date   = ls_head-bldat.           "凭证中的凭证日期
  wa_documentheader-pstng_date = ls_head-budat.           "凭证中的记帐日期
  wa_documentheader-ref_doc_no = ls_head-xblnr.           "参考凭证号
  wa_documentheader-header_txt = ls_head-bktxt.           "凭证抬头文本
  wa_documentheader-username   = sy-uname.                "用户


  LOOP AT it_item INTO DATA(ls_item).
    ADD 1 TO l_itemno.

    IF ls_item-koart = 'S' OR ( ls_item-lifnr IS  INITIAL  AND ls_item-kunnr IS  INITIAL ).
      "总账相关的行项目信息
      wa_accountgl-itemno_acc  = l_itemno .        "凭证行项目
      wa_accountgl-costcenter  = ls_item-kostl .   "成本中心
      wa_accountgl-profit_ctr  = ls_item-prctr .   "利润中心
      wa_accountgl-gl_account  = ls_item-hkont.    "会计科目
      wa_accountgl-item_text   = ls_item-sgtxt.    "项目行文本
      wa_accountgl-alloc_nmbr  = ls_item-zuonr.    "分配号
      IF ls_item-aufnr IS NOT INITIAL.
        wa_accountgl-orderid   = ls_item-aufnr.    "订单号
      ENDIF.


      APPEND  wa_accountgl  TO  it_accountgl .
    ENDIF.

    IF ls_item-koart = 'K' OR ls_item-lifnr IS NOT INITIAL."供应商
      wa_accountpayable-itemno_acc  = l_itemno .        "凭证行项目
      wa_accountpayable-vendor_no = ls_item-lifnr.      "供应商
      wa_accountpayable-alloc_nmbr   = ls_item-zuonr.   "分配号
      wa_accountpayable-item_text   = ls_item-sgtxt.    "项目行文本
      APPEND wa_accountpayable TO it_accountpayable.
    ENDIF.

    IF ls_item-koart = 'D' OR ls_item-kunnr IS NOT INITIAL."客户.
      wa_accountreceivable-itemno_acc = l_itemno .        "凭证行项目
      wa_accountreceivable-customer   = ls_item-kunnr.
      wa_accountreceivable-gl_account = ls_item-hkont.
      wa_accountreceivable-profit_ctr = ls_item-prctr .   "利润中心
      wa_accountreceivable-item_text   = ls_item-sgtxt.    "项目行文本
      wa_accountreceivable-bline_date = ls_item-zfbdt.    "到期日期计算的起算日期
      APPEND wa_accountreceivable TO it_accountreceivable.
    ENDIF.

    "货币行项目信息
    IF ls_item-shkzg = 'H'.
      ls_item-cny_amount = ls_item-cny_amount * ( -1 ).
      ls_item-dmbtr = ls_item-dmbtr * ( -1 ).
    ENDIF.
    wa_currencyamount-itemno_acc = l_itemno .
    wa_currencyamount-amt_doccur = ls_item-cny_amount. "原币金额
    wa_currencyamount-currency  = ls_head-waers.

    IF ls_head-hwaer IS NOT INITIAL.
      wa_currencyamount-currency  = ls_head-hwaer.
      wa_currencyamount-amt_doccur = ls_item-dmbtr. "本位币金额
    ENDIF.

    wa_currencyamount-exch_rate = ls_item-kursf.   "汇率
    APPEND wa_currencyamount TO it_currencyamount.


    wa_zexten-posnr = l_itemno.
    CASE ls_head-zbdlx.
      WHEN '出差费用报销单' OR '个人报销'.
        IF ls_head-zspjd = 'FA'. "往来凭证
          IF ls_item-shkzg = 'S'.
            wa_zexten-bschl = '40'.
          ELSE.
            wa_zexten-bschl = '31'.
          ENDIF.
        ENDIF.

        IF ls_head-zspjd = 'CA'."付款凭证
          "如果实际付款金额为0时,则不产生凭证
          IF line_exists( it_currencyamount[ amt_doccur = 0 ] ).
            hlynumber = ls_head-hlynumber.
            transactionnumber = ls_head-transactionnumber.
            zmsgtyp = 'E'.
            zmsgtxt = '实际付款金额为0!'.
            RETURN.
          ENDIF.

          IF ls_item-shkzg = 'S'.
            wa_zexten-bschl = '25'.
          ELSE.
            wa_zexten-bschl = '50'.
            wa_zexten-zzcf  = ls_item-zzcf. "现金流量项
          ENDIF.
        ENDIF.


      WHEN '借款单' .
        IF ls_head-zfylx = '日常借款'.
          IF ls_item-shkzg = 'S'.
            wa_zexten-bschl = '25'.
          ELSE.
            wa_zexten-bschl = '50'.
            wa_zexten-zzcf  = ls_item-zzcf. "现金流量项
          ENDIF.
        ENDIF.

        IF ls_head-zfylx = '房租押金' OR ls_head-zfylx = '保证金退款'.
          IF ls_item-shkzg = 'S'.
            wa_zexten-bschl = '29'.
            wa_zexten-umskz = ls_item-umskz. "特殊总账标识
          ELSE.
            wa_zexten-bschl = '50'.
            wa_zexten-zzcf  = ls_item-zzcf. "现金流量项
          ENDIF.
        ENDIF.

      WHEN '还款单'.
        IF ls_head-zfylx = '日常借款还款'.
          IF ls_item-shkzg = 'S'.
            wa_zexten-bschl = '40'.
            wa_zexten-zzcf  = ls_item-zzcf. "现金流量项
          ELSE.
            wa_zexten-bschl = '31'.
          ENDIF.
        ENDIF.

        IF ls_head-zfylx = '房租押金还款' OR ls_head-zfylx = '保证金退款还款'.
          IF ls_item-shkzg = 'S'.
            wa_zexten-bschl = '40'.
            wa_zexten-zzcf  = ls_item-zzcf. "现金流量项
          ELSE.
            wa_zexten-bschl = '39'.
            wa_zexten-umskz = ls_item-umskz. "特殊总账标识
          ENDIF.
        ENDIF.


      WHEN '培训付款单' OR '会议付款单' OR '对公付款'.
        IF ls_head-zspjd = 'FA' AND ls_head-zsfdp = ''.
          IF ls_item-shkzg = 'S'.
            wa_zexten-bschl = '25'.
          ELSE.
            wa_zexten-bschl = '50'.
            wa_zexten-zzcf  = ls_item-zzcf. "现金流量项
          ENDIF.
        ELSEIF ls_head-zspjd = 'FA' AND ls_head-zsfdp = 'X'.
          IF ls_item-shkzg = 'S'.
            wa_zexten-bschl = '40'.
          ELSE.
            wa_zexten-bschl = '31'.
          ENDIF.
        ELSEIF ls_head-zspjd = 'CA' .
          "如果实际付款金额为0时,则不产生凭证
          IF line_exists( it_currencyamount[ amt_doccur = 0 ] ).
            hlynumber = ls_head-hlynumber.
            transactionnumber = ls_head-transactionnumber.
            zmsgtyp = 'E'.
            zmsgtxt = '实际付款金额为0!'.
            RETURN.
          ENDIF.

          IF ls_item-shkzg = 'S'.
            wa_zexten-bschl = '25'.
          ELSE.
            wa_zexten-bschl = '50'.
            wa_zexten-zzcf  = ls_item-zzcf. "现金流量项
          ENDIF.
        ENDIF.

      WHEN OTHERS.
    ENDCASE.


    wa_extension2-structure  = 'ZSFI001'.
    wa_extension2-valuepart1 = wa_zexten.
    APPEND wa_extension2 TO it_extension2.


  ENDLOOP.




  CALL FUNCTION 'BAPI_ACC_DOCUMENT_POST'
    EXPORTING
      documentheader    = wa_documentheader
    IMPORTING
      obj_key           = l_obj_key
    TABLES
      accountgl         = it_accountgl
      accountreceivable = it_accountreceivable
      accountpayable    = it_accountpayable
      currencyamount    = it_currencyamount
      return            = it_return
      extension2        = it_extension2.

  READ TABLE it_return INTO wa_return WITH  KEY type = 'E'.
  IF sy-subrc = 0.
    CALL FUNCTION 'BAPI_TRANSACTION_ROLLBACK'.
    LOOP AT it_return INTO wa_return WHERE ( type = 'E' OR type = 'A').
      zmsgtxt = zmsgtxt && wa_return-message.
    ENDLOOP.
    zmsgtyp = 'E'.
  ELSE.
    CALL FUNCTION 'BAPI_TRANSACTION_COMMIT'
      EXPORTING
        wait = 'X'.
    zmsgtyp = 'S'.
    belnr = l_obj_key(10).
  ENDIF.
  hlynumber = ls_head-hlynumber.
  transactionnumber = ls_head-transactionnumber.

  WAIT UP TO '0.5' SECONDS.
  UPDATE bkpf SET xblnr_alt = ls_head-xblnr_alt WHERE bukrs = ls_head-bukrs AND belnr = l_obj_key(10) AND gjahr = ls_head-budat(4).
  IF sy-subrc = 0.
    COMMIT WORK .
  ELSE.
    ROLLBACK WORK.
  ENDIF.

  "日志保存
  MOVE-CORRESPONDING ls_head TO lt_log_head.
  lt_log_head-belnr =  l_obj_key(10).
  lt_log_head-ztime = sy-datum && sy-uzeit.
  lt_log_head-zhlyl = ls_head-hlynumber.
  lt_log_head-zhlym = ls_head-transactionnumber.
  APPEND lt_log_head.

  CLEAR : l_itemno.
  LOOP AT it_item INTO ls_item.
    ADD 1 TO l_itemno.
    MOVE-CORRESPONDING ls_item TO lt_log_item.
    lt_log_item-ztime = sy-datum && sy-uzeit.
    lt_log_item-belnr =  l_obj_key(10).
    lt_log_item-buzei = l_itemno.
  ENDLOOP.

  MODIFY ztwf004 FROM TABLE lt_log_head.
  IF sy-subrc = 0.
    COMMIT WORK .
  ELSE.
    ROLLBACK WORK.
  ENDIF.

  MODIFY ztwf005 FROM TABLE lt_log_item.
  IF sy-subrc = 0.
    COMMIT WORK .
  ELSE.
    ROLLBACK WORK.
  ENDIF.
ENDFUNCTION.
posted @   abap菜鸟3  阅读(429)  评论(1编辑  收藏  举报
编辑推荐:
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
阅读排行:
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· Manus爆火,是硬核还是营销?
· 终于写完轮子一部分:tcp代理 了,记录一下
· 别再用vector<bool>了!Google高级工程师:这可能是STL最大的设计失误
· 单元测试从入门到精通
点击右上角即可分享
微信分享提示