代码改变世界

通过BAPI:BAPI_INCOMINGINVOICE_CREATE创建无采购订单的发票及过账

  覆盆子  阅读(166)  评论(0编辑  收藏  举报

本次是计划通过MIRO对应BAPI:BAPI_INCOMINGINVOICE_CREATE来创建无采购订单的发票并对其进行过账

开发中遇到一些参数数据错误导致报错的问题,记录如下

 需要注意的是,抬头的汇总金额是需要对PO,物料及总账各自的行项目金额进行汇总所得到的金额,如果有尾差,就需要处理不为0时的税率问题

如下代码主要记录了赋值字段,仅供参考

 
  DATA: ls_headerdata TYPE bapi_incinv_create_header,
        lt_itemdata   TYPE TABLE OF bapi_incinv_create_item,
        ls_itemdata   TYPE bapi_incinv_create_item,
        lt_taxdata    TYPE TABLE OF bapi_incinv_create_tax,
        ls_taxdata    TYPE bapi_incinv_create_tax,
        ls_account    TYPE bapi_incinv_create_account,
        lt_account    TYPE TABLE OF bapi_incinv_create_account,
        ls_glaccount  TYPE bapi_incinv_create_gl_account,
        lt_glaccount  TYPE TABLE OF bapi_incinv_create_gl_account,
        ls_material   TYPE bapi_incinv_create_material,
        lt_material   TYPE TABLE OF bapi_incinv_create_material,
        lt_return     TYPE STANDARD TABLE OF bapiret2 WITH HEADER LINE.
  DATAls_tab LIKE gs_tab,
        lv_belnr TYPE bkpf-belnr,
        lv_awkey TYPE bkpf-awkey,
        lv_number TYPE bapi_incinv_fld-inv_doc_no,
        lv_mwskz_mrm TYPE mwskz_mrm VALUE 'J0'.

  CHECK gt_tab IS NOT INITIAL.
  READ TABLE gt_tab INTO ls_tab INDEX 1.

  ls_headerdata-invoice_ind   'X' .         "业务处理类别
  ls_headerdata-doc_type      'RE' .        "单据类型(RE表示采购订单)
*  ls_headerdata-ref_doc_no    = ''.           "参照
  ls_headerdata-diff_inv      = ls_tab-lifnr ."出票方
  ls_headerdata-doc_date      = ls_tab-budat ."凭证日期
  ls_headerdata-comp_code     = ls_tab-bukrs ."公司代码
  ls_headerdata-pstng_date    = ls_tab-budat ."过账日期
  ls_headerdata-currency      = ls_tab-waers ."币种
*  ls_headerdata-calc_tax_ind  = 'X'.          "自动计算税额
*  ls_headerdata-pmnttrms      = 'K059' .      "付款条件代码
  ls_headerdata-bline_date    = ls_tab-budat "发票日期
*  ls_headerdata-item_text     = ''.           "项目文本
  ls_headerdata-del_costs_taxc = lv_mwskz_mrm.

  LOOP AT gt_tab INTO ls_tab .

    CLEAR: ls_material,ls_itemdata ,ls_taxdata,ls_account,ls_glaccount .

    lv_ebelp = lv_ebelp + 10 .
    IF ls_tab-shkzg 'H'.
      ls_headerdata-gross_amount = ls_headerdata-gross_amount - ls_tab-wrbtr .
    ELSEIF ls_tab-shkzg 'S'.
      ls_headerdata-gross_amount = ls_headerdata-gross_amount + ls_tab-wrbtr .
    ENDIF.

    ls_material-invoice_doc_item = lv_ebelp .        "发票行项目号
    ls_material-material         = ls_tab-matnr.     "物料编号
    ls_material-db_cr_ind        = ls_tab-shkzg.     "物料借贷
    ls_material-item_amount      = ls_tab-wrbtr.     "金额
    ls_material-quantity         = ls_tab-menge.     "数量
    ls_material-tax_code         = lv_mwskz_mrm.
    ls_material-base_uom         = ls_tab-meins.     "单位
    ls_material-val_area         = ls_tab-werks.     "工厂
    APPEND ls_material TO lt_material.

*    ls_itemdata-invoice_doc_item = lv_ebelp .       "发票行项目号
*    ls_itemdata-po_number        = ls_tab-ebeln .    "采购订单号
*    ls_itemdata-material         = ls_tab-matnr.    "物料编号
**    ls_itemdata-item_amount     = <fs_vbrp2>-netwr .
*    ls_itemdata-tax_code         = LV_MWSKZ_MRM .            "
*    ls_itemdata-quantity         = ls_tab-menge .
*    ls_itemdata-po_unit          = ls_tab-meins .
*    ls_itemdata-freight_ven      = ls_tab-lifnr.     "供应商代码
*    APPEND ls_itemdata TO lt_itemdata .

    ls_taxdata-tax_code = lv_mwskz_mrm .
    APPEND ls_taxdata TO lt_taxdata .

    IF ls_tab-zhktdc 'H'.
      ls_headerdata-gross_amount = ls_headerdata-gross_amount - ls_tab-wrbtr .
    ELSEIF ls_tab-zhktdc 'S'.
      ls_headerdata-gross_amount = ls_headerdata-gross_amount + ls_tab-wrbtr .
    ENDIF.
    ls_glaccount-invoice_doc_item  = lv_ebelp.
    ls_glaccount-gl_account        = ls_tab-zhkt01.
    ls_glaccount-comp_code         = ls_tab-bukrs.
    ls_glaccount-db_cr_ind         =ls_tab-zhktdc.
    ls_glaccount-item_amount       = ls_tab-wrbtr.
    ls_glaccount-costcenter        = ls_tab-kostl.
    ls_glaccount-item_text         = ls_tab-sgtxt.
*    ls_glaccount-tax_code          = LV_MWSKZ_MRM.
*    ls_glaccount-func_area         = '3000'.
    APPEND ls_glaccount TO lt_glaccount.

  ENDLOOP .
  IF ls_headerdata-gross_amount <> 0.
    gv_check_error = 'X'.
    MESSAGE '借贷余额不为0,无法进行过账' TYPE 'S' DISPLAY LIKE 'E'.EXIT.
  ENDIF.

  CALL FUNCTION 'BAPI_INCOMINGINVOICE_CREATE'
    EXPORTING
      headerdata     = ls_headerdata
*   addressdata      =
*   oildata          =
    IMPORTING
      invoicedocnumber = lv_number
      fiscalyear       = p_gjahr
    TABLES
      itemdata         = lt_itemdata
*     accountingdata   =
      glaccountdata    = lt_glaccount
      materialdata     = lt_material
      taxdata          = lt_taxdata
*     withtaxdata      =
*     vendoritemsplitdata       =
      return           = lt_return
*     extensionin      =
*     tm_itemdata      =
*     nfmetallitms     =
*     assetdata        =
    .
  LOOP AT lt_return WHERE type 'E' OR type 'A' .
    CONCATENATE ls_tab-mess lt_return-message ';' INTO ls_tab-message.
  ENDLOOP.
  IF sy-subrc 0.
    CALL FUNCTION 'BAPI_TRANSACTION_ROLLBACK'.
  ELSE.
    CALL FUNCTION 'BAPI_TRANSACTION_COMMIT'
      EXPORTING
        wait 'X'.
    CONCATENATE lv_number p_gjahr INTO lv_awkey.
    SELECT SINGLE belnr INTO lv_belnr FROM bkpf WHERE bukrs = p_bukrs
                                                  AND gjahr = p_gjahr
                                                  AND awkey = lv_awkey.

  ENDIF.

相关博文:
阅读排行:
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· C#/.NET/.NET Core优秀项目和框架2025年2月简报
· 葡萄城 AI 搜索升级:DeepSeek 加持,客户体验更智能
· 什么是nginx的强缓存和协商缓存
· 一文读懂知识蒸馏
点击右上角即可分享
微信分享提示