zoukankan      html  css  js  c++  java
  • 函数使用四:采购发票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

  • 相关阅读:
    适合于小团队产品迭代的APP测试流程
    【转】软件测试上线标准
    安全性测试之修改密码
    LoadRunner 实现监控Tomcat
    【转】人生应该接受的教育
    晓光聊《小厂如何做测试》
    由测试需要多少编程知识想到的
    12款很棒的浏览器兼容性测试工具推荐
    最近感悟测试人员需要的一种能力
    APP测试功能点总结
  • 原文地址:https://www.cnblogs.com/sapSB/p/6839311.html
Copyright © 2011-2022 走看看