MIRO发票校验BAPI_INCOMINGINVOICE_CREATE (2013-01-23 10:01:29)

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

时间: 2024-10-11 21:11:33

MIRO发票校验BAPI_INCOMINGINVOICE_CREATE (2013-01-23 10:01:29)的相关文章

002 MIRO发票校验采购订单项目科目分配类别检查增强-20150819

BADI SE19:ZINVOICE_UPDATE   MIRO发票检验过账好模拟时,检查采购订单line 是否有固定资产的行项目,如果有固定资产项目,则弹出提示框,提示消息:存在规定资产采购项目!   判断逻辑:检查MIRO ,选中的采购订单项目数据,项目的科目分配类别是否 = 'A',能找到为'A'的line ,则弹出提示框. DEVK905455       ABAP30       B235 MIRO发票校验资产栏位检查 by rainy on 20150817 req by fi me

MM--发票校验 及基于采购订单的MIRO发票校验过程(

一.介绍发票校验是物料管理(MM)系统的一部分.它提供物料管理部分和财务会计, 成本控制和资产管理部分的连接.物料管理模块的发票校验为以下目的服务:它完成物料采购的全过程 - 物料采购从采购申请开始,接下来是采购和收货, 并以收到发票而结束.它允许处理不基于物料采购的发票(例如,服务费, 其它花费,过程费用, 等等).它允许处理贷项凭证, 既可以是发票的取消, 也可以是打折扣. 发票校验不是对支付进行处理, 也不是对发票进行分析. 这些需要处理的信息被传递到其它部门. 发票校验的任务包括:输入接

MIRO做发票校验时实现替代功能的多种方式

http://blog.sina.com.cn/s/blog_3f2c03e30100ngje.html MIRO做发票校验时,如果需要对产生的会计凭证做某些字段的替代,可有多种方法. 1.GGB1替代(抬头和行项目,标准的财务会计替代) 2.BTE 1120 3.badi:ac_document 4.Smod: FMRESERV 上面涉及到SAP开发的多种增强技术,以及财务模块非常好用的substitution功能.但是我发现ggb1行项目替代是无法替代利润中心字段的,修改了gb01table

SAP研究贴之--发票校验提示移动平均价为负

近日,应付岗密集出现发票校验时移动平均价为负值导致过账失败的情况,采购经理又是拍桌子.又是摔杯子的.财务经理安排任务彻底清查,找出问题原因.哎,毫无头绪啊...测试机模拟业务吧流程:合同(系统外)-采购订单(ME23N)-对采购订单收货(MB01)-发票校验(MIRO)1)正常业务的凭证流:                        1.借:原材料                100        订单单价及数量10元*10只,发票单价及数量10元*10只   贷:应付暂估       

Materialise.Mimics.Innovation.Suite.v17.0.Medical.&.Research.Win32_64 4CD比利时医学软件+Mimics 10.01 (著名医学有限元仿真)

Materialise.Mimics.Innovation.Suite.v17.0.Medical.&.Research.Win32_64 4CD比利时医学软件Mimics 10.01 (著名医学有限元仿真)Delcam Dental v2010 SP2-ISO 1CD(专业牙科软件)Delcam DentCAD 8112 SP2 牙科设计软件DElcam DentMill 5070 牙科加工解决方案MiPACS Dental Enterprise Solution v3.1 (医学牙科软件)D

[OpenStack 存储] 说说RAID0 1 2 3 4 5 6 10 01 30 50, 软RAID, 硬RAID

最近在思考一种廉价方便的cinder集成LVM driver的方式,那就是cinder+LVM+多块盘组成的RAID硬盘.这样的情况下就要根据读写需求和可用资源考虑采用什么样的RAID,以及怎样选择实现raid的方式,有两种分别为硬件RAID和软件RAID,为了温习一下,就顺便画些图(图中使用的硬盘数都是该RAID下需要的最少硬盘数)总结下各个RAID技术. 软RAID与硬RAID 硬RAID可以理解为需要RAID卡,通过RAID卡实现对多块盘的管理, 把多块盘组成RAID冗余阵列,如何组合成R

BEGINNING SHAREPOINT® 2013 DEVELOPMENT 第10章节--SP2013中OAuth概览 OAuth介绍

BEGINNING SHAREPOINT? 2013 DEVELOPMENT 第10章节--SP2013中OAuth概览  OAuth介绍 OAuth是一个开放的标准,由Internet Engineering Task Force管理,被设计允许应用程序以Web友好的方式代表应用程序或用户访问服务.

BEGINNING SHAREPOINT® 2013 DEVELOPMENT 第10章节--SP2013中OAuth概览 创建和管理应用程序身份

BEGINNING SHAREPOINT? 2013 DEVELOPMENT 第10章节--SP2013中OAuth概览  创建和管理应用程序身份 在之前的部分,你看到应用程序如何像用户一样拥有一个身份.当一个App依据用户执行某操作时,SP记录这个信息.

BEGINNING SHAREPOINT® 2013 DEVELOPMENT 第10章节--SP2013中OAuth概览 SP2013中的OAuth

BEGINNING SHAREPOINT? 2013 DEVELOPMENT 第10章节--SP2013中OAuth概览  SP2013中的OAuth SP apps使用OAuth授权调用SP APIs.当一个App调用SP中的API时,例如,获得一些列表数据,SP核对App身份可用,并有权限访问资源:例如,一个列表.