函數使用四:采購發票MIRO BAPI_INCOMINGINVOICE_CREATE


1. 業務處理(transaction)字段選擇:

    創建后續借記(subsequent debit)
            ItemData                     DE_CRE_IND  = 'X'
            HeaderData                INVOICE_IND  = 'X'

    創建后續貸記(subsequent credit)
            ItemData                    DE_CRE_IND  = 'X'
            HeaderData               INVOICE_IND   = ' '

    發票(invoice)
            HeaderData    INVOICE_IND = 'X'
    貸方憑證(credit demo)
            HeaderData    INVOICE_IND = ' '

2. 標識: 貨物項目/交貨成本/全部(Indicator: Goods Items/Delivery Costs/Both)

    貨物/服務項目(Goods/service items)
            ItemData   COND_TYPE      = ' '
                            COND_ST_NO   = ' '
                            COND_COUNT  = ' '
    計划交貨成本(Planned delivery costs)
            ItemData   COND_TYPE      = 'X'
                            COND_ST_NO  = 'X'
                            COND_COUNT = 'X'

form frm_invoice_create2 .
  data: str type string.
  data: ls_headerdata       like bapi_incinv_create_header,
        lt_itemdata         like table of bapi_incinv_create_item,
        ls_itemdata         like bapi_incinv_create_item,
        lt_return           like table of bapiret2,
        ls_return           like bapiret2,
        lv_invoicedocnumber like bapi_incinv_fld-inv_doc_no,
        lv_fiscalyear       like bapi_incinv_fld-fisc_year.
  data: lv_price1           type bapi_rmwwr.
  data: lv_item             type n length 6.
  data: lv_retpo type retpo.
  clear:l_menge,ls_headerdata,lv_fiscalyear,lv_price1,lv_item.

* 處理退貨和非退貨項目
  clear: gt_ret,gt_ret[],gt_inv,gt_inv[].
  loop at gt_alv into gs_alv where source = 'EKBE'.
    clear: lv_retpo.
    select single retpo into lv_retpo  from ekpo where ebeln = gs_alv-ebeln and ebelp = gs_alv-ebelp.
    loop at gt_invoice into gs_invoice where ebeln = gs_alv-ebeln and ebelp = gs_alv-ebelp.
*---------根據退貨標識 放入不同的內表
      if lv_retpo = 'X'."退貨項目
        if gs_invoice-shkzg = 'H'.
          gs_invoice-dmbtr = 0 - gs_invoice-dmbtr.
        endif.
        gt_ret-ebeln = gs_invoice-ebeln."采購訂單
        gt_ret-ebelp = gs_invoice-ebelp."行項目
        gt_ret-lfbnr = gs_invoice-lfbnr. "參考憑證號
        gt_ret-lfpos = gs_invoice-lfpos."行項目
        gt_ret-lfgja = gs_invoice-lfgja."年度
        gt_ret-mwskz = gs_invoice-mwskz."稅碼
        gt_ret-dmbtr = gs_invoice-dmbtr. "金額
        gt_ret-menge = gs_invoice-menge. "數量
        select single meins into gt_ret-meins from ekpo where ebeln = gs_invoice-ebeln and ebelp = gs_invoice-ebelp.
        collect gt_ret.
      else.
        if gs_invoice-shkzg = 'H'.
          gs_invoice-dmbtr = 0 - gs_invoice-dmbtr.
        endif.
        gt_inv-ebeln = gs_invoice-ebeln."采購訂單
        gt_inv-ebelp = gs_invoice-ebelp."行項目
        gt_inv-lfbnr = gs_invoice-lfbnr. "參考憑證號
        gt_inv-lfpos = gs_invoice-lfpos."行項目
        gt_inv-lfgja = gs_invoice-lfgja."年度
        gt_inv-mwskz = gs_invoice-mwskz."稅碼
        gt_inv-dmbtr = gs_invoice-dmbtr. "金額
        gt_inv-menge = gs_invoice-menge. "數量
        select single meins into gt_inv-meins from ekpo where ebeln = gs_invoice-ebeln and ebelp = gs_invoice-ebelp.
        collect gt_inv.
      endif.
    endloop.
  endloop.
*---正常訂單發票校驗
  clear: ls_headerdata.
  ls_headerdata-invoice_ind  = 'X'.    "當采購訂單行項目是正常訂單時該標識必為X,為miro界面上的業務處理為1.發票否則為2.貸方憑證(invoice_ind='X'表示miro界面最上部的業務處理是1.發票,invoice_ind='', 表示miro界面最上部的業務處理為2.貸方憑證)

  ls_headerdata-doc_type     = 'YX'.
  ls_headerdata-doc_date     = p_datum.
  ls_headerdata-pstng_date   = g_post_date.
  ls_headerdata-bline_date   = g_post_date.    "基線日期/付款計算的起始日期
  ls_headerdata-comp_code    = p_bukr2.
  ls_headerdata-currency     = 'CNY'.
  ls_headerdata-calc_tax_ind = 'X'. "自動結算稅額
  ls_headerdata-bus_area     = '9999'.
  clear: lv_item.
  loop at gt_inv.
    lv_item = lv_item + 1.   "發票行項目號
    ls_itemdata-invoice_doc_item = lv_item.
    ls_itemdata-po_number        = gt_inv-ebeln.
    ls_itemdata-po_item          = gt_inv-ebelp.
    ls_itemdata-ref_doc          = gt_inv-lfbnr.
    ls_itemdata-ref_doc_year     = gt_inv-lfgja.
    ls_itemdata-ref_doc_it       = gt_inv-lfpos.
    ls_itemdata-item_amount      = gt_inv-dmbtr.
    ls_itemdata-quantity         = gt_inv-menge.
    ls_itemdata-po_unit          = gt_inv-meins.
    if gt_ret-mwskz is not initial.
      ls_itemdata-tax_code         = gt_inv-mwskz.
    else.
      ls_itemdata-tax_code         = p_mwskz.
    endif.
    append ls_itemdata to lt_itemdata.
    clear: ls_itemdata.

    lv_price1 = lv_price1 + abs( gt_inv-dmbtr ).
  endloop.
  ls_headerdata-gross_amount = lv_price1 * ( 100 + l_mwskz ) / 100.    "總金額

  refresh: lt_return.clear: ls_return,invoicedocnumber.
  call function 'BAPI_INCOMINGINVOICE_CREATE'
    exporting
      headerdata       = ls_headerdata
    importing
      invoicedocnumber = invoicedocnumber
    tables
      itemdata         = lt_itemdata
      return           = lt_return.

  loop at lt_return into ls_return where type = 'E' or type = 'A'.
    cp_eind = 'X'.
    exit.
  endloop.
  if cp_eind ne 'X'.
    call function 'BAPI_TRANSACTION_COMMIT'
      exporting
        wait = 'X'.

*---插入值到表ZTFI014
    gs_ztfi014-tcode = sy-tcode.
    gs_ztfi014-seqno = p_datum.
    gs_ztfi014-objnr = p_bukr2.
    gs_ztfi014-gjahr = p_datum(4).
    gs_ztfi014-bukrs = p_bukrs.
    gs_ztfi014-belnr = invoicedocnumber.

    modify ztfi014 from gs_ztfi014.
  else.
    call function 'BAPI_TRANSACTION_ROLLBACK'.

    loop at lt_return into ls_return.
      clear gs_log.
      gs_log-type = ls_return-type.
      gs_log-docno = invoicedocnumber.
      call function 'MESSAGE_TEXT_BUILD'
        exporting
          msgid               = ls_return-id
          msgnr               = ls_return-number
          msgv1               = ls_return-message_v1
          msgv2               = ls_return-message_v2
          msgv3               = ls_return-message_v3
          msgv4               = ls_return-message_v4
        importing
          message_text_output = gs_log-message.

      case gs_log-type.
        when 'S'.
          gs_log-icon = '3'.
        when 'W'.
          gs_log-icon = '2'.
        when 'E' or 'A'.
          gs_log-icon = '1'.
        when others.
      endcase.

      append gs_log to gt_log.
      clear ls_return.
    endloop.

    message e001(00) with '第一張發票預制失敗,請點擊顯示消息查看詳情!'.
  endif.
*---退貨訂單發票校驗
  clear: ls_headerdata-invoice_ind,ls_headerdata-gross_amount.  "發票標志 退貨是該標識必須為空
  clear: lv_item,ls_itemdata,ls_return,invoicedocnumber,lv_price1.
  refresh: lt_itemdata,lt_return.
  loop at gt_ret.
    lv_item = lv_item + 1.   "發票行項目號
    ls_itemdata-invoice_doc_item = lv_item.
    ls_itemdata-po_number        = gt_ret-ebeln.
    ls_itemdata-po_item          = gt_ret-ebelp.
    ls_itemdata-ref_doc          = gt_ret-lfbnr.
    ls_itemdata-ref_doc_year     = gt_ret-lfgja.
    ls_itemdata-ref_doc_it       = gt_ret-lfpos.
    ls_itemdata-item_amount      = abs( gt_ret-dmbtr ).
    ls_itemdata-quantity         = gt_ret-menge.
    ls_itemdata-po_unit          = gt_ret-meins.
    if gt_inv-mwskz is not initial.
      ls_itemdata-tax_code         = gt_ret-mwskz.
    else.
      ls_itemdata-tax_code         = p_mwskz.
    endif.
    append ls_itemdata to lt_itemdata.
    clear: ls_itemdata.

    lv_price1 = lv_price1 + abs( gt_ret-dmbtr ).
  endloop.
  ls_headerdata-gross_amount = lv_price1 * ( 100 + l_mwskz ) / 100.    "總金額

  refresh: lt_return.clear: ls_return.
  call function 'BAPI_INCOMINGINVOICE_CREATE'
    exporting
      headerdata       = ls_headerdata
    importing
      invoicedocnumber = invoicedocnumber
    tables
      itemdata         = lt_itemdata
      return           = lt_return.

  loop at lt_return into ls_return where type = 'E' or type = 'A'.
    cp_eind = 'X'.
    exit.
  endloop.
  if cp_eind ne 'X'.
    call function 'BAPI_TRANSACTION_COMMIT'
      exporting
        wait = 'X'.

*---插入值到表ZTFI014
    gs_ztfi014-tcode = sy-tcode.
    gs_ztfi014-seqno = p_datum.
    gs_ztfi014-objnr = p_bukr2.
    gs_ztfi014-gjahr = p_datum(4).
    gs_ztfi014-bukrs = p_bukrs.
    gs_ztfi014-belnr = invoicedocnumber.

    modify ztfi014 from gs_ztfi014.

  else.
    call function 'BAPI_TRANSACTION_ROLLBACK'.

    loop at lt_return into ls_return.
      clear gs_log.
      gs_log-type = ls_return-type.
      gs_log-docno = invoicedocnumber.
      call function 'MESSAGE_TEXT_BUILD'
        exporting
          msgid               = ls_return-id
          msgnr               = ls_return-number
          msgv1               = ls_return-message_v1
          msgv2               = ls_return-message_v2
          msgv3               = ls_return-message_v3
          msgv4               = ls_return-message_v4
        importing
          message_text_output = gs_log-message.

      case gs_log-type.
        when 'S'.
          gs_log-icon = '3'.
        when 'W'.
          gs_log-icon = '2'.
        when 'E' or 'A'.
          gs_log-icon = '1'.
        when others.
      endcase.

      append gs_log to gt_log.
      clear ls_return.
    endloop.

    message e001(00) with '第二張發票預制失敗,請點擊顯示消息查看詳情!'.
  endif.
endform.                    " FRM_INVOICE_CREATE2

 

注意:

在PO收貨后,做發票校驗,發現一個問題,就是在headerdata中有個參數 calc_tax_ind ,如果將這個值‘X’,那么在

ME23N中會看不到生成的發票校驗憑證invoicedocnumber的值。

headerdata中的必輸值:

 invoice_ind    為'X'

 doc_date

 pstng_date

 comp_code

 currency

 gross_amount

 

itemdata中的必輸值:

 invoice_doc_item

 po_number

 po_item

 item_amount

 quantity

 po_unit

 ref_doc

 ref_doc_year

 ref_doc_it


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM