12-08-2012 9:20 AM
Hi Experts,
I am trying to uplaod the material master data using bapi_material_savedata.
It is working fine for one data, and if i try to upload more datas then the first data getting created and remaining data getting the following error
Field MATNR has been transferred inconsistently or is blank
And the material is created using external number range that is ill give the material number in the excel sheet.
Am pasting the code also here for your reference
Please do the needfull.
Thanks in advance.
REPORT z_mm_mat_mast_upld.
TYPE-POOLS: slis, truxs.
DATA: wa_tab_raw_data TYPE truxs_t_text_data,
sno TYPE i.
TYPES: BEGIN OF ty_msg,
sno TYPE i,
msgtyp TYPE c,
plant(4),
mstring(255) TYPE c,
END OF ty_msg.
DATA tmsstab TYPE TABLE OF ty_msg.
DATA wmsstab TYPE ty_msg.
DATA : lv_sno TYPE i.
TABLES : bapimathead, " Header segment with control information
bapi_mara, " Client-specific material data
bapi_marax, " Information on update for CLIENTDATA
bapi_marc, " Plant-specific material data
bapi_marcx, " Information on update for PLANTDATA
bapi_mard, " Storage-location-specific material data
bapi_mardx, " Information on update for STORAGELOCATIONDATA
bapi_mbew, " Valuation data
bapi_mbewx, " Information on update for VALUATIONDATA
bapi_makt, " Material descriptions
bapi_marm, " Units of measure
bapi_marmx, " Information on update for UNITSOFMEASURE
bapi_mltx, " Long texts
bapiret2. " Return parameters
TYPES : BEGIN OF ty_master,
matnr(18), " Material Number
mbrsh(1), " Industry Sector
mtart(4), " Material Type
werks(4), " Plant
lgort(4), " Storage Location
maktx(40), " Material Description
meins(3), " Base Unit of measure
matkl(9), " Material Group
bismt(18), " Old Material Number
ekgrp(3), " Purchasing Group
bstme(3), " Order unit
webaz(3), " GR Procesing Time
tdline(132), " Purchase Order Text
disgr(4), " MRP Group
maabc(1), " ABC Indicator
dismm(2), " MRP Type
dispo(3), " MRP Controller
lgfsb(4), " Storage Loc for EP
plifz(3), " Planned Delivery Time
perkz(1), " Period Indicator
mtvfp(2), " Availability Check
lgpbe(10), " Storage Bin
bwkey(4), " Valuation Area
bklas(4), " Valuation Class
vprsv(1), " Price Control
verpr(11), " Moving Price
peinh(5), " Price Unit
meinh(3), " alternate_unit 1
umren(5), " denominator 1
umrez(5), " numerator 1
alt_un(3), " alternate_unit 2
denom(5), " denominator 2
numer(5), " numerator 2
minbe(13), " reorder point
disls(2), " lot size
mabst(13), " Maximum Stock level
END OF ty_master.
*DATA: BEGIN OF it_matmaster OCCURS 0.
* INCLUDE STRUCTURE ty_master.
*DATA: END OF it_matmaster.
DATA : it_matmaster TYPE STANDARD TABLE OF ty_master,
wa_matmaster TYPE ty_master.
DATA: BEGIN OF it_return OCCURS 0.
INCLUDE STRUCTURE bapiret2.
DATA: END OF it_return.
DATA: BEGIN OF it_marm OCCURS 0.
INCLUDE STRUCTURE bapi_marm.
DATA: END OF it_marm.
DATA: BEGIN OF it_marmx OCCURS 0.
INCLUDE STRUCTURE bapi_marmx.
DATA: END OF it_marmx.
DATA: BEGIN OF it_mltx OCCURS 0.
INCLUDE STRUCTURE bapi_mltx.
DATA: END OF it_mltx.
DATA: BEGIN OF it_materialdesc OCCURS 0.
INCLUDE STRUCTURE bapi_makt .
DATA: END OF it_materialdesc.
******Selection Screen
SELECTION-SCREEN BEGIN OF BLOCK rad1 WITH FRAME TITLE text-002.
PARAMETERS: pa_fname LIKE rlgrap-filename.
SELECTION-SCREEN END OF BLOCK rad1.
**********Added For Authority check for the user
AUTHORITY-CHECK OBJECT 'S_PROGRAM'
ID 'P_GROUP' FIELD 'ZAML'
ID 'P_ACTION' FIELD 'SUBMIT'.
IF sy-subrc NE '0'.
MESSAGE ID 'ZHR' TYPE 'E' NUMBER 004 WITH 'You are not Authorized'.
ENDIF.
******At Selection screen
AT SELECTION-SCREEN ON VALUE-REQUEST FOR pa_fname.
****** To get the File name
CALL FUNCTION 'F4_FILENAME'
EXPORTING
field_name = 'PA_FNAME'
IMPORTING
file_name = pa_fname.
******Start of Selection
START-OF-SELECTION.
****** Convert the excel file to sap format
CALL FUNCTION 'TEXT_CONVERT_XLS_TO_SAP'
EXPORTING
i_line_header = 'X'
i_tab_raw_data = wa_tab_raw_data
i_filename = pa_fname
TABLES
i_tab_converted_data = it_matmaster[]
EXCEPTIONS
conversion_failed = 1
OTHERS = 2.
IF sy-subrc <> 0.
MESSAGE i016(pg) WITH 'Invalid file. Please check again'.
STOP.
ENDIF.
IF it_matmaster[] IS NOT INITIAL.
LOOP AT it_matmaster INTO wa_matmaster.
* CLEAR bapimathead.
* BREAK-POINT.
CALL FUNCTION 'CONVERSION_EXIT_ALPHA_INPUT'
EXPORTING
input = wa_matmaster-matnr
IMPORTING
output = wa_matmaster-matnr.
*******Header Details
bapimathead-material = wa_matmaster-matnr.
bapimathead-ind_sector = wa_matmaster-mbrsh.
bapimathead-matl_type = wa_matmaster-mtart.
bapimathead-basic_view = 'X'.
bapimathead-mrp_view = 'X'.
bapimathead-storage_view = 'X'.
bapimathead-account_view = 'X'.
bapimathead-purchase_view = 'X'.
CALL FUNCTION 'CONVERSION_EXIT_CUNIT_INPUT'
EXPORTING
input = wa_matmaster-meins
language = sy-langu
IMPORTING
output = wa_matmaster-meins.
****Mara Table Details
bapi_mara-matl_group = wa_matmaster-matkl.
bapi_mara-base_uom = wa_matmaster-meins.
bapi_mara-base_uom_iso = wa_matmaster-meins.
bapi_mara-old_mat_no = wa_matmaster-bismt.
CALL FUNCTION 'CONVERSION_EXIT_CUNIT_INPUT'
EXPORTING
input = wa_matmaster-bstme
language = sy-langu
IMPORTING
output = wa_matmaster-bstme.
bapi_mara-po_unit = wa_matmaster-bstme.
bapi_marax-matl_group = 'X'.
bapi_marax-base_uom = 'X'.
bapi_marax-base_uom_iso = 'X'.
bapi_marax-old_mat_no = 'X'.
bapi_marax-po_unit = 'X'.
*****MARC Table Details
bapi_marc-plant = wa_matmaster-werks.
bapi_marc-pur_group = wa_matmaster-ekgrp.
bapi_marc-mrp_type = wa_matmaster-dismm.
bapi_marc-mrp_ctrler = wa_matmaster-dispo.
bapi_marc-abc_id = wa_matmaster-maabc.
bapi_marc-plnd_delry = wa_matmaster-plifz.
bapi_marc-gr_pr_time = wa_matmaster-webaz.
bapi_marc-period_ind = wa_matmaster-perkz.
bapi_marc-mrp_group = wa_matmaster-disgr.
bapi_marc-sloc_exprc = wa_matmaster-lgfsb.
bapi_marc-availcheck = wa_matmaster-mtvfp.
bapi_marc-REORDER_PT = wa_matmaster-minbe.
bapi_marc-LOTSIZEKEY = wa_matmaster-disls.
bapi_marc-MAX_STOCK = wa_matmaster-mabst.
bapi_marcx-plant = wa_matmaster-werks.
bapi_marcx-pur_group = 'X'.
bapi_marcx-mrp_type = 'X'.
bapi_marcx-mrp_ctrler = 'X'.
bapi_marcx-abc_id = 'X'.
bapi_marcx-plnd_delry = 'X'.
bapi_marcx-gr_pr_time = 'X'.
bapi_marcx-period_ind = 'X'.
bapi_marcx-mrp_group = 'X'.
bapi_marcx-sloc_exprc = 'X'.
bapi_marcx-availcheck = 'X'.
bapi_marcx-REORDER_PT = 'X'.
bapi_marcx-LOTSIZEKEY = 'X'.
bapi_marcx-MAX_STOCK = 'X'.
*****MARD Table Details
bapi_mard-plant = wa_matmaster-werks.
bapi_mard-stge_loc = wa_matmaster-lgort.
bapi_mard-stge_bin = wa_matmaster-lgpbe.
bapi_mardx-plant = wa_matmaster-werks.
bapi_mardx-stge_loc = wa_matmaster-lgort.
bapi_mardx-stge_bin = 'X'.
******MBEW Table Details
bapi_mbew-val_area = wa_matmaster-bwkey.
bapi_mbew-val_class = wa_matmaster-bklas.
bapi_mbew-price_ctrl = wa_matmaster-vprsv.
bapi_mbew-moving_pr = wa_matmaster-verpr.
bapi_mbew-price_unit = wa_matmaster-peinh.
bapi_mbewx-val_area = wa_matmaster-bwkey.
bapi_mbewx-val_class = 'X'.
bapi_mbewx-price_ctrl = 'X'.
bapi_mbewx-moving_pr = 'X'.
bapi_mbewx-price_unit = 'X'.
*****Material Description Details
it_materialdesc-langu = 'EN'.
it_materialdesc-matl_desc = wa_matmaster-maktx.
APPEND it_materialdesc.
CALL FUNCTION 'CONVERSION_EXIT_CUNIT_INPUT'
EXPORTING
input = wa_matmaster-meinh
language = sy-langu
IMPORTING
output = wa_matmaster-meinh.
*****Material Unit of Measure
it_marm-alt_unit = wa_matmaster-meinh.
it_marm-numerator = wa_matmaster-umrez.
it_marm-denominatr = wa_matmaster-umren.
APPEND it_marm.
it_marmx-alt_unit = wa_matmaster-meinh.
it_marmx-numerator = 'X'.
it_marmx-denominatr = 'X'.
APPEND it_marmx.
*****Alternate unit of measure 2
IF wa_matmaster-alt_un IS NOT INITIAL.
it_marm-alt_unit = wa_matmaster-alt_un. " alternate_unit 2
it_marm-numerator = wa_matmaster-denom. " denominator 2
it_marm-denominatr = wa_matmaster-numer. " numerator 2
APPEND it_marm.
it_marmx-alt_unit = wa_matmaster-alt_un.
it_marmx-numerator = 'X'.
it_marmx-denominatr = 'X'.
APPEND it_marmx.
ENDIF.
**** Material Long Text
it_mltx-text_name = wa_matmaster-matnr.
it_mltx-langu = 'EN'.
it_mltx-applobject = 'MATERIAL'.
it_mltx-text_id = 'BEST'.
it_mltx-text_line = wa_matmaster-tdline.
APPEND it_mltx.
CALL FUNCTION 'BAPI_MATERIAL_SAVEDATA'
EXPORTING
headdata = bapimathead
clientdata = bapi_mara
clientdatax = bapi_marax
plantdata = bapi_marc
plantdatax = bapi_marcx
storagelocationdata = bapi_mard
storagelocationdatax = bapi_mardx
valuationdata = bapi_mbew
valuationdatax = bapi_mbewx
IMPORTING
return = it_return
TABLES
materialdescription = it_materialdesc
unitsofmeasure = it_marm
unitsofmeasurex = it_marmx
materiallongtext = it_mltx.
IF it_return-type EQ 'S'.
CALL FUNCTION 'BAPI_TRANSACTION_COMMIT'.
ENDIF.
lv_sno = lv_sno + 1.
wmsstab-sno = lv_sno.
wmsstab-msgtyp = it_return-type.
wmsstab-plant = wa_matmaster-werks.
wmsstab-mstring = it_return-message.
APPEND wmsstab TO tmsstab.
CLEAR : wmsstab,
bapimathead,
bapi_mara,
bapi_marax,
bapi_marc,
bapi_marcx,
bapi_mard,
bapi_mardx,
bapi_mbew,
bapi_mbewx,
it_materialdesc,
it_marm,
it_marmx,
it_mltx,
wa_matmaster.
ENDLOOP.
PERFORM print_msg.
ELSE.
MESSAGE 'No data found' TYPE 'S' DISPLAY LIKE 'E'.
ENDIF.
12-08-2012 9:35 AM
12-08-2012 9:42 AM
Hi Maverick
As per your suggestion i have set the flag = 'X' in bapi_transaction commit
and facing the same error Field MATNR has been transferred inconsistently or is blank
IF it_return-type EQ 'S'.
CALL FUNCTION 'BAPI_TRANSACTION_COMMIT'
EXPORTING
WAIT = 'X'
* IMPORTING
* RETURN = .
.
12-08-2012 9:54 AM
this error is because your second record is getting processed before the first record is getting completely saved in DB...
try once COMMIT WORK AND WAIT or wait for 10 seconds type command... if this does not work i think you have to go for a ENQUEUE and dequeue....
you can also try - FM 'ENQUE_SLEEP' after bapi_transaction_commit
or before calling bapi_material_savedata write SET UPDATE TASK LOCAL.
Message was edited by: Maverick mvx
12-08-2012 10:11 AM
Hi Maverick
Thanks for ur reply.
As per your suggestion i have used COMMIT WORK AND WAIT & wait for 10 seconds command after the BAPI_TRANSACTION_COMMIT but there is no use
for ENQUEUE and dequeue is there any specific BAPI to lock the material number.
becuase when i am trying to upload for one material with 3 different plants it is uploaded successfully when i try to use different material number for the same plant then only i get the error.
12-08-2012 10:18 AM
you can try - FM 'ENQUE_SLEEP' after bapi_transaction_commit
or before calling bapi_material_savedata write SET UPDATE TASK LOCAL.
There is one more BAPI BAPI_MATERIAL_SAVEREPLICA , i dont remember exactly but i think it was used to do extend different materials....
for the BAPI you are using i think you can only use one material .... you can go through the documentation once... hope this helps..
12-08-2012 10:28 AM
Hi Maverick
Thanks for ur reply.
I used all the above suggested by you.
but still the problem exist.
12-08-2012 10:30 AM
i think with the bapi you are using you can not extend many different material to pne plant ... if you want to do that you need to pass material and plant one by one in loop...
try using BAPI_MATERIAL_SAVEREPLICA ...
12-10-2012 4:57 AM
Hi Vijayan,
else use this FM "CONVERSION_EXIT_ALPHA_INPUT"
Regard's
Smruti Ranjan
01-29-2013 10:04 AM
Please use BAPI_MATERIAL_SAVEREPICA.
this will save a lot of time also.
09-16-2014 2:01 PM
I am also facing the same the issue.(I am using BAPI_MATERIAL_SAVEDATA to update materiallongtext . Program is successfully updating materials for single record but for multiple records it is not updating)
plz let me know any solution.
09-16-2014 2:12 PM
Hi Prathyusha,
hope this may useful......
Keep the bapi in loop and make sure that, at the end of loop clear all the work areas and item tables.
Note: We have to make sure that the data convertions made before applying to BAPI with respect to fields.
Regards,
Vamshi
09-16-2014 3:25 PM
09-16-2014 3:33 PM
09-16-2014 4:49 PM
09-16-2014 3:55 PM
Field MATNR has been transferred inconsistently or is blank
And the material is created using external number range that is ill give the material number in the excel sheet.
Can you explain, AFAIK field MATERIAL of HEADDATA must always been filled (either with your external code or for internal number from the value returned by BAPI_MATERIAL_GETINTNUMBER)
Nevertheless, here RETURN is an internal table, so you cannot rely on a simple check on header line (?) but must execute a LOOP looking for message type 'A' or 'E'. ANd if you trigger a COMMIT when there are some errors, you can get this kind of message (SAP has already cleared some data...)
Also, did you check for OSS notes for your version/SP, there are some notes with text like "only first material gets created successfully and subsequent materials does not get created."
Also check length of your matnr vs length of subfield material, you could replace your statements with a single
CALL FUNCTION 'CONVERSION_EXIT_ALPHA_INPUT'
EXPORTING
input = wa_matmaster-matnr
IMPORTING
output = bapimathead-m
aterial.
to prevent errors generation.
Regards,
Raymond