大家好,又见面了,我是你们的朋友全栈君。
- 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 = 0,CALL 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_return–zmty = ‘E’.
CALL FUNCTION ‘BAPI_TRANSACTION_ROLLBACK’.
ELSE.
CLEAR ls_commit_return.
CALL FUNCTION ‘BAPI_TRANSACTION_COMMIT’
EXPORTING
wait = ‘X’ IMPORTING
return = ls_commit_return.
发布者:全栈程序员-用户IM,转载请注明出处:https://javaforall.cn/163905.html原文链接:https://javaforall.cn
【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛
【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...