毛重和 业务量 体积单位在 BAPI_MARM BAPI_MARMX里面
更新时注意 :ALT_UNIT 和 ALT_UNIT_ISO 要和 head里面的BASE_UOM 保持一致
链接参考:How to update VOlume and Volume Unit through BAPI_MATERIAL_SAVEDATA ? | SAP Community
FUNCTION ZMATNR_PLM2SAP.
*"----------------------------------------------------------------------
*"*"本地接口:
*" TABLES
*" MATERIAL STRUCTURE ZMAT
*" OUTPUT_MESSAGE STRUCTURE ZMAT_MESSAGE
*"----------------------------------------------------------------------
"定义数据
TABLES:mara,marc,ZLOGOFMATNRORBOM.
data: temp_mat type matnr, "物料
temp_werks type werks_d, "工厂
temp_mtart type mtart, "物料类型
temp_subrc like SYST-SUBRC, "物料类型修改成功与否
HEADDATA LIKE BAPIMATHEAD, "带有控制信息的表头段
CLIENTDATA LIKE BAPI_MARA, "客户端物料数据
CLIENTDATAX LIKE BAPI_MARAX, "客户端物料数据的更新信息
return2 type bapiret2, "返回信息
MESSAGETAB LIKE BDCMSGCOLL OCCURS 0 WITH HEADER LINE, "返回物料类型的消息
RETURNS LIKE BAPI_MATRETURN2 OCCURS 0 WITH HEADER LINE. "返回消息
data: BEGIN OF zlog,
MATNR TYPE MATNR,
WERKS TYPE WERKS_D,
INTERFACENAME(60) TYPE C,
LOGDATE TYPE DATUM,
LOGTIME TYPE UZEIT,
maktx type maktx,
MEINS type MEINS,
MBRSH type MBRSH,
lvorm type lvorm,
mtart type mtart,
SPART type SPART,
MATKL type MATKL,
BISMT type BISMT,
LGFSB type LGFSB,
EORIGINNO(40) type c,
CREATER(20) type c,
MESSAGETYPE(1) TYPE C,
MESSAGE(220) TYPE C,
END OF ZLOG.
data: matdescription like table of BAPI_MAKT WITH HEADER LINE. "物料描述
data:ltWV like TABLE OF BAPI_MARM WITH HEADER LINE. " 度量单位 毛重 体积
data:ltWVX like TABLE OF BAPI_MARMX WITH HEADER LINE. "度量单位 毛重 体积
data: BEGIN OF newmat_record,
MATNR like mara-matnr,
werks type werks_d,
MAKTX like makt-maktx,
MEINS like mara-meins,
MBRSH like mara-MBRSH,
lvorm like mara-lvorm,
mtart like mara-mtart,
SPART like mara-spart,
MATKL like mara-matkl,
BISMT type BISMT,
LGFSB TYPE LGFSB,
EORIGINNO(40) type c,
creater(20) type c,
ISUPDATE(1) type C,
CREATEDATE type D,
CREATETIME type T,
UPDATEDATE type D,
UPDATETIME type T,
END OF newmat_record.
LOOP at MATERIAL.
CLEAR ltwv[].clear ltwvx[].
CALL FUNCTION 'CONVERSION_EXIT_MATN1_INPUT'
EXPORTING
input = MATERIAL-matnr
IMPORTING
output = MATERIAL-matnr.
TRANSLATE MATERIAL-matnr TO UPPER CASE.
CALL FUNCTION 'CONVERSION_EXIT_CUNIT_INPUT'
EXPORTING
input = MATERIAL-MEINS
IMPORTING
output = MATERIAL-MEINS.
"判断必须的输入字段是否有数据
if ( material-matnr is INITIAL ) or ( material-werks is INITIAL ).
clear output_message.
output_message-matnr = material-matnr.
output_message-werks = material-werks.
output_message-messagetype = 'E'.
output_message-message = '物料和工厂为必填字段,请补充必填字段!'.
append output_message.
CONTINUE.
endif.
clear temp_mat.
clear temp_mtart.
CLEAR RETURNS.
CLEAR RETURNS[].
select SINGLE matnr mtart into (temp_mat,temp_mtart) from mara where matnr = material-matnr.
if temp_mat is not initial.
*1. 更新物料
*1.1 准备输入数据
"头数据:事实上这个数据创建后就修改不了了
clear headdata.
headdata-MATERIAL = material-matnr. "物料(必填,且不可修改)
headdata-IND_SECTOR = material-mbrsh. "行业领域(必填,且不可修改)
headdata-matl_type = material-mtart. "物料类型(也必填,在这里直接修改不了,需调用创建的函数处理)
headdata-BASIC_VIEW = 'X'.
"基本数据
clear clientdata.
clear clientdatax.
CLIENTDATA-BASE_UOM = material-meins.
CLIENTDATAX-BASE_UOM = 'X'.
CLIENTDATA-DEL_FLAG = material-lvorm.
CLIENTDATAX-DEL_FLAG = 'X'.
CLIENTDATA-DIVISION = material-SPART.
CLIENTDATAX-DIVISION = 'X'.
CLIENTDATA-OLD_MAT_NO = material-BISMT.
CLIENTDATAX-OLD_MAT_NO = 'X'.
* 由于存在物料组字段含义变更的问题,更新后会影响历史数据统计的准确性,此字段不更新到sap,新物料如果个别需更新,可以通知黄海燕更新
CLIENTDATA-MATL_GROUP = material-MATKL.
CLIENTDATAX-MATL_GROUP = 'X'.
ltWv-alt_unit = material-meins.
ltWvX-alt_unit = material-meins.
ltWv-ALT_UNIT_ISO = material-meins.
ltWvX-ALT_UNIT_ISO = material-meins.
ltWv-VOLUME = material-VOLUM."体积
ltWvX-VOLUME = 'X'.
ltWv-VOLUMEUNIT = material-VOLEH."体积
ltWvX-VOLUMEUNIT = 'X'.
ltWv-GROSS_WT = material-BRGEW. "毛重
ltWvX-GROSS_WT = 'X'.
* ltWv-NET_WEIGHT = material-NTGEW."净重
* ltWvx-net_weight = 'X'.
ltWv-UNIT_OF_WT = material-GEWEI.
ltWvX-UNIT_OF_WT = 'X'.
APPEND ltWv.
APPEND ltWvX.
CLIENTDATA-net_weight = material-NTGEW."净重
CLIENTDATAX-net_weight = 'X'.
CLIENTDATA-UNIT_OF_WT = material-gewei."毛重
CLIENTDATAX-UNIT_OF_WT = 'X'.
"物料描述
CLEAR matdescription.
CLEAR matdescription[].
matdescription-LANGU_ISO = 'ZH'.
matdescription-MATL_DESC = material-maktx.
* concatenate material-maktx material-EORIGINNO into matdescription-MATL_DESC.
APPEND matdescription.
*1.2 执行更新物料
CALL FUNCTION 'BAPI_MATERIAL_SAVEDATA'
EXPORTING
headdata = headdata
clientdata = clientdata
clientdatax = clientdatax
IMPORTING
return = return2
TABLES
materialdescription = matdescription[]
UNITSOFMEASURE = ltwv[]
UNITSOFMEASUREX = ltwvX[]
RETURNMESSAGES = RETURNS.
CALL FUNCTION 'BAPI_TRANSACTION_COMMIT'
EXPORTING
WAIT = 'X'.
if material-lvorm <> 'X'.
UPDATE MARA SET lvorm = '' where matnr = material-matnr.
UPDATE MARC SET lvorm = '' where matnr = material-matnr.
COMMIT WORK and wait.
ENDIF.
"单独处理更新物料类型
if material-mtart <> temp_mtart.
CALL FUNCTION 'ZBAPI_CHANGEMTART'
EXPORTING
CTU = 'X'
MODE = 'N'
UPDATE = 'L'
NODATA = '/'
MATNR_001 = material-matnr
NMTAR_002 = material-mtart
IMPORTING
SUBRC = temp_subrc
TABLES
MESSTAB = MESSAGETAB.
CALL FUNCTION 'BAPI_TRANSACTION_COMMIT'
EXPORTING
WAIT = 'X'.
endif.
*1.3 输出消息处理
clear output_message.
output_message-matnr = material-matnr.
UPDATE mara SET zysj = material-zysj ZJKZYJ = material-ZJKZYJ
WHERE matnr = MATERIAL-matnr.
CALL FUNCTION 'CONVERSION_EXIT_MATN1_OUTPUT'
EXPORTING
input = output_message-matnr
IMPORTING
output = output_message-matnr.
output_message-werks = material-werks.
output_message-messagetype = return2-type.
output_message-message = return2-message.
IF return2-type = 'S' .
LOOP AT RETURNS.
IF RETURNS-TYPE = 'E' or RETURNS-TYPE = 'A'.
output_message-messagetype = RETURNS-type.
output_message-message = RETURNS-message.
EXIT.
ENDIF.
ENDLOOP.
ENDIF.
if temp_subrc <> 0.
if output_message-messagetype = 'S'.
output_message-messagetype = 'E'.
output_message-message = '物料类型更新不成功!'.
else.
output_message-messagetype = 'E'.
CONCATENATE output_message-message ',且物料类型更新不成功!' INTO output_message-message.
endif.
endif.
append output_message.
* 1.4 记录传入的数据及处理结果
ZLOG-matnr = output_message-matnr.
ZLOG-werks = output_message-werks.
ZLOG-messagetype = output_message-messagetype.
ZLOG-message = output_message-message.
ZLOG-logdate = sy-DATUM.
ZLOG-logtime = sy-UZEIT.
ZLOG-interfacename = 'ZMATNR_PLM2SAP'.
ZLOG-maktx = material-maktx.
ZLOG-MEINS = material-MEINS.
ZLOG-MBRSH = material-MBRSH.
ZLOG-lvorm = material-lvorm.
ZLOG-mtart = material-mtart.
ZLOG-SPART = material-SPART.
ZLOG-MATKL = material-MATKL.
ZLOG-BISMT = material-BISMT.
ZLOG-LGFSB = material-LGFSB.
ZLOG-EORIGINNO = material-EORIGINNO.
ZLOG-CREATER = material-CREATER.
insert into ZLOGOFMATNRORBOM values ZLOG.
commit work and wait.
CLEAR ZLOG.
*1.5 对新添加的工厂数据进行更新,便于维护专员添加新的工厂视图
IF output_message-messagetype = 'S'.
clear temp_werks.
select SINGLE werks into temp_werks from marc where matnr = material-matnr and werks = material-werks.
if temp_werks is initial.
clear newmat_record.
newmat_record-matnr = material-matnr.
newmat_record-werks = material-werks.
newmat_record-maktx = material-maktx.
newmat_record-MEINS = material-MEINS.
newmat_record-MBRSH = material-MBRSH.
newmat_record-lvorm = material-lvorm.
newmat_record-MTART = material-MTART.
newmat_record-SPART = material-SPART.
newmat_record-MATKL = material-MATKL.
newmat_record-BISMT = material-BISMT.
newmat_record-lgfsb = material-lgfsb.
newmat_record-EORIGINNO = material-EORIGINNO.
newmat_record-creater = material-creater.
newmat_record-isupdate = '0'.
newmat_record-createdate = SY-DATUM.
newmat_record-createtime = SY-UZEIT.
insert into zmat_synchronize values newmat_record.
commit work and wait.
endif.
ENDIF.
"修改物料日期和修改时间及其他工厂数据字段更新到新物料同步表
update zmat_synchronize set updatedate = SY-DATUM updatetime = SY-UZEIT lgfsb = material-lgfsb where matnr = material-matnr and werks = material-werks.
commit work and wait.
else.
*2. 新建物料
"判断必须的输入字段是否都有数据:物料、物料描述、单位、行业领域、物料类型、部门、物料组;
"工厂和采购库位不必填,但是还是要提供给物料维护专员生成其他视图数据
if ( material-matnr is INITIAL ) or ( material-maktx is INITIAL ) or ( material-meins is INITIAL )
or ( material-mbrsh is INITIAL ) or ( material-mtart is INITIAL ) or ( material-SPART is INITIAL ) or ( material-MATKL is INITIAL ).
clear output_message.
output_message-matnr = material-matnr.
output_message-werks = material-werks.
output_message-messagetype = 'E'.
output_message-message = '新建物料所需的数据不全,请补充必填字段!'.
append output_message.
CONTINUE.
endif.
*2.1 准备输入数据
"头数据
clear headdata.
headdata-MATERIAL = material-matnr. "物料(必填,且不可修改)
headdata-IND_SECTOR = material-mbrsh. "行业领域(必填,且不可修改)
headdata-matl_type = material-mtart. "物料类型(也必填,且不可修改)
headdata-BASIC_VIEW = 'X'.
"基本数据
clear clientdata.
if material-lvorm is not INITIAL.
CLIENTDATA-DEL_FLAG = material-lvorm.
else.
CLIENTDATA-DEL_FLAG =''.
endif.
CLIENTDATA-MATL_GROUP = material-MATKL.
CLIENTDATA-BASE_UOM = material-meins.
CLIENTDATA-DIVISION = material-SPART.
CLIENTDATA-OLD_MAT_NO = material-BISMT.
"基本数据的更新项
clear clientdatax.
if material-lvorm is not INITIAL.
CLIENTDATAX-DEL_FLAG = 'X'.
else.
CLIENTDATAX-DEL_FLAG =''.
endif.
CLIENTDATAX-MATL_GROUP = 'X'.
CLIENTDATAX-BASE_UOM = 'X'.
CLIENTDATAX-DIVISION = 'X'.
CLIENTDATAX-OLD_MAT_NO = 'X'.
ltWv-alt_unit = material-meins.
ltWvX-alt_unit = material-meins.
ltWv-ALT_UNIT_ISO = material-meins.
ltWvX-ALT_UNIT_ISO = material-meins.
ltWv-VOLUME = material-VOLUM."体积
ltWvX-VOLUME = 'X'.
ltWv-VOLUMEUNIT = material-VOLEH."体积
ltWvX-VOLUMEUNIT = 'X'.
ltWv-GROSS_WT = material-BRGEW. "毛重
ltWvX-GROSS_WT = 'X'.
* ltWv-NET_WEIGHT = material-NTGEW."净重
* ltWvx-net_weight = 'X'.
ltWv-UNIT_OF_WT = material-GEWEI.
ltWvX-UNIT_OF_WT = 'X'.
APPEND ltWv.
APPEND ltWvX.
CLIENTDATA-net_weight = material-NTGEW."净重
CLIENTDATAX-net_weight = 'X'.
CLIENTDATA-UNIT_OF_WT = material-gewei."毛重
CLIENTDATAX-UNIT_OF_WT = 'X'.
"物料描述
CLEAR matdescription.
CLEAR matdescription[].
matdescription-LANGU_ISO = 'ZH'.
matdescription-MATL_DESC = material-maktx .
* concatenate material-maktx material-EORIGINNO into matdescription-MATL_DESC.
APPEND matdescription.
*2.2 执行新建物料
CALL FUNCTION 'BAPI_MATERIAL_SAVEDATA'
EXPORTING
headdata = headdata
clientdata = clientdata
clientdatax = clientdatax
IMPORTING
return = return2
TABLES
materialdescription = matdescription[]
UNITSOFMEASURE = ltwv[]
UNITSOFMEASUREX = ltwvX[]
RETURNMESSAGES = RETURNS.
CALL FUNCTION 'BAPI_TRANSACTION_COMMIT'
EXPORTING
WAIT = 'X'.
UPDATE mara SET zysj = material-zysj ZJKZYJ = material-ZJKZYJ
WHERE matnr = MATERIAL-matnr.
*2.3 输出消息处理
clear output_message.
output_message-matnr = material-matnr.
CALL FUNCTION 'CONVERSION_EXIT_MATN1_OUTPUT'
EXPORTING
input = output_message-matnr
IMPORTING
output = output_message-matnr.
output_message-werks = material-werks.
output_message-messagetype = return2-type.
output_message-message = return2-message.
IF return2-type = 'S'.
LOOP AT RETURNS.
IF RETURNS-TYPE = 'E' or RETURNS-TYPE = 'A'.
output_message-messagetype = RETURNS-type.
output_message-message = RETURNS-message.
EXIT.
ENDIF.
ENDLOOP.
ENDIF.
append output_message.
* 2.4 记录传入的数据及处理结果
ZLOG-matnr = output_message-matnr.
ZLOG-werks = output_message-werks.
ZLOG-messagetype = output_message-messagetype.
ZLOG-message = output_message-message.
ZLOG-logdate = sy-DATUM.
ZLOG-logtime = sy-UZEIT.
ZLOG-interfacename = 'ZMATNR_PLM2SAP'.
ZLOG-maktx = material-maktx.
ZLOG-MEINS = material-MEINS.
ZLOG-MBRSH = material-MBRSH.
ZLOG-lvorm = material-lvorm.
ZLOG-mtart = material-mtart.
ZLOG-SPART = material-SPART.
ZLOG-MATKL = material-MATKL.
ZLOG-BISMT = material-BISMT.
ZLOG-LGFSB = material-LGFSB.
ZLOG-EORIGINNO = material-EORIGINNO.
ZLOG-CREATER = material-CREATER.
insert into ZLOGOFMATNRORBOM values ZLOG.
commit work and wait.
CLEAR ZLOG.
*2.5 对新建的物料进行记录,便于维护专员更新各视图数据
IF output_message-messagetype = 'S'.
clear newmat_record.
newmat_record-matnr = material-matnr.
newmat_record-werks = material-werks.
newmat_record-maktx = material-maktx.
newmat_record-MEINS = material-MEINS.
newmat_record-MBRSH = material-MBRSH.
newmat_record-lvorm = material-lvorm.
newmat_record-MTART = material-MTART.
newmat_record-SPART = material-SPART.
newmat_record-MATKL = material-MATKL.
newmat_record-BISMT = material-BISMT.
newmat_record-lgfsb = material-lgfsb.
newmat_record-EORIGINNO = material-EORIGINNO.
newmat_record-creater = material-creater.
newmat_record-isupdate = '0'.
newmat_record-createdate = SY-DATUM.
newmat_record-createtime = SY-UZEIT.
insert into zmat_synchronize values newmat_record.
commit work and wait.
ENDIF.
endif.
ENDLOOP.
ENDFUNCTION.