i18n texts, doma, dtel

This commit is contained in:
sshlapak 2016-10-27 18:23:53 +03:00 committed by sbcgua
parent 48cfcbae94
commit 59655bd2b6
4 changed files with 319 additions and 12 deletions

View File

@ -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: <lang> LIKE LINE OF lt_i18n_langs,
<dd07v> LIKE LINE OF lt_dd07v,
<dd01_text> LIKE LINE OF lt_dd01_texts,
<dd07_text> 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 <lang>.
lv_index = sy-tabix.
CALL FUNCTION 'DDIF_DOMA_GET'
EXPORTING
name = lv_name
langu = <lang>
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 <dd01_text>.
MOVE-CORRESPONDING ls_dd01v TO <dd01_text>.
LOOP AT lt_dd07v ASSIGNING <dd07v>.
APPEND INITIAL LINE TO lt_dd07_texts ASSIGNING <dd07_text>.
MOVE-CORRESPONDING <dd07v> TO <dd07_text>.
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: <lang> LIKE LINE OF lt_i18n_langs,
<dd07v> LIKE LINE OF it_dd07v,
<dd01_text> LIKE LINE OF lt_dd01_texts,
<dd07_text> 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 <lang>.
" Skip languages that are not installed
CHECK lcl_objects=>is_language_installed( <lang> ) = abap_true.
" Domain description
ls_dd01v_tmp = is_dd01v.
READ TABLE lt_dd01_texts ASSIGNING <dd01_text> WITH KEY ddlanguage = <lang>.
IF sy-subrc > 0.
lcx_exception=>raise( |DD01_TEXTS cannot find lang { <lang> } in XML| ).
ENDIF.
MOVE-CORRESPONDING <dd01_text> TO ls_dd01v_tmp.
" Domain values
lt_dd07v_tmp = it_dd07v.
LOOP AT lt_dd07v_tmp ASSIGNING <dd07v>.
READ TABLE lt_dd07_texts ASSIGNING <dd07_text>
WITH KEY ddlanguage = <lang> valpos = <dd07v>-valpos.
CHECK sy-subrc = 0. " ! no translation -> master translation remain (maybe not OK)
MOVE-CORRESPONDING <dd07_text> TO <dd07v>.
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

View File

@ -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: <lang> LIKE LINE OF lt_i18n_langs,
<dd04_text> 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 <lang>.
lv_index = sy-tabix.
CALL FUNCTION 'DDIF_DTEL_GET'
EXPORTING
name = lv_name
langu = <lang>
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 <dd04_text>.
MOVE-CORRESPONDING ls_dd04v TO <dd04_text>.
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: <lang> LIKE LINE OF lt_i18n_langs,
<dd04_text> 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 <lang>.
" Skip languages that are not installed
CHECK lcl_objects=>is_language_installed( <lang> ) = abap_true.
" Data element description
ls_dd04v_tmp = is_dd04v.
READ TABLE lt_dd04_texts ASSIGNING <dd04_text> WITH KEY ddlanguage = <lang>.
IF sy-subrc > 0.
lcx_exception=>raise( |DD04_TEXTS cannot find lang { <lang> } in XML| ).
ENDIF.
MOVE-CORRESPONDING <dd04_text> 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

View File

@ -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.

View File

@ -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.