ABAPALV Editor

Clase y edirot que permite incorporar la configuración de las columnas y botones de un ALV. De esta forma, todo los que son los textos de las columnas, ordenación, ocultación, etcétera, recae sobre un tema de parametrización en vez de programación. Funciona con la clase CL_GUI_ALV_GRID y con la cl_salv_table (menos potente que el anterior). También permite ocultar botones estándar del ALV.

Hay que crear tres tabla de diccionario (ver el include #ZXX_I_CL_FCAT más abajo) que permite un almacenamiento permanente.

ZXX_PRG_TOOL_ALV

  1. report  ZXX_PRG_TOOL_ALV.
  2.  
  3. INCLUDE ZXX_I_TOOL_ALV_TOP.
  4. include ZXX_I_CL_FCAT. "<-- Clase de ejemplo para leer catálogo
  5. INCLUDE ZXX_I_TOOL_ALV_CLS.
  6. INCLUDE ZXX_I_TOOL_ALV_SEL.
  7. INCLUDE ZXX_I_TOOL_ALV_EVE.
  8. INCLUDE ZXX_I_TOOL_ALV_FRM.

INCLUDE ZXX_I_TOOL_ALV_TOP.

  1.  
  2. CLASS lcl_event_handler DEFINITION DEFERRED.
  3. CLASS zcl_fieldcatalog DEFINITION DEFERRED.
  4.  
  5.  
  6. CONSTANTS: c_alv_main TYPE i VALUE 1,
  7.            c_alv_det  TYPE i VALUE 2,
  8.            c_alv_fc   TYPE i VALUE 3.
  9.  
  10. TYPES: BEGIN OF ty_01,
  11.          bup       TYPE char6,
  12.          bdo       TYPE char6,
  13. *         INCLUDE STRUCTURE zcl_fieldcatalog=>ty_talv. "<-- Aquí se debe poner la tabla de BD
  14. *TYPES:
  15. *--[ Cuando se asiente en el proyecto, esto debería ser cambiado por
  16. *--[ el include de más arriba a la tabla de diccionario de proyecto.
  17. *--[ Una lástima no poder hacer referencia al typo de la clase
  18.         mandt        TYPE mandt,
  19.         prog       TYPE sycprog,
  20.         nalv       TYPE numc4,
  21.         fieldname        TYPE lvc_fname,
  22.         col_pos    TYPE lvc_colpos,
  23.         do_sum     TYPE lvc_dosum,
  24.         no_out     TYPE lvc_noout,
  25.         tech       TYPE lvc_tech,
  26.         edit       TYPE lvc_edit,
  27.         icon       TYPE lvc_icon,
  28.         checkbox   TYPE lvc_checkb,
  29.         outputlen        TYPE lvc_outlen,
  30.         hotspot    TYPE lvc_hotspt,
  31.         decimals_o TYPE lvc_decmls,
  32. *--[ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^  Elimnar cuando se asiente en DDIC
  33.  
  34.          seltext    TYPE lvc_txt,
  35.          coltext    TYPE lvc_txtcol,
  36.          scrtext_l  TYPE scrtext_l,
  37.          scrtext_m  TYPE scrtext_m,
  38.          scrtext_s  TYPE scrtext_s,
  39.        END OF ty_01,
  40.  
  41.        BEGIN OF ty_alv,
  42.          id      TYPE i,
  43.          cc      TYPE REF TO cl_gui_custom_container,
  44.          cm      TYPE scrfname,
  45.          grid    TYPE REF TO cl_gui_alv_grid,
  46.          layout  TYPE lvc_s_layo,
  47.          variant TYPE disvariant,
  48.          fcat    TYPE lvc_t_fcat,
  49.          split01 TYPE REF TO cl_gui_splitter_container,
  50.          split02 TYPE REF TO cl_gui_splitter_container,
  51.          html    TYPE REF TO cl_gui_html_viewer,
  52.          event   TYPE REF TO lcl_event_handler,
  53.          toolbar TYPE ui_functions,
  54.        END OF ty_alv,
  55.  
  56.        BEGIN OF ty_fcat,
  57.          flag  TYPE xfeld,
  58.          name  TYPE string,
  59.          value TYPE string,
  60.        END OF ty_fcat.
  61.  
  62. DATA:
  63.   t_tab_01       TYPE STANDARD TABLE OF ty_01,
  64.   t_tab_02       TYPE STANDARD TABLE OF ty_fcat,
  65.  
  66. *--[ Tablas de BackUp
  67.   index_rows     TYPE lvc_t_row,
  68.   t_fcat_01      TYPE lvc_t_fcat,
  69.   g_error        TYPE sy-subrc,
  70.   g_titulo       TYPE char255,
  71.   g_save         TYPE xfeld,
  72.   g_okcode       TYPE sy-ucomm,
  73.   t_alv          TYPE STANDARD TABLE OF ty_alv,
  74.   g_alv          LIKE LINE OF t_alv,
  75.   t_fcode        TYPE TABLE OF sy-ucomm,
  76.  
  77. *--[ End Of DATA
  78.   end_of_data(1).
  79.  
  80. DATA: g_fcat TYPE REF TO zcl_fieldcatalog.
  81.  
  82. FIELD-SYMBOLS: <t_demo> TYPE STANDARD TABLE.

include ZXX_I_CL_FCAT.

  1.  
  2. CLASS zcl_fieldcatalog DEFINITION.
  3.  
  4.   PUBLIC SECTION.
  5.     CONSTANTS: c_version            TYPE string  VALUE 'v01.00',
  6.                c_alv_not_found      TYPE sysubrc VALUE 1,
  7.                c_alv_nalv_not_found TYPE sysubrc VALUE 2,
  8.  
  9. *--[ Las tablas de parametrización del proyecto
  10.                c_tab_alv            TYPE string  VALUE 'ZAG3_TALV',
  11.                c_tab_alv_text       TYPE string  VALUE 'ZAG3_TALVT',
  12.                c_tab_alv_tool       TYPE string  VALUE 'ZAG3_TALV_TOOL'.
  13.  
  14.  
  15.     TYPES:
  16.  
  17. * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
  18. *--[ Sample Tables
  19.       BEGIN OF ty_talv,
  20.         mandt        TYPE mandt,
  21.         prog       TYPE sycprog,
  22.         nalv       TYPE numc4,
  23.         fieldname        TYPE lvc_fname,
  24.         col_pos    TYPE lvc_colpos,
  25.         do_sum     TYPE lvc_dosum,
  26.         no_out     TYPE lvc_noout,
  27.         tech       TYPE lvc_tech,
  28.         edit       TYPE lvc_edit,
  29.         icon       TYPE lvc_icon,
  30.         checkbox   TYPE lvc_checkb,
  31.         outputlen        TYPE lvc_outlen,
  32.         hotspot    TYPE lvc_hotspt,
  33.         decimals_o TYPE lvc_decmls,
  34.       END   OF ty_talv,
  35.  
  36.       BEGIN OF ty_talvt,
  37.         mandt       TYPE mandt,
  38.         prog      TYPE sycprog,
  39.         nalv      TYPE numc4,
  40.         fieldname       TYPE lvc_fname,
  41.         langu       TYPE spras,
  42.         seltext   TYPE lvc_txt,
  43.         coltext   TYPE lvc_txtcol,
  44.         scrtext_l       TYPE scrtext_l,
  45.         scrtext_m       TYPE scrtext_m,
  46.         scrtext_s       TYPE scrtext_s,
  47.       END OF ty_talvt,
  48.  
  49.       BEGIN OF ty_alv_tool,
  50.         mandt   TYPE mandt,
  51.         prog  TYPE sycprog,
  52.         nalv  TYPE numc4,
  53.         func  TYPE ui_func,
  54.       END OF ty_alv_tool,
  55.  
  56.       BEGIN OF ty_alv,
  57.         nalv    TYPE numc4,
  58.         alv     TYPE STANDARD TABLE OF ty_talv WITH DEFAULT KEY,
  59.         alvt    TYPE STANDARD TABLE OF ty_talvt WITH DEFAULT KEY,
  60.         alvtool TYPE STANDARD TABLE OF ty_alv_tool WITH DEFAULT KEY,
  61.       END OF ty_alv.
  62.  
  63.     TYPES: BEGIN OF ty_tool,
  64.              var TYPE string,
  65.              val TYPE string,
  66.            END OF ty_tool.
  67.  
  68.     DATA: t_tool TYPE STANDARD TABLE OF ty_tool.
  69.  
  70.     DATA: g_error   TYPE i,
  71.           g_program TYPE sycprog,
  72.           t_alv     TYPE STANDARD TABLE OF ty_alv.
  73.  
  74.     METHODS:
  75.       constructor IMPORTING i_program TYPE sycprog,
  76.  
  77.       set_fcat IMPORTING i_nalv TYPE numc4
  78.                          i_fcat TYPE lvc_s_fcat,
  79.  
  80.       merge_fcat IMPORTING i_nalv TYPE numc4
  81.                  CHANGING  i_fcat TYPE lvc_t_fcat,
  82.  
  83.       merge_fcat_factory IMPORTING i_nalv TYPE numc4
  84.                                    i_alv  TYPE REF TO cl_salv_table,
  85.  
  86.       merge_toolbar IMPORTING i_nalv    TYPE numc4
  87.                     CHANGING  i_toolbar TYPE ui_functions.
  88.  
  89.   PRIVATE SECTION.
  90.  
  91.     METHODS:
  92.       get_fc.
  93.  
  94. ENDCLASS.
  95.  
  96.  
  97. CLASS zcl_fieldcatalog IMPLEMENTATION.
  98.  
  99.   METHOD merge_fcat_factory.
  100. *i_nalv TYPE numc4
  101. *i_alv  type REF TO cl_salv_table,
  102.     DATA: t_fcat_01 TYPE lvc_t_fcat.
  103.  
  104.     t_fcat_01 = cl_salv_controller_metadata=>get_lvc_fieldcatalog(
  105.                             r_columns      = i_alv->get_columns( )
  106.                            r_aggregations  = i_alv->get_aggregations( ) ).
  107.  
  108.     TRY.
  109.         DATA(ALV) = t_alv[ nalv = i_nalv ].
  110.       CATCH cx_root.
  111. *--[ Como no existe, lo creamos.
  112.         LOOP AT t_fcat_01 ASSIGNING FIELD-SYMBOL(<rx>).
  113.           set_fcat( i_nalv = i_nalv i_fcat = <rx> ).
  114.         ENDLOOP.
  115.         exit.
  116.     ENDTRY.
  117.  
  118.     loop at alv-alv into data(ax).
  119.       at first.
  120.           DATA(o_columns) = i_alv->get_columns( ).
  121.       endat.
  122.       DATA(o_column) = o_columns->get_column( ax-fieldname ).
  123.  
  124.       data(bx) = alv-alvt[ nalv = i_nalv fieldname = ax-fieldname ].
  125.  
  126.       o_column->set_long_text( bX-scrtext_l ).
  127.       o_column->set_medium_text( bx-scrtext_m ).
  128.       o_column->set_short_text( bx-scrtext_s ).
  129.       o_column->set_technical( ax-tech ).
  130.       o_column->SET_VISIBLE( COND #( WHEN ax-no_out is INITIAL THEN abap_true else abap_false ) ).
  131.  
  132.     endloop.
  133.  
  134.   ENDMETHOD.
  135.  
  136.   METHOD get_fc.
  137.     DATA(bx) = cl_abap_objectdescr=>describe_by_name( p_name = 'CL_GUI_ALV_GRID' ).
  138.     DATA(ax) = NEW cl_gui_custom_container( container_name = 'ROMEOMUSTDIE' ).
  139.     DATA(cx) = NEW cl_gui_alv_grid( i_parent = ax ).
  140.     FIELD-SYMBOLS: <bx> TYPE table.
  141.     ASSIGN ('bx->attributes') TO <bx>.
  142.  
  143.     LOOP AT <bx> ASSIGNING FIELD-SYMBOL(<bl>).
  144.       ASSIGN ('<bl>-name') TO FIELD-SYMBOL(<cl>).
  145.       CHECK <cl> CP 'MC_FC_*'.
  146.       APPEND INITIAL LINE TO t_tool ASSIGNING FIELD-SYMBOL(<tool>).
  147.       <tool>-var = <cl>.
  148.       DATA(dl) = |CL_GUI_ALV_GRID=>{ <cl> }|.
  149.       ASSIGN (dl) TO FIELD-SYMBOL(<dh>).
  150.       <tool>-val = <dh>.
  151.     ENDLOOP.
  152.   ENDMETHOD.
  153.  
  154.   METHOD constructor.
  155.     g_program = i_program.
  156.     DATA: ax TYPE STANDARD TABLE OF ty_talv.
  157.  
  158.     SELECT * FROM (c_tab_alv)
  159.       INTO CORRESPONDING FIELDS OF TABLE @ax
  160.       WHERE  prog = @i_program
  161.       ORDER BY nalv ASCENDING, col_pos ASCENDING.
  162.  
  163.     IF sy-subrc NE 0.
  164.       g_error = c_alv_not_found.
  165.     ELSE.
  166.       LOOP AT ax INTO DATA(bx) GROUP BY ( nalv = bx-nalv ) REFERENCE INTO DATA(grupo).
  167.  
  168.         APPEND INITIAL LINE TO t_alv ASSIGNING FIELD-SYMBOL(<ax>).
  169.  
  170.         LOOP AT GROUP grupo ASSIGNING FIELD-SYMBOL(<cx>).
  171.           <ax>-nalv = <cx>-nalv.
  172.           APPEND <cx> TO <ax>-alv.
  173.  
  174.         ENDLOOP.
  175.  
  176.       ENDLOOP.
  177. *--[ Excluímos botones
  178.  
  179.       LOOP AT t_alv ASSIGNING FIELD-SYMBOL(<ah>).
  180.         SELECT * FROM  (c_tab_alv_tool)
  181.              APPENDING CORRESPONDING FIELDS OF TABLE <ah>-alvtool
  182.                  WHERE  prog  = i_program
  183.                  AND    nalv  = <ah>-nalv.
  184.  
  185.         SELECT * FROM  (c_tab_alv_text)
  186.           APPENDING CORRESPONDING FIELDS OF TABLE <ax>-alvt
  187.                WHERE  prog       = i_program
  188.                AND    nalv       = <ah>-nalv
  189.                AND    langu      = sy-langu.
  190.  
  191.       ENDLOOP.
  192.     ENDIF.
  193.     get_fc( ).
  194.  
  195.   ENDMETHOD.
  196.  
  197.   METHOD merge_toolbar.
  198.     TRY.
  199.         DATA(alv) = t_alv[ nalv = i_nalv ].
  200.  
  201. *BREAK-POINT .
  202.         LOOP AT alv-alvtool INTO DATA(ax) WHERE nalv = i_nalv.
  203.  
  204.           DATA(ls) = |cl_gui_alv_grid=>{ ax-func }|.
  205.           ASSIGN (ls) TO FIELD-SYMBOL(<bx>).
  206.           CHECK sy-subrc EQ 0.
  207.           APPEND <bx> TO i_toolbar.
  208.  
  209.         ENDLOOP.
  210.         SORT i_toolbar.
  211.         DELETE ADJACENT DUPLICATES FROM i_toolbar.
  212.       CATCH cx_root.
  213.     ENDTRY.
  214.  
  215.   ENDMETHOD.
  216.  
  217.   METHOD merge_fcat.
  218.     TRY.
  219.         DATA(alv) = t_alv[ nalv = i_nalv ].
  220.       CATCH cx_root.
  221. *--[ Como no existe, lo creamos.
  222.         LOOP AT i_fcat ASSIGNING FIELD-SYMBOL(<rx>).
  223.           set_fcat( i_nalv = i_nalv i_fcat = <rx> ).
  224.         ENDLOOP.
  225.     ENDTRY.
  226.  
  227. *--[ Maquillamos los campos que encontramos.
  228.     LOOP AT i_fcat ASSIGNING FIELD-SYMBOL(<ax>).
  229.  
  230. *--[ Cargamos los atributos
  231.       TRY.
  232.           DATA(bx) = alv-alv[ fieldname = <ax>-fieldname ].
  233.         CATCH cx_root.
  234.           set_fcat( i_nalv = i_nalv i_fcat = <ax> ).
  235.           CONTINUE.
  236.       ENDTRY.
  237.       MOVE-CORRESPONDING bx TO <ax>.
  238.  
  239. *--[ Cargamos los textos
  240.       TRY.
  241.           DATA(cx) = alv-alvt[ fieldname = <ax>-fieldname ].
  242.         CATCH cx_root.
  243.           CONTINUE. "<-- No hay textos
  244.       ENDTRY.
  245.       MOVE-CORRESPONDING cx TO <ax>.
  246.  
  247.     ENDLOOP.
  248.  
  249.   ENDMETHOD.
  250.  
  251.   METHOD set_fcat.
  252.     DATA: ax TYPE ty_talv,
  253.           bx TYPE ty_talvt.
  254.  
  255.     MOVE-CORRESPONDING i_fcat TO: ax, bx.
  256.     ax-prog = bx-prog = g_program.
  257.     ax-nalv = bx-nalv = i_nalv.
  258.     bx-langu = sy-langu.
  259.     INSERT (c_tab_alv) FROM ax.
  260.     INSERT (c_tab_alv_text) FROM bx.
  261.  
  262.   ENDMETHOD.
  263.  
  264. ENDCLASS.
  265.  
  266. * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
  267. *--[ Como utilizarlo
  268. *data: g_fcat TYPE REF TO zcl_fieldcatalog,
  269. *
  270. *  g_fcat = NEW zcl_fieldcatalog( sy-cprog ).
  271. *  g_fcat->merge_fcat( EXPORTING i_nalv = '0001'
  272. *                                 CHANGING i_fcat = t_alv[ c_alv_main ]-fcat ).
  273. *
  274. *  g_fcat->merge_toolbar( EXPORTING i_nalv = '0001'
  275. *                         CHANGING i_toolbar = t_alv[ c_alv_main ]-toolbar ).

INCLUDE ZXX_I_TOOL_ALV_CLS.

  1. CLASS lcl_event_handler DEFINITION FINAL.
  2.   PUBLIC SECTION .
  3.  
  4.     DATA: id TYPE i.
  5.  
  6.     METHODS:
  7.  
  8.       handle_data_changed
  9.                   FOR EVENT data_changed OF cl_gui_alv_grid
  10.         IMPORTING er_data_changed,
  11.  
  12.       handle_user_command FOR EVENT user_command OF cl_gui_alv_grid
  13.         IMPORTING e_ucomm,
  14.  
  15.       handle_hotspot
  16.                   FOR EVENT hotspot_click OF cl_gui_alv_grid
  17.         IMPORTING e_row_id e_column_id,
  18.  
  19.       handle_toolbar FOR EVENT toolbar OF cl_gui_alv_grid
  20.         IMPORTING e_object. " e_interactive,
  21.  
  22. ENDCLASS.
  23.  
  24. CLASS lcl_event_handler IMPLEMENTATION.
  25.  
  26.  
  27.   method handle_hotspot.
  28.     CASE e_column_id.
  29.       when 'BUP'. perform BOT_UP using e_row_id abap_true.
  30.       when 'BDO'. perform BOT_DOWN using e_row_id abap_true.
  31.  
  32.     endcase.
  33.   endmethod.
  34.  
  35.  
  36.   METHOD handle_data_changed.
  37.  
  38.     LOOP AT er_data_changed->mt_good_cells INTO DATA(ls_good).
  39.  
  40. *      CHECK LS_GOOD-FIELDNAME CP 'VAL*'.
  41.       g_save = abap_true.
  42. *      DATA(l_campo) = ls_good-fieldname.
  43. *      l_campo+0(3) = 'USR'.
  44. *      IF ls_good-value IS INITIAL. CLEAR sy-uname. ENDIF.
  45. *      CALL METHOD er_data_changed->modify_cell
  46. *        EXPORTING
  47. *          i_row_id    = ls_good-row_id
  48. *          i_fieldname = CONV #( l_campo )
  49. *          i_value     = sy-uname.
  50.  
  51.     ENDLOOP.
  52.   ENDMETHOD.
  53.  
  54.   METHOD handle_toolbar.
  55.  
  56.     e_object->mt_toolbar = VALUE #( BASE e_object->mt_toolbar
  57.  
  58.                                           ( butn_type  = 0
  59.                                             function   = 'MC00'
  60.                                             icon       = icon_display
  61.                                             text       = 'Previsualizar'
  62.                                             quickinfo  = 'Previsializar'
  63.                                             disabled   = abap_false )
  64.  
  65.                                           ( butn_type  = 0
  66.                                             function   = 'MC01'
  67.                                             icon       = ICON_TREND_UP
  68.                                             text       = 'Subir'
  69.                                             quickinfo  = 'Subir'
  70.                                             disabled   = abap_false )
  71.  
  72.                                           ( butn_type  = 0
  73.                                             function   = 'MC02'
  74.                                             icon       = ICON_TREND_DOWN
  75.                                             text       = 'Bajar'
  76.                                             quickinfo  = 'Bajar'
  77.                                             disabled   = abap_false )
  78.                                           ).
  79.  
  80.   ENDMETHOD.
  81.  
  82.   METHOD handle_user_command .
  83.  
  84.     CASE e_ucomm.
  85.       WHEN 'MC00'. perform ALV_REFRESH.
  86.       when 'MC01'. perform BOT_ALV_UP.
  87.       when 'MC02'. perform BOT_ALV_DOWN.
  88.     ENDCASE.
  89. *
  90.   ENDMETHOD.
  91.  
  92. ENDCLASS.

INCLUDE ZXX_I_TOOL_ALV_SEL.

  1. SELECTION-SCREEN BEGIN OF BLOCK b01 WITH FRAME.
  2.  
  3. PARAMETERS: p_prog type SYCPROG,
  4.             p_nalv type NUMC4.
  5.  
  6. SELECTION-SCREEN END OF BLOCK b01.
  7.  
  8. * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
  9. *--[ Copy
  10. module pbo_XXXX output.
  11.   case sy-dynnr.
  12.     when '0100'.  perform pbo_0100.
  13.   endcase.
  14. ENDMODULE.
  15.  
  16. module pai_XXXX input.
  17.   case sy-dynnr.
  18.     when '0100'.  perform pai_0100.
  19.   endcase.
  20. ENDMODULE.

INCLUDE ZXX_I_TOOL_ALV_EVE.

  1.  
  2. AT SELECTION-SCREEN ON VALUE-REQUEST FOR p_prog.
  3.   perform eve_At_selection_Screen_FIELD using 'P_PROG' CHANGING P_PROG.
  4.  
  5. INITIALIZATION.
  6.   perform eve_initialization.
  7.  
  8. START-OF-SELECTION.
  9.   PERFORM data_load.
  10.  
  11. end-of-SELECTION.
  12.   PERFORM data_list.

INCLUDE ZXX_I_TOOL_ALV_FRM.

  1.  
  2. FORM eve_at_selection_screen_field USING p_field CHANGING p_prog.
  3.  
  4.   TYPES: BEGIN OF ty_f4,
  5.            pos  TYPE lvc_colpos,
  6.            prog TYPE sycprog,
  7.            nalv TYPE numc4,
  8.            text TYPE repti,
  9.          END OF ty_f4.
  10.   DATA: t_f4 TYPE STANDARD TABLE OF ty_f4.
  11.  
  12. *--[ Es más lento, pero evitamos tener que declarar tablas
  13. select DISTINCT prog nalv from (zcl_fieldcatalog=>c_tab_alv)
  14.   into CORRESPONDING FIELDS OF table t_f4
  15.   ORDER BY prog nalv.
  16.   loop at t_f4 ASSIGNING FIELD-SYMBOL(<ah>) where text is INITIAL.
  17.     SELECT SINGLE text into <ah>-text FROM trdirt
  18.            WHERE  name   = <ah>-prog
  19.            AND    sprsl  = sy-langu.
  20.     if sy-subrc eq 0.
  21.        modify t_f4 from <ah> TRANSPORTING text where prog = <ah>-prog and text is INITIAL.
  22.     endif.
  23.  
  24.   endloop.
  25.  
  26.   CHECK lines( t_f4 ) > 0.
  27.  
  28.   LOOP AT t_f4 ASSIGNING FIELD-SYMBOL(<ax>).  <ax>-pos = sy-tabix. ENDLOOP.
  29.  
  30.   DATA: t_return TYPE STANDARD TABLE OF ddshretval.
  31.  
  32.   CALL FUNCTION 'F4IF_INT_TABLE_VALUE_REQUEST'
  33.     EXPORTING
  34.       retfield        = 'POS'
  35.       value_org       = 'S'
  36.     TABLES
  37.       value_tab       = t_f4
  38.       return_tab      = t_return
  39.     EXCEPTIONS
  40.       parameter_error = 1
  41.       no_values_found = 2
  42.       OTHERS          = 3.
  43.   IF sy-subrc EQ 0.
  44.     TRY.
  45.         DATA(l_pos) = t_return[ 1 ]-fieldval.
  46.         p_prog = t_f4[ l_pos ]-prog.
  47.         p_nalv = t_f4[ l_pos ]-nalv.
  48.         DATA: t_dynpread TYPE STANDARD TABLE OF dynpread.
  49.  
  50.         t_dynpread = VALUE #( ( fieldname = 'P_NALV'
  51.                                 fieldvalue = p_nalv ) ).
  52.         CALL FUNCTION 'DYNP_VALUES_UPDATE'
  53.           EXPORTING
  54.             dyname               = sy-cprog "
  55.             dynumb               = '1000'
  56.           TABLES
  57.             dynpfields           = t_dynpread
  58.           EXCEPTIONS
  59.             invalid_abapworkarea = 1
  60.             invalid_dynprofield  = 2
  61.             invalid_dynproname   = 3
  62.             invalid_dynpronummer = 4
  63.             invalid_request      = 5
  64.             no_fielddescription  = 6
  65.             undefind_error       = 7
  66.             OTHERS               = 8.
  67.         IF sy-subrc <> 0.
  68. * Implement suitable error handling here
  69.         ENDIF.
  70.  
  71.       CATCH cx_root.
  72.     ENDTRY.
  73.   ENDIF.
  74.  
  75. ENDFORM.
  76.  
  77. FORM eve_initialization.
  78.   DO 5 TIMES.
  79.     DATA(nn) = CONV numc2( sy-index ).
  80.     TRY.
  81.         t_alv = VALUE #( BASE t_alv ( id                = sy-index
  82.                                       cm                = |CC_ALV_{ nn }|
  83.                                       layout-sel_mode   = 'A'
  84.                                       layout-zebra      = abap_true
  85.                                       layout-cwidth_opt = abap_true
  86.                                       variant-report    = sy-repid
  87.                                      )
  88.                        ).
  89.       CATCH cx_root.
  90.         CLEAR sy-subrc.
  91.     ENDTRY.
  92.  
  93.   ENDDO. "<-- ALV Template
  94.   g_fcat = NEW zcl_fieldcatalog( sy-cprog ).
  95. ENDFORM.
  96.  
  97. FORM data_load.
  98.  
  99. data: t_tool type STANDARD TABLE OF zcl_fieldcatalog=>ty_alv_tool,
  100.       t_text type STANDARD TABLE OF zcl_fieldcatalog=>ty_talvt.
  101.  
  102. *--[ Al ser dinámico, tengo que hacerlo sin JOIN :') :"(
  103. select * from (zcl_fieldcatalog=>c_tab_alv)
  104.   into CORRESPONDING FIELDS OF table t_tab_01
  105.   where prog = p_prog and nalv = p_nalv.
  106.  
  107. select * from (zcl_fieldcatalog=>c_tab_alv_text)
  108.   into CORRESPONDING FIELDS OF table t_text
  109.   where prog = p_prog and nalv = p_nalv and langu = sy-langu.
  110.  
  111.  
  112.   LOOP AT t_tab_01 ASSIGNING FIELD-SYMBOL(<ax>).
  113.     try.
  114.       data(bx) = t_text[ fieldname = <ax>-fieldname ].
  115.       MOVE-CORRESPONDING bx to <ax>.
  116.     catch cx_root.
  117.     endtry.
  118.     <ax>-bup = icon_trend_up.
  119.     <ax>-bdo = icon_trend_down.
  120.   ENDLOOP.
  121.  
  122.   SELECT * FROM (zcl_fieldcatalog=>c_tab_alv_tool)
  123.     INTO CORRESPONDING FIELDS OF TABLE t_tool
  124.          WHERE  prog  = p_prog
  125.          AND    nalv  = p_nalv.
  126.  
  127.   LOOP AT g_fcat->t_tool INTO DATA(al).
  128.     t_tab_02 = VALUE #( BASE t_tab_02 ( name = al-var value = al-val ) ).
  129.   ENDLOOP.
  130.  
  131.   LOOP AT t_tool INTO DATA(ax).
  132.     TRY.
  133.         t_tab_02[ name = ax-func ]-flag = abap_true.
  134.       CATCH cx_root.
  135.     ENDTRY.
  136.  
  137.   ENDLOOP.
  138.  
  139.   PERFORM data_load_demo.
  140. ENDFORM.
  141.  
  142.  
  143. FORM alv_refresh.
  144.   PERFORM data_load_demo.
  145. *    t_alv[ c_alv_det ]-fcat = ax.
  146.   t_alv[ c_alv_det ]-grid->set_frontend_fieldcatalog( t_alv[ c_alv_det ]-fcat ).
  147.   t_alv[ c_alv_det ]-grid->refresh_table_display( ).
  148. ENDFORM.
  149.  
  150. FORM data_load_demo.
  151.   DATA: t_newtable TYPE REF TO data,
  152.         t_newline  TYPE REF TO data.
  153.  
  154.   UNASSIGN <t_demo>.
  155.  
  156.   cl_salv_table=>factory( IMPORTING r_salv_table = DATA(l_alv) CHANGING t_table = t_tab_01 ).
  157.  
  158. *--[ Creamos estructura ALV
  159.   DATA(ax) = cl_salv_controller_metadata=>get_lvc_fieldcatalog(
  160.              r_columns      = l_alv->get_columns( )
  161.              r_aggregations  = l_alv->get_aggregations( ) ).
  162.   REFRESH ax. "<-- Limpiamos
  163.  
  164.   LOOP AT t_tab_01 INTO DATA(bx).
  165.     ax = VALUE #( BASE ax ( fieldname = bx-fieldname
  166.                             rollname  = 'CHAR20'
  167.                             datatype  = 'CHAR'
  168.                             inttype    = 'C'
  169.                             intlen    = 18
  170. *                           decimals  = 2
  171.                             do_sum = bx-do_sum
  172.                             no_out = bx-no_out
  173.                             tech   = bx-tech
  174.                             edit   = bx-edit
  175.                             icon     = bx-icon
  176.                             checkbox = bx-checkbox
  177.                             outputlen = bx-outputlen
  178.                             hotspot   = bx-hotspot
  179.                             reptext   = bx-seltext
  180.                             seltext   = bx-seltext
  181.                             scrtext_s = bx-scrtext_s
  182.                             scrtext_m = bx-scrtext_m
  183.                             scrtext_l = bx-scrtext_l
  184.                             col_pos   = bx-col_pos
  185.                              )
  186.                  ).
  187.     AT LAST.
  188.       CALL METHOD cl_alv_table_create=>create_dynamic_table
  189.         EXPORTING
  190.           it_fieldcatalog = ax
  191.         IMPORTING
  192.           ep_table        = t_newtable.
  193.       ASSIGN t_newtable->* TO <t_demo>.
  194.       CREATE DATA t_newline LIKE LINE OF <t_demo>.
  195.       APPEND INITIAL LINE TO <t_demo> ASSIGNING FIELD-SYMBOL(<dh>).
  196.       DATA: l_data TYPE string.
  197.       t_alv[ c_alv_det ]-fcat = ax.
  198.       LOOP AT t_tab_01 INTO DATA(cx).
  199.         DATA(l_campo) = |<DH>-{ cx-fieldname }|.
  200.         ASSIGN (l_campo) TO FIELD-SYMBOL(<l_campo>).
  201.         CALL FUNCTION 'GENERAL_GET_RANDOM_STRING'
  202.           EXPORTING
  203.             number_chars  = 128
  204.           IMPORTING
  205.             random_string = l_data.
  206.         <l_campo> = l_data.
  207.  
  208.       ENDLOOP.
  209.     ENDAT.
  210.   ENDLOOP.
  211.  
  212. ENDFORM.
  213.  
  214.  
  215. FORM data_list.
  216.   CHECK g_error IS INITIAL.
  217.   IF lines( t_tab_01 ) > 0.
  218.     CALL SCREEN '0100'.
  219.   ELSE.
  220.     MESSAGE s398(00) WITH TEXT-e01 DISPLAY LIKE 'E'.
  221.   ENDIF.
  222. ENDFORM.
  223.  
  224. FORM pbo_0100.
  225.   REFRESH t_fcode.
  226.   SET PF-STATUS 'MAIN0100' EXCLUDING t_fcode.
  227.   g_titulo = 'Editor ALV'.
  228.   SET TITLEBAR 'TIT01' WITH  TEXT-t01.
  229.   PERFORM alv_create_main.
  230. ENDFORM.
  231.  
  232. FORM alv_create_main.
  233. * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
  234. *--[ Creamos ALV_002
  235.   t_alv[ c_alv_main ]-cc      = NEW cl_gui_custom_container( container_name = t_alv[ c_alv_main ]-cm ).
  236.   t_alv[ c_alv_main ]-split01 = NEW cl_gui_splitter_container( parent = t_alv[ c_alv_main ]-cc rows = 2 columns = 1 ).
  237.  
  238.   t_alv[ c_alv_main ]-split02 = NEW cl_gui_splitter_container( parent = t_alv[ c_alv_main ]-split01->get_container( row = 1 column = 1 ) rows = 1 columns = 2 ).
  239.  
  240.   t_alv[ c_alv_main ]-grid    = NEW cl_gui_alv_grid( i_parent = t_alv[ c_alv_main ]-split02->get_container( row = 1 column = 1 ) ).
  241.   t_alv[ c_alv_det  ]-grid    = NEW cl_gui_alv_grid( i_parent = t_alv[ c_alv_main ]-split01->get_container( row = 2 column = 1 ) ).
  242.   t_alv[ c_alv_fc   ]-grid    = NEW cl_gui_alv_grid( i_parent = t_alv[ c_alv_main ]-split02->get_container( row = 1 column = 2 ) ).
  243.  
  244.   t_alv[ c_alv_main ]-split01->set_row_height( id = 1 height = 80  ).
  245.   t_alv[ c_alv_main ]-split02->set_column_width( id = 1 width = 70  ).
  246.  
  247.   t_alv[ c_alv_main ]-layout-cwidth_opt = abap_true.
  248.   t_alv[ c_alv_main ]-layout-col_opt = abap_true.
  249. *  t_alv[ c_alv_main ]-layout-stylefname = 'CELLTAB'.
  250.   t_alv[ c_alv_main ]-variant-report = sy-cprog.
  251. *  t_alv[ c_alv_main ]-variant-variant = '/DEFAULT'.
  252.   t_alv[ c_alv_main ]-variant-handle = c_alv_main.
  253.   IF lines(  t_alv[ c_alv_main ]-fcat ) = 0.
  254.     REFRESH t_fcat_01.
  255.  
  256.  
  257. *--[ Creamos el FCAT de la tabla
  258.     cl_salv_table=>factory( IMPORTING r_salv_table = DATA(l_alv) CHANGING t_table = t_tab_01 ).
  259.     t_fcat_01 = cl_salv_controller_metadata=>get_lvc_fieldcatalog(
  260.           r_columns      = l_alv->get_columns( )
  261.           r_aggregations  = l_alv->get_aggregations( ) ).
  262.  
  263.     LOOP AT t_fcat_01 ASSIGNING FIELD-SYMBOL(<f>).
  264.  
  265.       CASE <f>-fieldname.
  266.         WHEN 'BUP'.
  267.           <f>-hotspot = <f>-icon = abap_true.
  268.           <f>-scrtext_s = <f>-scrtext_m = <f>-reptext = <f>-scrtext_l = 'Subir'.
  269.           <f>-fix_column = abap_true.
  270.           <f>-key = abap_true.
  271.         WHEN 'BDO'.
  272.           <f>-hotspot = <f>-icon = abap_true.
  273.           <f>-scrtext_s = <f>-scrtext_m = <f>-reptext = <f>-scrtext_l = 'Bajar'.
  274.           <f>-fix_column = abap_true.
  275.           <f>-key = abap_true.
  276.         WHEN 'FIELDNAME' .
  277.           <f>-fix_column = abap_true.
  278.           <f>-key = abap_true.
  279.         WHEN 'PROG' OR 'NALV'. <f>-no_out = abap_true.
  280.         WHEN 'MANDT'.
  281.           <f>-no_out = abap_true.
  282.           <f>-tech   = abap_true.
  283.  
  284.  
  285.         WHEN 'COL_POS'.    <f>-no_out = abap_true.
  286.         WHEN 'DO_SUM'.     <f>-edit = abap_true. <f>-checkbox = abap_true.
  287.         WHEN 'NO_OUT'.     <f>-edit = abap_true. <f>-checkbox = abap_true.
  288.         WHEN 'TECH'.       <f>-edit = abap_true. <f>-checkbox = abap_true.
  289.         WHEN 'EDIT'.       <f>-edit = abap_true. <f>-checkbox = abap_true.
  290.         WHEN 'ICON'.       <f>-edit = abap_true. <f>-checkbox = abap_true.
  291.         WHEN 'CHECKBOX'.   <f>-edit = abap_true. <f>-checkbox = abap_true.
  292.         WHEN 'OUTPUTLEN'.  <f>-edit = abap_true.
  293.         WHEN 'HOTSPOT'.    <f>-edit = abap_true. <f>-checkbox = abap_true.
  294.         WHEN 'DECIMALS_O'. <f>-edit = abap_true.
  295.  
  296.         WHEN 'SELTEXT' OR
  297.         'COLTEXT' OR
  298.         'SCRTEXT_L' OR
  299.         'SCRTEXT_M' OR
  300.         'COL_POS' OR
  301.         'SCRTEXT_S'. <f>-edit = abap_true.
  302.  
  303.       ENDCASE.
  304.  
  305.     ENDLOOP.
  306.  
  307.     t_alv[ c_alv_main ]-fcat = t_fcat_01.
  308.   ENDIF.
  309.  
  310. *--[ FieldCatalog
  311.   REFRESH t_fcat_01.
  312.   cl_salv_table=>factory( IMPORTING r_salv_table = l_alv CHANGING t_table = t_tab_02 ).
  313.   t_fcat_01 = cl_salv_controller_metadata=>get_lvc_fieldcatalog(
  314.         r_columns      = l_alv->get_columns( )
  315.         r_aggregations  = l_alv->get_aggregations( ) ).
  316.   LOOP AT t_fcat_01 ASSIGNING <f>.
  317.  
  318.     CASE <f>-fieldname.
  319.       WHEN 'VALUE'. <f>-scrtext_s = <f>-scrtext_m = <f>-reptext = <f>-scrtext_l = 'Valor'.
  320.       WHEN 'NAME'.  <f>-scrtext_s = <f>-scrtext_m = <f>-reptext = <f>-scrtext_l = 'Nombre'.
  321.       WHEN 'FLAG'.  <f>-edit = abap_true. <f>-checkbox = abap_true.
  322.     ENDCASE.
  323.   ENDLOOP.
  324.   t_alv[ c_alv_fc ]-fcat = t_fcat_01.
  325.  
  326.   DATA(tmp_tool) =  t_alv[ c_alv_main ]-toolbar. " PUSH
  327.   PERFORM alv_remove_buttons USING c_alv_main CHANGING tmp_tool.
  328.   t_alv[ c_alv_main ]-toolbar = tmp_tool. "POP
  329.   t_alv[ c_alv_det ]-toolbar = tmp_tool. "POP
  330.   t_alv[ c_alv_fc ]-toolbar = tmp_tool. "POP
  331.  
  332. *  g_fcat->merge_toolbar( EXPORTING i_nalv = '0001'
  333. *                         CHANGING i_toolbar = t_alv[ c_alv_main ]-toolbar ).
  334. *
  335. *  g_fcat->merge_toolbar( EXPORTING i_nalv = '0002'
  336. *                         CHANGING i_toolbar = t_alv[ c_alv_det ]-toolbar ).
  337.  
  338.   t_alv[ c_alv_main ]-grid->set_table_for_first_display(
  339.     EXPORTING
  340.       i_buffer_active = abap_false
  341.       i_bypassing_buffer = abap_true
  342.  
  343.       is_variant           = t_alv[ c_alv_main ]-variant
  344.       is_layout            = t_alv[ c_alv_main ]-layout
  345.       i_save               = 'A'
  346.       it_toolbar_excluding = t_alv[ c_alv_main ]-toolbar
  347.     CHANGING
  348.       it_fieldcatalog      = t_alv[ c_alv_main ]-fcat "gt_field
  349.       it_outtab            = t_tab_01 ).
  350.  
  351.   t_alv[ c_alv_det ]-grid->set_table_for_first_display(
  352.   EXPORTING
  353.     i_buffer_active = abap_false
  354.     i_bypassing_buffer = abap_true
  355.  
  356.     is_variant           = t_alv[ c_alv_main ]-variant
  357.     is_layout            = t_alv[ c_alv_main ]-layout
  358.     i_save               = 'A'
  359.     it_toolbar_excluding = t_alv[ c_alv_det ]-toolbar
  360.   CHANGING
  361.     it_fieldcatalog      = t_alv[ c_alv_det ]-fcat "gt_field
  362.     it_outtab            = <t_demo> ).
  363.  
  364.  
  365.   t_alv[ c_alv_fc ]-grid->set_table_for_first_display(
  366.     EXPORTING
  367.       i_buffer_active = abap_false
  368.       i_bypassing_buffer = abap_true
  369.  
  370.       is_variant           = t_alv[ c_alv_main ]-variant
  371.       is_layout            = t_alv[ c_alv_main ]-layout
  372.       i_save               = 'A'
  373.       it_toolbar_excluding = t_alv[ c_alv_main ]-toolbar
  374.     CHANGING
  375.       it_fieldcatalog      = t_alv[ c_alv_fc ]-fcat "gt_field
  376.       it_outtab            = t_tab_02 ).
  377.  
  378.   t_alv[ c_alv_main ]-event = NEW lcl_event_handler( ).
  379.   t_alv[ c_alv_main ]-event->id = t_alv[ c_alv_main ]-id.
  380.   g_alv = t_alv[ c_alv_main ].
  381.  
  382.   SET HANDLER g_alv-event->handle_toolbar       FOR t_alv[ c_alv_main ]-grid.
  383.   SET HANDLER g_alv-event->handle_user_command  FOR t_alv[ c_alv_main ]-grid.
  384.   SET HANDLER g_alv-event->handle_data_changed  FOR t_alv[ c_alv_main ]-grid.
  385.   SET HANDLER g_alv-event->handle_hotspot       FOR t_alv[ c_alv_main ]-grid.
  386.  
  387.   g_alv-grid->set_toolbar_interactive( ).
  388.   g_alv-grid->set_ready_for_input( 1 ).
  389.   g_alv-grid->register_edit_event( cl_gui_alv_grid=>mc_evt_modified ).
  390.  
  391.   g_alv-grid->set_ready_for_input( i_ready_for_input = 1 ).
  392.  
  393.   g_alv = t_alv[ c_alv_fc ].
  394.   g_alv-grid->set_ready_for_input( 1 ).
  395.   g_alv-grid->set_ready_for_input( i_ready_for_input = 1 ).
  396.  
  397. ENDFORM.
  398.  
  399. FORM alv_remove_buttons USING p_alv TYPE i CHANGING t_tool TYPE ui_functions.
  400.  
  401.   REFRESH t_tool.
  402.   CASE p_alv.
  403.  
  404. * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
  405. *--[ ALV de Títulos
  406.     WHEN 99.
  407.       t_tool = VALUE #( BASE t_tool ( cl_gui_alv_grid=>mc_fg_edit     )
  408.                                     ( cl_gui_alv_grid=>mc_fg_sort     )
  409.                                     ( cl_gui_alv_grid=>mc_mb_subtot   )
  410.                                     ( cl_gui_alv_grid=>mc_mb_sum      )
  411.                                     ( cl_gui_alv_grid=>mc_mb_variant  )
  412.                                     ( cl_gui_alv_grid=>mc_fc_detail   )
  413.                                     ( cl_gui_alv_grid=>mc_fc_graph    )
  414.                                     ( cl_gui_alv_grid=>mc_fc_info     )
  415.                                     ( cl_gui_alv_grid=>mc_fc_filter   )
  416.                                     ( cl_gui_alv_grid=>mc_mb_export   )
  417.                                     ( cl_gui_alv_grid=>mc_fc_views    )
  418.                                     ( cl_gui_alv_grid=>mc_fc_find     )
  419.                                     ( cl_gui_alv_grid=>mc_fc_print    )
  420.                      ).
  421.  
  422. * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
  423. *--[ ALV Principal
  424.     WHEN c_alv_main OR c_alv_det.
  425.       t_tool = VALUE #( BASE t_tool ( cl_gui_alv_grid=>mc_fg_edit     )
  426.                                     ( cl_gui_alv_grid=>mc_fg_sort     )
  427.                                     ( cl_gui_alv_grid=>mc_mb_subtot   )
  428.                                     ( cl_gui_alv_grid=>mc_mb_sum      )
  429.                                     ( cl_gui_alv_grid=>mc_mb_variant  )
  430.                                     ( cl_gui_alv_grid=>mc_fc_detail   )
  431.                                     ( cl_gui_alv_grid=>mc_fc_graph    )
  432.                                     ( cl_gui_alv_grid=>mc_fc_info     )
  433.                                     ( cl_gui_alv_grid=>mc_fc_filter   )
  434. *                                    ( CL_GUI_ALV_GRID=>MC_FC_FIND     )
  435. *                                    ( CL_GUI_ALV_GRID=>MC_FC_PRINT    )
  436.                        ).
  437.  
  438.   ENDCASE.
  439. ENDFORM.
  440.  
  441. FORM pai_0100.
  442.   DATA(l_okcode) = g_okcode.
  443.   CLEAR g_okcode.
  444.   t_alv[ c_alv_main ]-grid->check_changed_data( ).
  445.   t_alv[ c_alv_fc ]-grid->check_changed_data( ).
  446.   CASE l_okcode.
  447.     WHEN 'BACK'. PERFORM boton_exit_program.
  448.     WHEN 'SAVE'. PERFORM data_save.
  449.   ENDCASE.
  450. ENDFORM.
  451.  
  452. FORM exit_screen USING g_num.
  453.   IF g_num IS NOT INITIAL.
  454.     t_alv[ g_num ]-cc->free( ).
  455.     CLEAR: t_alv[ g_num ]-cc, t_alv[ g_num ]-grid.
  456.   ENDIF.
  457.   LEAVE TO SCREEN 0.
  458. ENDFORM.
  459.  
  460. FORM popup_to_save CHANGING p_subrc TYPE sysubrc.
  461.  
  462.   DATA: l_ans(1).
  463.   CALL FUNCTION 'POPUP_TO_CONFIRM'
  464.     EXPORTING
  465.       titlebar              = TEXT-t07
  466. *     DIAGNOSE_OBJECT       = ' '
  467.       text_question         = TEXT-q01
  468.       text_button_1         = TEXT-q02
  469. *     ICON_BUTTON_1         = ICON_OKAY
  470.       text_button_2         = TEXT-q03
  471. *     ICON_BUTTON_2         = ICON_CANCEL
  472.       default_button        = '2'
  473.       display_cancel_button = abap_false
  474.       start_column          = 50
  475. *     START_ROW             = 6
  476. *     POPUP_TYPE            =
  477.       iv_quickinfo_button_1 = TEXT-q04
  478.       iv_quickinfo_button_2 = TEXT-q05
  479.     IMPORTING
  480.       answer                = l_ans
  481. *      TABLES
  482. *     PARAMETER             =
  483.     EXCEPTIONS
  484.       text_not_found        = 1
  485.       OTHERS                = 2.
  486.  
  487.   IF l_ans = '1'.
  488. *--[ Bye Bye Bye
  489.     g_save = abap_false.
  490.     CLEAR sy-subrc.
  491.   ELSE.
  492.     p_subrc = 69.
  493. *      EXIT. "-> Back to the future
  494.   ENDIF.
  495. ENDFORM.
  496.  
  497. FORM boton_exit_program.
  498.  
  499.   IF g_save IS NOT INITIAL.
  500.  
  501.     PERFORM popup_to_save CHANGING sy-subrc.
  502.     CHECK sy-subrc EQ 0.
  503.  
  504.   ENDIF.
  505.   LOOP AT t_alv INTO DATA(l_alv) WHERE cc IS NOT INITIAL.
  506.     l_alv-cc->free( ).
  507.     FREE: l_alv-cc.
  508.     CLEAR: l_alv-cc, l_alv-grid.
  509.   ENDLOOP.
  510.   LEAVE TO SCREEN 0.
  511. ENDFORM.
  512.  
  513. FORM data_save.
  514.  
  515.   DATA: l_001 TYPE zcl_fieldcatalog=>ty_talv,
  516.         l_002 TYPE zcl_fieldcatalog=>ty_talvt,
  517.         l_003 TYPE zcl_fieldcatalog=>ty_alv_tool.
  518. *--[ Borramos los registros anteriores
  519.   DELETE FROM (zcl_fieldcatalog=>c_tab_alv)      WHERE prog = p_prog AND nalv = p_nalv.
  520.   DELETE FROM (zcl_fieldcatalog=>c_tab_alv_text) WHERE prog = p_prog AND nalv = p_nalv.
  521.   DELETE FROM (zcl_fieldcatalog=>c_tab_alv_tool) WHERE prog = p_prog AND nalv = p_nalv.
  522.  
  523.   LOOP AT t_tab_01 INTO DATA(ax).
  524.  
  525.     CLEAR: l_001, l_002.
  526.     MOVE-CORRESPONDING ax TO: l_001, l_002.
  527.     l_001-col_pos = sy-tabix. "<-- Nuevo Orden Mundial
  528.     l_002-langu = sy-langu.
  529.     MODIFY (zcl_fieldcatalog=>c_tab_alv)      FROM l_001.
  530.     MODIFY (zcl_fieldcatalog=>c_tab_alv_text) FROM l_002.
  531.     AT LAST.
  532.       CLEAR g_save.
  533.       MESSAGE s052(/sdf/mon)." with 'Datos grabados correctamente'.
  534.     ENDAT.
  535.   ENDLOOP.
  536.  
  537.   l_003-prog = p_prog.
  538.   l_003-nalv = p_nalv.
  539.   LOOP AT t_tab_02 INTO DATA(bx) WHERE flag = abap_true.
  540.     l_003-func = bx-name.
  541.     MODIFY (zcl_fieldcatalog=>c_tab_alv_tool) FROM l_003.
  542.   ENDLOOP.
  543.  
  544. ENDFORM.
  545.  
  546. FORM data_display.
  547.   t_alv[ c_alv_main ]-grid->refresh_table_display( ).
  548. *  cl_gui_cfw=>set_new_ok_code( new_code = 'REFR' )."<-- HARDRefresh
  549.   cl_gui_cfw=>flush( ).
  550. ENDFORM.
  551.  
  552. DATA: t_fieldname TYPE STANDARD TABLE OF string.
  553.  
  554. FORM bot_alv_up_down USING p_updown.
  555.   REFRESH t_fieldname.
  556.   t_alv[ c_alv_main ]-grid->get_selected_rows( IMPORTING et_index_rows = index_rows ).
  557.   IF lines( index_rows ) > 0.
  558.     CASE p_updown.
  559.       WHEN 'U'. SORT index_rows BY index ASCENDING.
  560.       WHEN 'D'. SORT index_rows BY index DESCENDING.
  561.     ENDCASE.
  562.  
  563.     LOOP AT index_rows INTO DATA(ax).
  564.       READ TABLE t_tab_01 INTO DATA(ah) INDEX ax-index.
  565.       APPEND ah-fieldname TO t_fieldname.
  566.     ENDLOOP.
  567.   ELSE.
  568.     MESSAGE s398(00) WITH 'Debe seleccionar al menos un registro'.
  569.   ENDIF.
  570. ENDFORM.
  571.  
  572. FORM bot_alv_up_done USING p_updown.
  573.   DATA: p_index TYPE lvc_s_row,
  574.         t_index TYPE lvc_t_row.
  575.   PERFORM bot_alv_up_down USING p_updown.
  576.   CHECK lines( index_rows ) > 0.
  577.   LOOP AT t_fieldname INTO DATA(ax).
  578.     READ TABLE t_tab_01 TRANSPORTING NO FIELDS WITH KEY fieldname = ax.
  579.     p_index-index = sy-tabix.
  580.     CASE p_updown.
  581.       WHEN 'U'. PERFORM bot_up USING p_index abap_false.
  582.       WHEN 'D'. PERFORM bot_down USING p_index abap_false.
  583.     ENDCASE.
  584.   ENDLOOP.
  585.   REFRESH index_rows.
  586.  
  587.   LOOP AT t_fieldname INTO ax.
  588.     READ TABLE t_tab_01 TRANSPORTING NO FIELDS WITH KEY fieldname = ax.
  589.     t_index = VALUE #( BASE t_index ( index = sy-tabix ) ).
  590.   ENDLOOP.
  591.  
  592.   PERFORM data_display.
  593.   t_alv[ c_alv_main ]-grid->set_selected_rows( EXPORTING it_index_rows = t_index ).
  594.   t_alv[ c_alv_main ]-grid->set_current_cell_via_id( EXPORTING is_row_id = p_index ).
  595. ENDFORM.
  596.  
  597. FORM bot_alv_up.
  598.   PERFORM bot_alv_up_done USING 'U'.
  599. ENDFORM.
  600.  
  601. FORM bot_alv_down.
  602.   PERFORM bot_alv_up_done USING 'D'.
  603. ENDFORM.
  604.  
  605. FORM bot_up USING p_index TYPE lvc_s_row
  606.                     p_refresh TYPE xfeld.
  607.   CHECK p_index-index NE 1.
  608.   DATA(l_indice) = p_index-index - 1.
  609.   DATA(cab) = t_tab_01[ p_index-index ].
  610.   DELETE t_tab_01 INDEX p_index-index.
  611.   INSERT cab INTO t_tab_01 INDEX l_indice.
  612.   LOOP AT t_tab_01  ASSIGNING FIELD-SYMBOL(<ax>). <ax>-col_pos = sy-tabix. ENDLOOP.
  613.   CHECK p_refresh = abap_true.
  614.   PERFORM data_display.
  615.   t_alv[ c_alv_main ]-grid->set_current_cell_via_id( EXPORTING is_row_id = p_index ).
  616. ENDFORM.
  617.  
  618. FORM bot_down USING p_index TYPE lvc_s_row
  619.                     p_refresh TYPE xfeld.
  620.   CHECK p_index-index NE lines( t_tab_01 ).
  621.   DATA(l_indice) = p_index-index + 1.
  622.   DATA(cab) = t_tab_01[ p_index-index ].
  623.   DELETE t_tab_01 INDEX p_index-index.
  624.   INSERT cab INTO t_tab_01 INDEX l_indice.
  625.   LOOP AT t_tab_01  ASSIGNING FIELD-SYMBOL(<ax>). <ax>-col_pos = sy-tabix. ENDLOOP.
  626.   CHECK p_refresh = abap_true.
  627.   PERFORM data_display.
  628.   t_alv[ c_alv_main ]-grid->set_current_cell_via_id( EXPORTING is_row_id = p_index ).
  629. ENDFORM.