UNPKG

navidev-adt-api

Version:

API de conexión al Abap Developer Tools

1,376 lines (1,106 loc) 49.5 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.content = void 0; exports.content = `"! <p class="shorttext synchronized">AL30 - View configuration</p> class ZCL_AL30_CONF definition public create public global friends ZCL_AL30_CONTROLLER . public section. type-pools ABAP . types: *"* public components of class ZCL_AL30_CONF *"* do not include other source files here!!! tt_info_data TYPE STANDARD TABLE OF dfies WITH EMPTY KEY . "! <p class="shorttext synchronized">Read view</p> methods READ_VIEW importing !IV_NAME_VIEW type TABNAME !IV_ALL_LANGUAGE type SAP_BOOL default ABAP_FALSE !IV_LANGU type SYLANGU default SY-LANGU !IV_READ_DDIC type SAP_BOOL default ABAP_TRUE exporting !EV_TEXT_VIEW type AS4TEXT !ES_RETURN type BAPIRET2 !ES_VIEW type ZAL30_T_VIEW !ET_FIELDS type ZIF_AL30_DATA=>TT_FIELDS_VIEW !ET_FIELDS_TEXT type ZIF_AL30_DATA=>TT_FIELDS_TEXT_VIEW !ET_FIELDS_DDIC type DD03PTAB !ET_FOREIGN_KEY_DDIC type DD05MTTYP . "! <p class="shorttext synchronized">Checks if view is correct in DDIC</p> methods CHECK_VIEW_DDIC importing !IV_NAME_VIEW type TABNAME exporting !E_RETURN type BAPIRET2 !E_TEXT_VIEW type AS4TEXT . "! <p class="shorttext synchronized">Create a view</p> methods INSERT_VIEW importing !IV_NAME_VIEW type TABNAME !IV_USE_DEFAULT_VALUES type SAP_BOOL default ABAP_FALSE !IS_DEFAULT_VALUES type ZIF_AL30_DATA=>TS_DEFAULT_VALUES_CREATE optional exporting !ES_RETURN type BAPIRET2 !ET_FIELDS type ZIF_AL30_DATA=>TT_FIELDS_VIEW !ET_FIELDS_TEXT type ZIF_AL30_DATA=>TT_FIELDS_TEXT_VIEW !ES_VIEW type ZAL30_T_VIEW !ET_FIELDS_DDIC type DD03PTAB . "! <p class="shorttext synchronized">Delete a view</p> methods DELETE_VIEW importing !IV_NAME_VIEW type TABNAME returning value(RS_RETURN) type BAPIRET2 . "! <p class="shorttext synchronized">Save view</p> methods SAVE_VIEW importing !IS_VIEW type ZAL30_T_VIEW !IT_FIELDS type ZIF_AL30_DATA=>TT_FIELDS_VIEW !IT_FIELDS_TEXT type ZIF_AL30_DATA=>TT_FIELDS_TEXT_VIEW optional returning value(RS_RETURN) type BAPIRET2 . "! <p class="shorttext synchronized">Check view for insert</p> methods CHECK_VIEW_INSERT importing !IV_NAME_VIEW type TABNAME exporting !ES_RETURN type BAPIRET2 !EV_TEXT_VIEW type AS4TEXT . "! <p class="shorttext synchronized">Check view when is reading</p> methods CHECK_VIEW_READ importing !IV_NAME_VIEW type TABNAME exporting !ES_RETURN type BAPIRET2 !EV_TEXT_VIEW type AS4TEXT . "! <p class="shorttext synchronized">Check if there are changes between the view and the dictiona</p> methods CHECK_CHANGES_DICT importing !IT_FIELDS type ZIF_AL30_DATA=>TT_FIELDS_VIEW optional !IT_FIELDS_TEXT type ZIF_AL30_DATA=>TT_FIELDS_TEXT_VIEW optional !IS_VIEW type ZAL30_T_VIEW !IV_LANGU type SYLANGU default SY-LANGU exporting !EV_DIFF_FIELDS type SAP_BOOL !EV_DIFF_TEXT type SAP_BOOL . "! <p class="shorttext synchronized">Adjusts the view with the data dictionary.</p> methods ADJUST_VIEW_DICTIONARY importing !IV_KEEP_TEXT type SAP_BOOL default ABAP_TRUE !IV_LANGU type SYLANGU default SY-LANGU exporting value(ES_RETURN) type BAPIRET2 !EV_TEXT_VIEW type AS4TEXT changing !CT_FIELDS_VIEW type ZIF_AL30_DATA=>TT_FIELDS_VIEW !CT_FIELDS_TEXT_VIEW type ZIF_AL30_DATA=>TT_FIELDS_TEXT_VIEW !CS_VIEW type ZAL30_T_VIEW . "! <p class="shorttext synchronized">Check exit class</p> methods CHECK_EXIT_CLASS importing !IV_EXIT_CLASS type ZAL30_E_EXIT_CLASS returning value(RS_RETURN) type BAPIRET2 . "! <p class="shorttext synchronized">Get logon languages</p> methods GET_LOGON_LANGUAGES importing !IV_LANGU type SYLANGU default SY-LANGU exporting !ET_LANG type ZIF_AL30_DATA=>TT_LOGON_LANG !ET_R_LANG type ZIF_AL30_DATA=>TT_R_LANG . "! <p class="shorttext synchronized">Get fields of data dictionary</p> methods GET_FIELDS_VIEW_DDIC importing !IV_NAME_VIEW type ANY !IV_LANGU type SYLANGU default SY-LANGU !IV_ADD_TEXTTABLE type SAP_BOOL default ABAP_FALSE !IV_ALL_LANGUAGE type SAP_BOOL default ABAP_FALSE exporting !ES_DD02V type DD02V !ET_FIELDS type ZIF_AL30_DATA=>TT_FIELDS_VIEW !ET_FIELDS_TEXT type ZIF_AL30_DATA=>TT_FIELDS_TEXT_VIEW !EV_TEXTTABLE type TABNAME !ET_FIELDS_DDIC type DD03PTAB !ET_FOREIGN_KEY_DDIC type DD05MTTYP raising ZCX_AL30 . "! <p class="shorttext synchronized">Transport View</p> methods TRANSPORT_VIEW importing !IS_VIEW type ZAL30_T_VIEW !IT_FIELDS_VIEW type ZIF_AL30_DATA=>TT_FIELDS_VIEW !IT_FIELDS_TEXT_VIEW type ZIF_AL30_DATA=>TT_FIELDS_TEXT_VIEW optional exporting !ES_RETURN type BAPIRET2 changing !CV_ORDER type E070-TRKORR . "! <p class="shorttext synchronized">Read single view ddic</p> methods READ_SINGLE_VIEW_DDIC importing !IV_NAME_VIEW type ANY !IV_LANGU type SYLANGU default SY-LANGU exporting !ES_DD02V type DD02V !ET_DD03P type DD03PTAB !ET_DD05M type DD05MTTYP raising ZCX_AL30 . "! <p class="shorttext synchronized">Read info of a data element</p> "! "! @parameter iv_rollname | <p class="shorttext synchronized">Data element</p> "! @parameter es_info | <p class="shorttext synchronized">info</p> methods READ_SINGLE_DATA_ELEMENT importing !IV_ROLLNAME type ROLLNAME !IV_LANGU type SYLANGU default SY-LANGU exporting !ES_INFO type DFIES raising ZCX_AL30 . "! <p class="shorttext synchronized">Read info in all languages</p> "! "! @parameter iv_rollname | <p class="shorttext synchronized">Data element</p> "! @parameter et_info | <p class="shorttext synchronized">Information in each language</p> methods READ_DATA_ELEMENT_ALL_LANG importing !IV_ROLLNAME type ROLLNAME exporting !ET_INFO type TT_INFO_DATA raising ZCX_AL30 . PROTECTED SECTION. *"* protected components of class ZCL_AL30_CONF *"* do not include other source files here!!! DATA mt_logon_lang TYPE zif_al30_data=>tt_logon_lang . DATA mt_fields TYPE zif_al30_data=>tt_fields_view . DATA mt_fields_text TYPE zif_al30_data=>tt_fields_text_view . DATA mt_fields_ddic TYPE dd03ptab . DATA mt_foreign_key_ddic TYPE dd05mttyp. DATA ms_view TYPE zal30_t_view . "! <p class="shorttext synchronized">Save the data in ddic format</p> METHODS save_view_ddic IMPORTING !is_view TYPE zal30_t_view !it_fields TYPE zif_al30_data=>tt_fields_view !it_fields_text TYPE zif_al30_data=>tt_fields_text_view OPTIONAL RAISING zcx_al30 . "! <p class="shorttext synchronized">Read view in all languages</p> METHODS read_view_ddic_all_lang IMPORTING !iv_name_view TYPE any !iv_langu TYPE sylangu DEFAULT sy-langu EXPORTING !es_dd02v TYPE dd02v !et_dd03p TYPE dd03ptab !et_dd05m TYPE dd05mttyp . "! <p class="shorttext synchronized">Read text view</p> METHODS read_text_view IMPORTING !iv_name_view TYPE tabname !iv_all_language TYPE sap_bool DEFAULT abap_false !iv_langu TYPE sylangu DEFAULT sy-langu EXPORTING !et_fields_text TYPE zif_al30_data=>tt_fields_text_view . "! <p class="shorttext synchronized">Get text table of view</p> METHODS get_texttable_view IMPORTING !iv_name_view TYPE any !iv_langu TYPE sylangu DEFAULT sy-langu !iv_all_language TYPE sap_bool DEFAULT abap_false EXPORTING !ev_texttable TYPE tabname !et_fields TYPE zif_al30_data=>tt_fields_view !et_fields_text TYPE zif_al30_data=>tt_fields_text_view !et_fields_ddic TYPE dd03ptab . "! <p class="shorttext synchronized">Adjust fields of view</p> METHODS adjust_fields_view IMPORTING !iv_all_language TYPE sap_bool DEFAULT abap_false !iv_langu TYPE sylangu DEFAULT sy-langu !it_fields_ddic TYPE dd03ptab CHANGING !ct_fields TYPE zif_al30_data=>tt_fields_view !ct_fields_text TYPE zif_al30_data=>tt_fields_text_view . "! <p class="shorttext synchronized">Fill default values of fields</p> METHODS fill_default_values_fields CHANGING !cs_fields TYPE zif_al30_data=>ts_fields_view . "! <p class="shorttext synchronized">Fill default values of view</p> METHODS fill_default_values_view IMPORTING !is_default_values TYPE zif_al30_data=>ts_default_values_create OPTIONAL !iv_use_default_values TYPE sap_bool DEFAULT abap_false CHANGING !cs_view TYPE zal30_t_view . "! <p class="shorttext synchronized">Is fields a checkbox?</p> METHODS is_field_checkbox IMPORTING !iv_rollname TYPE domname RETURNING VALUE(rv_result) TYPE zal30_s_fields_attr_general-checkbox . PRIVATE SECTION. *"* private components of class ZCL_AL30_CONF *"* do not include other source files here!!! ENDCLASS. CLASS ZCL_AL30_CONF IMPLEMENTATION. METHOD adjust_fields_view. DATA ls_fields_text TYPE LINE OF zif_al30_data=>tt_fields_text_view. LOOP AT ct_fields ASSIGNING FIELD-SYMBOL(<ls_fields>). " Este campo al ser añadido el 06/05/2020 puede ser que en configuraciones previas no exista, en en ese caso se le pone el valor por defecto <ls_fields>-lbl_type_header = cond #( when <ls_fields>-lbl_type_header is initial then zif_al30_data=>cs_label_type_col_header-default else <ls_fields>-lbl_type_header ). " Si el texto se introduce manual solo tendré que actualizar la posición donde debe salir, que será la misma que la del campo CASE <ls_fields>-source_text. WHEN zif_al30_data=>cs_source_text-manual. LOOP AT ct_fields_text ASSIGNING FIELD-SYMBOL(<ls_fields_text>) WHERE fieldname = <ls_fields>-fieldname. <ls_fields_text>-pos_ddic = <ls_fields>-pos_ddic. ENDLOOP. " Si viene del diccionario se añade el texto que proviene del mismo WHEN zif_al30_data=>cs_source_text-dictionary. " Si el campo es virtual no vendrá del diccionario por lo tanto hay llamar a otros método para recuperar sus textos IF <ls_fields>-virtual = abap_true. TRY. " La búsqueda del texto del elemento de datos también depende si se quiere para todos los idiomas o solo " para el idioma pasado por parámetro. El primero se usa en la configuración de la vista, el segundo cuando se " mantienee los datos. IF iv_all_language = abap_true. read_data_element_all_lang( EXPORTING iv_rollname = <ls_fields>-virtual_dtel IMPORTING et_info = DATA(lt_info) ). ELSE. read_single_data_element( EXPORTING iv_rollname = <ls_fields>-virtual_dtel iv_langu = iv_langu IMPORTING es_info = DATA(ls_info) ). INSERT ls_info INTO TABLE lt_info. ENDIF. LOOP AT lt_info ASSIGNING FIELD-SYMBOL(<ls_info>). ls_fields_text = CORRESPONDING #( <ls_info> ). ls_fields_text = CORRESPONDING #( BASE ( ls_fields_text ) <ls_fields> ). ls_fields_text-spras = <ls_info>-langu. INSERT ls_fields_text INTO TABLE ct_fields_text. CLEAR ls_fields_text. ENDLOOP. CLEAR lt_info. . CATCH zcx_al30. ENDTRY. ENDIF. LOOP AT it_fields_ddic ASSIGNING FIELD-SYMBOL(<ls_fields_ddic>) WHERE fieldname = <ls_fields>-fieldname. MOVE-CORRESPONDING <ls_fields_ddic> TO ls_fields_text. ls_fields_text-spras = <ls_fields_ddic>-ddlanguage. ls_fields_text-pos_ddic = <ls_fields>-pos_ddic. INSERT ls_fields_text INTO TABLE ct_fields_text. CLEAR ls_fields_text. ENDLOOP. ENDCASE. ENDLOOP. " Obtenemos la última posición usada DATA(lv_position) = REDUCE #( INIT x = 0 FOR <wa> IN ct_fields NEXT x = COND #( WHEN <wa>-pos_ddic > x THEN <wa>-pos_ddic ELSE x ) ). lv_position = lv_position + 1. " Se ajusta aquellos campos que no tienen posición. LOOP AT ct_fields ASSIGNING <ls_fields> WHERE pos_ddic IS INITIAL. <ls_fields>-pos_ddic = lv_position. lv_position = lv_position + 1. ENDLOOP. ENDMETHOD. METHOD adjust_view_dictionary. DATA lt_fields_old TYPE zif_al30_data=>tt_fields_view. DATA lt_fields_text_old TYPE zif_al30_data=>tt_fields_text_view. CLEAR: es_return, ev_text_view. * Si los campos a nivel de parámetro están informados tienen prioridad sobre los globales IF ct_fields_view IS NOT INITIAL. DATA(lt_fields) = ct_fields_view. ELSE. lt_fields = mt_fields. ENDIF. IF ct_fields_text_view IS NOT INITIAL. DATA(lt_fields_text) = ct_fields_text_view. ELSE. lt_fields_text = mt_fields_text. ENDIF. IF cs_view IS INITIAL. cs_view = ms_view. ENDIF. * Se pasa los parámetros de entrada a tablas auxiliares lt_fields_old = lt_fields. lt_fields_text_old = lt_fields_text. * Limpio los parámetros changing. CLEAR: ct_fields_view, ct_fields_text_view. * Leo los campos de la vista en formato listo para ser tratado y los pongo en los parámetros changing. TRY. CALL METHOD get_fields_view_ddic EXPORTING iv_name_view = cs_view-tabname iv_add_texttable = abap_true IMPORTING es_dd02v = DATA(ls_dd02v) et_fields = ct_fields_view et_fields_text = ct_fields_text_view ev_texttable = cs_view-texttable. CATCH zcx_al30 . es_return = zcl_al30_util=>fill_return( iv_type = 'E' iv_number = '013' iv_message_v1 = cs_view-tabname ). EXIT. ENDTRY. * Recupero el texto ev_text_view = ls_dd02v-ddtext. * LOOP AT ct_fields_view ASSIGNING FIELD-SYMBOL(<ls_fields>). " Si el campo existe en la tabla que toca (puede ser que se pueden mover campos entre la tabla principal y la de textos) paso los valores que pudiera tener. READ TABLE lt_fields_old ASSIGNING FIELD-SYMBOL(<ls_fields_old>) WITH KEY fieldname = <ls_fields>-fieldname field_texttable = <ls_fields>-field_texttable. IF sy-subrc = 0. <ls_fields> = <ls_fields_old>. ELSE. " El nuevo campo se le rellena con sus valores por defecto fill_default_values_fields( CHANGING cs_fields = <ls_fields> ). ENDIF. " Si el campo tiene como origen del texto manual y se quiere mantener el texto entonces voy moviendo los textos antiguos al nuevo IF <ls_fields>-source_text = zif_al30_data=>cs_source_text-manual AND iv_keep_text = abap_true. LOOP AT ct_fields_text_view ASSIGNING FIELD-SYMBOL(<ls_fields_text>) WHERE fieldname = <ls_fields>-fieldname. READ TABLE lt_fields_text_old ASSIGNING FIELD-SYMBOL(<ls_fields_text_old>) WITH KEY fieldname = <ls_fields>-fieldname spras = <ls_fields_text>-spras. IF sy-subrc = 0. <ls_fields_text> = <ls_fields_text_old>. ENDIF. ENDLOOP. ENDIF. ENDLOOP. " Se añaden los campos virtuales que había en la tabla antigua LOOP AT lt_fields_old ASSIGNING <ls_fields_old> WHERE virtual = abap_true. INSERT <ls_fields_old> INTO TABLE ct_fields_view. LOOP AT lt_fields_text_old ASSIGNING <ls_fields_text_old> WHERE fieldname = <ls_fields_old>-fieldname. INSERT <ls_fields_text_old> INTO TABLE ct_fields_text_view. ENDLOOP. ENDLOOP. * Finalmente grabo la vista es_return = save_view( EXPORTING is_view = cs_view it_fields = ct_fields_view it_fields_text = ct_fields_text_view ). * Se pasan los nuevos campos ajustados a las variables globales mt_fields = ct_fields_view. mt_fields_text = ct_fields_text_view. ms_view = cs_view. ENDMETHOD. METHOD check_changes_dict. FIELD-SYMBOLS <ls_dd03p> TYPE dd03p. DATA ld_name TYPE ddobjname. DATA ls_dd02v TYPE dd02v. DATA lt_dd03p TYPE TABLE OF dd03p. DATA ld_num_fields TYPE i. DATA ld_num_fields_ddic TYPE i. DATA lv_texttable_ddic TYPE tabname. ev_diff_fields = ev_diff_text = abap_false. * Si los campos a nivel de parámetro están informados tienen prioridad sobre los globales IF it_fields IS NOT INITIAL. DATA(lt_fields) = it_fields. ELSE. lt_fields = mt_fields. ENDIF. IF it_fields_text IS NOT INITIAL. DATA(lt_fields_text) = it_fields_text. ELSE. lt_fields_text = mt_fields_text. ENDIF. * Obtengo información de la tabla TRY. CALL METHOD get_fields_view_ddic EXPORTING iv_name_view = is_view-tabname iv_add_texttable = abap_true IMPORTING et_fields = DATA(lt_fields_ddic) et_fields_text = DATA(lt_fields_text_ddic) ev_texttable = lv_texttable_ddic. CATCH zcx_al30. ENDTRY. IF lt_fields_ddic[] IS NOT INITIAL. * Se mira campo por campo las posibles diferencias, los virtuales no se procesan porque nunca existen en el diccionario. LOOP AT lt_fields ASSIGNING FIELD-SYMBOL(<ls_fields>) WHERE virtual = abap_false. " Se mira que el campo existe en la tabla que le pertoca. Si un campo esta en la principal y pasa a la de texto, o la inversa, " se tiene que detectar porque afectaría a la actualización. READ TABLE lt_fields_ddic TRANSPORTING NO FIELDS WITH KEY fieldname = <ls_fields>-fieldname field_texttable = <ls_fields>-field_texttable. IF sy-subrc = 0. * Nota IRB 04/06/2019: No tiene sentido validar el texto porque si se introduce manualmente da igual el que pueda tener * en el diccionario. Y si se escoge el diccionario siempre tomará el texto del mismo. Aún asi, la dejo la validación por * si hay que implementar dicha casuística. * " La validación de texto solo se efectua cuando el origen del texto del campo será manual. * IF <ls_fields>-source_text = zif_al30_data=>cs_source_text-manual. * LOOP AT it_fields_text ASSIGNING FIELD-SYMBOL(<ls_fields_text>). * * READ TABLE lt_fields_text_ddic ASSIGNING FIELD-SYMBOL(<ls_fields_text_ddic>) * WITH KEY fieldname = <ls_fields_text>-fieldname * spras = <ls_fields_text>-spras. * IF sy-subrc = 0. ** Si el existe el mismo campo miro los textos * IF <ls_fields_text>-scrtext_s NE <ls_dd03p>-scrtext_s * OR <ls_fields_text>-scrtext_m NE <ls_dd03p>-scrtext_m * OR <ls_fields_text>-scrtext_l NE <ls_dd03p>-scrtext_l * OR <ls_fields_text>-reptext NE <ls_dd03p>-reptext. * ev_diff_text = abap_true. * EXIT. * ENDIF. * * ELSE. ** A la primera diferencia salgo, no tiene sentido leer el resto de campos. * ev_diff_fields = abap_true. * EXIT. * ENDIF. * ENDLOOP. * ENDIF. ELSE. " A la primera diferencia salgo, no tiene sentido leer el resto de campos. ev_diff_fields = abap_true. EXIT. ENDIF. ENDLOOP. " Si no hay diferencias se busca a la inversa, que haya campos nuevos en el diccionario que no esten en la configuración IF ev_diff_fields = abap_false. LOOP AT lt_fields_ddic ASSIGNING FIELD-SYMBOL(<ls_fields_ddic>). READ TABLE lt_fields TRANSPORTING NO FIELDS WITH KEY fieldname = <ls_fields_ddic>-fieldname field_texttable = <ls_fields_ddic>-field_texttable virtual = abap_false. IF sy-subrc NE 0. " A la primera diferencia salgo, no tiene sentido leer el resto de campos. ev_diff_fields = abap_true. EXIT. ENDIF. ENDLOOP. ENDIF. ELSE. ev_diff_fields = abap_true. ENDIF. ENDMETHOD. METHOD check_exit_class. DATA ld_not_active TYPE sap_bool. DATA ls_impl TYPE seorelkey. DATA ld_deleted TYPE sap_bool. CLEAR rs_return. * Primero se mira que la clase exista CALL FUNCTION 'SEO_CLASS_EXISTENCE_CHECK' EXPORTING clskey = iv_exit_class IMPORTING not_active = ld_not_active EXCEPTIONS not_specified = 1 not_existing = 2 is_interface = 3 no_text = 4 inconsistent = 5 OTHERS = 6. IF sy-subrc NE 0 OR ld_not_active = abap_true. rs_return = zcl_al30_util=>fill_return( iv_type = 'E' iv_number = '030' iv_message_v1 = iv_exit_class ). ELSE. * Segundo se mira si tiene la interface exit ls_impl-clsname = iv_exit_class. ls_impl-refclsname = zif_al30_data=>cv_intf_exit. CALL FUNCTION 'SEO_IMPLEMENTG_EXISTENCE_CHECK' EXPORTING impkey = ls_impl IMPORTING deleted = ld_deleted EXCEPTIONS class_not_existing = 1 not_specified = 2 not_existing = 3 is_inheritance = 4 is_comprising = 5 inconsistent = 6 OTHERS = 7. IF ld_deleted = abap_true OR sy-subrc NE 0. rs_return = zcl_al30_util=>fill_return( iv_type = 'E' iv_number = '031' iv_message_v1 = zif_al30_data=>cv_intf_exit ). ENDIF. ENDIF. ENDMETHOD. METHOD check_view_ddic. DATA ld_mainflag TYPE dd02v-mainflag. DATA ls_dd02v TYPE dd02v. DATA lt_dd03p TYPE TABLE OF dd03p. FIELD-SYMBOLS <ls_dd03p> TYPE dd03p. CLEAR: e_return, e_text_view. * Verificacion similar que se hace cuando se crea un diálogo de actualizacion. Que esta * en el include: MSVIMF35 form: get_ddic_info_tabl. TRY. CALL METHOD read_single_view_ddic EXPORTING iv_name_view = iv_name_view IMPORTING es_dd02v = ls_dd02v et_dd03p = lt_dd03p. CATCH zcx_al30 . e_return = zcl_al30_util=>fill_return( iv_type = 'E' iv_number = '013' iv_message_v1 = iv_name_view ). EXIT. ENDTRY. e_text_view = ls_dd02v-ddtext. " Texto del objeto ** Verifico que en la tabla no tenga campos de tipo string * READ TABLE lt_dd03p TRANSPORTING NO FIELDS WITH KEY datatype = 'STRG'. * IF sy-subrc = 0. * e_return = zcl_al30_util=>fill_return( iv_type = 'E' iv_number = '002' iv_message_v1 = iv_name_view ). * * ELSE. * Verifico que la tabla tenga el flag de actualización permitida IF ls_dd02v-mainflag = 'N'. " No permitido. e_return = zcl_al30_util=>fill_return( iv_type = 'E' iv_number = '003' iv_message_v1 = iv_name_view ). ENDIF. * ENDIF. ENDMETHOD. METHOD check_view_insert. DATA ls_view TYPE zal30_t_view. * Primero chequeo que la vista no exista ya SELECT SINGLE * INTO ls_view FROM zal30_t_view WHERE tabname = iv_name_view. IF sy-subrc NE 0. * Después lanzo los chequeos de la vista/tabla del diccionario CALL METHOD check_view_ddic EXPORTING iv_name_view = iv_name_view IMPORTING e_return = es_return e_text_view = ev_text_view. ELSE. es_return = zcl_al30_util=>fill_return( iv_type = 'E' iv_number = '009' iv_message_v1 = iv_name_view ). ENDIF. ENDMETHOD. METHOD check_view_read. DATA ls_view TYPE zal30_t_view. * Primero chequeo que la vista no exista ya SELECT SINGLE * INTO ls_view FROM zal30_t_view WHERE tabname = iv_name_view. IF sy-subrc = 0. * Después lanzo los chequeos de la vista/tabla del diccionario CALL METHOD check_view_ddic EXPORTING iv_name_view = iv_name_view IMPORTING e_return = es_return e_text_view = ev_text_view. ELSE. es_return = zcl_al30_util=>fill_return( iv_type = 'E' iv_number = '001' iv_message_v1 = iv_name_view ). ENDIF. ENDMETHOD. METHOD delete_view. CLEAR rs_return. * Borro los datos principales de la vista DELETE FROM zal30_t_view WHERE tabname = iv_name_view. IF sy-subrc = 0. DELETE FROM zal30_t_fields WHERE tabname = iv_name_view. IF sy-subrc = 0. " Los textos no se controla si va bien o va mal porque puede que no tenga datos, si todos los campos tienen el campo de origen " del texto con el valor diccionario. DELETE FROM zal30_t_fieldst WHERE tabname = iv_name_view. COMMIT WORK AND WAIT. rs_return = zcl_al30_util=>fill_return( iv_type = 'S' iv_number = '008' iv_message_v1 = iv_name_view ). ELSE. ROLLBACK WORK. rs_return = zcl_al30_util=>fill_return( iv_type = 'E' iv_number = '007' iv_message_v1 = iv_name_view ). ENDIF. ELSE. rs_return = zcl_al30_util=>fill_return( iv_type = 'E' iv_number = '006' iv_message_v1 = iv_name_view ). ENDIF. ENDMETHOD. METHOD fill_default_values_fields. cs_fields-source_text = zif_al30_data=>cs_source_text-dictionary. IF cs_fields-tech = abap_false. " Los campos técnicos no se mostrarán en la pantalla selección cs_fields-sel_screen = abap_true. ENDIF. ENDMETHOD. METHOD fill_default_values_view. " Si el parámetro de valores por defecto esta informado los usaré para informar la estructura de la vista IF iv_use_default_values = abap_true. cs_view = CORRESPONDING #( is_default_values ). ELSE. cs_view-auth_user = abap_false. " El acceso a la tabla se validará por usuario cs_view-change_log = abap_true. " Se guardará log de cambios en las modificaciones ENDIF. ENDMETHOD. METHOD get_fields_view_ddic. DATA ls_fields LIKE LINE OF et_fields. DATA ls_fields_text LIKE LINE OF et_fields_text. FIELD-SYMBOLS <ls_dd03p> TYPE dd03p. CLEAR: es_dd02v, et_fields, et_fields_text, et_fields_ddic. * Leo la informacion de los campos IF iv_all_language = abap_true. CALL METHOD read_view_ddic_all_lang EXPORTING iv_name_view = iv_name_view iv_langu = iv_langu IMPORTING es_dd02v = es_dd02v et_dd03p = et_fields_ddic et_dd05m = et_foreign_key_ddic. ELSE. CALL METHOD read_single_view_ddic EXPORTING iv_name_view = iv_name_view iv_langu = iv_langu IMPORTING es_dd02v = es_dd02v et_dd03p = et_fields_ddic et_dd05m = et_foreign_key_ddic. ENDIF. IF et_fields_ddic IS INITIAL. RAISE EXCEPTION TYPE zcx_al30 EXPORTING textid = zcx_al30=>view_dont_exist. ENDIF. * Y los adapto al formato de las tablas de la aplicaicon. * Leo los campos y los voy pasando a una tabla interna que después se * pasará a la tabla de diccionario LOOP AT et_fields_ddic ASSIGNING <ls_dd03p>. " Sin lenguaje no se añade a la tabla de textos. Eso ocurre cuando hay idiomas configurados en el sistema pero " no se ha cargado su libreria de textos. Sin ese idioma luego se producen errores al grabar. IF <ls_dd03p>-ddlanguage IS NOT INITIAL. MOVE-CORRESPONDING <ls_dd03p> TO ls_fields_text. ls_fields_text-spras = <ls_dd03p>-ddlanguage. ls_fields_text-pos_ddic = <ls_dd03p>-position. APPEND ls_fields_text TO et_fields_text. CLEAR ls_fields_text. ENDIF. " En la tabla de campos solo aparecerá una vez READ TABLE et_fields TRANSPORTING NO FIELDS WITH KEY fieldname = <ls_dd03p>-fieldname. IF sy-subrc NE 0. MOVE-CORRESPONDING <ls_dd03p> TO ls_fields. * El campo de posición es importante para saber el orden posterior de los campos. Ya que sin este * campo la lectura de los campos se hace de manera desordenada y la lectura de datos no son correctas ls_fields-pos_ddic = <ls_dd03p>-position. * Me guardo si el campo es clave, ya que lo usaré para evitar que los campos sean editables. ls_fields-key_ddic = <ls_dd03p>-keyflag. * El campo mandante lo pongo por defecto como campo "técnico" IF <ls_dd03p>-rollname = 'MANDT'. ls_fields-tech = abap_true. ENDIF. " Si se esta procesando un campo que es un char de una posición y además tiene dominio, miro si ese campo " es sensible a ser un checkbox IF <ls_dd03p>-datatype = 'CHAR' AND <ls_dd03p>-leng = 1 AND <ls_dd03p>-rollname IS NOT INITIAL. ls_fields-checkbox = is_field_checkbox( <ls_dd03p>-rollname ). ENDIF. APPEND ls_fields TO et_fields. CLEAR ls_fields. ENDIF. ENDLOOP. " Se buscará y se incluirán los campos de la tabla de texto asociada a la tabla obtenida IF iv_add_texttable = abap_true. get_texttable_view( EXPORTING iv_name_view = iv_name_view iv_langu = iv_langu iv_all_language = iv_all_language IMPORTING ev_texttable = ev_texttable et_fields = DATA(lt_textttable_fields) et_fields_text = DATA(lt_texttable_fields_text) et_fields_ddic = DATA(lt_texttable_ddic) ). " Se devuelven todos los campos del diccionario de la tabla de textos INSERT LINES OF lt_texttable_ddic INTO TABLE et_fields_ddic. " Numero de campos que hay en la tabla principal. Porque el campo de los textos comenzará en la posición + 1. DESCRIBE TABLE et_fields LINES DATA(lv_num_fields). lv_num_fields = lv_num_fields + 1. LOOP AT lt_textttable_fields ASSIGNING FIELD-SYMBOL(<ls_fields>). DATA(lv_add_field) = abap_true. " Los campos clave de la tabla de textos no se pueden añadir para evitar duplicados, salvo el del idioma que es necesario para " validaciones y orden de transporte IF <ls_fields>-key_ddic = abap_true. READ TABLE lt_texttable_ddic TRANSPORTING NO FIELDS WITH KEY fieldname = <ls_fields>-fieldname datatype = 'LANG'. IF sy-subrc = 0. <ls_fields>-lang_texttable = abap_true. " Se marca que es el campo de idioma ELSE. lv_add_field = abap_false. " El campo no se añade " Se borra el campo de la tabla de textos porque no se tiene que procesar. DELETE lt_texttable_fields_text WHERE fieldname = <ls_fields>-fieldname. ENDIF. ENDIF. IF lv_add_field = abap_true. <ls_fields>-tabname = iv_name_view. " La tabla será la principal <ls_fields>-pos_ddic = lv_num_fields. " Posición nueva <ls_fields>-field_texttable = abap_true. " Campo de la tabla de texto INSERT <ls_fields> INTO TABLE et_fields. lv_num_fields = lv_num_fields + 1. " Se añaden los textos LOOP AT lt_texttable_fields_text ASSIGNING FIELD-SYMBOL(<ls_fields_text>) WHERE fieldname = <ls_fields>-fieldname. <ls_fields_text>-tabname = iv_name_view. <ls_fields_text>-pos_ddic = <ls_fields>-pos_ddic. INSERT <ls_fields_text> INTO TABLE et_fields_text. ENDLOOP. ENDIF. ENDLOOP. ENDIF. " Se orden los campos por su posición SORT et_fields_text BY pos_ddic. SORT et_fields BY pos_ddic. ENDMETHOD. METHOD get_logon_languages. CLEAR et_lang. IF mt_logon_lang IS INITIAL. SELECT t002t~sprsl t002t~sptxt INTO TABLE mt_logon_lang FROM t002t JOIN t002c ON t002t~sprsl = t002c~spras WHERE t002t~spras = iv_langu AND t002c~lainst = abap_true ORDER BY t002t~sptxt. ENDIF. et_lang = mt_logon_lang. et_r_lang = VALUE #( FOR <ls_logon_lang> IN mt_logon_lang ( sign = 'I' option = 'EQ' low = <ls_logon_lang>-lang ) ). ENDMETHOD. METHOD get_texttable_view. DATA lv_tabname TYPE tabname. DATA lv_texttable TYPE tabname. CLEAR: ev_texttable, et_fields, et_fields_text. lv_tabname = iv_name_view. CALL FUNCTION 'DDUT_TEXTTABLE_GET' EXPORTING tabname = lv_tabname IMPORTING texttable = lv_texttable. ev_texttable = lv_texttable. IF ev_texttable IS NOT INITIAL. TRY. get_fields_view_ddic( EXPORTING iv_name_view = ev_texttable iv_langu = iv_langu iv_all_language = iv_all_language IMPORTING et_fields = et_fields et_fields_text = et_fields_text et_fields_ddic = et_fields_ddic ). CATCH zcx_al30. ENDTRY. ENDIF. ENDMETHOD. METHOD insert_view. CLEAR: et_fields, es_return, et_fields_ddic, et_fields_text. * En la creación solo se recuperarán los campos, los textos no se recuperán porque por defecto se tomarán * del diccionario de datos TRY. CALL METHOD get_fields_view_ddic EXPORTING iv_name_view = iv_name_view iv_add_texttable = abap_true iv_all_language = abap_true IMPORTING et_fields = et_fields et_fields_text = et_fields_text et_fields_ddic = et_fields_ddic ev_texttable = es_view-texttable. CATCH zcx_al30 . es_return = zcl_al30_util=>fill_return( iv_type = 'E' iv_number = '013' iv_message_v1 = iv_name_view ). EXIT. ENDTRY. " Nota IRB: Es importante que primero se rellen los posibles valores por defecto. El motivo es que " la estructura de valores por defecto es la misma que la tabla y el nombre del campo de la vista estará en blanco " y se perderá en el camino. * Valores por defecto en la cabecera fill_default_values_view( EXPORTING is_default_values = is_default_values iv_use_default_values = iv_use_default_values CHANGING cs_view = es_view ). * Pongo el nombre de la vista a la estructura principal de la vista es_view-tabname = iv_name_view. * Por defecto los campos de la vista su texto se tomará del diccionario LOOP AT et_fields ASSIGNING FIELD-SYMBOL(<ls_fields>). fill_default_values_fields( CHANGING cs_fields = <ls_fields> ). ENDLOOP. * Finalmente grabo la vista. es_return = save_view( EXPORTING is_view = es_view it_fields = et_fields it_fields_text = et_fields_text ). ENDMETHOD. METHOD is_field_checkbox. rv_result = abap_false. " Se recupera los valores del dominio asociado al alemento de datos DATA(lt_values) = CAST cl_abap_elemdescr( cl_abap_typedescr=>describe_by_name( iv_rollname ) )->get_ddic_fixed_values( ). IF lines( lt_values ) = 2. " Tiene que tener dos valores para el ' ' y 'X'. " Para el false o el no tanto el campo low como el high ha de estar en blanco. Nota, como los campos tienen nombre esopecial para SAP " hay que ponerlos de esa manera para que funcione. READ TABLE lt_values TRANSPORTING NO FIELDS WITH KEY ('LOW') = space ('HIGH') = space. IF sy-subrc = 0. " El true o si tiene que tener el campo low una X y el high en blanco. READ TABLE lt_values TRANSPORTING NO FIELDS WITH KEY ('LOW') = 'X' ('HIGH') = space. IF sy-subrc = 0. rv_result = abap_true. ENDIF. ENDIF. ENDIF. ENDMETHOD. METHOD read_data_element_all_lang. CLEAR et_info. get_logon_languages( IMPORTING et_lang = DATA(lt_lang) ). LOOP AT lt_lang ASSIGNING FIELD-SYMBOL(<ls_lang>). TRY. read_single_data_element( EXPORTING iv_rollname = iv_rollname iv_langu = <ls_lang>-lang IMPORTING es_info = DATA(ls_info) ). INSERT ls_info INTO TABLE et_info. CATCH zcx_al30. ENDTRY. ENDLOOP. " Si al final de la búsqueda no existen datos en ningun idioma se lanza la excepción que el " elemento de datos no existe IF et_info IS INITIAL. RAISE EXCEPTION TYPE zcx_al30 EXPORTING textid = zcx_al30=>data_element_not_exist. ENDIF. ENDMETHOD. METHOD read_single_data_element. CLEAR: es_info. CALL METHOD cl_abap_typedescr=>describe_by_name( EXPORTING p_name = iv_rollname RECEIVING p_descr_ref = DATA(lo_ref) EXCEPTIONS type_not_found = 1 OTHERS = 2 ). IF sy-subrc <> 0. RAISE EXCEPTION TYPE zcx_al30 EXPORTING textid = zcx_al30=>data_element_not_exist. ELSE. DATA(lo_rollname) = CAST cl_abap_elemdescr( lo_ref ). es_info = lo_rollname->get_ddic_field( p_langu = iv_langu ). es_info-langu = iv_langu. ENDIF. ENDMETHOD. METHOD read_single_view_ddic. DATA lv_name TYPE ddobjname . CLEAR: es_dd02v, et_dd03p, et_dd05m. lv_name = iv_name_view. * Leo los campos de la tabla CALL FUNCTION 'DDIF_TABL_GET' EXPORTING name = lv_name state = 'A' " Active version langu = iv_langu IMPORTING dd02v_wa = es_dd02v TABLES dd03p_tab = et_dd03p[] dd05m_tab = et_dd05m[] EXCEPTIONS illegal_input = 1 OTHERS = 2. IF sy-subrc NE 0 OR et_dd03p IS INITIAL. RAISE EXCEPTION TYPE zcx_al30 EXPORTING textid = zcx_al30=>view_dont_exist. ELSE. " Pongo el campo idioma siempre porque si no esta traducido no se informa. Y es necesario para el resto de procesos. LOOP AT et_dd03p ASSIGNING FIELD-SYMBOL(<ls_dd03p>). <ls_dd03p>-ddlanguage = iv_langu. ENDLOOP. * Funcion para leer vistas: DD_VIEW_GET " Si es una vista la descripción que se recupera no es correcta. IF es_dd02v-tabclass = 'VIEW'. SELECT SINGLE ddtext INTO es_dd02v-ddtext FROM dd25t WHERE viewname = lv_name AND ddlanguage = iv_langu. ENDIF. ENDIF. ENDMETHOD. METHOD read_text_view. CLEAR et_fields_text. " IF iv_all_language = abap_true. " Se obtienen todos los idiomas de logon get_logon_languages( IMPORTING et_r_lang = DATA(lt_r_lang) ). ELSE. INSERT VALUE #( sign = 'I' option = 'EQ' low = iv_langu ) INTO TABLE lt_r_lang. ENDIF. SELECT * INTO CORRESPONDING FIELDS OF TABLE et_fields_text FROM zal30_t_fieldst WHERE spras IN lt_r_lang AND tabname = iv_name_view. ENDMETHOD. METHOD read_view. DATA ls_return TYPE bapiret2. CLEAR: es_return, es_view, et_fields, et_fields_text, et_fields_ddic. CLEAR: mt_fields, ms_view, mt_fields_text, mt_fields_ddic. * Primero busco si existe la apliacion SELECT SINGLE * INTO ms_view FROM zal30_t_view WHERE tabname = iv_name_view. IF sy-subrc = 0. * Busco la informacion de los campos SELECT * INTO CORRESPONDING FIELDS OF TABLE mt_fields FROM zal30_t_fields WHERE tabname = iv_name_view. " Lectura de los textos en todos los idioma de logon read_text_view( EXPORTING iv_name_view = iv_name_view iv_all_language = iv_all_language iv_langu = iv_langu IMPORTING et_fields_text = mt_fields_text ). " Lectura de los campos del diccionario. IF iv_read_ddic = abap_true. TRY. get_fields_view_ddic( EXPORTING iv_name_view = iv_name_view iv_langu = iv_langu iv_add_texttable = abap_true iv_all_language = iv_all_language IMPORTING es_dd02v = DATA(ls_dd02v) et_fields_ddic = mt_fields_ddic et_foreign_key_ddic = mt_foreign_key_ddic ). CATCH zcx_al30. ENDTRY. ENDIF. ev_text_view = ls_dd02v-ddtext. " Texto de la tabla " Se completan los textos en base a los datos del diccionario adjust_fields_view( EXPORTING it_fields_ddic = mt_fields_ddic CHANGING ct_fields = mt_fields ct_fields_text = mt_fields_text ). " Se orden los campos por su posición SORT mt_fields_text BY pos_ddic. SORT mt_fields BY pos_ddic. " Solo se devuelven los campos solicitados IF et_fields IS SUPPLIED. et_fields = mt_fields. ENDIF. IF et_fields_text IS SUPPLIED. et_fields_text = mt_fields_text. ENDIF. IF es_view IS SUPPLIED. es_view = ms_view. ENDIF. IF et_fields_ddic IS SUPPLIED. et_fields_ddic = mt_fields_ddic. ENDIF. IF et_foreign_key_ddic IS SUPPLIED. et_foreign_key_ddic = mt_foreign_key_ddic. ENDIF. ELSE. es_return = zcl_al30_util=>fill_return( iv_type = 'E' iv_number = '001' iv_message_v1 = iv_name_view ). ENDIF. ENDMETHOD. METHOD read_view_ddic_all_lang. CLEAR: es_dd02v, et_dd03p, et_dd05m. * Se obtiene todos los idioma de logon get_logon_languages( IMPORTING et_lang = DATA(lt_lang) ). LOOP AT lt_lang ASSIGNING FIELD-SYMBOL(<ls_lang>). TRY. read_single_view_ddic( EXPORTING iv_name_view = iv_name_view iv_langu = <ls_lang>-lang IMPORTING es_dd02v = DATA(ls_dd02v) et_dd03p = DATA(lt_dd03p) et_dd05m = DATA(lt_dd05m) ). " Los datos de cabecera pongo el idioma de logon. De esta manera el nombre de la tabla saldrá en el idioma de conexion. " Hago lo mismo para las claves externas de la tabla. IF <ls_lang>-lang = iv_langu. es_dd02v = ls_dd02v. et_dd05m = lt_dd05m. ENDIF. INSERT LINES OF lt_dd03p INTO TABLE et_dd03p. CATCH zcx_al30. ENDTRY. ENDLOOP. ENDMETHOD. METHOD save_view. DATA lt_fields_text TYPE zif_al30_data=>tt_fields_text_view. * Solo se guardarán los textos de aquellos campos que cuyo origen del texto no sea diccionario LOOP AT it_fields ASSIGNING FIELD-SYMBOL(<ls_fields>) WHERE source_text = zif_al30_data=>cs_source_text-manual. LOOP AT it_fields_text ASSIGNING FIELD-SYMBOL(<ls_fields_text>) WHERE fieldname = <ls_fields>-fieldname. INSERT <ls_fields_text> INTO TABLE lt_fields_text. ENDLOOP. ENDLOOP.. * Grabo los datos de la vista TRY. save_view_ddic( is_view = is_view it_fields = it_fields it_fields_text = lt_fields_text ). rs_return = zcl_al30_util=>fill_return( iv_type = 'S' iv_number = '005' iv_message_v1 = is_view-tabname ). CATCH zcx_al30 . rs_return = zcl_al30_util=>fill_return( iv_type = 'S' iv_number = '037' iv_message_v1 = is_view-tabname ). ENDTRY. ENDMETHOD. METHOD save_view_ddic. DATA lt_fields_ddic TYPE STANDARD TABLE OF zal30_t_fields. DATA lt_fieldst_ddic TYPE STANDARD TABLE OF zal30_t_fieldst. * Se borra los campos previos de la tabla ya sé puede ser que no sean los mismos, ni en cantidad ni en nombre DELETE FROM zal30_t_fields WHERE tabname = is_view-tabname. DELETE FROM zal30_t_fieldst WHERE tabname = is_view-tabname. " Se convierte las tablas de entrada al formato de tabla de diccionario. lt_fields_ddic = CORRESPONDING #( it_fields ). lt_fieldst_ddic = CORRESPONDING #( it_fields_text ). * Añado los campos MODIFY zal30_t_fields FROM TABLE lt_fields_ddic. IF sy-subrc = 0. * Los textos solo se informán si la tabla esta rellena. Puede no estarlo porque los textos se tomán del diccionario IF lt_fieldst_ddic IS NOT INITIAL. MODIFY zal30_t_fieldst FROM TABLE lt_fieldst_ddic. ENDIF. IF sy-subrc = 0. MODIFY zal30_t_view FROM is_view. IF sy-subrc = 0. COMMIT WORK AND WAIT. ELSE. ROLLBACK WORK. RAISE EXCEPTION TYPE zcx_al30 EXPORTING textid = zcx_al30=>error_save_view. ENDIF. ELSE. ROLLBACK WORK. RAISE EXCEPTION TYPE zcx_al30 EXPORTING textid = zcx_al30=>error_save_view. ENDIF. ELSE. RAISE EXCEPTION TYPE zcx_al30 EXPORTING textid = zcx_al30=>error_save_view. ENDIF. ENDMETHOD. METHOD transport_view. DATA lt_view TYPE STANDARD TABLE OF zal30_t_view. DATA lt_fields_ddic TYPE STANDARD TABLE OF zal30_t_fields. DATA lt_fieldst_ddic TYPE STANDARD TABLE OF zal30_t_fieldst. CLEAR es_return. " Datos cabecera INSERT is_view INTO TABLE lt_view. zcl_al30_util=>values_itab_2_transport_order( EXPORTING it_values = lt_view iv_tabname = 'ZAL30_T_VIEW' IMPORTING es_return = es_return CHANGING cv_order = cv_order ). IF es_return IS INITIAL OR es_return-type NE zif_al30_data=>cs_msg_type-error. " Se convierte las tablas de entrada al formato de tabla de diccionario. lt_fields_ddic = CORRESPONDING #( it_fields_view ). " Solo se guardan los textos de los campos que se quiere el texto manual IF it_fields_text_view IS NOT INITIAL. LOOP AT lt_fields_ddic ASSIGNING FIELD-SYMBOL(<ls_fields_ddic>) WHERE source_text = zif_al30_data=>cs_source_text-manual. LOOP AT it_fields_text_view ASSIGNING FIELD-SYMBOL(<ls_fields_text_view>) WHERE fieldname = <ls_fields_ddic>-fieldname. DATA(ls_fieldst_ddic) = CORRESPONDING zal30_t_fieldst( <ls_fields_text_view> ). INSERT ls_fieldst_ddic INTO TABLE lt_fieldst_ddic. ENDLOOP. ENDLOOP. ENDIF. * Campos de la vista zcl_al30_util=>values_itab_2_transport_order( EXPORTING it_values = lt_fields_ddic iv_tabname = 'ZAL30_T_FIELDS' IMPORTING es_return = es_return CHANGING cv_order = cv_order ). IF es_return IS INITIAL OR es_return-type NE zif_al30_data=>cs_msg_type-error. IF lt_fieldst_ddic IS NOT INITIAL. zcl_al30_util=>values_itab_2_transport_order( EXPORTING it_values = lt_fieldst_ddic iv_tabname = 'ZAL30_T_FIELDST' IMPORTING es_return = es_return CHANGING cv_order = cv_order ). ENDIF. ENDIF. ENDIF. ENDMETHOD. ENDCLASS.`;