CLASS z2ui5_lcl_utility DEFINITION INHERITING FROM cx_no_check. PUBLIC SECTION. TYPES: BEGIN OF ty_attri, name TYPE string, type_kind TYPE string, type TYPE string, bind_type TYPE string, data_stringify TYPE string, gen_type_kind TYPE string, gen_type TYPE string, gen_kind TYPE string, END OF ty_attri. TYPES ty_T_attri TYPE STANDARD TABLE OF ty_attri WITH EMPTY KEY. DATA: BEGIN OF ms_error, x_root TYPE REF TO cx_root, uuid TYPE string, s_msg TYPE LINE OF bapirettab, END OF ms_error. METHODS constructor IMPORTING val TYPE any OPTIONAL previous TYPE REF TO cx_root OPTIONAL PREFERRED PARAMETER val. METHODS get_text REDEFINITION. CLASS-METHODS raise IMPORTING v TYPE clike DEFAULT `CX_SY_SUBRC` when TYPE abap_bool DEFAULT abap_true PREFERRED PARAMETER v. CLASS-METHODS get_header_val IMPORTING v TYPE clike RETURNING VALUE(result) TYPE z2ui5_if_client=>ty_s_name_value-value. CLASS-METHODS get_param_val IMPORTING v TYPE clike RETURNING VALUE(result) TYPE z2ui5_if_client=>ty_s_name_value-value. CLASS-METHODS get_uuid RETURNING VALUE(result) TYPE string. CLASS-METHODS get_uuid_session RETURNING VALUE(result) TYPE string. CLASS-METHODS get_user_tech RETURNING VALUE(result) TYPE string. CLASS-METHODS get_timestampl RETURNING VALUE(result) TYPE timestampl. CLASS-METHODS trans_any_2_json IMPORTING any TYPE any RETURNING VALUE(result) TYPE string. CLASS-METHODS trans_xml_2_object IMPORTING xml TYPE clike EXPORTING data TYPE data. CLASS-METHODS get_t_attri_by_ref IMPORTING io_app TYPE REF TO object RETURNING VALUE(result) TYPE ty_t_attri ##NEEDED. CLASS-METHODS trans_object_2_xml IMPORTING object TYPE data RETURNING VALUE(result) TYPE string. CLASS-METHODS get_abap_2_json IMPORTING val TYPE any RETURNING VALUE(result) TYPE string. CLASS-METHODS check_is_boolean IMPORTING val TYPE any RETURNING VALUE(result) TYPE abap_bool. CLASS-METHODS get_json_boolean IMPORTING val TYPE any RETURNING VALUE(result) TYPE string. CLASS-METHODS trans_ref_tab_2_tab IMPORTING ir_tab_from TYPE REF TO data EXPORTING t_result TYPE STANDARD TABLE. CLASS-METHODS get_trim_upper IMPORTING val TYPE any RETURNING VALUE(result) TYPE string. CLASS-METHODS _get_t_attri_by_struc IMPORTING io_app TYPE REF TO object iv_attri TYPE csequence RETURNING VALUE(result) TYPE abap_attrdescr_tab. PROTECTED SECTION. CLASS-DATA mv_counter TYPE i. ENDCLASS. CLASS z2ui5_lcl_utility IMPLEMENTATION. METHOD get_trim_upper. result = CONV #( val ). result = to_upper( shift_left( shift_right( result ) ) ). ENDMETHOD. METHOD constructor. super->constructor( previous = previous ). CLEAR textid. TRY. ms_error-x_root ?= val. CATCH cx_root ##CATCH_ALL. ms_error-s_msg-message = val. ENDTRY. TRY. ms_error-uuid = get_uuid( ). CATCH cx_root ##CATCH_ALL. ENDTRY. ENDMETHOD. METHOD get_abap_2_json. IF check_is_boolean( val ). result = COND #( WHEN val = abap_true THEN `true` ELSE `false` ). ELSE. result = |"{ escape( val = val format = cl_abap_format=>e_json_string ) }"|. ENDIF. ENDMETHOD. METHOD check_is_boolean. TRY. DATA(lo_ele) = CAST cl_abap_elemdescr( cl_abap_elemdescr=>describe_by_data( val ) ). CASE lo_ele->get_relative_name( ). WHEN `ABAP_BOOL` OR `ABAP_BOOLEAN` OR `XSDBOOLEAN`. result = abap_true. ENDCASE. CATCH cx_root. ENDTRY. ENDMETHOD. METHOD get_json_boolean. IF check_is_boolean( val ). result = COND #( WHEN val = abap_true THEN `true` ELSE `false` ). ELSE. result = val. ENDIF. ENDMETHOD. METHOD get_timestampl. GET TIME STAMP FIELD result. ENDMETHOD. METHOD get_user_tech. result = sy-uname. ENDMETHOD. METHOD get_uuid. TRY. DATA uuid TYPE c LENGTH 32. TRY. CALL METHOD (`CL_SYSTEM_UUID`)=>if_system_uuid_static~create_uuid_c32 RECEIVING uuid = uuid. CATCH cx_sy_dyn_call_illegal_class. DATA(lv_fm) = `GUID_CREATE`. CALL FUNCTION lv_fm IMPORTING ev_guid_32 = uuid. ENDTRY. result = uuid. CATCH cx_root. ASSERT 1 = 0. ENDTRY. ENDMETHOD. METHOD get_uuid_session. mv_counter = mv_counter + 1. result = get_trim_upper( mv_counter ). ENDMETHOD. METHOD get_header_val. result = to_lower( z2ui5_cl_http_handler=>client-t_header[ name = v ]-value ). ENDMETHOD. METHOD get_param_val. DATA(lt_param) = VALUE z2ui5_if_client=>ty_t_name_value( LET tab = z2ui5_cl_http_handler=>client-t_param IN FOR row IN tab ( name = to_upper( row-name ) value = to_upper( row-value ) ) ). TRY. result = lt_param[ name = get_trim_upper( v ) ]-value. CATCH cx_root. ENDTRY. ENDMETHOD. METHOD get_t_attri_by_ref. DATA(lt_attri) = CAST cl_abap_classdescr( cl_abap_objectdescr=>describe_by_object_ref( io_app ) )->attributes. DELETE lt_attri WHERE visibility <> cl_abap_classdescr=>public. LOOP AT lt_attri INTO DATA(ls_attri) WHERE type_kind = cl_abap_classdescr=>typekind_struct2 OR type_kind = cl_abap_classdescr=>typekind_struct1. DELETE lt_attri INDEX sy-tabix. INSERT LINES OF _get_t_attri_by_struc( io_app = io_app iv_attri = ls_attri-name ) INTO TABLE lt_attri. ENDLOOP. LOOP AT lt_attri INTO ls_attri. DATA(ls_attri2) = VALUE ty_attri( ). ls_attri2 = CORRESPONDING #( ls_attri ). FIELD-SYMBOLS TYPE any. UNASSIGN . DATA(lv_assign) = `IO_APP->` && ls_attri-name. ASSIGN (lv_assign) TO . DATA(lo_descr) = cl_abap_datadescr=>describe_by_data( ). CASE lo_descr->kind. WHEN lo_descr->kind_elem. ls_attri2-type = CAST cl_abap_elemdescr( lo_descr )->get_relative_name( ). ENDCASE. APPEND ls_attri2 TO result. ENDLOOP. ENDMETHOD. METHOD _get_t_attri_by_struc. CONSTANTS c_prefix TYPE string VALUE `IO_APP->`. FIELD-SYMBOLS TYPE any. DATA(lv_name) = c_prefix && to_upper( iv_attri ). ASSIGN (lv_name) TO . raise( when = xsdbool( sy-subrc <> 0 ) ). DATA(lo_type) = cl_abap_structdescr=>describe_by_data( ). DATA(lo_struct) = CAST cl_abap_structdescr( lo_type ). LOOP AT lo_struct->get_components( ) REFERENCE INTO DATA(lr_comp). DATA(lv_element) = iv_attri && `-` && lr_comp->name. IF lr_comp->as_include = abap_true. INSERT LINES OF _get_t_attri_by_struc( io_app = io_app iv_attri = lv_element ) INTO TABLE result. ELSE. INSERT VALUE #( name = lv_element type_kind = lr_comp->type->type_kind ) INTO TABLE result. ENDIF. ENDLOOP. ENDMETHOD. METHOD trans_any_2_json. result = /ui2/cl_json=>serialize( any ). ENDMETHOD. METHOD trans_object_2_xml. FIELD-SYMBOLS TYPE any. ASSIGN object->* TO . raise( when = xsdbool( sy-subrc <> 0 ) ). CALL TRANSFORMATION id SOURCE data = RESULT XML result OPTIONS data_refs = `heap-or-create`. ENDMETHOD. METHOD trans_ref_tab_2_tab. TYPES ty_t_ref TYPE STANDARD TABLE OF REF TO data. FIELD-SYMBOLS TYPE ty_t_ref. ASSIGN ir_tab_from->* TO . raise( when = xsdbool( sy-subrc <> 0 ) ). CLEAR t_result. DATA(lo_tab) = CAST cl_abap_tabledescr( cl_abap_datadescr=>describe_by_data( t_result ) ). DATA(lo_struc) = CAST cl_abap_structdescr( lo_tab->get_table_line_type( ) ). DATA(lt_components) = lo_struc->get_components( ). LOOP AT INTO DATA(lr_from). DATA lr_row TYPE REF TO data. CREATE DATA lr_row LIKE LINE OF t_result. ASSIGN lr_row->* TO FIELD-SYMBOL(). ASSIGN lr_from->* TO FIELD-SYMBOL(). raise( when = xsdbool( sy-subrc <> 0 ) ). LOOP AT lt_components INTO DATA(ls_comp). FIELD-SYMBOLS TYPE data. ASSIGN COMPONENT ls_comp-name OF STRUCTURE TO . IF sy-subrc <> 0. EXIT. ENDIF. FIELD-SYMBOLS TYPE data. ASSIGN COMPONENT ls_comp-name OF STRUCTURE TO . IF sy-subrc <> 0. EXIT. ENDIF. ASSIGN ->* TO FIELD-SYMBOL(). IF sy-subrc = 0. = . ENDIF. ENDLOOP. INSERT INTO TABLE t_result. ENDLOOP. ENDMETHOD. METHOD trans_xml_2_object. CALL TRANSFORMATION id SOURCE XML xml RESULT data = data. ENDMETHOD. METHOD get_text. IF ms_error-x_root IS NOT INITIAL. result = ms_error-x_root->get_text( ). DATA(error) = abap_true. ELSEIF ms_error-s_msg-message IS NOT INITIAL. result = ms_error-s_msg-message. error = abap_true. ENDIF. IF error = abap_true AND result IS INITIAL. result = `unknown error`. ENDIF. ENDMETHOD. METHOD raise. IF when = abap_false. RETURN. ENDIF. RAISE EXCEPTION TYPE z2ui5_lcl_utility EXPORTING val = v. ENDMETHOD. ENDCLASS. CLASS z2ui5_lcl_utility_tree_json DEFINITION. PUBLIC SECTION. DATA mo_root TYPE REF TO z2ui5_lcl_utility_tree_json. DATA mo_parent TYPE REF TO z2ui5_lcl_utility_tree_json. DATA mv_name TYPE string. DATA mv_value TYPE string. DATA mt_values TYPE STANDARD TABLE OF REF TO z2ui5_lcl_utility_tree_json WITH EMPTY KEY. DATA mv_check_list TYPE abap_bool. DATA mr_actual TYPE REF TO data. DATA mv_apost_active TYPE abap_bool. CLASS-METHODS new IMPORTING io_root TYPE REF TO z2ui5_lcl_utility_tree_json iv_name TYPE simple RETURNING VALUE(result) TYPE REF TO z2ui5_lcl_utility_tree_json. CLASS-METHODS factory IMPORTING iv_json TYPE clike OPTIONAL RETURNING VALUE(result) TYPE REF TO z2ui5_lcl_utility_tree_json. METHODS constructor. METHODS get_root RETURNING VALUE(result) TYPE REF TO z2ui5_lcl_utility_tree_json. METHODS get_attribute IMPORTING name TYPE string RETURNING VALUE(result) TYPE REF TO z2ui5_lcl_utility_tree_json. METHODS get_val RETURNING VALUE(result) TYPE string. METHODS add_attribute IMPORTING n TYPE clike v TYPE clike apos_active TYPE abap_bool DEFAULT abap_true RETURNING VALUE(result) TYPE REF TO z2ui5_lcl_utility_tree_json. METHODS add_attribute_object IMPORTING name TYPE clike RETURNING VALUE(result) TYPE REF TO z2ui5_lcl_utility_tree_json. METHODS add_attribute_struc IMPORTING val TYPE data RETURNING VALUE(result) TYPE REF TO z2ui5_lcl_utility_tree_json. METHODS add_attribute_instance IMPORTING val TYPE REF TO z2ui5_lcl_utility_tree_json RETURNING VALUE(result) TYPE REF TO z2ui5_lcl_utility_tree_json. METHODS stringify RETURNING VALUE(result) TYPE string. PROTECTED SECTION. METHODS wrap_json IMPORTING iv_text TYPE string RETURNING VALUE(result) TYPE string. METHODS quote_json IMPORTING iv_text TYPE string iv_cond TYPE abap_bool RETURNING VALUE(result) TYPE string. ENDCLASS. CLASS z2ui5_lcl_utility_tree_json IMPLEMENTATION. METHOD add_attribute. DATA(lo_attri) = new( io_root = mo_root iv_name = n ). IF apos_active = abap_false. lo_attri->mv_value = v. ELSE. lo_attri->mv_value = escape( val = v format = cl_abap_format=>e_json_string ). ENDIF. lo_attri->mv_apost_active = apos_active. lo_attri->mo_parent = me. INSERT lo_attri INTO TABLE mt_values. result = me. ENDMETHOD. METHOD add_attribute_instance. val->mo_root = mo_root. val->mo_parent = me. INSERT val INTO TABLE mt_values. result = val. ENDMETHOD. METHOD add_attribute_struc. FIELD-SYMBOLS TYPE any. DATA(lo_struc) = CAST cl_abap_structdescr( cl_abap_datadescr=>describe_by_data( val ) ). DATA(lt_comp) = lo_struc->get_components( ). LOOP AT lt_comp REFERENCE INTO DATA(lr_comp). ASSIGN COMPONENT lr_comp->name OF STRUCTURE val TO . add_attribute( n = lr_comp->name v = ). ENDLOOP. result = me. ENDMETHOD. METHOD add_attribute_object. DATA(lo_attri) = new( io_root = mo_root iv_name = name ). mt_values = VALUE #( BASE mt_values ( lo_attri ) ). lo_attri->mo_parent = me. result = lo_attri. ENDMETHOD. METHOD constructor. mo_root = me. ENDMETHOD. METHOD factory. result = NEW #( ). result->mo_root = result. /ui2/cl_json=>deserialize( EXPORTING json = CONV string( iv_json ) assoc_arrays = abap_true CHANGING data = result->mr_actual ). ENDMETHOD. METHOD new. result = NEW #( ). result->mo_root = io_root. result->mv_name = CONV string( iv_name ). ENDMETHOD. METHOD get_attribute. CONSTANTS c_prefix TYPE string VALUE `MR_ACTUAL->`. z2ui5_lcl_utility=>raise( when = xsdbool( mr_actual IS INITIAL ) ). DATA(lo_attri) = new( io_root = mo_root iv_name = name ). FIELD-SYMBOLS TYPE any. DATA(lv_name) = c_prefix && replace( val = name sub = `-` with = `_` occ = 0 ). ASSIGN (lv_name) TO . z2ui5_lcl_utility=>raise( when = xsdbool( sy-subrc <> 0 ) ). lo_attri->mr_actual = . lo_attri->mo_parent = me. INSERT lo_attri INTO TABLE mt_values. result = lo_attri. ENDMETHOD. METHOD get_val. FIELD-SYMBOLS TYPE any. ASSIGN mr_actual->* TO . z2ui5_lcl_utility=>raise( when = xsdbool( sy-subrc <> 0 ) v = `Value of Attribute in JSON not found` ). result = . ENDMETHOD. METHOD get_root. result = mo_root. ENDMETHOD. METHOD wrap_json. result = SWITCH #( mv_check_list WHEN abap_true THEN |[ { iv_text }]| ELSE `{` && iv_text && `}` ). ENDMETHOD. METHOD quote_json. result = SWITCH #( iv_cond WHEN abap_true THEN `"` && iv_text && `"` ELSE iv_text ). ENDMETHOD. METHOD stringify. LOOP AT mt_values INTO DATA(lo_attri). IF sy-tabix > 1. result = result && |,|. ENDIF. IF mv_check_list = abap_false. result = |{ result }"{ lo_attri->mv_name }":|. ENDIF. IF lo_attri->mt_values IS NOT INITIAL. result = result && lo_attri->stringify( ). ELSE. result = result && quote_json( iv_cond = xsdbool( lo_attri->mv_apost_active = abap_true OR lo_attri->mv_value IS INITIAL ) iv_text = lo_attri->mv_value ). ENDIF. ENDLOOP. result = wrap_json( result ). ENDMETHOD. ENDCLASS. CLASS z2ui5_lcl_fw_handler DEFINITION DEFERRED. CLASS z2ui5_lcl_fw_handler DEFINITION. PUBLIC SECTION. CONSTANTS: BEGIN OF cs_bind_type, one_way TYPE string VALUE 'ONE_WAY', two_way TYPE string VALUE 'TWO_WAY', one_time TYPE string VALUE 'ONE_TIME', END OF cs_bind_type. TYPES: BEGIN OF ty_s_db, id TYPE string, id_prev TYPE string, id_prev_app TYPE string, id_prev_app_stack TYPE string, t_attri TYPE z2ui5_lcl_utility=>ty_t_attri, o_app TYPE REF TO z2ui5_if_app, END OF ty_s_db. DATA ms_db TYPE ty_s_db. TYPES: BEGIN OF ty_s_next, check_app_leave TYPE abap_bool, o_call_app TYPE REF TO z2ui5_if_app, s_set TYPE z2ui5_if_client=>ty_S_next, BEGIN OF s_msg, control TYPE string, type TYPE string, text TYPE string, END OF s_msg, END OF ty_s_next. DATA ms_actual TYPE z2ui5_if_client=>ty_s_get. DATA ms_next TYPE ty_s_next. CLASS-DATA mo_body TYPE REF TO z2ui5_lcl_utility_tree_json. CLASS-METHODS request_begin RETURNING VALUE(result) TYPE REF TO z2ui5_lcl_fw_handler. METHODS request_end RETURNING VALUE(result) TYPE string. METHODS _create_binding IMPORTING value TYPE data type TYPE string DEFAULT cs_bind_type-two_way check_gen_data TYPE abap_bool OPTIONAL RETURNING VALUE(result) TYPE string. CLASS-METHODS set_app_start RETURNING VALUE(result) TYPE REF TO z2ui5_lcl_fw_handler. CLASS-METHODS set_app_client IMPORTING id_prev TYPE clike RETURNING VALUE(result) TYPE REF TO z2ui5_lcl_fw_handler. METHODS set_app_leave RETURNING VALUE(result) TYPE REF TO z2ui5_lcl_fw_handler. METHODS set_app_call RETURNING VALUE(result) TYPE REF TO z2ui5_lcl_fw_handler. METHODS set_app_system IMPORTING VALUE(ix) TYPE REF TO cx_root OPTIONAL error_text TYPE string OPTIONAL PREFERRED PARAMETER ix RETURNING VALUE(result) TYPE REF TO z2ui5_lcl_fw_handler. CLASS-METHODS model_set_backend IMPORTING lr_model TYPE REF TO data lo_app TYPE REF TO object t_attri TYPE z2ui5_lcl_utility=>ty_t_attri ##NEEDED. CLASS-METHODS model_set_frontend IMPORTING lo_app TYPE REF TO object t_attri TYPE z2ui5_lcl_utility=>ty_t_attri RETURNING VALUE(result) TYPE string ##NEEDED. ENDCLASS. CLASS z2ui5_lcl_fw_db DEFINITION. PUBLIC SECTION. CLASS-METHODS create IMPORTING id TYPE string db TYPE z2ui5_lcl_fw_handler=>ty_s_db. CLASS-METHODS load_app IMPORTING id TYPE string RETURNING VALUE(result) TYPE z2ui5_lcl_fw_handler=>ty_s_db. CLASS-METHODS read IMPORTING id TYPE clike check_load_app TYPE abap_bool DEFAULT abap_true RETURNING VALUE(result) TYPE z2ui5_t_draft. CLASS-METHODS cleanup. ENDCLASS. CLASS z2ui5_lcl_fw_app DEFINITION. PUBLIC SECTION. INTERFACES z2ui5_if_app. DATA: BEGIN OF ms_error, x_error TYPE REF TO cx_root, app TYPE REF TO z2ui5_if_app, classname TYPE string, kind TYPE string, END OF ms_error. DATA: BEGIN OF ms_home, is_initialized TYPE abap_bool, btn_text TYPE string, btn_event_id TYPE string, btn_icon TYPE string, classname TYPE string, class_value_state TYPE string, class_value_state_text TYPE string, class_editable TYPE abap_bool VALUE abap_true, END OF ms_home. CLASS-METHODS factory_error IMPORTING error TYPE REF TO cx_root app TYPE REF TO object OPTIONAL RETURNING VALUE(result) TYPE REF TO z2ui5_lcl_fw_app. DATA mv_is_initialized TYPE abap_bool. DATA mv_view_name TYPE string. METHODS z2ui5_on_init. METHODS z2ui5_on_event IMPORTING client TYPE REF TO z2ui5_if_client. METHODS z2ui5_on_rendering IMPORTING client TYPE REF TO z2ui5_if_client. ENDCLASS. CLASS z2ui5_lcl_fw_app IMPLEMENTATION. METHOD z2ui5_if_app~main. IF mv_is_initialized = abap_false. mv_is_initialized = abap_true. z2ui5_on_init( ). ENDIF. z2ui5_on_event( client ). z2ui5_on_rendering( client ). ENDMETHOD. METHOD factory_error. result = NEW #( ). result->ms_error-x_error = error. result->ms_error-app = CAST #( app ). ENDMETHOD. METHOD z2ui5_on_init. IF ms_error-x_error IS NOT BOUND. mv_view_name = 'HOME'. ms_home-is_initialized = abap_true. ms_home-btn_text = `check`. ms_home-btn_event_id = `BUTTON_CHECK`. ms_home-class_editable = abap_true. ms_home-btn_icon = `sap-icon://validate`. ms_home-classname = `z2ui5_cl_app_hello_world`. ELSE. mv_view_name = 'ERROR'. ENDIF. ENDMETHOD. METHOD z2ui5_on_event. CASE mv_view_name. WHEN `HOME`. CASE client->get( )-event. WHEN `BUTTON_CHANGE`. ms_home-btn_text = `check`. ms_home-btn_event_id = `BUTTON_CHECK`. ms_home-btn_icon = `sap-icon://validate`. ms_home-class_editable = abap_true. WHEN `BUTTON_CHECK`. TRY. " TODO: variable is assigned but never used (ABAP cleaner) DATA li_app_test TYPE REF TO z2ui5_if_app. ms_home-classname = z2ui5_lcl_utility=>get_trim_upper( ms_home-classname ). CREATE OBJECT li_app_test TYPE (ms_home-classname). client->popup_message_toast( `App is ready to start!` ). ms_home-btn_text = `edit`. ms_home-btn_event_id = `BUTTON_CHANGE`. ms_home-btn_icon = `sap-icon://edit`. ms_home-class_value_state = `Success`. ms_home-class_editable = abap_false. CATCH cx_root INTO DATA(lx) ##CATCH_ALL. ms_home-class_value_state_text = lx->get_text( ). ms_home-class_value_state = `Warning`. client->popup_message_box( text = ms_home-class_value_state_text type = `error` ). ENDTRY. WHEN `DEMOS`. DATA li_app TYPE REF TO z2ui5_if_app. TRY. CREATE OBJECT li_app TYPE (`Z2UI5_CL_APP_DEMO_00`). client->nav_app_call( li_app ). CATCH cx_root. client->popup_message_box( `Demos not available. Check the demo folder or you release is lower v750` ). ENDTRY. ENDCASE. WHEN `ERROR`. CASE client->get( )-event. WHEN `BUTTON_HOME`. client->nav_app_home( ). WHEN `BUTTON_BACK`. client->nav_app_leave( client->get_app( client->get( )-id_prev_app ) ). ENDCASE. ENDCASE. ENDMETHOD. METHOD z2ui5_on_rendering. IF ms_error-x_error IS BOUND. ms_error-x_error->get_source_position( IMPORTING program_name = DATA(lv_prog) include_name = DATA(lv_incl) source_line = DATA(lv_line) ). IF client->get_app( client->get( )-id_prev_app ) IS BOUND. DATA(lv_check_back) = `true`. ELSE. lv_check_back = `false`. ENDIF. DATA(lv_descr) = ms_error-x_error->get_text( ) && ` -------------------------------------------------------------------------------------------- Source Code Position: ` && lv_prog && ` / ` && lv_incl && ` / ` && lv_line && ` `. DATA(lv_xml_error) = `