zoukankan      html  css  js  c++  java
  • BAPI和BDC使用小结

    在项目上遇到了要同时用BAPI和BDC更新数据的情况。开发的需求如下:
    ME22N中
    修改采购订单中物料条目的净价和每,然后在物料数据页的供应商物料号中记录旧价格和旧每,同时在EAN/UPC中写入'ZSJ'。

     
    大部分的更新都可以由BAPI完成,但是EAN/UPC在BAPI中找不到对应的字段,而且客户不愿意改字段。一开始看到ME22N这种多条目的事务代码,觉得BDC录屏没法做,但是其实是可以做的,只是比较麻烦。
    下面一点点总结分享。

    BDC部分:

    BDC录屏后,得到的结果基本是没法直接用的,我是通过录了很多次屏,然后东拼西凑、修修改改得出来的。

    录屏的操作流程:其他采购订单->输入采购订单号->确定->项目点击下拉列表选择行项目->修改EAN/UPC->保存,得到的录屏结果如下 :

     

     

    直接录屏的结果是没法用的,必须把红色下划线的部分去掉,保留反而会出错。这些是录屏的时候记录下来的屏幕上一些字段的值,但在程序操作调用BDC的过程中,你无法知道这些字段的具体值是多少,填不对的话反而会出错,所以要去掉。

    而且在填写BDC_FIELD的时候,带BDC_SUBSCR的部分都可以不填写,只要填写一些关于操作和字段赋值的部分就可以了。

    BDC调试:

    BDC需要调试的话就设置模式MODE为A,这样就可以观看前台是怎么样一步一步执行的,便于发现错误。MODE为E是只有发生错误才转到前台,而MODE为N是完全的后台操作。一般先用A或E确认能执行成功后再换成N来执行。

    BDC代码:

     

    总结下BDC的适用范围:

    BDC适用于录制较为单一的操作,并且一般情况下不适用于多条行项目,但是也有例外。在一些特殊的事物代码中,对于行项目的修改也能是一组比较单一的操作,比如ME22N就是每次选择下拉列表,然后修改相应的字段。所以有时候BDC录屏是一件需要业务顾问、技术顾问一起做、互相配合的事。

    BAPI部分:

    由于SAP各个表之间的关联关系非常复杂,一个前台操作可能同时更新了N张表,所以ABAP中严禁直接更新标准表,这会导致不一致性。而为了保持一致性,需要更新和修改的时候则需要使用BAPI。

    BAPI与BDC相比,执行速度会快些、效率会高些,而且比较适合用来更新修改多条行项目的数据。

    BAPI中值得一提的是它的X参数,参数明后代X后缀的参数标示了需要更新哪些相应的字段,所以必须对X参数中需要更新的字段赋值为 X ,否则BAPI并不会更新任何字段。

    X参数:

     

    对需要更新的字段赋值:

     

    另外ABAP中能够支持多个BAPI连续调用,然后同时COMMIT或是ROLLBACK,以此来保证一致性。只需要再调用完BAPI后再调用BAPI_TRANSACTION_COMMIT或是BAPI_TRANSACTION_ROLLBACK。

     

    值得一提的是BAPI_TRANSACTION_COMMIT的WAIT参数。注意:BAPI是异步更新的,所以如果不使用WAIT参数的话,那么它无法保证在执行下条语句时BAPI已经更新成功,这样如果连续两条语句都是写操作,有很大可能会造成读写冲突,比如:我在BAPI执行完后调用BDC,如果不WAIT的话,那么就会有读写冲突,BAPI锁住了一些表或是资源导致BDC无法更新。

  • 相关阅读:
    UVa 1349 (二分图最小权完美匹配) Optimal Bus Route Design
    UVa 1658 (拆点法 最小费用流) Admiral
    UVa 11082 (网络流建模) Matrix Decompressing
    UVa 753 (二分图最大匹配) A Plug for UNIX
    UVa 1451 (数形结合 单调栈) Average
    UVa 1471 (LIS变形) Defense Lines
    UVa 11572 (滑动窗口) Unique Snowflakes
    UVa 1606 (极角排序) Amphiphilic Carbon Molecules
    UVa 11054 Wine trading in Gergovia
    UVa 140 (枚举排列) Bandwidth
  • 原文地址:https://www.cnblogs.com/raychenfj/p/3124942.html
Copyright © 2011-2022 走看看