CLASS zcl_abapgit_object_tran DEFINITION PUBLIC INHERITING FROM zcl_abapgit_objects_super FINAL. PUBLIC SECTION. INTERFACES zif_abapgit_object. ALIASES mo_files FOR zif_abapgit_object~mo_files. PRIVATE SECTION. TYPES: tty_param_values TYPE STANDARD TABLE OF rsparam WITH NON-UNIQUE DEFAULT KEY. CONSTANTS: c_oo_program(9) VALUE '\PROGRAM=', c_oo_class(7) VALUE '\CLASS=', c_oo_method(8) VALUE '\METHOD=', c_oo_tcode TYPE tcode VALUE 'OS_APPLICATION', c_oo_frclass(30) VALUE 'CLASS', c_oo_frmethod(30) VALUE 'METHOD', c_oo_frupdtask(30) VALUE 'UPDATE_MODE', c_oo_synchron VALUE 'S', c_oo_asynchron VALUE 'U', c_true TYPE c VALUE 'X', c_false TYPE c VALUE space. METHODS: split_parameters CHANGING ct_rsparam TYPE s_param cs_rsstcd TYPE rsstcd cs_tstcp TYPE tstcp cs_tstc TYPE tstc, split_parameters_comp IMPORTING ig_type TYPE any ig_param TYPE any CHANGING cg_value TYPE any, serialize_texts IMPORTING io_xml TYPE REF TO zcl_abapgit_xml_output RAISING zcx_abapgit_exception, deserialize_texts IMPORTING io_xml TYPE REF TO zcl_abapgit_xml_input RAISING zcx_abapgit_exception, deserialize_oo_transaction IMPORTING iv_package TYPE devclass is_tstc TYPE tstc is_tstcc TYPE tstcc is_tstct TYPE tstct is_tstcp TYPE tstcp it_param_values TYPE zcl_abapgit_object_tran=>tty_param_values is_rsstcd TYPE rsstcd RAISING zcx_abapgit_exception. ENDCLASS. CLASS zcl_abapgit_object_tran IMPLEMENTATION. METHOD deserialize_oo_transaction. " You should remember that we don't use batch input just for fun, " but because FM RPY_TRANSACTION_INSERT doesn't support OO transactions. DATA: ls_bcdata TYPE bdcdata, lt_bcdata TYPE STANDARD TABLE OF bdcdata, lt_message TYPE STANDARD TABLE OF bdcmsgcoll. FIELD-SYMBOLS: TYPE bdcmsgcoll. ls_bcdata-program = 'SAPLSEUK'. ls_bcdata-dynpro = '0390'. ls_bcdata-dynbegin = 'X'. APPEND ls_bcdata TO lt_bcdata. CLEAR ls_bcdata. ls_bcdata-fnam = 'TSTC-TCODE'. ls_bcdata-fval = is_tstc-tcode. APPEND ls_bcdata TO lt_bcdata. IF zif_abapgit_object~exists( ) = abap_true. CLEAR ls_bcdata. ls_bcdata-fnam = 'BDC_OKCODE'. ls_bcdata-fval = '=CHNG'. APPEND ls_bcdata TO lt_bcdata. ELSE. CLEAR ls_bcdata. ls_bcdata-fnam = 'BDC_OKCODE'. ls_bcdata-fval = '=ADD'. APPEND ls_bcdata TO lt_bcdata. ENDIF. ls_bcdata-program = 'SAPLSEUK'. ls_bcdata-dynpro = '0300'. ls_bcdata-dynbegin = 'X'. APPEND ls_bcdata TO lt_bcdata. CLEAR ls_bcdata. ls_bcdata-fnam = 'TSTCT-TTEXT'. ls_bcdata-fval = is_tstct-ttext. APPEND ls_bcdata TO lt_bcdata. CLEAR ls_bcdata. ls_bcdata-fnam = 'RSSTCD-S_CLASS'. ls_bcdata-fval = 'X'. APPEND ls_bcdata TO lt_bcdata. CLEAR ls_bcdata. ls_bcdata-fnam = 'BDC_OKCODE'. ls_bcdata-fval = '=ENTR'. APPEND ls_bcdata TO lt_bcdata. ls_bcdata-program = 'SAPLSEUK'. ls_bcdata-dynpro = '0360'. ls_bcdata-dynbegin = 'X'. APPEND ls_bcdata TO lt_bcdata. CLEAR ls_bcdata. ls_bcdata-fnam = 'RSSTCD-S_TRFRAME'. ls_bcdata-fval = is_rsstcd-s_trframe. APPEND ls_bcdata TO lt_bcdata. CLEAR ls_bcdata. ls_bcdata-fnam = 'RSSTCD-S_UPDTASK'. ls_bcdata-fval = is_rsstcd-s_updtask. APPEND ls_bcdata TO lt_bcdata. CLEAR ls_bcdata. ls_bcdata-fnam = 'BDC_OKCODE'. ls_bcdata-fval = '=TR_FRAMEWORK'. APPEND ls_bcdata TO lt_bcdata. ls_bcdata-program = 'SAPLSEUK'. ls_bcdata-dynpro = '0360'. ls_bcdata-dynbegin = 'X'. APPEND ls_bcdata TO lt_bcdata. CLEAR ls_bcdata. ls_bcdata-fnam = 'RSSTCD-CLASSNAME'. ls_bcdata-fval = is_rsstcd-classname. APPEND ls_bcdata TO lt_bcdata. CLEAR ls_bcdata. ls_bcdata-fnam = 'RSSTCD-METHOD'. ls_bcdata-fval = is_rsstcd-method. APPEND ls_bcdata TO lt_bcdata. IF is_rsstcd-s_local IS NOT INITIAL. CLEAR ls_bcdata. ls_bcdata-fnam = 'RSSTCD-S_LOCAL'. ls_bcdata-fval = is_rsstcd-s_local. APPEND ls_bcdata TO lt_bcdata. ENDIF. IF is_rsstcd-s_updlok IS NOT INITIAL. CLEAR ls_bcdata. ls_bcdata-fnam = 'RSSTCD-S_UPDLOK'. ls_bcdata-fval = is_rsstcd-s_updlok. APPEND ls_bcdata TO lt_bcdata. ENDIF. CLEAR ls_bcdata. ls_bcdata-fnam = 'TSTC-PGMNA'. ls_bcdata-fval = is_tstc-pgmna. APPEND ls_bcdata TO lt_bcdata. IF is_tstcc-s_webgui = '2'. CLEAR ls_bcdata. ls_bcdata-fnam = 'G_IAC_EWT'. ls_bcdata-fval = abap_true. APPEND ls_bcdata TO lt_bcdata. CLEAR ls_bcdata. ls_bcdata-fnam = 'BDC_OKCODE'. ls_bcdata-fval = 'MAKE_PROFI '. APPEND ls_bcdata TO lt_bcdata. ls_bcdata-program = 'SAPLSEUK'. ls_bcdata-dynpro = '0360'. ls_bcdata-dynbegin = 'X'. APPEND ls_bcdata TO lt_bcdata. ELSEIF is_tstcc-s_webgui IS NOT INITIAL. CLEAR ls_bcdata. ls_bcdata-fnam = 'TSTCC-S_WEBGUI'. ls_bcdata-fval = is_tstcc-s_webgui. APPEND ls_bcdata TO lt_bcdata. ENDIF. IF is_tstcc-s_pervas IS NOT INITIAL. CLEAR ls_bcdata. ls_bcdata-fnam = 'TSTCC-S_PERVAS'. ls_bcdata-fval = is_tstcc-s_pervas. APPEND ls_bcdata TO lt_bcdata. ENDIF. IF is_tstcc-s_service IS NOT INITIAL. CLEAR ls_bcdata. ls_bcdata-fnam = 'TSTCC-S_SERVICE'. ls_bcdata-fval = is_tstcc-s_service. APPEND ls_bcdata TO lt_bcdata. ENDIF. IF is_tstcc-s_platin IS NOT INITIAL. CLEAR ls_bcdata. ls_bcdata-fnam = 'TSTCC-S_PLATIN'. ls_bcdata-fval = is_tstcc-s_platin. APPEND ls_bcdata TO lt_bcdata. ENDIF. IF is_tstcc-s_win32 IS NOT INITIAL. CLEAR ls_bcdata. ls_bcdata-fnam = 'TSTCC-S_WIN32'. ls_bcdata-fval = is_tstcc-s_win32. APPEND ls_bcdata TO lt_bcdata. ENDIF. CLEAR ls_bcdata. ls_bcdata-fnam = 'BDC_OKCODE'. ls_bcdata-fval = '=WB_SAVE'. APPEND ls_bcdata TO lt_bcdata. ls_bcdata-program = 'SAPLSTRD'. ls_bcdata-dynpro = '0100'. ls_bcdata-dynbegin = 'X'. APPEND ls_bcdata TO lt_bcdata. CLEAR ls_bcdata. ls_bcdata-fnam = 'KO007-L_DEVCLASS'. ls_bcdata-fval = iv_package. APPEND ls_bcdata TO lt_bcdata. CLEAR ls_bcdata. ls_bcdata-fnam = 'BDC_OKCODE'. ls_bcdata-fval = '=ADD'. APPEND ls_bcdata TO lt_bcdata. ls_bcdata-program = 'BDC_OKCODE'. ls_bcdata-dynpro = '0360'. ls_bcdata-dynbegin = 'X'. APPEND ls_bcdata TO lt_bcdata. CLEAR ls_bcdata. ls_bcdata-fnam = 'BDC_OKCODE'. ls_bcdata-fval = '=WB_BACK'. APPEND ls_bcdata TO lt_bcdata. ls_bcdata-program = 'BDC_OKCODE'. ls_bcdata-dynpro = '0360'. ls_bcdata-dynbegin = 'X'. APPEND ls_bcdata TO lt_bcdata. CLEAR ls_bcdata. ls_bcdata-fnam = 'BDC_OKCODE'. ls_bcdata-fval = '=WB_BACK'. APPEND ls_bcdata TO lt_bcdata. CALL FUNCTION 'ABAP4_CALL_TRANSACTION' EXPORTING tcode = 'SE93' mode_val = 'N' TABLES using_tab = lt_bcdata mess_tab = lt_message EXCEPTIONS OTHERS = 1. IF sy-subrc <> 0. zcx_abapgit_exception=>raise( |Error deserializing { ms_item-obj_type } { ms_item-obj_name }| ). ENDIF. LOOP AT lt_message ASSIGNING WHERE msgtyp CA 'EAX'. MESSAGE ID -msgid TYPE -msgtyp NUMBER -msgnr WITH -msgv1 -msgv2 -msgv3 -msgv4 INTO sy-msgli. zcx_abapgit_exception=>raise_t100( ). ENDLOOP. ENDMETHOD. METHOD deserialize_texts. DATA lt_tpool_i18n TYPE TABLE OF tstct. FIELD-SYMBOLS LIKE LINE OF lt_tpool_i18n. " Read XML-files data io_xml->read( EXPORTING iv_name = 'I18N_TPOOL' CHANGING cg_data = lt_tpool_i18n ). " Force t-code name (security reasons) LOOP AT lt_tpool_i18n ASSIGNING . -tcode = ms_item-obj_name. ENDLOOP. IF lines( lt_tpool_i18n ) > 0. MODIFY tstct FROM TABLE lt_tpool_i18n. IF sy-subrc <> 0. zcx_abapgit_exception=>raise( 'Update of t-code translations failed' ). ENDIF. ENDIF. ENDMETHOD. METHOD serialize_texts. DATA lt_tpool_i18n TYPE TABLE OF tstct. " Skip master language - it was already serialized " Don't serialize t-code itself SELECT sprsl ttext INTO CORRESPONDING FIELDS OF TABLE lt_tpool_i18n FROM tstct WHERE sprsl <> mv_language AND tcode = ms_item-obj_name. "#EC CI_GENBUFF IF lines( lt_tpool_i18n ) > 0. SORT lt_tpool_i18n BY sprsl ASCENDING. io_xml->add( iv_name = 'I18N_TPOOL' ig_data = lt_tpool_i18n ). ENDIF. ENDMETHOD. METHOD split_parameters. * see subroutine split_parameters in include LSEUKF01 DATA: lv_off TYPE i, lv_param_beg TYPE i, lv_length TYPE i, ls_param LIKE LINE OF ct_rsparam. FIELD-SYMBOLS TYPE any. CLEAR cs_rsstcd-s_vari. IF cs_tstcp-param(1) = '\'. " OO-Transaktion ohne FR split_parameters_comp( EXPORTING ig_type = c_oo_program ig_param = cs_tstcp-param CHANGING cg_value = cs_tstc-pgmna ). split_parameters_comp( EXPORTING ig_type = c_oo_class ig_param = cs_tstcp-param CHANGING cg_value = cs_rsstcd-classname ). split_parameters_comp( EXPORTING ig_type = c_oo_method ig_param = cs_tstcp-param CHANGING cg_value = cs_rsstcd-method ). IF NOT cs_tstc-pgmna IS INITIAL. cs_rsstcd-s_local = c_true. ENDIF. RETURN. ELSEIF cs_tstcp-param(1) = '@'. " Transaktionsvariante cs_rsstcd-s_vari = c_true. IF cs_tstcp-param(2) = '@@'. cs_rsstcd-s_ind_vari = c_true. lv_off = 2. ELSE. CLEAR cs_rsstcd-s_ind_vari. lv_off = 1. ENDIF. IF cs_tstcp-param CA ' '. ENDIF. sy-fdpos = sy-fdpos - lv_off. IF sy-fdpos > 0. cs_rsstcd-call_tcode = cs_tstcp-param+lv_off(sy-fdpos). sy-fdpos = sy-fdpos + 1 + lv_off. cs_rsstcd-variant = cs_tstcp-param+sy-fdpos. ENDIF. ELSEIF cs_tstcp-param(1) = '/'. cs_rsstcd-st_tcode = c_true. cs_rsstcd-st_prog = space. IF cs_tstcp-param+1(1) = '*'. cs_rsstcd-st_skip_1 = c_true. ELSE. CLEAR cs_rsstcd-st_skip_1. ENDIF. IF cs_tstcp-param CA ' '. ENDIF. lv_param_beg = sy-fdpos + 1. sy-fdpos = sy-fdpos - 2. IF sy-fdpos > 0. cs_rsstcd-call_tcode = cs_tstcp-param+2(sy-fdpos). ENDIF. SHIFT cs_tstcp-param BY lv_param_beg PLACES. ELSE. cs_rsstcd-st_tcode = space. cs_rsstcd-st_prog = c_true. ENDIF. DO 254 TIMES. IF cs_tstcp-param = space. EXIT. ENDIF. CLEAR ls_param. IF cs_tstcp-param CA '='. CHECK sy-fdpos <> 0. ASSIGN cs_tstcp-param(sy-fdpos) TO . ls_param-field = . IF ls_param-field(1) = space. SHIFT ls_param-field. ENDIF. sy-fdpos = sy-fdpos + 1. SHIFT cs_tstcp-param BY sy-fdpos PLACES. IF cs_tstcp-param CA ';'. IF sy-fdpos <> 0. ASSIGN cs_tstcp-param(sy-fdpos) TO . ls_param-value = . IF ls_param-value(1) = space. SHIFT ls_param-value. ENDIF. ENDIF. sy-fdpos = sy-fdpos + 1. SHIFT cs_tstcp-param BY sy-fdpos PLACES. APPEND ls_param TO ct_rsparam. ELSE. lv_length = strlen( cs_tstcp-param ). CHECK lv_length > 0. ASSIGN cs_tstcp-param(lv_length) TO . ls_param-value = . IF ls_param-value(1) = space. SHIFT ls_param-value. ENDIF. lv_length = lv_length + 1. SHIFT cs_tstcp-param BY lv_length PLACES. APPEND ls_param TO ct_rsparam. ENDIF. ENDIF. ENDDO. * oo-Transaktion mit Framework IF cs_rsstcd-call_tcode = c_oo_tcode. cs_rsstcd-s_trframe = c_true. LOOP AT ct_rsparam INTO ls_param. CASE ls_param-field. WHEN c_oo_frclass. cs_rsstcd-classname = ls_param-value. WHEN c_oo_frmethod. cs_rsstcd-method = ls_param-value. WHEN c_oo_frupdtask. IF ls_param-value = c_oo_synchron. cs_rsstcd-s_upddir = c_true. cs_rsstcd-s_updtask = c_false. cs_rsstcd-s_updlok = c_false. ELSEIF ls_param-value = c_oo_asynchron. cs_rsstcd-s_upddir = c_false. cs_rsstcd-s_updtask = c_true. cs_rsstcd-s_updlok = c_false. ELSE. cs_rsstcd-s_upddir = c_false. cs_rsstcd-s_updtask = c_false. cs_rsstcd-s_updlok = c_true. ENDIF. ENDCASE. ENDLOOP. ENDIF. ENDMETHOD. METHOD split_parameters_comp. DATA: lv_off TYPE i. IF ig_param CS ig_type. lv_off = sy-fdpos + strlen( ig_type ). cg_value = ig_param+lv_off. IF cg_value CA '\'. CLEAR cg_value+sy-fdpos. ENDIF. ENDIF. ENDMETHOD. METHOD zif_abapgit_object~changed_by. rv_user = c_user_unknown. " todo ENDMETHOD. METHOD zif_abapgit_object~compare_to_remote_version. CREATE OBJECT ro_comparison_result TYPE zcl_abapgit_comparison_null. ENDMETHOD. METHOD zif_abapgit_object~delete. DATA: lv_transaction TYPE tstc-tcode. lv_transaction = ms_item-obj_name. CALL FUNCTION 'RPY_TRANSACTION_DELETE' EXPORTING transaction = lv_transaction EXCEPTIONS not_excecuted = 1 object_not_found = 2 OTHERS = 3. IF sy-subrc <> 0. zcx_abapgit_exception=>raise( 'Error from RPY_TRANSACTION_DELETE' ). ENDIF. ENDMETHOD. METHOD zif_abapgit_object~deserialize. CONSTANTS: lc_hex_tra TYPE x VALUE '00', * c_hex_men TYPE x VALUE '01', lc_hex_par TYPE x VALUE '02', lc_hex_rep TYPE x VALUE '80', * c_hex_rpv TYPE x VALUE '10', lc_hex_obj TYPE x VALUE '08'. DATA: lv_dynpro TYPE d020s-dnum, ls_tstc TYPE tstc, lv_type TYPE rglif-docutype, ls_tstct TYPE tstct, ls_tstcc TYPE tstcc, ls_tstcp TYPE tstcp, lt_param_values TYPE tty_param_values, ls_rsstcd TYPE rsstcd. IF zif_abapgit_object~exists( ) = abap_true. zif_abapgit_object~delete( ). ENDIF. io_xml->read( EXPORTING iv_name = 'TSTC' CHANGING cg_data = ls_tstc ). io_xml->read( EXPORTING iv_name = 'TSTCC' CHANGING cg_data = ls_tstcc ). io_xml->read( EXPORTING iv_name = 'TSTCT' CHANGING cg_data = ls_tstct ). io_xml->read( EXPORTING iv_name = 'TSTCP' CHANGING cg_data = ls_tstcp ). lv_dynpro = ls_tstc-dypno. CASE ls_tstc-cinfo. WHEN lc_hex_tra. lv_type = ststc_c_type_dialog. WHEN lc_hex_rep. lv_type = ststc_c_type_report. WHEN lc_hex_par. lv_type = ststc_c_type_parameters. WHEN lc_hex_obj. lv_type = ststc_c_type_object. * todo, or ststc_c_type_variant? WHEN OTHERS. zcx_abapgit_exception=>raise( 'Transaction, unknown CINFO' ). ENDCASE. IF ls_tstcp IS NOT INITIAL. split_parameters( CHANGING ct_rsparam = lt_param_values cs_rsstcd = ls_rsstcd cs_tstcp = ls_tstcp cs_tstc = ls_tstc ). ENDIF. CASE lv_type. WHEN ststc_c_type_object. deserialize_oo_transaction( iv_package = iv_package is_tstc = ls_tstc is_tstcc = ls_tstcc is_tstct = ls_tstct is_tstcp = ls_tstcp it_param_values = lt_param_values is_rsstcd = ls_rsstcd ). WHEN OTHERS. CALL FUNCTION 'RPY_TRANSACTION_INSERT' EXPORTING transaction = ls_tstc-tcode program = ls_tstc-pgmna dynpro = lv_dynpro language = mv_language development_class = iv_package transaction_type = lv_type shorttext = ls_tstct-ttext called_transaction = ls_rsstcd-call_tcode called_transaction_skip = ls_rsstcd-st_skip_1 variant = ls_rsstcd-variant cl_independend = ls_rsstcd-s_ind_vari html_enabled = ls_tstcc-s_webgui java_enabled = ls_tstcc-s_platin wingui_enabled = ls_tstcc-s_win32 TABLES param_values = lt_param_values EXCEPTIONS cancelled = 1 already_exist = 2 permission_error = 3 name_not_allowed = 4 name_conflict = 5 illegal_type = 6 object_inconsistent = 7 db_access_error = 8 OTHERS = 9. IF sy-subrc <> 0. zcx_abapgit_exception=>raise( 'Error from RPY_TRANSACTION_INSERT' ). ENDIF. ENDCASE. " Texts deserializing (translations) deserialize_texts( io_xml ). ENDMETHOD. METHOD zif_abapgit_object~exists. DATA: lv_tcode TYPE tstc-tcode. SELECT SINGLE tcode FROM tstc INTO lv_tcode WHERE tcode = ms_item-obj_name. "#EC CI_GENBUFF rv_bool = boolc( sy-subrc = 0 ). ENDMETHOD. METHOD zif_abapgit_object~get_metadata. rs_metadata = get_metadata( ). ENDMETHOD. METHOD zif_abapgit_object~has_changed_since. rv_changed = abap_true. ENDMETHOD. METHOD zif_abapgit_object~is_locked. DATA: lv_object TYPE eqegraarg. lv_object = |TN{ ms_item-obj_name }|. OVERLAY lv_object WITH ' '. lv_object = lv_object && '*'. rv_is_locked = exists_a_lock_entry_for( iv_lock_object = 'EEUDB' iv_argument = lv_object ). ENDMETHOD. METHOD zif_abapgit_object~jump. DATA: lt_bdcdata TYPE TABLE OF bdcdata. FIELD-SYMBOLS: LIKE LINE OF lt_bdcdata. APPEND INITIAL LINE TO lt_bdcdata ASSIGNING . -program = 'SAPLSEUK'. -dynpro = '0390'. -dynbegin = abap_true. APPEND INITIAL LINE TO lt_bdcdata ASSIGNING . -fnam = 'BDC_OKCODE'. -fval = '=SHOW'. APPEND INITIAL LINE TO lt_bdcdata ASSIGNING . -fnam = 'TSTC-TCODE'. -fval = ms_item-obj_name. CALL FUNCTION 'ABAP4_CALL_TRANSACTION' STARTING NEW TASK 'GIT' EXPORTING tcode = 'SE93' mode_val = 'E' TABLES using_tab = lt_bdcdata EXCEPTIONS system_failure = 1 communication_failure = 2 resource_failure = 3 OTHERS = 4 ##fm_subrc_ok. "#EC CI_SUBRC ENDMETHOD. METHOD zif_abapgit_object~serialize. DATA: lv_transaction TYPE tstc-tcode, lt_tcodes TYPE TABLE OF tstc, ls_tcode LIKE LINE OF lt_tcodes, ls_tstct TYPE tstct, ls_tstcp TYPE tstcp, lt_gui_attr TYPE TABLE OF tstcc, ls_gui_attr LIKE LINE OF lt_gui_attr. lv_transaction = ms_item-obj_name. CALL FUNCTION 'RPY_TRANSACTION_READ' EXPORTING transaction = lv_transaction TABLES tcodes = lt_tcodes gui_attributes = lt_gui_attr EXCEPTIONS permission_error = 1 cancelled = 2 not_found = 3 object_not_found = 4 OTHERS = 5. IF sy-subrc = 4 OR sy-subrc = 3. RETURN. ELSEIF sy-subrc <> 0. zcx_abapgit_exception=>raise( 'Error from RPY_TRANSACTION_READ' ). ENDIF. SELECT SINGLE * FROM tstct INTO ls_tstct WHERE sprsl = mv_language AND tcode = lv_transaction. "#EC CI_SUBRC "#EC CI_GENBUFF SELECT SINGLE * FROM tstcp INTO ls_tstcp WHERE tcode = lv_transaction. "#EC CI_SUBRC "#EC CI_GENBUFF READ TABLE lt_tcodes INDEX 1 INTO ls_tcode. ASSERT sy-subrc = 0. READ TABLE lt_gui_attr INDEX 1 INTO ls_gui_attr. ASSERT sy-subrc = 0. io_xml->add( iv_name = 'TSTC' ig_data = ls_tcode ). io_xml->add( iv_name = 'TSTCC' ig_data = ls_gui_attr ). io_xml->add( iv_name = 'TSTCT' ig_data = ls_tstct ). IF ls_tstcp IS NOT INITIAL. io_xml->add( iv_name = 'TSTCP' ig_data = ls_tstcp ). ENDIF. " Texts serializing (translations) serialize_texts( io_xml ). ENDMETHOD. ENDCLASS.