diff --git a/src/zabapgit_object_doma.prog.abap b/src/zabapgit_object_doma.prog.abap index 747d1beeb..3c62057a1 100644 --- a/src/zabapgit_object_doma.prog.abap +++ b/src/zabapgit_object_doma.prog.abap @@ -13,6 +13,34 @@ CLASS lcl_object_doma DEFINITION INHERITING FROM lcl_objects_super FINAL. INTERFACES lif_object. ALIASES mo_files FOR lif_object~mo_files. + PRIVATE SECTION. + + TYPES: BEGIN OF ty_dd01_texts, + ddlanguage TYPE dd01v-ddlanguage, + ddtext TYPE dd01v-ddtext, + END OF ty_dd01_texts, + BEGIN OF ty_dd07_texts, + valpos TYPE dd07v-valpos, + ddlanguage TYPE dd07v-ddlanguage, + domvalue_l TYPE dd07v-domvalue_l, + domvalue_h TYPE dd07v-domvalue_h, + ddtext TYPE dd07v-ddtext, + domval_ld TYPE dd07v-domval_ld, + domval_hd TYPE dd07v-domval_hd, + END OF ty_dd07_texts, + tt_dd01_texts TYPE STANDARD TABLE OF ty_dd01_texts, + tt_dd07_texts TYPE STANDARD TABLE OF ty_dd07_texts. + + METHODS: + serialize_texts + IMPORTING io_xml TYPE REF TO lcl_xml_output + RAISING lcx_exception, + deserialize_texts + IMPORTING io_xml TYPE REF TO lcl_xml_input + is_dd01v TYPE dd01v + it_dd07v TYPE dd07v_tab + RAISING lcx_exception. + ENDCLASS. "lcl_object_doma DEFINITION *----------------------------------------------------------------------* @@ -118,12 +146,9 @@ CLASS lcl_object_doma IMPLEMENTATION. EXCEPTIONS illegal_input = 1 OTHERS = 2. - IF sy-subrc <> 0. + IF sy-subrc <> 0 OR ls_dd01v IS INITIAL. lcx_exception=>raise( 'error from DDIF_DOMA_GET' ). ENDIF. - IF ls_dd01v IS INITIAL. - RETURN. " does not exist - ENDIF. CLEAR: ls_dd01v-as4user, ls_dd01v-as4date, @@ -134,6 +159,8 @@ CLASS lcl_object_doma IMPLEMENTATION. io_xml->add( iv_name = 'DD07V_TAB' ig_data = lt_dd07v ). + serialize_texts( io_xml ). + ENDMETHOD. "serialize METHOD lif_object~deserialize. @@ -144,8 +171,8 @@ CLASS lcl_object_doma IMPLEMENTATION. * fm TR_TADIR_INTERFACE * fm RS_CORR_INSERT ? - DATA: ls_dd01v TYPE dd01v, - lv_name TYPE ddobjname, + DATA: lv_name TYPE ddobjname, + ls_dd01v TYPE dd01v, lt_dd07v TYPE TABLE OF dd07v. @@ -175,8 +202,147 @@ CLASS lcl_object_doma IMPLEMENTATION. lcx_exception=>raise( 'error from DDIF_DOMA_PUT' ). ENDIF. + deserialize_texts( io_xml = io_xml + is_dd01v = ls_dd01v + it_dd07v = lt_dd07v ). + lcl_objects_activation=>add_item( ms_item ). ENDMETHOD. "deserialize + METHOD serialize_texts. + + DATA: lv_name TYPE ddobjname, + lv_index TYPE i, + ls_dd01v TYPE dd01v, + lt_dd07v TYPE TABLE OF dd07v, + lt_i18n_langs TYPE TABLE OF langu, + lt_dd01_texts TYPE tt_dd01_texts, + lt_dd07_texts TYPE tt_dd07_texts. + + FIELD-SYMBOLS: LIKE LINE OF lt_i18n_langs, + LIKE LINE OF lt_dd07v, + LIKE LINE OF lt_dd01_texts, + LIKE LINE OF lt_dd07_texts. + + lv_name = ms_item-obj_name. + + " Collect additional languages + SELECT DISTINCT ddlanguage as langu INTO TABLE lt_i18n_langs + FROM dd01v + WHERE domname = lv_name + AND ddlanguage <> mv_language. " Skip master lang - it was serialized already + + LOOP AT lt_i18n_langs ASSIGNING . + lv_index = sy-tabix. + + CALL FUNCTION 'DDIF_DOMA_GET' + EXPORTING + name = lv_name + langu = + IMPORTING + dd01v_wa = ls_dd01v + TABLES + dd07v_tab = lt_dd07v + EXCEPTIONS + illegal_input = 1 + OTHERS = 2. + IF sy-subrc <> 0 OR ls_dd01v-ddlanguage IS INITIAL. + DELETE lt_i18n_langs INDEX lv_index. " Don't save this lang + CONTINUE. + ENDIF. + + APPEND INITIAL LINE TO lt_dd01_texts ASSIGNING . + MOVE-CORRESPONDING ls_dd01v TO . + + LOOP AT lt_dd07v ASSIGNING . + APPEND INITIAL LINE TO lt_dd07_texts ASSIGNING . + MOVE-CORRESPONDING TO . + ENDLOOP. + + ENDLOOP. + + IF lines( lt_i18n_langs ) > 1. + io_xml->add( iv_name = 'I18N_LANGS' + ig_data = lt_i18n_langs ). + + io_xml->add( iv_name = 'DD01_TEXTS' + ig_data = lt_dd01_texts ). + + io_xml->add( iv_name = 'DD07_TEXTS' + ig_data = lt_dd07_texts ). + ENDIF. + + ENDMETHOD. "serialize_texts + + METHOD deserialize_texts. + + DATA: lv_name TYPE ddobjname, + ls_dd01v_tmp TYPE dd01v, + lt_dd07v_tmp TYPE TABLE OF dd07v, + lt_i18n_langs TYPE TABLE OF langu, + lt_dd01_texts TYPE tt_dd01_texts, + lt_dd07_texts TYPE tt_dd07_texts. + + FIELD-SYMBOLS: LIKE LINE OF lt_i18n_langs, + LIKE LINE OF it_dd07v, + LIKE LINE OF lt_dd01_texts, + LIKE LINE OF lt_dd07_texts. + + lv_name = ms_item-obj_name. + + io_xml->read( EXPORTING iv_name = 'I18N_LANGS' + CHANGING cg_data = lt_i18n_langs ). + + io_xml->read( EXPORTING iv_name = 'DD01_TEXTS' + CHANGING cg_data = lt_dd01_texts ). + + io_xml->read( EXPORTING iv_name = 'DD07_TEXTS' + CHANGING cg_data = lt_dd07_texts ). + + SORT: lt_i18n_langs, lt_dd07_texts BY ddlanguage. " Optimization + + LOOP AT lt_i18n_langs ASSIGNING . + + " Skip languages that are not installed + CHECK lcl_objects=>is_language_installed( ) = abap_true. + + " Domain description + ls_dd01v_tmp = is_dd01v. + READ TABLE lt_dd01_texts ASSIGNING WITH KEY ddlanguage = . + IF sy-subrc > 0. + lcx_exception=>raise( |DD01_TEXTS cannot find lang { } in XML| ). + ENDIF. + MOVE-CORRESPONDING TO ls_dd01v_tmp. + + " Domain values + lt_dd07v_tmp = it_dd07v. + LOOP AT lt_dd07v_tmp ASSIGNING . + READ TABLE lt_dd07_texts ASSIGNING + WITH KEY ddlanguage = valpos = -valpos. + CHECK sy-subrc = 0. " ! no translation -> master translation remain (maybe not OK) + MOVE-CORRESPONDING TO . + DELETE lt_dd07_texts INDEX sy-tabix. " Optimization + ENDLOOP. + + CALL FUNCTION 'DDIF_DOMA_PUT' + EXPORTING + name = lv_name + dd01v_wa = ls_dd01v_tmp + TABLES + dd07v_tab = lt_dd07v_tmp + EXCEPTIONS + doma_not_found = 1 + name_inconsistent = 2 + doma_inconsistent = 3 + put_failure = 4 + put_refused = 5 + OTHERS = 6. + IF sy-subrc <> 0. + lcx_exception=>raise( 'error from DDIF_DOMA_PUT @TEXTS' ). + ENDIF. + ENDLOOP. + + ENDMETHOD. "deserialize_texts + ENDCLASS. "lcl_object_doma IMPLEMENTATION \ No newline at end of file diff --git a/src/zabapgit_object_dtel.prog.abap b/src/zabapgit_object_dtel.prog.abap index 37bd08de5..7fe5e3baf 100644 --- a/src/zabapgit_object_dtel.prog.abap +++ b/src/zabapgit_object_dtel.prog.abap @@ -13,6 +13,27 @@ CLASS lcl_object_dtel DEFINITION INHERITING FROM lcl_objects_super FINAL. INTERFACES lif_object. ALIASES mo_files FOR lif_object~mo_files. + PRIVATE SECTION. + + TYPES: BEGIN OF ty_dd04_texts, + ddlanguage TYPE dd04t-ddlanguage, + ddtext TYPE dd04t-ddtext, + reptext TYPE dd04t-reptext, + scrtext_s TYPE dd04t-scrtext_s, + scrtext_m TYPE dd04t-scrtext_m, + scrtext_l TYPE dd04t-scrtext_l, + END OF ty_dd04_texts, + tt_dd04_texts TYPE STANDARD TABLE OF ty_dd04_texts. + + METHODS: + serialize_texts + IMPORTING io_xml TYPE REF TO lcl_xml_output + RAISING lcx_exception, + deserialize_texts + IMPORTING io_xml TYPE REF TO lcl_xml_input + is_dd04v TYPE dd04v + RAISING lcx_exception. + ENDCLASS. "lcl_object_dtel DEFINITION *----------------------------------------------------------------------* @@ -78,9 +99,9 @@ CLASS lcl_object_dtel IMPLEMENTATION. DATA: lv_objname TYPE rsedd0-ddobjname. - lv_objname = ms_item-obj_name. + CALL FUNCTION 'RS_DD_DELETE_OBJ' EXPORTING no_ask = abap_true @@ -103,9 +124,9 @@ CLASS lcl_object_dtel IMPLEMENTATION. ls_dd04v TYPE dd04v, ls_tpara TYPE tpara. - lv_name = ms_item-obj_name. + CALL FUNCTION 'DDIF_DTEL_GET' EXPORTING name = lv_name @@ -116,12 +137,9 @@ CLASS lcl_object_dtel IMPLEMENTATION. EXCEPTIONS illegal_input = 1 OTHERS = 2. - IF sy-subrc <> 0. + IF sy-subrc <> 0 or ls_dd04v IS INITIAL. lcx_exception=>raise( 'Error from DDIF_DTEL_GET' ). ENDIF. - IF ls_dd04v IS INITIAL. - RETURN. " does not exist - ENDIF. CLEAR: ls_dd04v-as4user, ls_dd04v-as4date, @@ -144,6 +162,8 @@ CLASS lcl_object_dtel IMPLEMENTATION. io_xml->add( iv_name = 'TPARA' ig_data = ls_tpara ). + serialize_texts( io_xml ). + ENDMETHOD. "serialize METHOD lif_object~deserialize. @@ -177,8 +197,110 @@ CLASS lcl_object_dtel IMPLEMENTATION. lcx_exception=>raise( 'error from DDIF_DTEL_PUT' ). ENDIF. + deserialize_texts( io_xml = io_xml + is_dd04v = ls_dd04v ). + lcl_objects_activation=>add_item( ms_item ). ENDMETHOD. "deserialize + METHOD serialize_texts. + + DATA: lv_name TYPE ddobjname, + lv_index TYPE i, + ls_dd04v TYPE dd04v, + ls_tpara TYPE tpara, + lt_dd04_texts TYPE tt_dd04_texts, + lt_i18n_langs TYPE TABLE OF langu. + FIELD-SYMBOLS: LIKE LINE OF lt_i18n_langs, + TYPE ty_dd04_texts. + + lv_name = ms_item-obj_name. + + " Collect additional languages + SELECT DISTINCT ddlanguage as langu INTO TABLE lt_i18n_langs + FROM dd04v + WHERE rollname = lv_name + AND ddlanguage <> mv_language. " Skip master lang - it was serialized already + + LOOP AT lt_i18n_langs ASSIGNING . + lv_index = sy-tabix. + CALL FUNCTION 'DDIF_DTEL_GET' + EXPORTING + name = lv_name + langu = + IMPORTING + dd04v_wa = ls_dd04v + tpara_wa = ls_tpara + EXCEPTIONS + illegal_input = 1 + OTHERS = 2. + IF sy-subrc <> 0 OR ls_dd04v-ddlanguage IS INITIAL. + DELETE lt_i18n_langs INDEX lv_index. " Don't save this lang + CONTINUE. + ENDIF. + + APPEND INITIAL LINE TO lt_dd04_texts ASSIGNING . + MOVE-CORRESPONDING ls_dd04v TO . + + ENDLOOP. + + IF lines( lt_i18n_langs ) > 0. + io_xml->add( iv_name = 'I18N_LANGS' + ig_data = lt_i18n_langs ). + + io_xml->add( iv_name = 'DD04_TEXTS' + ig_data = lt_dd04_texts ). + ENDIF. + + ENDMETHOD. + + METHOD deserialize_texts. + + DATA: lv_name TYPE ddobjname, + ls_dd04v_tmp TYPE dd04v, + lt_i18n_langs TYPE TABLE OF langu, + lt_dd04_texts TYPE tt_dd04_texts. + FIELD-SYMBOLS: LIKE LINE OF lt_i18n_langs, + TYPE ty_dd04_texts. + + lv_name = ms_item-obj_name. + + io_xml->read( EXPORTING iv_name = 'I18N_LANGS' + CHANGING cg_data = lt_i18n_langs ). + + io_xml->read( EXPORTING iv_name = 'DD04_TEXTS' + CHANGING cg_data = lt_dd04_texts ). + + SORT: lt_i18n_langs, lt_dd04_texts BY ddlanguage. " Optimization + LOOP AT lt_i18n_langs ASSIGNING . + + " Skip languages that are not installed + CHECK lcl_objects=>is_language_installed( ) = abap_true. + + " Data element description + ls_dd04v_tmp = is_dd04v. + READ TABLE lt_dd04_texts ASSIGNING WITH KEY ddlanguage = . + IF sy-subrc > 0. + lcx_exception=>raise( |DD04_TEXTS cannot find lang { } in XML| ). + ENDIF. + MOVE-CORRESPONDING TO ls_dd04v_tmp. + CALL FUNCTION 'DDIF_DTEL_PUT' + EXPORTING + name = lv_name + dd04v_wa = ls_dd04v_tmp + EXCEPTIONS + dtel_not_found = 1 + name_inconsistent = 2 + dtel_inconsistent = 3 + put_failure = 4 + put_refused = 5 + OTHERS = 6. + IF sy-subrc <> 0. + lcx_exception=>raise( 'error from DDIF_DTEL_PUT @TEXTS' ). + ENDIF. + ENDLOOP. + + ENDMETHOD. + ENDCLASS. "lcl_object_dtel IMPLEMENTATION \ No newline at end of file diff --git a/src/zabapgit_objects.prog.abap b/src/zabapgit_objects.prog.abap index a3e110ea4..2d6b72a3b 100644 --- a/src/zabapgit_objects.prog.abap +++ b/src/zabapgit_objects.prog.abap @@ -1517,7 +1517,14 @@ CLASS lcl_objects DEFINITION FINAL. CLASS-METHODS supported_list RETURNING VALUE(rt_types) TYPE ty_types_tt. + CLASS-METHODS is_language_installed + IMPORTING iv_language TYPE langu + RETURNING VALUE(rv_yes) TYPE abap_bool. + PRIVATE SECTION. + + CLASS-DATA: mv_langs_installed type scplangs. + CLASS-METHODS check_duplicates IMPORTING it_files TYPE ty_files_tt RAISING lcx_exception. diff --git a/src/zabapgit_objects_impl.prog.abap b/src/zabapgit_objects_impl.prog.abap index 4cb47a21f..6a8b24a0c 100644 --- a/src/zabapgit_objects_impl.prog.abap +++ b/src/zabapgit_objects_impl.prog.abap @@ -221,6 +221,18 @@ CLASS lcl_objects IMPLEMENTATION. ENDMETHOD. "supported_list + METHOD is_language_installed. + + IF mv_langs_installed IS INITIAL. + CALL FUNCTION 'RSAQ_READ_INSTALLED_LANGUAGES' + IMPORTING + inst_languages = mv_langs_installed. + ENDIF. + + rv_yes = boolc( mv_langs_installed CA iv_language ). + + ENDMETHOD. "is_language_installed + METHOD exists. DATA: li_obj TYPE REF TO lif_object.