04-05-2013 11:29 PM
Hello all,
I need a way to take a value in the material's classification and push it to a value in the material master. This should be called for create and updates. I first implemented BADI_MATERIAL_CHECK method CHECK_DATA. That works correctly for everything on the GUI from MM01, to MM02 to mass maintenance. This works because I look in the stack and get the classification data from (SAPLCLFM)ALLAUSP[] and then push it to the CMARA parameter in the BADI. The problem is that when you call the BAPI_MATERIAL_SAVEDATA from outside of SAP via and RFC the values that are in
(SAPLCLFM)ALLAUSP[] aren't there.
So any ideas? I looked at CACL_VALUE_CHANGE and the MODIFY_INPUT method but I can change only the classification data there.
If anyone has any suggestions along these lines it would be most helpful.
Thanks.
04-05-2013 11:42 PM
Why don't you read the classifications for the material before calling BAPI_MATERIAL_SAVEDATA? Maybe I'm not understanding your requirement.
04-06-2013 3:48 AM
Hi Samuli,
That would work, but if this is a new material there would be no classification, and if they had changed the classification you would need the changes that are yet to be written to the DB. Sorry I didn't explain that better on the original post.
04-06-2013 8:40 AM
In that case you will have to create the material first and then the classifications. Once you have created the classifications, you can read them and update the material. Use BAPI_OBJCL* (and optionally BAPI_CLAS*) to work with classifications.
04-06-2013 3:49 AM
Hi Ronnie
i got a program that saves the classification data, maybe there is a function alike to reade these data.
*&---------------------------------------------------------------------*
*& Form FILL_CLASSIFICATION
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
* --> p1 text
* <-- p2 text
*----------------------------------------------------------------------*
FORM fill_classification .
*View Head Data
*View Data In Previous Views
*View Single Data
DATA: ls_objectkeynew TYPE bapi1003_key-object,
ls_objecttablenew TYPE bapi1003_key-objecttable,
ls_classnumnew TYPE bapi1003_key-classnum,
ls_classtypenew TYPE bapi1003_key-classtype,
ls_status TYPE bapi1003_key-status,
ls_standardclass TYPE bapi1003_key-stdclass,
ls_changenumber TYPE bapi1003_key-changenumber,
ls_keydate TYPE bapi1003_key-keydate,
ls_no_default_values TYPE bapi1003_key-flag,
ls_classif_status TYPE bapi1003_key-status,
lt_allocvaluesnum TYPE TABLE OF bapi1003_alloc_values_num,
lt_allocvalueschar TYPE TABLE OF bapi1003_alloc_values_char,
lt_allocvaluescurr TYPE TABLE OF bapi1003_alloc_values_curr,
lt_return TYPE TABLE OF bapiret2,
ls_allocvaluesnum TYPE bapi1003_alloc_values_num,
ls_allocvalueschar TYPE bapi1003_alloc_values_char,
ls_allocvaluescurr TYPE bapi1003_alloc_values_curr,
ls_return TYPE bapiret2.
DATA: lt_klart TYPE TABLE OF klah-klart,
ls_klart TYPE klah-klart,
lt_class TYPE TABLE OF klah-class,
ls_class TYPE klah-class,
lt_atnam TYPE TABLE OF cabn-atnam,
ls_atnam TYPE cabn-atnam,
lt_atwrt TYPE TABLE OF cawn-atwrt,
ls_atwrt TYPE cawn-atwrt,
lt_cabnt TYPE TABLE OF cabnt,
ls_cabnt TYPE cabnt,
lt_cawnt TYPE TABLE OF cawnt,
ls_cawnt TYPE cawnt,
lv_atinn TYPE c LENGTH 30,
lv_zaehl TYPE kssk-zaehl.
*Get All Class Types In Worksheet
FIND '/' IN gs_tbx-klart.
IF sy-subrc = 0.
SPLIT gs_tbx-klart
AT '/'
INTO TABLE lt_klart.
ELSE.
ls_klart = gs_tbx-klart.
APPEND ls_klart TO lt_klart.
ENDIF.
*Get All Class Names In Worksheet
FIND '/' IN gs_tbx-class.
IF sy-subrc = 0.
SPLIT gs_tbx-class
AT '/'
INTO TABLE lt_class.
ELSE.
ls_class = gs_tbx-class.
APPEND ls_class TO lt_class.
ENDIF.
*Get All Caracterist Names In Worksheet
FIND '/' IN gs_tbx-atnam.
IF sy-subrc = 0.
SPLIT gs_tbx-atnam
AT '/'
INTO TABLE lt_atnam.
ELSE.
ls_atnam = gs_tbx-atnam.
APPEND ls_atnam TO lt_atnam.
ENDIF.
*Get All Caracterist Values In Worksheet
FIND '/' IN gs_tbx-atwrt.
IF sy-subrc = 0.
SPLIT gs_tbx-atwrt
AT '/'
INTO TABLE lt_atwrt.
ELSE.
ls_atwrt = gs_tbx-atwrt.
APPEND ls_atwrt TO lt_atwrt.
ENDIF.
LOOP AT lt_klart INTO ls_klart.
CLEAR: ls_objectkeynew,
ls_objecttablenew,
ls_classnumnew,
ls_classtypenew,
ls_status,
ls_standardclass,
ls_changenumber,
ls_keydate,
ls_no_default_values,
ls_classif_status,
lt_allocvaluesnum,
lt_allocvalueschar,
lt_allocvaluescurr,
lt_return,
ls_allocvaluesnum,
ls_allocvalueschar,
ls_allocvaluescurr,
ls_return,
ls_class,
ls_atnam,
ls_atwrt,
lv_zaehl.
READ TABLE lt_class INTO ls_class INDEX sy-tabix.
READ TABLE lt_atnam INTO ls_atnam INDEX sy-tabix.
READ TABLE lt_atwrt INTO ls_atwrt INDEX sy-tabix.
lv_zaehl = lv_zaehl + 1.
ls_objectkeynew = gs_headdata-material.
ls_objecttablenew = 'MARA'.
ls_classnumnew = ls_class.
ls_classtypenew = ls_klart.
ls_status = gs_tbx-statu.
ls_standardclass = gs_tbx-stdcl.
ls_no_default_values = 'X'.
ls_allocvaluesnum-charact = ls_atnam.
ls_allocvaluesnum-instance = lv_zaehl.
APPEND ls_allocvaluesnum TO lt_allocvaluesnum.
ls_allocvalueschar-charact = ls_atnam.
ls_allocvalueschar-value_char = ls_atwrt.
ls_allocvalueschar-instance = lv_zaehl.
APPEND ls_allocvalueschar TO lt_allocvalueschar.
CALL FUNCTION 'BAPI_OBJCL_CREATE'
EXPORTING
objectkeynew = ls_objectkeynew
objecttablenew = ls_objecttablenew
classnumnew = ls_classnumnew
classtypenew = ls_classtypenew
status = '1'
* STANDARDCLASS =
* CHANGENUMBER =
* KEYDATE = SY-DATUM
no_default_values = ls_no_default_values
IMPORTING
classif_status = ls_classif_status
TABLES
allocvaluesnum = lt_allocvaluesnum
allocvalueschar = lt_allocvalueschar
allocvaluescurr = lt_allocvaluescurr
return = lt_return.
CALL FUNCTION 'BAPI_TRANSACTION_COMMIT'
EXPORTING
wait = 'X'.
IF ls_classif_status <> '1'.
gs_classif_status = ls_classif_status.
ENDIF.
APPEND LINES OF lt_return TO gt_classreturn.
ENDLOOP.
ENDFORM. " FILL_CLASSIFICATION
04-08-2013 5:38 AM
Hi Ronnie,
Suppose you have below case...
Case 1: Material Master Data Create with Classification View .
BAPI_MATERIAL_SAVEDATA ( Create Material using this BAPI )
BAPI_OBJCL_CREATE ( Pass Material Number with classification view data's)
BAPI_TRANSACTION_COMMIT
Case 2: Material Master Data Change with Classification View .
BAPI_MATERIAL_SAVEDATA ( Change the Material Master Record using this BAPI )
BAPI_OBJCL_GETDETAIL (Collect Existing Class and Characteristics value)
BAPI_OBJCL_CHANGE (then pass new value all existing and new Characteristics)
BAPI_TRANSACTION_COMMIT
Case 3: Only Classification View data change .
BAPI_OBJCL_GETDETAIL (Collect Existing Class and Characteristics value)
BAPI_OBJCL_CHANGE (then pass new values all existing and new Characteristics)
BAPI_TRANSACTION_COMMIT
Note : Use above BAPI's Sequence as per your requirement .
if you doesn't use "BAPI_OBJCL_GETDETAIL" in your change scenario then your new value is updated successfully using "BAPI_OBJCL_CHANGE" bapi but existing characteristics value becomes empty, so use "BAPI_OBJCL_GETDETAIL" bapi mandatory for collecting existing value if you go for change scenario .
Regard's
Smruti