*&---------------------------------------------------------------------* *& Report ZGIB_DCV_CONVERT_MAKT *&---------------------------------------------------------------------* *& *&---------------------------------------------------------------------* REPORT zgib_dcv_convert_makt MESSAGE-ID /gib/dcv. TABLES: /gib/dcvt012. SELECT-OPTIONS: so_matnr FOR /gib/dcvt012-matnr. CLASS lcl_main DEFINITION. PUBLIC SECTION. CLASS-METHODS: run. ENDCLASS. CLASS lcl_maktx DEFINITION. PUBLIC SECTION. TYPES: BEGIN OF ts_key40, matnr TYPE matnr, spras TYPE spras, END OF ts_key40. TYPES: BEGIN OF ts_key18, matnr TYPE char18, spras TYPE spras, END OF ts_key18, tt_objtrn TYPE TABLE OF /gib/dcv_objtrn. METHODS: read_data, convert, constructor, get_msg RETURNING VALUE(er_msg) TYPE REF TO /gib/cl_dcv_error_msg, get_data EXPORTING et_objtrn TYPE tt_objtrn, get_convert_count RETURNING VALUE(ef_count) TYPE int4. CLASS-METHODS: is_matnr_lenght_40 RETURNING VALUE(ef_40) TYPE xfeld. PROTECTED SECTION. DATA: mt_objtrn TYPE tt_objtrn. PRIVATE SECTION. DATA: mt_t002 TYPE TABLE OF t002, mr_msg TYPE REF TO /gib/cl_dcv_error_msg, mf_convert_count TYPE int4, mf_commit_count TYPE int4. METHODS: convert_objtrn IMPORTING is_objtrn TYPE /gib/dcv_objtrn RAISING /gib/cx_dcv, check_spras IMPORTING if_spras TYPE spras RAISING /gib/cx_dcv. ENDCLASS. START-OF-SELECTION. lcl_main=>run( ). CLASS lcl_main IMPLEMENTATION. METHOD run. IF lcl_maktx=>is_matnr_lenght_40( ) = abap_true. DATA(lr_makt) = NEW lcl_maktx( ). lr_makt->read_data( ). lr_makt->convert( ). lr_makt->get_msg( )->show( ). ELSE. MESSAGE 'Konvertierung nur bei 40stelliger Materialnummmer notwendig' TYPE 'I'. RETURN. ENDIF. ENDMETHOD. ENDCLASS. CLASS lcl_maktx IMPLEMENTATION. METHOD is_matnr_lenght_40. DATA: lf_matnr TYPE matnr, lf_length TYPE i. DESCRIBE FIELD lf_matnr LENGTH lf_length IN CHARACTER MODE. IF lf_length = 40. ef_40 = abap_true. ELSE. ef_40 = abap_false. ENDIF. ENDMETHOD. METHOD constructor. mr_msg = NEW /gib/cl_dcv_error_msg( ). ENDMETHOD. METHOD get_msg. er_msg = mr_msg. ENDMETHOD. METHOD get_convert_count. ef_count = mf_convert_count. ENDMETHOD. METHOD get_data. et_objtrn = mt_objtrn. ENDMETHOD. METHOD read_data. SELECT * FROM /gib/dcv_objtrn INTO TABLE mt_objtrn WHERE tabname = 'MAKT'. ENDMETHOD. METHOD convert. DATA: ls_key18 TYPE ts_key18, ls_key40 TYPE ts_key40, lf_dummy TYPE c. LOOP AT mt_objtrn INTO DATA(ls_objtrn). ls_key40 = ls_objtrn-keyval. TRY. check_spras( ls_key40-spras ). CATCH /gib/cx_dcv. "obviously to be converted TRY. convert_objtrn( ls_objtrn ). CATCH /gib/cx_dcv INTO DATA(lr_error). mr_msg->set_by_exception( lr_error ). ENDTRY. ENDTRY. IF mf_commit_count > 1000. COMMIT WORK. CLEAR: mf_commit_count. ENDIF. ENDLOOP. COMMIT WORK. MESSAGE s162(/gib/dcv) WITH mf_convert_count INTO lf_dummy. mr_msg->sy_set( ). ENDMETHOD. METHOD check_spras. DATA: ls_t002 TYPE t002, lf_dummy TYPE c. IF if_spras IS INITIAL. MESSAGE e199 WITH 'Die Angabe der Sprache fehlt' INTO lf_dummy. mr_msg->sy_set( ). RAISE EXCEPTION TYPE /gib/cx_dcv. ENDIF. READ TABLE mt_t002 TRANSPORTING NO FIELDS WITH KEY spras = if_spras. IF sy-subrc <> 0. CLEAR: ls_t002. SELECT SINGLE spras FROM t002 INTO ls_t002-spras WHERE spras = if_spras. IF sy-subrc = 0. APPEND ls_t002 TO mt_t002. ELSE. MESSAGE e108 WITH 'Sprache' if_spras INTO lf_dummy. mr_msg->sy_set( ). RAISE EXCEPTION TYPE /gib/cx_dcv. ENDIF. ENDIF. ENDMETHOD. METHOD convert_objtrn. DATA: ls_key18 TYPE ts_key18, ls_key40 TYPE ts_key40, lf_dummy_spras TYPE c, lf_objnr TYPE /gib/dcv_objid, lf_dummy TYPE c. ls_key18 = is_objtrn-keyval. IF ls_key18-matnr NOT IN so_matnr. RETURN. ENDIF. MOVE-CORRESPONDING ls_key18 TO ls_key40. SELECT COUNT(*) FROM mara WHERE matnr = ls_key40-matnr. IF sy-subrc <> 0. "material not valid MESSAGE e108 WITH 'Material' ls_key40-matnr INTO lf_dummy. mr_msg->sy_set( ). RAISE EXCEPTION TYPE /gib/cx_dcv. ENDIF. check_spras( ls_key40-spras ). DATA(lf_keyval) = is_objtrn-keyval. lf_keyval = ls_key40. SELECT SINGLE objectid FROM /gib/dcv_objtrn INTO lf_objnr WHERE tabname = 'MAKT' AND keyval = lf_keyval. IF sy-subrc = 0. MESSAGE e108 WITH 'Objekt-ID zu Materialtext' lf_keyval INTO lf_dummy. mr_msg->sy_set( ). RAISE EXCEPTION TYPE /gib/cx_dcv. ENDIF. UPDATE /gib/dcv_objtrn SET keyval = lf_keyval WHERE objectid = is_objtrn-objectid. mf_convert_count = mf_convert_count + 1. mf_commit_count = mf_commit_count + 1. ENDMETHOD. ENDCLASS.