SAP中BAPI_MATERIAL_SAVEDATA分析和使用
本文目录
BAPI_MATERIAL_SAVEDATA结构
1. 导入参数(EXPORTING)
2. 导出参数(IMPORTING)
3. 表参数(TABLES)
BAPI_MATERIAL_SAVEDATA使用
BAPI_MATERIAL_SAVEDATA修改物料类型不能成功原因分析
BAPI使用注意项
业务背景:前面有提到批量修改物料类型的前台操作,现在需要实现后台代码中修改物料类型,查找到sap系统中有相关标准的BAPI--BAPI_MATERIAL_SAVEDATA,现分析是否可以使用。
BAPI的详细定义和自创建BAPI见:https://blog.csdn.net/qq_55841727/article/details/143712907?fromshare=blogdetail&sharetype=blogdetail&sharerId=143712907&sharerefer=PC&sharesource=qq_55841727&sharefrom=from_link
BAPI_MATERIAL_SAVEDATA结构
BAPI_MATERIAL_SAVEDATA 是 SAP 系统中用于创建和修改物料主数据的标准 BAPI(业务应用程序接口),需要该BAPI中哪些可以使用和修改,就需要了解它的结构,传入传出的字段。进入SE37,输入该BAPI点击显示。
BAPI_MATERIAL_SAVEDATA 的参数分为导入参数(EXPORTING)、导出参数(IMPORTING)和表参数(TABLES),点击每行参数后边的显示还会有解释说明,会指出具体的字段使用。例如HEADDATA的显示
以下是主要参数的说明:
1. 导入参数(EXPORTING)
- HEADDATA:包含物料的基本控制信息,如物料号、物料类型、行业领域等。创建物料时,必须至少选择一个视图(如基本视图、工厂视图等)。
- CLIENTDATA:客户端层次的物料数据,对应后台表 MARA。
- PLANTDATA:工厂级别的物料数据,对应后台表 MARC。
- SALESDATA:销售视图数据,对应后台表 MVKE。
- VALUATIONDATA:财务视图数据,对应后台表 MBEW。
- FORECASTPARAMETERS:预测视图数据,对应后台表 MPOP。
- STORAGELOCATIONDATA:库存地点视图数据,对应后台表 MARD。
2. 导出参数(IMPORTING)
- RETURN:返回操作结果和错误信息,用于判断调用是否成功。
3. 表参数(TABLES)
- MATERIALDESCRIPTION:物料的语言相关描述,对应表 MAKT。
- TAXCLASSIFICATIONS:物料的税分类,对应表 MLAN。
- EXTENSIONIN 和 EXTENSIONINX:用于传递自定义字段的数据和操作标记。
BAPI_MATERIAL_SAVEDATA使用
SAP系统中的BAPI参数结构设计遵循一种特定的模式:相关字段通常会被组织在同一个结构中,同时会配备一个名称相似但以"X"结尾的配套结构。这个配套结构中的字段名称与数据结构完全对应,但每个字段都是单字符类型,充当开关作用,明确指示BAPI是否需要处理相应字段的变更,精确控制哪些数据需要更新。
根据以上规则,先定义:
DATA:ls_headdata LIKE bapimathead,ls_clientdata LIKE bapi_mara,ls_clientdatax LIKE bapi_marax,ls_plantdata LIKE bapi_marc,ls_plantdatax LIKE bapi_marcx,ls_salesdata LIKE bapi_mvke,ls_salesdatax LIKE bapi_mvkex,ls_valuationdata LIKE bapi_mbew,ls_valuationdatax LIKE bapi_mbewx,ls_storagelocationdata LIKE bapi_mard,ls_storagelocationdatax LIKE bapi_mardx,ls_extensionin LIKE bapiparex,ls_bapi_te_mara LIKE bapi_te_mara,pt_extensionin TYPE bapiparextab,lt_bapi_te_mara LIKE TABLE OF bapi_te_mara,lt_extensionin LIKE TABLE OF bapiparex,ls_extensioninx LIKE bapiparexx,lt_extensioninx LIKE TABLE OF bapiparexx,l_container TYPE me_max_container,ls_bapi_te_marax LIKE bapi_te_marax,lt_unitsofmeasure LIKE TABLE OF bapi_marm WITH HEADER LINE,lt_unitsofmeasurex LIKE TABLE OF bapi_marmx WITH HEADER LINE,lt_materiallongtext LIKE TABLE OF bapi_mltx WITH HEADER LINE,lt_materialdescription LIKE TABLE OF bapi_makt WITH HEADER LINE,lt_taxclassifications LIKE TABLE OF bapi_mlan WITH HEADER LINE,ls_return LIKE bapiret2.
定义之后,填充数据(表头的和一些视图的基本数据),并且维护是否可修改的控制:
ls_headdata-material = lv_matnr.ls_headdata-material_long = lv_matnr.ls_headdata-basic_view = 'X' .ls_headdata-ind_sector = 'M'.ls_clientdata-unit_of_wt = 'G'.ls_clientdatax-unit_of_wt = 'X'.lt_materialdescription-langu = '1'.lt_materialdescription-matl_desc = is_item-maktx.APPEND lt_materialdescription .ls_clientdata-base_uom = is_item-meins.ls_clientdatax-base_uom = 'X' .ls_clientdata-matl_group = is_item-matkl .ls_clientdatax-matl_group = 'X' .ls_bapi_te_mara-material = is_item-matnr.ls_bapi_te_mara-ztxt = is_item-ztxt.ls_bapi_te_mara-zpm = is_item-zpm.ls_bapi_te_mara-zggxh = is_item-zggxh.ls_bapi_te_mara-zpp = is_item-zpp.ls_bapi_te_mara-zsbxp = is_item-zsbxp.ls_bapi_te_mara-zcz = is_item-zcz.ls_bapi_te_mara-zbz = is_item-zbz.ls_bapi_te_mara-zmrpjx = is_item-zmrpjx.ls_bapi_te_mara-zzBm = is_item-zzbm.IF is_item-brgew IS NOT INITIAL.ls_bapi_te_mara-brgew = is_item-brgew.ENDIF.ls_headdata-work_sched_view = 'X'.ls_headdata-storage_view = 'X'.ls_plantdata-plant = is_item-werks.ls_plantdatax-plant = is_item-werks.
最后调用BAPI传值:
CALL FUNCTION 'BAPI_MATERIAL_SAVEDATA'EXPORTINGheaddata = ls_headdataclientdata = ls_clientdataclientdatax = ls_clientdataxplantdata = ls_plantdataplantdatax = ls_plantdatax
* FORECASTPARAMETERS =
* FORECASTPARAMETERSX =
* PLANNINGDATA =
* PLANNINGDATAX =
* STORAGELOCATIONDATA =
* STORAGELOCATIONDATAX =
* VALUATIONDATA =
* VALUATIONDATAX =
* WAREHOUSENUMBERDATA =
* WAREHOUSENUMBERDATAX =
* SALESDATA =
* SALESDATAX =
* STORAGETYPEDATA =
* STORAGETYPEDATAX =
* FLAG_ONLINE = ' '
* FLAG_CAD_CALL = ' '
* NO_DEQUEUE = ' '
* NO_ROLLBACK_WORK = ' '
* CLIENTDATACWM =
* CLIENTDATACWMX =
* VALUATIONDATACWM =
* VALUATIONDATACWMX =
* MATPLSTADATA =
* MATPLSTADATAX =
* MARC_APS_EXTDATA =
* MARC_APS_EXTDATAX =IMPORTINGreturn = ls_returnTABLESmaterialdescription = lt_materialdescription
* UNITSOFMEASURE =
* UNITSOFMEASUREX =
* INTERNATIONALARTNOS =
* MATERIALLONGTEXT =
* TAXCLASSIFICATIONS =
* RETURNMESSAGES =
* PRTDATA =
* PRTDATAX =extensionin = lt_extensioninextensioninx = lt_extensioninx
* UNITSOFMEASURECWM =
* UNITSOFMEASURECWMX =
* SEGMRPGENERALDATA =
* SEGMRPGENERALDATAX =
* SEGMRPQUANTITYDATA =
* SEGMRPQUANTITYDATAX =
* SEGVALUATIONTYPE =
* SEGVALUATIONTYPEX =
* SEGSALESSTATUS =
* SEGSALESSTATUSX =
* SEGWEIGHTVOLUME =
* SEGWEIGHTVOLUMEX =
* DEMAND_PENALTYDATA =
* DEMAND_PENALTYDATAX =
* NFMCHARGEWEIGHTS =
* NFMCHARGEWEIGHTSX =
* NFMSTRUCTURALWEIGHTS =
* NFMSTRUCTURALWEIGHTSX =.IF ls_return-type = 'S'.CALL FUNCTION 'BAPI_TRANSACTION_COMMIT'EXPORTINGwait = 'X'.ret-code = 'S'.ret-msg = '物料:创建成功'.IF sy-subrc = 0 .COMMIT WORK AND WAIT.ENDIF.ELSE.ret-code = ls_return-type.ret-msg = '物料创建:' && ls_return-message && is_item-matnr.CALL FUNCTION 'BAPI_TRANSACTION_ROLLBACK'.ENDIF.
BAPI_MATERIAL_SAVEDATA修改物料类型不能成功原因分析
上一段中强调了参数和对应的结构,物料类型字段MATL_TYPE存在BAPIMATHEAD带有控制信息的表头段结构中,但是系统中不存在BAPIMATHEAD的配套结构,尽管后续在程序中使用了控制语句 ls_headdata-matl_type = 'X'依旧不能起作用。
后续的方法是在程序中使用BDC的方法完成了对物料类型的修改程序。BDC方法参考见此前的博文:https://blog.csdn.net/qq_55841727/article/details/143705153?fromshare=blogdetail&sharetype=blogdetail&sharerId=143705153&sharerefer=PC&sharesource=qq_55841727&sharefrom=from_link
BAPI使用注意项
- 涉及更新操作的BAPI(如创建、修改或删除)与读取操作之间必须以上一次COMMIT WORK为界。
- 事务提交与回滚必须通过调用SAP标准业务对象BapiService的相应方法完成,外部程序在验证BAPI执行成功(检查RETURN参数中无E类消息)后,调用BAPI_TRANSACTION_COMMIT提交事务;若存在错误消息,则必须使用BAPI_TRANSACTION_ROLLBACK撤销操作。