BAPI 一些笔记

BAPI 一些笔记BAPI的结构,BAPI里的代码可以分为这样两部分:1、一部分是数据校核,检查传入的数据是否满足创建相关业务对象的条件,并且把错误消息反馈出来;2、另一部分是更新数据库,即UPDATE/INSERT/DELETEdbtab这样的操作。1BAPI的优点bapi是面向对象的设计;bapi是固定的,一般不能修改;bapi可以被sap内部部件和非sap程序使用;bapi的成功和错误信息始终通过RETURN返回;bapi可以被许多开发平台使用;2何时该考虑使用BAPI设计

大家好,又见面了,我是你们的朋友全栈君。

  • vendor 供应商号:长度必须和系统一致,10位。如 2000025要写成 0002000025传递给参数。

      CALL FUNCTION ‘CONVERSION_EXIT_ALPHA_INPUT’

        EXPORTING
          input  = poheader-vendor
        IMPORTING
          output = poheader-vendor.

      poheaderx-vendor = abap_true.

  •  POITEM 中的 PO_ITEM 参数,在 POITEMX中对应的不是X,而是相同的 采购凭证的项目编号.

      poitem-po_item       = lv_ebelp.”行项目
      poitemx-po_item      = lv_ebelp.

  •  POHEADER中的参数在 POHEADERX一定要有对应的参数。POITEM也一样。
  • 增强字段在extensionin里

   “抬头增强字段
    ls_te_head-zpslx = ls_head-zpslx.
    ls_te_head-zzekkoyl0 = ls_head-zwxsh.”无需送货标识
    ls_te_headx-zpslx = abap_true.
    ls_te_headx-zzekkoyl0 = abap_true.
    lt_extensionin-structure = ‘BAPI_TE_MEPOHEADER’.
    lt_extensionin-valuepart1 = ls_te_head.
    APPEND lt_extensionin.
    CLEAR:ls_te_head,lt_extensionin.
    lt_extensionin-structure = ‘BAPI_TE_MEPOHEADERX’.
    lt_extensionin-valuepart1 = ls_te_headx.
    APPEND lt_extensionin.
    CLEAR:ls_te_headx,lt_extensionin.

      “行项目增强字段
      ls_te_item-po_item = lv_ebelp.
      ls_te_item-zzeanme = lt_data-zzeanme .
      ls_te_item-zzcd    = lt_data-zzcd.
      ls_te_item-zzjsean = lt_data-ean11.
      ls_te_item-zzjssl  = lt_data-zzeanme.
      ls_te_item-zzjsdw  = lt_data-meins.
      ls_te_item-zzdgean = lt_data-zzdgean.
      ls_te_item-zzeanme = lt_data-zzdgsl.
      ls_te_item-zzdgdw  = lt_data-zzdgdw.
      ls_te_item-zmd = lt_data-zmd.
      ls_te_item-zzekpoyl6 = lt_data-zzekpoyl6.”城市代码
      CLEAR:lt_data,poaccount,poaccountx.

      lt_extensionin-structure = ‘BAPI_TE_MEPOITEM’.
      CALL METHOD cl_abap_container_utilities=>fill_container_c
        EXPORTING
          im_value               = ls_te_item
        IMPORTING
          ex_container           = lt_extensionin-valuepart1
        EXCEPTIONS
          illegal_parameter_type = 1
          OTHERS                 = 2.
      IF sy-subrc <> 0.
*                                     Implement suitable error handling here
      ENDIF.
      APPEND lt_extensionin.
      CLEAR lt_extensionin.

      ls_te_itemx-po_item = lv_ebelp.
      ls_te_itemx-zzeanme = abap_true.
      ls_te_itemx-zzcd    = abap_true.
      ls_te_itemx-zzjsean = abap_true.
      ls_te_itemx-zzjssl  = abap_true.
      ls_te_itemx-zzjsdw  = abap_true.
      ls_te_itemx-zzdgean = abap_true.
      ls_te_itemx-zzeanme = abap_true.
      ls_te_itemx-zzdgdw = abap_true.
      ls_te_itemx-zmd     = abap_true.
      ls_te_itemx-zzekpoyl6     = abap_true.
      lt_extensionin-structure = ‘BAPI_TE_MEPOITEMX’.
      lt_extensionin-valuepart1 = ls_te_itemx.
      APPEND lt_extensionin.
      CLEAR lt_extensionin.

BAPI的结构,BAPI里的代码可以分为这样两部分:

1、一部分是数据校核,检查传入的数据是否满足创建相关业务对象的条件,并且把错误消息反馈出来;

2、另一部分是更新数据库,即UPDATE/INSERT/DELETE dbtab这样的操作。

1 BAPI的优点

bapi是面向对象的设计;

bapi是固定的,一般不能修改;

bapi可以被sap内部部件和非sap程序使用;

bapi的成功和错误信息始终通过RETURN返回;

bapi可以被许多开发平台使用;

2 何时该考虑使用BAPI设计程序

用VB/JAVA?C++等语言编写非SAPGUI程序访问和处理sap数据;

SAP不同部件之间通讯;

与非sap程序或者老系统交换数据:

使用异步通信分发数据如:ALE

可以通过SAP Business Connector or Internet Application Components 与因特网程序集成;

3 关于RETURN

RETURN用于BAPI返回错误和成功的消息,它可以是BAPIRETURN,BAPIRETURN,BAPIRET1,BAPIRET2和BAPIRET2_FIX中的一种类型.这些结构一般都包括以下字段:

SORT return BY type number row.

LOOP AT return WHERE type = ‘E’ OR type = ‘A’.

 ENDLOOP.

如果sy-subrc = 0CALL FUNCTION ‘BAPI_TRANSACTION_ROLLBACK’.

否则

 CALL FUNCTION ‘BAPI_TRANSACTION_COMMIT’

      EXPORTING

        wait   ‘X’  参数wait赋值‘X’,提交完之后才回进行后面的代码

      IMPORTING

        return ls_commit_return.

TYPE

CHAR 1

S= success message

E = error message

W = warning message

I = information message

A = termination message (abort)终止消息(中止)

ID

CHAR 20

Message ID The structure BAPIRET2 takes into account the name space extension for the message class as of Release 4.0. If you want messages to be compatible with earlier R/3 Releases, use the message classes before Release 4.0.

NUMBER

NUMC 3

Message number

MESSAGE

CHAR 220

Full message text from the message table. All variables (in fields Message_V1 to Message_V4) have been replaced with text.

MESSAGE_V1

MESSAGE_V2

MESSAGE_V3 MESSAGE_V4

CHAR 50

Fields for the variable texts of the message

我们调用bapi做了相关的业务操作后,通常都要在后面调用 BAPI_TRANSACTION_COMMIT来提交所做得更改,然而,有时候,在程序中需要调用多个不同的BAPI实现不同的功能,那么这个时候就容易出现问题了。

最先调用的BAPI成功执行了,可是后续的BAPI就无法成功执行,当我们调试的时候,却没有错误,一切都能正常操作。那么这个时候,我们就要考虑是 BAPI_TRANSACTION_COMMIT参数的问题了!

因为在一个bapi成功执行后,需要调用 BAPI_TRANSACTION_COMMIT来提交所做得更改,那么这个提交操作要等待一定的时间,我们调用的时候,通常 BAPI_TRANSACTION_COMMIT的WAIT参数是空的,那么就会导致commit work and wait不会执行,而是简单的commit work操作,这样后续的BAPI可能需要上一个bapi所作操作的数据,而恰巧这些数据还没有提交完成,就会导致以后的bapi都无法正常顺利的执行。所以我们只需要将 BAPI_TRANSACTION_COMMIT中的参数wait赋值’X’。就可以保证后续的操作正常进行了。

BAPI_PO_CREATE1样例:

CALL FUNCTION 'BAPI_PO_CREATE1'
    EXPORTING
      poheader         = ls_poheader
      poheaderx        = ls_poheaderx
*     testrun          = testrun
    IMPORTING
      exppurchaseorder = lv_ebeln
    TABLES
      return           = lt_return[]
      poitem           = lt_poitem[]
      poitemx          = lt_poitemx[]
      poschedule       = lt_poschedule[]
      poschedulex      = lt_poschedulex[]
      pocond           = lt_pocond[]
      pocondx          = lt_pocondx[]
*     poaccount        = poaccount[]
*     poaccountx       = poaccountx[]
*     potextheader     = potextheader[]
*     pocomponents     = pocomponents[]
*     pocomponentsx    = pocomponentsx[]
      extensionin      = lt_extensionin[].

  SORT lt_return BY type number row.
  CLEAR lv_msg.
  LOOP AT lt_return WHERE type = 'E' OR type = 'A'.
    IF lt_return-type = 'E' AND lt_return-id = 'MEPO'.
      CONTINUE.
    ENDIF.
    IF lt_return-type = 'E' AND lt_return-id = 'BAPI' AND  lt_return-number = '1'.
      CONTINUE.
    ENDIF.
    PERFORM frm_out_msg USING o_return-zmsg lt_return-message ';' CHANGING o_return-zmsg.
    lv_msg =  lv_msg && o_return-zmsg . "add start by Jeremy 22.05.2020 19:04:24
    AT NEW row.
      READ TABLE lt_poitem INTO DATA(ls_itme) INDEX  lt_return-row .
      o_return-zhxm2 = |{ ls_itme-po_item  ALPHA = IN }|.
      o_return-zhxm  = |{ ls_itme-po_item  ALPHA = IN }|.
*      CONDENSE O_RETURN-ZHXM NO-GAPS .
      o_return-zmsg = '项目:' && o_return-zhxm && o_return-zmsg.
      APPEND o_return TO ot_return.
      CLEAR o_return.
    ENDAT.
  ENDLOOP.
  IF lv_ebeln IS INITIAL.
    o_return-zmty = 'E'.
    CONDENSE lv_msg NO-GAPS .
    o_return-zmsg = lv_msg.
    CALL FUNCTION 'BAPI_TRANSACTION_ROLLBACK'.
  ELSE.
    CALL FUNCTION 'BAPI_TRANSACTION_COMMIT'
      EXPORTING
        wait = 'X'. 

  IF o_returnzmty ‘E’.

    CALL FUNCTION ‘BAPI_TRANSACTION_ROLLBACK’.

  ELSE.

    CLEAR ls_commit_return.

    CALL FUNCTION ‘BAPI_TRANSACTION_COMMIT’

      EXPORTING

        wait   ‘X’      IMPORTING

        return ls_commit_return.

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/163905.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • 分布式拒绝服务攻击(DDoS)原理及防范

    分布式拒绝服务攻击(DDoS)原理及防范年 6 月 01 日分布式拒绝服务攻击 DDoS 是目前黑客经常采用而难以防范的攻击手段 本文从概念开始详细介绍了这种攻击方式 着重描述了黑客是如何组织并发起的 DDoS 攻击 结合其中的 SynFlood 实例 您可以对 DDoS 攻击有一个更形象的了解 最后作者结合自己的经验与国内网络安全的现况探讨了一些防御 DDoS 的实际手段 DDoS 攻击概念 DoS 的攻击方式有很多种 最基本的 DoS 攻击就是

    2025年12月13日
    3
  • EnableEventValidation=”false”「建议收藏」

    EnableEventValidation=”false”「建议收藏」出现这种原因在页面开头添加上EnableEventValidation=”false”

    2022年7月13日
    21
  • 微商分销功能不能用了

    微商分销功能不能用了“三级以上分销将会被停止支付功能和封停账号”,日前一则“不利”消息彻底引爆微商的主要阵地——微信朋友圈。一时间关于分销三级变二级、微商寒冬将至的说法再次疯传。自央视曝光部分微商涉嫌传销之后,微信今年接连对微商们“动刀”,强化管理意在行业正规化发展,失去多级分销之后,依靠内容深度揽客的方式成为微商转型的方向。微商连遭重创刚刚过去的一周,微商们再次体验到了人生的跌宕起伏。认证为腾讯微信

    2022年5月13日
    45
  • vue父组件操作子组件的方法_vue子组件向父组件传值的三种方式

    vue父组件操作子组件的方法_vue子组件向父组件传值的三种方式父组件和子组件我们经常分不清什么是父组件,什么是子组件。现在来简单总结下:我们将某段代码封装成一个组件,而这个组件又在另一个组件中引入,而引入该封装的组件的文件叫做父组件,被引入的组件叫做子组件。具

    2022年8月7日
    5
  • 免杀工具汇总_一键免杀

    免杀工具汇总_一键免杀今天整理以前的笔记,把这部分工具整理了一下,虽然没有白利用稳,但这些工具也能在一定程度起到一定的免杀作用。DKMC项目地址:https://github.com/Mr-Un1k0d3r/DKMC可以创建一个outputs文件夹存放shellcode启动pythondkmc.py操作顺序:Sc:是将msf生成的raw文件转换位shellcode代码…

    2022年4月19日
    84
  • 图片外链方法大全: 免费的图床! 告别新浪图床 和 CDN

    图片外链方法大全: 免费的图床! 告别新浪图床 和 CDN今天给大家公开的是可以图片上传并获取稳定直链的方法,也就是俗称的”图床“;常用的一些免费图床,比如新浪图床可能不好用、图片访问慢;自费购买CDN价格过于昂贵,于是贫穷的我们整理出如下的方法上传图片,用于个人博客、网站等。本文仅列出可公开访问的网页,并只按正常用户操作,手动上传图片获取链接,不公开接口调用方法。防盗链可以通过网站的meta头激活成功教程,在head里插入下方代码:<metaname=”referrer”content=”never”>1、百度

    2022年6月20日
    85

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号