ABAPCONFIGSO 10

Programa Principal

  1. REPORT zini_001.
  2.  
  3. TABLES: sscrfields.  "<-- Para los botones en el PF-STATUS
  4.  
  5. PARAMETERS: p_script TYPE thead-tdname OBLIGATORY.
  6.  
  7. SELECTION-SCREEN FUNCTION KEY 1.
  8. SELECTION-SCREEN FUNCTION KEY 2.
  9. SELECTION-SCREEN FUNCTION KEY 3.
  10. SELECTION-SCREEN FUNCTION KEY 4.
  11. SELECTION-SCREEN FUNCTION KEY 5.
  12.  
  13. INCLUDE ZINI_XX_CONFIG_FILES.
  14.  
  15. AT SELECTION-SCREEN ON VALUE-REQUEST FOR p_script.
  16.   PERFORM f4_Script.
  17.  
  18. AT SELECTION-SCREEN.
  19.   PERFORM eve_start_of_selection.
  20.  
  21. INITIALIZATION.
  22.   PERFORM eve_initialization.
  23.  
  24. END-OF-SELECTION.
  25.  
  26.   PERFORM sample_use.
  27.   PERFORM editor.      "<-- Obtenemos la configuracion P_CONFIG_DATA para el CONSTRUCTOR
  28.  
  29.  
  30. FORM f4_script.
  31.   DATA: it_return TYPE STANDARD TABLE OF ddshretval.
  32. *--[ Soporte al POPUP
  33.   TYPES: BEGIN OF ty_f4,
  34.            tdname  TYPE tdobname,
  35.            tdtitle TYPE tdtitle,
  36.          END OF ty_f4.
  37.   DATA:
  38.     t_data_system TYPE STANDARD TABLE OF ty_f4,
  39.     l_data_system LIKE LINE OF t_data_system.
  40.  
  41.   SELECT * FROM stxh INTO CORRESPONDING FIELDS OF TABLE t_data_system
  42.     WHERE tdobject  = zini_cl_config_files=>c_object
  43.       AND tdid      = zini_cl_config_files=>c_id
  44.       AND tdspras   = zini_cl_config_files=>c_spras
  45.       AND tdmacode2 = zini_cl_config_files=>c_tag.
  46.  
  47.   CALL FUNCTION 'F4IF_INT_TABLE_VALUE_REQUEST'
  48.     EXPORTING
  49.       retfield        = 'TDNAME'
  50.       value_org       = 'S'
  51.       window_title    = ''
  52.     TABLES
  53.       value_tab       = t_data_system
  54.       return_tab      = it_return
  55.     EXCEPTIONS
  56.       parameter_error = 1
  57.       no_values_found = 2
  58.       OTHERS          = 3.
  59.   IF sy-subrc NE 0 OR lines( it_return ) = 0.
  60.     EXIT.
  61.   ENDIF.
  62.   p_script = it_return[ 1 ]-fieldval.
  63. ENDFORM.
  64.  
  65. FORM eve_start_of_selection.
  66.   CASE sscrfields-ucomm.
  67.     WHEN 'FC01'. PERFORM data_transport.
  68.   ENDCASE.
  69. ENDFORM.
  70.  
  71. FORM data_transport.
  72.   DATA(l_orden) = CONV e070-trkorr( '' ).
  73.  
  74.   CALL FUNCTION 'TR_F4_REQUESTS'
  75.     EXPORTING
  76.       iv_username             = sy-uname
  77.       iv_via_selection_screen = 'X'
  78.     IMPORTING
  79.       ev_selected_request     = l_orden
  80.     EXCEPTIONS
  81.       OTHERS                  = 1.
  82.  
  83.   CHECK sy-subrc EQ 0 AND l_orden IS NOT INITIAL.
  84.   SELECT MAX( as4pos ) INTO @DATA(l_max) FROM e071 WHERE trkorr = @l_orden.
  85.  
  86.   CHECK sy-subrc EQ 0.
  87.   l_max += 1.
  88.   DATA(l_071) = VALUE e071( trkorr = l_orden
  89.                             as4pos = l_max
  90.                             pgmid  = 'R3TR'
  91.                             object = zini_cl_config_files=>c_object
  92.                             obj_name = |{ zini_cl_config_files=>c_object },{ p_script },{ zini_cl_config_files=>c_id },{ zini_cl_config_files=>c_spras }|
  93.                            ).
  94.   INSERT e071 FROM l_071.
  95.   MESSAGE s398(00) WITH 'Configuracion anyadida a orden' l_orden '' '' ##no_text.
  96.  
  97. ENDFORM.
  98.  
  99. FORM eve_initialization.
  100.   sscrfields-functxt_01 = |@7Q@ Transportar| ##no_text .
  101. ENDFORM.
  102.  
  103. FORM editor.
  104.   DATA(my_ini) = NEW zini_cl_config_files( p_ini_name    = CONV string( p_script ) ).
  105.   my_ini->Edit( ).
  106.  
  107.   LOOP AT my_ini->get_script( ) INTO DATA(ls).
  108.     CHECK ls NP '*##<--END OF CONFIG*' ##no_text .
  109.     WRITE: / ls.
  110.   ENDLOOP.
  111. ENDFORM.
  112.  
  113. FORM sample_use.
  114.  
  115.   IF sy-subrc EQ 69.
  116. *--[ Solo por motivos de saber como funciona
  117.     DATA: r_rango TYPE RANGE OF sy-subrc.
  118.  
  119. *--[ Ejemplo de USO
  120. *--[ Creamos el objeto y la configuracion inicial
  121.     DATA(my_ini) = NEW zini_cl_config_files( p_ini_name    = 'ZINI_CONFIG_TEST'
  122.                                              p_config_data = CONV string(
  123.     cl_abap_char_utilities=>cr_lf && '# Ejemplo de como crear un fichero de configuracion               ' && ##no_text
  124.     cl_abap_char_utilities=>cr_lf && '# El caracter parrilla indica comentario a principio de linea     ' && ##no_text
  125.     cl_abap_char_utilities=>cr_lf && '# y en al final de la definicion de un parametro                  ' && ##no_text
  126.     cl_abap_char_utilities=>cr_lf && '# Limite de caracteres por definicion por defecto 132             ' && ##no_text
  127.     cl_abap_char_utilities=>cr_lf && '                                                                  ' && ##no_text
  128.     cl_abap_char_utilities=>cr_lf && '[INCLUDES]                                                        ' && ##no_text
  129.     cl_abap_char_utilities=>cr_lf && 'INCLUDE ZINI_CONFIG_TEST02   #Permite incluir otros configs       ' && ##no_text
  130.     cl_abap_char_utilities=>cr_lf && '                                                                  ' && ##no_text
  131.     cl_abap_char_utilities=>cr_lf && '[DATA-CORE]                                                       ' && ##no_text
  132.     cl_abap_char_utilities=>cr_lf && '     #Ejemplo de comentario a mitad de linea                      ' && ##no_text
  133.     cl_abap_char_utilities=>cr_lf && '   ; Otro ejemplo                                                 ' && ##no_text
  134.     cl_abap_char_utilities=>cr_lf && '                                                                  ' && ##no_text
  135.     cl_abap_char_utilities=>cr_lf && '#param 001     # Este parometro esta desactivado                  ' && ##no_text
  136.     cl_abap_char_utilities=>cr_lf && ';newparam Hello World   # Este tambien                            ' && ##no_text
  137.     cl_abap_char_utilities=>cr_lf && '                                                                  ' && ##no_text
  138.     cl_abap_char_utilities=>cr_lf && 'param_001    X             # Aqui va un comentario                ' && ##no_text
  139.     cl_abap_char_utilities=>cr_lf && 'directory        /tmp/data/                                       ' && ##no_text
  140.     cl_abap_char_utilities=>cr_lf && '                                                                  ' && ##no_text
  141.     cl_abap_char_utilities=>cr_lf && '#param 002                                                        ' && ##no_text
  142.     cl_abap_char_utilities=>cr_lf && 'DATUM 20241201  #Aqui otro comentario                             ' && ##no_text
  143.     cl_abap_char_utilities=>cr_lf && '                                                                  ' && ##no_text
  144.     cl_abap_char_utilities=>cr_lf && '[DATA-RANGES]                                                     ' && ##no_text
  145.     cl_abap_char_utilities=>cr_lf && '# Ejemplo de TABLA Interna o RANGOS                               ' && ##no_text
  146.     cl_abap_char_utilities=>cr_lf && 'R_RANGO_01 I EQ 1200                                              ' && ##no_text
  147.     cl_abap_char_utilities=>cr_lf && 'R_RANGO_01 I EQ 2500                                              ' && ##no_text
  148.     cl_abap_char_utilities=>cr_lf && 'R_RANGO_01 I EQ 2600                                              ' && ##no_text
  149.     cl_abap_char_utilities=>cr_lf && '                                                                  ' && ##no_text
  150.     cl_abap_char_utilities=>cr_lf ) ).
  151.  
  152. *--[ Opcion LOW Level
  153.     DATA(t_tab) = CONV zini_cl_config_files=>TY_valores( my_ini->get_data_all( ) ).
  154.     TRY. DATA(l_datum) = CONV datum( t_tab[ var_u = 'DATUM' ]-val ). CATCH cx_root. CLEAR sy-subrc. ENDTRY.
  155.  
  156. *--[ Opcion HIGH Level
  157.     my_ini->get_data( EXPORTING p_var_u = to_upper( 'DATUM' ) CHANGING e_data = sy-lisel ). "<-- Ejemplo de valor unico
  158.     my_ini->get_data_R( EXPORTING p_var_u = to_upper( 'R_RANGO_01' ) CHANGING e_data = r_rango ). "<-- Ejemplo de tabla
  159.  
  160. *  my_ini->Edit( ). " Por si queremos llamar a la edicion
  161.   ENDIF.
  162.  
  163. ENDFORM.

Include Principal: ZINI_XX_CONFIG_FILES.

  1.  
  2. CLASS zini_cl_config_files DEFINITION FINAL.
  3. * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
  4. *--[ Clase que se encarga de leer textos estandar via SO10
  5. *--[ Y tratarlos como ficheros de configuracion estilo LINUX
  6. *--[ Es un inicio
  7. *--[
  8. *--[ Para transportar los textos, bastara crear una entrada via SE09
  9. *--[ En la orden con los siguientes datos:
  10. *--[
  11. *--[ R3TR TEXT  TEXT,[AQUI_VA_EL_OBJETO],ST,S
  12. *--[
  13. *--[ O ejecutar el programa RSTXTRAN
  14. *--[
  15.   PUBLIC SECTION.
  16.  
  17.     CONSTANTS: c_version            TYPE string VALUE 'v01.03' ##no_text ##NEEDED,
  18. *--[ 01.01 - 20241220 + Creacion de la utilidad
  19. *--[ 01.02 - 20241230 + Se anyade el editor de inicializacion desde F8
  20. *--[ 01.03 - 20250107 + Anyadido sample config
  21. *--[                  + Seccion tecnica separada
  22.  
  23.                c_error_no_ini_found TYPE sysubrc VALUE 1,
  24.                c_error_save_text    TYPE sysubrc VALUE 2,
  25.                c_error_params       TYPE sysubrc VALUE 3,
  26.                c_error_var_no_found TYPE sysubrc VALUE 4,
  27.                c_error_crear_init   TYPE sysubrc VALUE 5,
  28.  
  29.                c_TAG                TYPE char4    VALUE 'ZINI' ##no_text,
  30.                c_spras              TYPE spras    VALUE 'S' ##no_text,
  31.                c_id                 TYPE tdid     VALUE 'ST' ##no_text,
  32.                c_object             TYPE tdobject VALUE 'TEXT' ##no_text.
  33.  
  34.     TYPES: BEGIN OF ty_valor,
  35.              var   TYPE char20,
  36.              var_u TYPE char20,
  37.              pos   TYPE numc3,
  38.              val   TYPE c LENGTH 112,
  39.            END OF ty_valor,
  40.  
  41.            TY_valores TYPE STANDARD TABLE OF ty_valor WITH NON-UNIQUE DEFAULT KEY.
  42.  
  43.     DATA: G_subrc           TYPE sysubrc.
  44.  
  45.     METHODS:
  46.       constructor IMPORTING p_ini_name    TYPE string
  47.                             p_config_data TYPE string OPTIONAL,    "Inicializa y Lee
  48.       edit,                                            " Editor de configuracion
  49.       set  IMPORTING i_config TYPE string,             " Inicializa el fichero de configuracion
  50.       get_data IMPORTING p_VAR   TYPE string OPTIONAL  " Recupera una variable del fichero
  51.                          p_VAR_U TYPE string OPTIONAL
  52.                          p_POS   TYPE string OPTIONAL
  53.                CHANGING  E_data  TYPE any,
  54.  
  55.       get_script RETURNING VALUE(R_script) TYPE string_t,
  56.  
  57.       get_data_R IMPORTING p_VAR   TYPE string OPTIONAL  " Recupera una variable RANGO del fichero
  58.                            p_VAR_U TYPE string OPTIONAL
  59.                            p_POS   TYPE string OPTIONAL
  60.                  CHANGING  E_data  TYPE table,
  61.  
  62.       get_DATA_all RETURNING VALUE(t_val) TYPE TY_valores. "Devuelve la tabla de valores entera!
  63.  
  64.   PRIVATE SECTION.
  65.  
  66.     CONSTANTS:
  67.       c_FORM     TYPE tdform   VALUE 'SYSTEM' ##no_text,
  68.       c_include  TYPE char20   VALUE 'INCLUDE' ##no_text,
  69.       c_title    TYPE char20   VALUE 'Config Script:' ##no_text,
  70.       c_begin_of TYPE char24   VALUE '#-->BEGIN OF CONFIG FILE' ##no_text,
  71.       c_end_of   TYPE char24   VALUE '#<--END OF CONFIG FILE' ##no_text.
  72.  
  73.     TYPES: BEGIN OF ty_ini,
  74.              ini_name   TYPE string,
  75.              ini_data   TYPE STANDARD TABLE OF string WITH NON-UNIQUE DEFAULT KEY,
  76.              INI_lines  TYPE STANDARD TABLE OF tline WITH NON-UNIQUE DEFAULT KEY,
  77.              tab_head   TYPE tlinet,
  78.              tab_tail   TYPE tlinet,
  79.              ini_header TYPE thead,
  80.            END OF ty_ini.
  81.  
  82.     DATA: t_data    TYPE  ty_ini,
  83.           t_valores TYPE STANDARD TABLE OF ty_Valor.
  84.  
  85.     METHODS:
  86.       get_data_where IMPORTING p_VAR          TYPE string OPTIONAL  " <-- Se encarga de preparar la busqueda
  87.                                p_VAR_U        TYPE string OPTIONAL
  88.                                p_POS          TYPE string OPTIONAL
  89.                      RETURNING VALUE(R_where) TYPE string,
  90.       save,            " Graba un configuracion
  91.       get,             " Lee la configuracion
  92.       get_ini RETURNING VALUE(t_ini)  TYPE tlinet,
  93.       sanitize.        " Purifica el fichero de configuracion
  94. ENDCLASS.
  95.  
  96. CLASS zini_cl_config_files IMPLEMENTATION.
  97.  
  98.   METHOD get_script.
  99.     DATA: ss       TYPE string,
  100.           cm(1023).
  101.     LOOP AT t_data-ini_data INTO DATA(l_s).
  102.       AT FIRST.
  103.         APPEND |DATA(my_ini) = NEW zini_cl_config_files( p_ini_name    = '{ t_data-ini_name }'| TO r_script ##no_text.
  104.         APPEND |                                         p_config_data = CONV string( | TO r_script ##no_text.
  105.       ENDAT.
  106.       ss = |cl_abap_char_utilities=>cr_lf && '{ l_s }| ##no_text.
  107.      IF strlen( ss ) < 100.
  108.        cm = ss. " Chapuza para posicionarse
  109.        cm+100(4) = |' &&|.
  110.         ss = cm.
  111.       ELSE.
  112.         ss = |{ ss }' &&|.
  113.      ENDIF.
  114.      APPEND ss TO r_Script.
  115.      AT LAST.
  116.        APPEND |cl_abap_char_utilities=>cr_lf ) ).| TO r_script ##no_text.
  117.      ENDAT.
  118.    ENDLOOP.
  119.  ENDMETHOD.
  120.  
  121.  METHOD get_data_all.
  122.    t_val = T_valores.
  123.  ENDMETHOD.
  124.  
  125.  METHOD get_data_where.
  126.  
  127.    CLEAR r_where.
  128.    IF p_var IS INITIAL AND p_var_u IS INITIAL.
  129.      g_subrc = c_error_params.
  130.      EXIT.
  131.    ENDIF.
  132.    IF p_VAR IS NOT INITIAL. R_where = 'VAR = p_var' ##no_text. ENDIF.
  133.    IF p_var_u IS NOT INITIAL. IF R_where IS INITIAL. R_where = 'VAR_U = p_var_u' ##no_text.  ELSE. R_where = |{ R_where } and VAR_U = p_var_u| ##no_text.  ENDIF. ENDIF.
  134.    IF p_pos IS NOT INITIAL. R_where = |{ R_where } and POS = P_POS| ##no_text. ENDIF.
  135.  
  136.  ENDMETHOD.
  137.  
  138.  METHOD get_data.
  139.    CLEAR e_data.
  140.    DATA(l_where) = CONV string( get_data_where( EXPORTING p_var = p_var p_var_u = p_var_u p_pos = p_pos ) ).
  141.    IF l_where IS INITIAL.
  142.      g_subrc = c_error_params.
  143.    ELSE.
  144.  
  145.      LOOP AT t_valores INTO DATA(ax) WHERE (l_where).
  146.        E_data = ax-val.
  147.        EXIT.
  148.      ENDLOOP.
  149.      IF sy-subrc NE 0.
  150.        g_subrc = c_error_var_no_found.
  151.      ENDIF.
  152.    ENDIF.
  153.  ENDMETHOD.
  154.  
  155.  METHOD get_data_R.
  156. *--[ Ejemplo de como se puede pasar una tabla interna desde la configuracion
  157.    FREE e_data.
  158.    DATA(l_where) = CONV string( get_data_where( EXPORTING p_var = p_var p_var_u = p_var_u p_pos = p_pos ) ).
  159.    IF l_where IS INITIAL.
  160.      g_subrc = c_error_params.
  161.      EXIT.
  162.    ENDIF.
  163.  
  164. *--[ Creamos la WA
  165.    DATA lin TYPE REF TO data.
  166.    CREATE DATA lin LIKE LINE OF E_data.
  167.    ASSIGN lin->* TO FIELD-SYMBOL(<bX>).
  168.  
  169.    LOOP AT t_valores INTO DATA(ax) WHERE (l_where).
  170.      ASSIGN ('<BX>-SIGN')   TO FIELD-SYMBOL(<a1>).
  171.      ASSIGN ('<BX>-OPTION') TO FIELD-SYMBOL(<a2>).
  172.      ASSIGN ('<BX>-LOW')    TO FIELD-SYMBOL(<a3>).
  173.      ASSIGN ('<BX>-HIGH')   TO FIELD-SYMBOL(<a4>).
  174. *--[ Intenamos evitar problemas de formato
  175.      SPLIT ax-val AT ' ' INTO DATA(l_a) DATA(l_b) DATA(l_c) DATA(l_d).
  176.      <a1> = l_a. <a2> = l_b. <a3> = l_c. <a4> = l_d.
  177.      APPEND INITIAL LINE TO e_data ASSIGNING FIELD-SYMBOL(<cx>).
  178.      MOVE-CORRESPONDING <bx> TO <cx>.
  179.  
  180.    ENDLOOP.
  181.    IF sy-subrc NE 0.
  182.      g_subrc = c_error_var_no_found.
  183.    ENDIF.
  184.  ENDMETHOD.
  185.  
  186.  METHOD sanitize.
  187.  
  188.    CHECK lines( t_data-ini_data ) > 0.
  189.    DATA(t_tmp) = T_data-ini_data[].
  190.    REFRESH t_valores.
  191.    LOOP AT t_tmp ASSIGNING FIELD-SYMBOL(<ax>).
  192.      <ax> = shift_left( <ax> ).
  193. *--[ Eliminamos comentarios y bloques
  194.      IF <ax> CP '##*' OR <ax> CP ';*' OR <ax> IS INITIAL OR <ax> CP '[*'.
  195.        DELETE t_tmp INDEX sy-tabix.
  196.        CONTINUE.
  197.      ELSE.
  198. *--[ Borramos los comentarios en medio del codigo
  199.        DATA(l_pos) = find( val = <ax> sub = '#' ).
  200.        IF l_pos > 0.
  201.          <ax> = substring( val = <ax> off = 0 len = l_pos ).
  202.        ENDIF.
  203.  
  204.        SPLIT <ax> AT ' ' INTO DATA(l_valor_dir)   "<-- Variable
  205.                               DATA(l_valor_data). "<-- Contenido de la variable
  206.        l_valor_data = shift_left( l_valor_data ).
  207.        if to_upper( l_valor_data ) cp 'SY-*' or to_upper( l_valor_data ) cp 'SYST-*'.
  208.           assign (l_valor_data) to FIELD-SYMBOL(<al>).
  209.           if sy-subrc eq 0.
  210.              l_valor_data = <al>.
  211.           endif.
  212.        endif.
  213.        IF to_upper( l_valor_dir ) = c_include AND l_valor_data IS NOT INITIAL.
  214.          DATA(l_new) = NEW zini_cl_config_files( l_valor_data ).
  215.          IF l_new->g_subrc IS INITIAL.
  216.            APPEND LINES OF l_new->get_DATA_all( ) TO t_valores.
  217.          ENDIF.
  218.        ELSE.
  219.  
  220.          t_valores = VALUE #( BASE t_valores ( var   = l_valor_dir
  221.                                                var_u = to_upper( l_valor_dir )
  222.                                                pos   = 0
  223.                                                val   = l_valor_data ) ).
  224.        ENDIF.
  225.      ENDIF.
  226.    ENDLOOP.
  227.    LOOP AT t_valores INTO DATA(l_val) GROUP BY l_val-var_u.
  228.  
  229.      DATA(l_index) = CONV numc3( 0 ).
  230. *--[ Esto esta pensado para multiples valores, por ejemplo, pseudo tablas
  231.      LOOP AT t_valores ASSIGNING FIELD-SYMBOL(<bx>) WHERE var_u = l_val-var_u.
  232.        <bx>-pos = l_index = l_index + 1.
  233.      ENDLOOP.
  234.  
  235.    ENDLOOP.
  236.  
  237.  ENDMETHOD.
  238.  
  239.  METHOD get.
  240.  
  241.    CLEAR T_data-ini_header.
  242.  
  243.    CALL FUNCTION 'READ_TEXT'
  244.      EXPORTING
  245.        id                      = c_id
  246.        language                = c_spras
  247.        name                    = CONV tdobname( T_data-ini_name )
  248.        object                  = c_object
  249.      IMPORTING
  250.        header                  = T_data-ini_header
  251.      TABLES
  252.        lines                   = T_data-ini_lines
  253.      EXCEPTIONS
  254.        id                      = 1
  255.        language                = 2
  256.        name                    = 3
  257.        not_found               = 4
  258.        object                  = 5
  259.        reference_check         = 6
  260.        wrong_access_to_archive = 7
  261.        OTHERS                  = 8.
  262.    IF sy-subrc <> 0.
  263.      g_subrc = c_error_no_ini_found.
  264. *--[ Posiblemente se tenga que crear uno nuevo
  265.      T_data-ini_header = VALUE #( tdobject   = c_object
  266.                                   tdname     = CONV tdobname( T_data-ini_name )
  267.                                   tdid       = c_id
  268.                                   tdspras    = c_spras
  269.                                   tdtitle    = |{ c_title } { T_data-ini_name }| ##no_text
  270.                                   tdform     = c_form
  271.                                   tdmacode2  = c_TAG
  272.                                   tdlinesize = 132
  273.                                  ).
  274.  
  275.      T_data-ini_lines = get_ini( ).
  276.  
  277.    ENDIF.
  278.    LOOP AT T_data-ini_lines INTO DATA(ax).
  279.      AT FIRST. REFRESH: T_data-ini_data, T_data-tab_head, t_data-tab_TAIL. ENDAT.
  280.      IF ax-tdline CP |#{ c_begin_of }*|. APPEND ax TO t_data-tab_head. CONTINUE. ENDIF.
  281.      IF ax-tdline CP |#{ c_end_of }*|. APPEND ax TO t_data-tab_TAIL. CONTINUE. ENDIF.
  282.      T_data-ini_data = VALUE #( BASE T_data-ini_data ( CONV string( ax-tdline ) ) ).
  283.    ENDLOOP.
  284.    sanitize( ).
  285.  
  286.  ENDMETHOD.
  287.  
  288.  METHOD get_ini.
  289.    REFRESH t_ini.
  290.    t_ini = VALUE #( BASE t_ini tdformat = '*'
  291.                       ( tdline = |{ c_begin_of } { sy-datum } { sy-uzeit } { sy-uname }| )
  292.                       ( tdline = '# This is a sample config file ')                   ##no_text
  293.                       ( tdline = '# Use # or ; at first column for comment lines' )   ##no_text
  294.                       ( tdline = '' )                                                 ##no_text
  295.                       ( tdline = '# Use this format to assign values &#8203;&#8203;to variables' )  ##no_text
  296.                       ( tdline = 'PARAMETER VALUE' )                                  ##no_text
  297.                       ( tdline = '' )                                                 ##no_text
  298.                       ( tdline = '#Sections and subsections are allowed, but they')   ##no_text
  299.                       ( tdline = '#are more for aesthetics of the configuration.' )   ##no_text
  300.                       ( tdline = '[Seccion_001]' )                                    ##no_text
  301.                       ( tdline = '' )                                                 ##no_text
  302.                       ( tdline = '# Use this format for tables-ranges' )              ##no_text
  303.                       ( tdline = 'MY_DATUM I GE 20250101    # This is a comment' )    ##no_text
  304.                       ( tdline = 'MY_DATUM I LE 20250101    # and this too' )         ##no_text
  305.                       ( tdline = '' )                                                 ##no_text
  306.                       ( tdline = |# For further information, view { sy-repid }| )     ##no_text
  307.                       ).
  308.  ENDMETHOD.
  309.  
  310.  METHOD set.
  311.    CLEAR g_subrc.
  312.  
  313.    CHECK i_config IS NOT INITIAL. "<-- No Config No SAVE
  314.  
  315.    CALL FUNCTION 'DELETE_TEXT'
  316.      EXPORTING
  317.        id              = c_id
  318.        language        = c_spras
  319.        name            = CONV tdobname( T_data-ini_name )
  320.        object          = c_object
  321.        savemode_direct = abap_true
  322.      EXCEPTIONS
  323.        not_found       = 1
  324.        OTHERS          = 2.
  325.    IF sy-subrc NE 0. CLEAR sy-subrc. ENDIF.
  326.    REFRESH: t_data-ini_data, t_data-INI_lines.
  327.    CLEAR T_data-ini_header .
  328.  
  329.    SPLIT i_config AT cl_abap_char_utilities=>cr_lf INTO TABLE t_data-ini_data.
  330.  
  331. *    LOOP AT p_data INTO DATA(l_data).
  332. *      t_data-ini_data = VALUE #( BASE t_data-ini_data ( l_data ) ).
  333. *    ENDLOOP.
  334.    T_data-ini_header = VALUE #( tdobject   = c_object
  335.                                 tdname     = CONV tdobname( T_data-ini_name )
  336.                                 tdid       = c_id
  337.                                 tdspras    = c_spras
  338.                                 tdtitle    = T_data-ini_name
  339.                                 tdform     = c_form
  340.                                 tdlinesize = 132
  341.                                ).
  342.    save( ).
  343.    IF g_subrc IS INITIAL.
  344.      get( ).
  345.    ELSE.
  346.      g_subrc = c_error_crear_init.
  347.    ENDIF.
  348.  
  349.  ENDMETHOD.
  350.  
  351.  METHOD save.
  352.    IF lines( t_data-ini_data ) > 0.
  353.  
  354.      LOOP AT T_data-ini_data INTO DATA(ax).
  355.        AT FIRST. REFRESH T_data-ini_lines. APPEND LINES OF t_data-tab_head TO t_data-ini_lines. ENDAT.
  356.        T_data-ini_lines = VALUE #( BASE T_data-ini_lines ( tdformat = '*' tdline = CONV string( ax ) ) ).
  357.  
  358.        AT LAST.
  359.          APPEND LINES OF t_data-tab_tail TO t_data-ini_lines.
  360.          T_data-ini_lines = VALUE #( BASE T_data-ini_lines ( tdformat = '*' tdline = |{ c_end_of } { sy-datum } { sy-uzeit } { sy-uname }| ) ).
  361.          CALL FUNCTION 'CONVERT_STREAM_TO_ITF_TEXT'
  362.            EXPORTING
  363.              lf          = abap_true
  364.              language    = c_spras
  365.              iv_lw       = 132
  366.            TABLES
  367.              text_stream = T_data-ini_data
  368.              itf_text    = T_data-ini_lines.
  369.          T_data-ini_header-tdmacode2 = c_TAG .
  370.          IF T_data-ini_header-tdtitle = T_data-ini_header-tdname.
  371.            T_data-ini_header-tdtitle = |{ c_title } { T_data-ini_header-tdname }|.
  372.          ENDIF.
  373.          CALL FUNCTION 'SAVE_TEXT'
  374.            EXPORTING
  375.              header          = T_data-ini_header
  376.              savemode_direct = abap_true
  377.            TABLES
  378.              lines           = T_data-ini_lines
  379.            EXCEPTIONS
  380.              id              = 1
  381.              language        = 2
  382.              name            = 3
  383.              object          = 4
  384.              OTHERS          = 5.
  385.          IF sy-subrc NE 0.
  386.            MESSAGE s398(00) WITH 'Error al grabar configuracion' T_data-ini_header-tdname '' '' DISPLAY LIKE 'E' ##no_text.
  387.          ENDIF.
  388.        ENDAT.
  389.      ENDLOOP.
  390.    ELSE.
  391.      sy-subrc = 4.
  392.    ENDIF.
  393.  
  394.    CHECK  sy-subrc <> 0.
  395.    g_subrc = c_error_save_text.
  396.  
  397.  ENDMETHOD.
  398.  
  399.  METHOD edit.
  400.    CALL FUNCTION 'TERM_CONTROL_EDIT'
  401.      EXPORTING
  402.        titel          = T_data-ini_header-tdtitle
  403.        langu          = c_spras
  404.      TABLES
  405.        textlines      = T_data-ini_data
  406.      EXCEPTIONS
  407.        user_cancelled = 1
  408.        OTHERS         = 2.
  409.    check sy-subrc EQ 0.
  410.      if lines( T_data-ini_data ) = 0.
  411.         append '# There is nothing to see here.' to T_data-ini_data.
  412.         append '# Please disperse.' to T_data-ini_data.
  413.      endif.
  414.      save( ).
  415.  
  416.  ENDMETHOD.
  417.  
  418.  METHOD constructor.
  419.    T_data-ini_name = p_ini_name.
  420.    get( ).
  421.    IF g_subrc = c_error_no_ini_found AND p_config_data IS NOT INITIAL.
  422.      set( p_config_data ).
  423.    ENDIF.
  424.  ENDMETHOD.
  425.  
  426. ENDCLASS.