hi,
i am having material class with 40 characteristics ,i am trying to update only 2 characteristics values in that class, i was written the below code , it is updating the those 2 characteristics but it is removing remaining characteristics data in material class.
CODE:
&----
*& Report ZCHAR_MATERIAL_UPDATE
*&
&----
*&
*&
&----
REPORT ZCHAR_MATERIAL_UPDATE.
TABLES : mara.
DATA: t_key TYPE cuobn.
DATA: cl_sys(10) TYPE c.
DATA: wa_len TYPE i.
DATA: str(30) TYPE c.
DATA: wa_cawn LIKE cawn.
DATA: i_mara TYPE TABLE OF mara,
wa_mara LIKE mara.
DATA: t_class LIKE sclass OCCURS 0,
object LIKE ausp-objek,
object_data LIKE clobjdat OCCURS 0,
wa LIKE clobjdat.
DATA : BEGIN OF gs_chars,
classtype TYPE bapi1003_key-classtype,
classnum TYPE bapi1003_key-classnum,
atnam TYPE atwrt,
atwrt_from TYPE atwrt,
atwrt_to TYPE atwrt,
END OF gs_chars.
DATA : lt_chars LIKE STANDARD TABLE OF gs_chars WITH HEADER LINE.
DATA: ls_charactdetail TYPE bapicharactdetail.
DATA: l_objectkey LIKE bapi1003_key-object,
l_objecttable LIKE bapi1003_key-objecttable,
l_classnum LIKE bapi1003_key-classnum,
l_classtype LIKE bapi1003_key-classtype.
DATA: ls_allocvaluesnumnew TYPE bapi1003_alloc_values_num,
ls_allocvaluescharnew TYPE bapi1003_alloc_values_char,
ls_allocvaluescurrnew TYPE bapi1003_alloc_values_curr,
ls_return TYPE bapiret2.
DATA: lt_allocvaluesnumnew TYPE STANDARD TABLE OF bapi1003_alloc_values_num,
lt_allocvaluescharnew TYPE STANDARD TABLE OF bapi1003_alloc_values_char,
lt_allocvaluescurrnew TYPE STANDARD TABLE OF bapi1003_alloc_values_curr,
lt_return TYPE STANDARD TABLE OF bapiret2.
DATA: lt_alloclist TYPE STANDARD TABLE OF bapi1003_alloc_list,
ls_alloclist TYPE bapi1003_alloc_list.
DATA : l_cust_class TYPE klasse_d.
CONSTANTS : gc_cmclosereason TYPE atnam VALUE 'CLCM_CMCLSEREASONTXT',
gc_cmenddate TYPE atnam VALUE 'CLCM_CMENDDATE'.
SELECT * FROM mara INTO TABLE i_mara
WHERE MTART EQ 'ZDI0'.
LOOP AT i_mara INTO wa_mara.
object = wa_mara-matnr.
CALL FUNCTION 'CLAF_CLASSIFICATION_OF_OBJECTS'
EXPORTING
classtype = '001'
object = object
TABLES
t_class = t_class
t_objectdata = object_data
EXCEPTIONS
no_classification = 1
no_classtypes = 2
invalid_class_type = 3
OTHERS = 4.
IF sy-subrc <> 0.
CASE sy-subrc.
WHEN 1.
WRITE 'No Classification found'.
WHEN 2.
WRITE 'No Class type found'.
WHEN OTHERS.
WRITE 'Invalid class type'.
ENDCASE.
ENDIF.
READ TABLE object_data INTO wa WITH KEY atnam = 'CLCM_CMENDDATE'.
if sy-subrc EQ 0 .
if not wa-ausp1 is initial .
str = wa-ausp1.
if str ne '00.00.0000'.
wa_len = strlen( str ).
IF wa_len GE 8.
CALL FUNCTION 'CONVERT_DATE_TO_INTERNAL'
EXPORTING
DATE_EXTERNAL = wa-ausp1
ACCEPT_INITIAL_DATE =
IMPORTING
DATE_INTERNAL = wa-ausp1
EXCEPTIONS
DATE_EXTERNAL_IS_INVALID = 1
OTHERS = 2
.
IF SY-SUBRC <> 0.
MESSAGE ID SY-MSGID TYPE SY-MSGTY NUMBER SY-MSGNO
WITH SY-MSGV1 SY-MSGV2 SY-MSGV3 SY-MSGV4.
ENDIF.
if wa-ausp1 LT sy-datum .
CLEAR : lt_chars[].
REFRESH : lt_chars[].
PERFORM f_build_chars TABLES lt_chars.
SORT lt_chars.
l_objecttable = 'MARA'.
l_objectkey = object.
LOOP AT lt_chars.
AT NEW classnum.
CLEAR: lt_allocvaluesnumnew,
lt_allocvaluescharnew,
lt_allocvaluescurrnew,
lt_return.
REFRESH: lt_allocvaluesnumnew,
lt_allocvaluescharnew,
lt_allocvaluescurrnew,
lt_return.
l_classnum = lt_chars-classnum.
l_classtype = lt_chars-classtype.
ENDAT.
REFRESH lt_return.
CALL FUNCTION 'BAPI_CHARACT_GETDETAIL'
EXPORTING
charactname = lt_chars-atnam
KEYDATE = SY-DATUM
LANGUAGE =
IMPORTING
charactdetail = ls_charactdetail
TABLES
return = lt_return.
READ TABLE lt_return INTO ls_return WITH KEY type = 'E'.
IF sy-subrc = 0.
g_input_error = gc_yes.
MESSAGE i000(zclcm_sm) WITH lt_chars-atnam ls_return-message(60).
EXIT.
ENDIF.
if lt_chars-atnam eq 'CLCM_CMENDDATE'.
CALL FUNCTION 'CONVERT_DATE_TO_EXTERNAL'
EXPORTING
DATE_INTERNAL = SY-DATUM
IMPORTING
DATE_EXTERNAL = cl_sys
EXCEPTIONS
DATE_INTERNAL_IS_INVALID = 1
OTHERS = 2.
IF SY-SUBRC <> 0.
MESSAGE ID SY-MSGID TYPE SY-MSGTY NUMBER SY-MSGNO
WITH SY-MSGV1 SY-MSGV2 SY-MSGV3 SY-MSGV4.
ENDIF.
move cl_sys to lt_chars-atwrt_from.
ELSEIF lt_chars-atnam eq 'CLCM_CMCLSEREASONTXT'.
move 'Closed by System' to lt_chars-atwrt_from.
endif.
CASE ls_charactdetail-data_type.
WHEN 'CHAR'.
ls_allocvaluescharnew-charact = lt_chars-atnam.
ls_allocvaluescharnew-value_neutral = lt_chars-atwrt_from.
APPEND ls_allocvaluescharnew TO lt_allocvaluescharnew.
MODIFY TABLE lt_allocvaluescharnew FROM ls_allocvaluescharnew.
WHEN 'DATE'.
ls_allocvaluescharnew-charact = lt_chars-atnam.
ls_allocvaluescharnew-value_neutral = lt_chars-atwrt_from.
APPEND ls_allocvaluescharnew TO lt_allocvaluescharnew.
MODIFY TABLE lt_allocvaluescharnew FROM ls_allocvaluescharnew.
ENDCASE.
AT END OF classnum.
REFRESH lt_return.
CALL FUNCTION 'BAPI_OBJCL_CHANGE'
EXPORTING
objectkey = l_objectkey
objecttable = l_objecttable
classnum = l_classnum
classtype = l_classtype
NO_DEFAULT_VALUES = ' '
TABLES
allocvaluesnumnew = lt_allocvaluesnumnew
allocvaluescharnew = lt_allocvaluescharnew
allocvaluescurrnew = lt_allocvaluescurrnew
return = lt_return.
READ TABLE lt_return INTO ls_return WITH KEY type = 'E'.
IF sy-subrc = 0.
MESSAGE e002(zfiex) WITH ls_return-message(90).
ELSE.
CALL FUNCTION 'BAPI_TRANSACTION_COMMIT'
EXPORTING
wait = 'X'.
ENDIF.
ENDAT.
ENDLOOP.
ENDIF.
ENDIF.
endif.
ENDIF.
ENDIF.
ENDLOOP.
&----
*& Form F_BUILD_CHARS
&----
text
----
-->P_LT_CHARS text
----
FORM f_build_chars TABLES pt_chars STRUCTURE gs_chars.
DATA: l_count(2) TYPE n,
l_charname(30) TYPE c,
l_fieldname(30) TYPE c.
FIELD-SYMBOLS: <fs> TYPE ANY.
Macro Definition to Characteristics
DEFINE addchar.
clear pt_chars.
pt_chars-classtype = '001'.
pt_chars-classnum = &1.
pt_chars-atnam = &2.
pt_chars-atwrt_from = &3.
append pt_chars.
END-OF-DEFINITION.
DATA: BEGIN OF gs_custclass,
class TYPE klasse_d,
material TYPE matnr,
enddate LIKE sy-datum,
close_reason(30) TYPE c.
DATA: END OF gs_custclass.
DATA: gt_custclass LIKE STANDARD TABLE OF gs_custclass.
addchar 'CLCM-SMCUSTOMER1' gc_cmenddate gs_custclass-enddate.
addchar 'CLCM-SMCUSTOMER1' gc_cmclosereason gs_custclass-close_reason.
ENDFORM. " F_BUILD_CHARS