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
- report ZXX_PRG_TOOL_ALV.
- INCLUDE ZXX_I_TOOL_ALV_TOP.
- include ZXX_I_CL_FCAT. "<-- Clase de ejemplo para leer catálogo
- INCLUDE ZXX_I_TOOL_ALV_CLS.
- INCLUDE ZXX_I_TOOL_ALV_SEL.
- INCLUDE ZXX_I_TOOL_ALV_EVE.
- INCLUDE ZXX_I_TOOL_ALV_FRM.
INCLUDE ZXX_I_TOOL_ALV_TOP.
- CLASS lcl_event_handler DEFINITION DEFERRED.
- CLASS zcl_fieldcatalog DEFINITION DEFERRED.
- CONSTANTS: c_alv_main TYPE i VALUE 1,
- c_alv_det TYPE i VALUE 2,
- c_alv_fc TYPE i VALUE 3.
- TYPES: BEGIN OF ty_01,
- bup TYPE char6,
- bdo TYPE char6,
- * INCLUDE STRUCTURE zcl_fieldcatalog=>ty_talv. "<-- Aquí se debe poner la tabla de BD
- *TYPES:
- *--[ Cuando se asiente en el proyecto, esto debería ser cambiado por
- *--[ el include de más arriba a la tabla de diccionario de proyecto.
- *--[ Una lástima no poder hacer referencia al typo de la clase
- mandt TYPE mandt,
- prog TYPE sycprog,
- nalv TYPE numc4,
- fieldname TYPE lvc_fname,
- col_pos TYPE lvc_colpos,
- do_sum TYPE lvc_dosum,
- no_out TYPE lvc_noout,
- tech TYPE lvc_tech,
- edit TYPE lvc_edit,
- icon TYPE lvc_icon,
- checkbox TYPE lvc_checkb,
- outputlen TYPE lvc_outlen,
- hotspot TYPE lvc_hotspt,
- decimals_o TYPE lvc_decmls,
- *--[ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ Elimnar cuando se asiente en DDIC
- seltext TYPE lvc_txt,
- coltext TYPE lvc_txtcol,
- scrtext_l TYPE scrtext_l,
- scrtext_m TYPE scrtext_m,
- scrtext_s TYPE scrtext_s,
- END OF ty_01,
- BEGIN OF ty_alv,
- id TYPE i,
- cc TYPE REF TO cl_gui_custom_container,
- cm TYPE scrfname,
- grid TYPE REF TO cl_gui_alv_grid,
- layout TYPE lvc_s_layo,
- variant TYPE disvariant,
- fcat TYPE lvc_t_fcat,
- split01 TYPE REF TO cl_gui_splitter_container,
- split02 TYPE REF TO cl_gui_splitter_container,
- html TYPE REF TO cl_gui_html_viewer,
- event TYPE REF TO lcl_event_handler,
- toolbar TYPE ui_functions,
- END OF ty_alv,
- BEGIN OF ty_fcat,
- flag TYPE xfeld,
- name TYPE string,
- value TYPE string,
- END OF ty_fcat.
- DATA:
- t_tab_01 TYPE STANDARD TABLE OF ty_01,
- t_tab_02 TYPE STANDARD TABLE OF ty_fcat,
- *--[ Tablas de BackUp
- index_rows TYPE lvc_t_row,
- t_fcat_01 TYPE lvc_t_fcat,
- g_error TYPE sy-subrc,
- g_titulo TYPE char255,
- g_save TYPE xfeld,
- g_okcode TYPE sy-ucomm,
- t_alv TYPE STANDARD TABLE OF ty_alv,
- g_alv LIKE LINE OF t_alv,
- t_fcode TYPE TABLE OF sy-ucomm,
- *--[ End Of DATA
- end_of_data(1).
- DATA: g_fcat TYPE REF TO zcl_fieldcatalog.
- FIELD-SYMBOLS: <t_demo> TYPE STANDARD TABLE.
include ZXX_I_CL_FCAT.
- CLASS zcl_fieldcatalog DEFINITION.
- PUBLIC SECTION.
- CONSTANTS: c_version TYPE string VALUE 'v01.00',
- c_alv_not_found TYPE sysubrc VALUE 1,
- c_alv_nalv_not_found TYPE sysubrc VALUE 2,
- *--[ Las tablas de parametrización del proyecto
- c_tab_alv TYPE string VALUE 'ZAG3_TALV',
- c_tab_alv_text TYPE string VALUE 'ZAG3_TALVT',
- c_tab_alv_tool TYPE string VALUE 'ZAG3_TALV_TOOL'.
- TYPES:
- * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
- *--[ Sample Tables
- BEGIN OF ty_talv,
- mandt TYPE mandt,
- prog TYPE sycprog,
- nalv TYPE numc4,
- fieldname TYPE lvc_fname,
- col_pos TYPE lvc_colpos,
- do_sum TYPE lvc_dosum,
- no_out TYPE lvc_noout,
- tech TYPE lvc_tech,
- edit TYPE lvc_edit,
- icon TYPE lvc_icon,
- checkbox TYPE lvc_checkb,
- outputlen TYPE lvc_outlen,
- hotspot TYPE lvc_hotspt,
- decimals_o TYPE lvc_decmls,
- END OF ty_talv,
- BEGIN OF ty_talvt,
- mandt TYPE mandt,
- prog TYPE sycprog,
- nalv TYPE numc4,
- fieldname TYPE lvc_fname,
- langu TYPE spras,
- seltext TYPE lvc_txt,
- coltext TYPE lvc_txtcol,
- scrtext_l TYPE scrtext_l,
- scrtext_m TYPE scrtext_m,
- scrtext_s TYPE scrtext_s,
- END OF ty_talvt,
- BEGIN OF ty_alv_tool,
- mandt TYPE mandt,
- prog TYPE sycprog,
- nalv TYPE numc4,
- func TYPE ui_func,
- END OF ty_alv_tool,
- BEGIN OF ty_alv,
- nalv TYPE numc4,
- alv TYPE STANDARD TABLE OF ty_talv WITH DEFAULT KEY,
- alvt TYPE STANDARD TABLE OF ty_talvt WITH DEFAULT KEY,
- alvtool TYPE STANDARD TABLE OF ty_alv_tool WITH DEFAULT KEY,
- END OF ty_alv.
- TYPES: BEGIN OF ty_tool,
- var TYPE string,
- val TYPE string,
- END OF ty_tool.
- DATA: t_tool TYPE STANDARD TABLE OF ty_tool.
- DATA: g_error TYPE i,
- g_program TYPE sycprog,
- t_alv TYPE STANDARD TABLE OF ty_alv.
- METHODS:
- constructor IMPORTING i_program TYPE sycprog,
- set_fcat IMPORTING i_nalv TYPE numc4
- i_fcat TYPE lvc_s_fcat,
- merge_fcat IMPORTING i_nalv TYPE numc4
- CHANGING i_fcat TYPE lvc_t_fcat,
- merge_fcat_factory IMPORTING i_nalv TYPE numc4
- i_alv TYPE REF TO cl_salv_table,
- merge_toolbar IMPORTING i_nalv TYPE numc4
- CHANGING i_toolbar TYPE ui_functions.
- PRIVATE SECTION.
- METHODS:
- get_fc.
- ENDCLASS.
- CLASS zcl_fieldcatalog IMPLEMENTATION.
- METHOD merge_fcat_factory.
- *i_nalv TYPE numc4
- *i_alv type REF TO cl_salv_table,
- DATA: t_fcat_01 TYPE lvc_t_fcat.
- t_fcat_01 = cl_salv_controller_metadata=>get_lvc_fieldcatalog(
- r_columns = i_alv->get_columns( )
- r_aggregations = i_alv->get_aggregations( ) ).
- TRY.
- DATA(ALV) = t_alv[ nalv = i_nalv ].
- CATCH cx_root.
- *--[ Como no existe, lo creamos.
- LOOP AT t_fcat_01 ASSIGNING FIELD-SYMBOL(<rx>).
- set_fcat( i_nalv = i_nalv i_fcat = <rx> ).
- ENDLOOP.
- exit.
- ENDTRY.
- loop at alv-alv into data(ax).
- at first.
- DATA(o_columns) = i_alv->get_columns( ).
- endat.
- DATA(o_column) = o_columns->get_column( ax-fieldname ).
- data(bx) = alv-alvt[ nalv = i_nalv fieldname = ax-fieldname ].
- o_column->set_long_text( bX-scrtext_l ).
- o_column->set_medium_text( bx-scrtext_m ).
- o_column->set_short_text( bx-scrtext_s ).
- o_column->set_technical( ax-tech ).
- o_column->SET_VISIBLE( COND #( WHEN ax-no_out is INITIAL THEN abap_true else abap_false ) ).
- endloop.
- ENDMETHOD.
- METHOD get_fc.
- DATA(bx) = cl_abap_objectdescr=>describe_by_name( p_name = 'CL_GUI_ALV_GRID' ).
- DATA(ax) = NEW cl_gui_custom_container( container_name = 'ROMEOMUSTDIE' ).
- DATA(cx) = NEW cl_gui_alv_grid( i_parent = ax ).
- FIELD-SYMBOLS: <bx> TYPE table.
- ASSIGN ('bx->attributes') TO <bx>.
- LOOP AT <bx> ASSIGNING FIELD-SYMBOL(<bl>).
- ASSIGN ('<bl>-name') TO FIELD-SYMBOL(<cl>).
- CHECK <cl> CP 'MC_FC_*'.
- APPEND INITIAL LINE TO t_tool ASSIGNING FIELD-SYMBOL(<tool>).
- <tool>-var = <cl>.
- DATA(dl) = |CL_GUI_ALV_GRID=>{ <cl> }|.
- ASSIGN (dl) TO FIELD-SYMBOL(<dh>).
- <tool>-val = <dh>.
- ENDLOOP.
- ENDMETHOD.
- METHOD constructor.
- g_program = i_program.
- DATA: ax TYPE STANDARD TABLE OF ty_talv.
- SELECT * FROM (c_tab_alv)
- INTO CORRESPONDING FIELDS OF TABLE @ax
- WHERE prog = @i_program
- ORDER BY nalv ASCENDING, col_pos ASCENDING.
- IF sy-subrc NE 0.
- g_error = c_alv_not_found.
- ELSE.
- LOOP AT ax INTO DATA(bx) GROUP BY ( nalv = bx-nalv ) REFERENCE INTO DATA(grupo).
- APPEND INITIAL LINE TO t_alv ASSIGNING FIELD-SYMBOL(<ax>).
- LOOP AT GROUP grupo ASSIGNING FIELD-SYMBOL(<cx>).
- <ax>-nalv = <cx>-nalv.
- APPEND <cx> TO <ax>-alv.
- ENDLOOP.
- ENDLOOP.
- *--[ Excluímos botones
- LOOP AT t_alv ASSIGNING FIELD-SYMBOL(<ah>).
- SELECT * FROM (c_tab_alv_tool)
- APPENDING CORRESPONDING FIELDS OF TABLE <ah>-alvtool
- WHERE prog = i_program
- AND nalv = <ah>-nalv.
- SELECT * FROM (c_tab_alv_text)
- APPENDING CORRESPONDING FIELDS OF TABLE <ax>-alvt
- WHERE prog = i_program
- AND nalv = <ah>-nalv
- AND langu = sy-langu.
- ENDLOOP.
- ENDIF.
- get_fc( ).
- ENDMETHOD.
- METHOD merge_toolbar.
- TRY.
- DATA(alv) = t_alv[ nalv = i_nalv ].
- *BREAK-POINT .
- LOOP AT alv-alvtool INTO DATA(ax) WHERE nalv = i_nalv.
- DATA(ls) = |cl_gui_alv_grid=>{ ax-func }|.
- ASSIGN (ls) TO FIELD-SYMBOL(<bx>).
- CHECK sy-subrc EQ 0.
- APPEND <bx> TO i_toolbar.
- ENDLOOP.
- SORT i_toolbar.
- DELETE ADJACENT DUPLICATES FROM i_toolbar.
- CATCH cx_root.
- ENDTRY.
- ENDMETHOD.
- METHOD merge_fcat.
- TRY.
- DATA(alv) = t_alv[ nalv = i_nalv ].
- CATCH cx_root.
- *--[ Como no existe, lo creamos.
- LOOP AT i_fcat ASSIGNING FIELD-SYMBOL(<rx>).
- set_fcat( i_nalv = i_nalv i_fcat = <rx> ).
- ENDLOOP.
- ENDTRY.
- *--[ Maquillamos los campos que encontramos.
- LOOP AT i_fcat ASSIGNING FIELD-SYMBOL(<ax>).
- *--[ Cargamos los atributos
- TRY.
- DATA(bx) = alv-alv[ fieldname = <ax>-fieldname ].
- CATCH cx_root.
- set_fcat( i_nalv = i_nalv i_fcat = <ax> ).
- CONTINUE.
- ENDTRY.
- MOVE-CORRESPONDING bx TO <ax>.
- *--[ Cargamos los textos
- TRY.
- DATA(cx) = alv-alvt[ fieldname = <ax>-fieldname ].
- CATCH cx_root.
- CONTINUE. "<-- No hay textos
- ENDTRY.
- MOVE-CORRESPONDING cx TO <ax>.
- ENDLOOP.
- ENDMETHOD.
- METHOD set_fcat.
- DATA: ax TYPE ty_talv,
- bx TYPE ty_talvt.
- MOVE-CORRESPONDING i_fcat TO: ax, bx.
- ax-prog = bx-prog = g_program.
- ax-nalv = bx-nalv = i_nalv.
- bx-langu = sy-langu.
- INSERT (c_tab_alv) FROM ax.
- INSERT (c_tab_alv_text) FROM bx.
- ENDMETHOD.
- ENDCLASS.
- * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
- *--[ Como utilizarlo
- *data: g_fcat TYPE REF TO zcl_fieldcatalog,
- *
- * g_fcat = NEW zcl_fieldcatalog( sy-cprog ).
- * g_fcat->merge_fcat( EXPORTING i_nalv = '0001'
- * CHANGING i_fcat = t_alv[ c_alv_main ]-fcat ).
- *
- * g_fcat->merge_toolbar( EXPORTING i_nalv = '0001'
- * CHANGING i_toolbar = t_alv[ c_alv_main ]-toolbar ).
INCLUDE ZXX_I_TOOL_ALV_CLS.
- CLASS lcl_event_handler DEFINITION FINAL.
- PUBLIC SECTION .
- DATA: id TYPE i.
- METHODS:
- handle_data_changed
- FOR EVENT data_changed OF cl_gui_alv_grid
- IMPORTING er_data_changed,
- handle_user_command FOR EVENT user_command OF cl_gui_alv_grid
- IMPORTING e_ucomm,
- handle_hotspot
- FOR EVENT hotspot_click OF cl_gui_alv_grid
- IMPORTING e_row_id e_column_id,
- handle_toolbar FOR EVENT toolbar OF cl_gui_alv_grid
- IMPORTING e_object. " e_interactive,
- ENDCLASS.
- CLASS lcl_event_handler IMPLEMENTATION.
- method handle_hotspot.
- CASE e_column_id.
- when 'BUP'. perform BOT_UP using e_row_id abap_true.
- when 'BDO'. perform BOT_DOWN using e_row_id abap_true.
- endcase.
- endmethod.
- METHOD handle_data_changed.
- LOOP AT er_data_changed->mt_good_cells INTO DATA(ls_good).
- * CHECK LS_GOOD-FIELDNAME CP 'VAL*'.
- g_save = abap_true.
- * DATA(l_campo) = ls_good-fieldname.
- * l_campo+0(3) = 'USR'.
- * IF ls_good-value IS INITIAL. CLEAR sy-uname. ENDIF.
- * CALL METHOD er_data_changed->modify_cell
- * EXPORTING
- * i_row_id = ls_good-row_id
- * i_fieldname = CONV #( l_campo )
- * i_value = sy-uname.
- ENDLOOP.
- ENDMETHOD.
- METHOD handle_toolbar.
- e_object->mt_toolbar = VALUE #( BASE e_object->mt_toolbar
- ( butn_type = 0
- function = 'MC00'
- icon = icon_display
- text = 'Previsualizar'
- quickinfo = 'Previsializar'
- disabled = abap_false )
- ( butn_type = 0
- function = 'MC01'
- icon = ICON_TREND_UP
- text = 'Subir'
- quickinfo = 'Subir'
- disabled = abap_false )
- ( butn_type = 0
- function = 'MC02'
- icon = ICON_TREND_DOWN
- text = 'Bajar'
- quickinfo = 'Bajar'
- disabled = abap_false )
- ).
- ENDMETHOD.
- METHOD handle_user_command .
- CASE e_ucomm.
- WHEN 'MC00'. perform ALV_REFRESH.
- when 'MC01'. perform BOT_ALV_UP.
- when 'MC02'. perform BOT_ALV_DOWN.
- ENDCASE.
- *
- ENDMETHOD.
- ENDCLASS.
INCLUDE ZXX_I_TOOL_ALV_SEL.
- SELECTION-SCREEN BEGIN OF BLOCK b01 WITH FRAME.
- PARAMETERS: p_prog type SYCPROG,
- p_nalv type NUMC4.
- SELECTION-SCREEN END OF BLOCK b01.
- * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
- *--[ Copy
- module pbo_XXXX output.
- case sy-dynnr.
- when '0100'. perform pbo_0100.
- endcase.
- ENDMODULE.
- module pai_XXXX input.
- case sy-dynnr.
- when '0100'. perform pai_0100.
- endcase.
- ENDMODULE.
INCLUDE ZXX_I_TOOL_ALV_EVE.
- AT SELECTION-SCREEN ON VALUE-REQUEST FOR p_prog.
- perform eve_At_selection_Screen_FIELD using 'P_PROG' CHANGING P_PROG.
- INITIALIZATION.
- perform eve_initialization.
- START-OF-SELECTION.
- PERFORM data_load.
- end-of-SELECTION.
- PERFORM data_list.
INCLUDE ZXX_I_TOOL_ALV_FRM.
- FORM eve_at_selection_screen_field USING p_field CHANGING p_prog.
- TYPES: BEGIN OF ty_f4,
- pos TYPE lvc_colpos,
- prog TYPE sycprog,
- nalv TYPE numc4,
- text TYPE repti,
- END OF ty_f4.
- DATA: t_f4 TYPE STANDARD TABLE OF ty_f4.
- *--[ Es más lento, pero evitamos tener que declarar tablas
- select DISTINCT prog nalv from (zcl_fieldcatalog=>c_tab_alv)
- into CORRESPONDING FIELDS OF table t_f4
- ORDER BY prog nalv.
- loop at t_f4 ASSIGNING FIELD-SYMBOL(<ah>) where text is INITIAL.
- SELECT SINGLE text into <ah>-text FROM trdirt
- WHERE name = <ah>-prog
- AND sprsl = sy-langu.
- if sy-subrc eq 0.
- modify t_f4 from <ah> TRANSPORTING text where prog = <ah>-prog and text is INITIAL.
- endif.
- endloop.
- CHECK lines( t_f4 ) > 0.
- LOOP AT t_f4 ASSIGNING FIELD-SYMBOL(<ax>). <ax>-pos = sy-tabix. ENDLOOP.
- DATA: t_return TYPE STANDARD TABLE OF ddshretval.
- CALL FUNCTION 'F4IF_INT_TABLE_VALUE_REQUEST'
- EXPORTING
- retfield = 'POS'
- value_org = 'S'
- TABLES
- value_tab = t_f4
- return_tab = t_return
- EXCEPTIONS
- parameter_error = 1
- no_values_found = 2
- OTHERS = 3.
- IF sy-subrc EQ 0.
- TRY.
- DATA(l_pos) = t_return[ 1 ]-fieldval.
- p_prog = t_f4[ l_pos ]-prog.
- p_nalv = t_f4[ l_pos ]-nalv.
- DATA: t_dynpread TYPE STANDARD TABLE OF dynpread.
- t_dynpread = VALUE #( ( fieldname = 'P_NALV'
- fieldvalue = p_nalv ) ).
- CALL FUNCTION 'DYNP_VALUES_UPDATE'
- EXPORTING
- dyname = sy-cprog "
- dynumb = '1000'
- TABLES
- dynpfields = t_dynpread
- EXCEPTIONS
- invalid_abapworkarea = 1
- invalid_dynprofield = 2
- invalid_dynproname = 3
- invalid_dynpronummer = 4
- invalid_request = 5
- no_fielddescription = 6
- undefind_error = 7
- OTHERS = 8.
- IF sy-subrc <> 0.
- * Implement suitable error handling here
- ENDIF.
- CATCH cx_root.
- ENDTRY.
- ENDIF.
- ENDFORM.
- FORM eve_initialization.
- DO 5 TIMES.
- DATA(nn) = CONV numc2( sy-index ).
- TRY.
- t_alv = VALUE #( BASE t_alv ( id = sy-index
- cm = |CC_ALV_{ nn }|
- layout-sel_mode = 'A'
- layout-zebra = abap_true
- layout-cwidth_opt = abap_true
- variant-report = sy-repid
- )
- ).
- CATCH cx_root.
- CLEAR sy-subrc.
- ENDTRY.
- ENDDO. "<-- ALV Template
- g_fcat = NEW zcl_fieldcatalog( sy-cprog ).
- ENDFORM.
- FORM data_load.
- data: t_tool type STANDARD TABLE OF zcl_fieldcatalog=>ty_alv_tool,
- t_text type STANDARD TABLE OF zcl_fieldcatalog=>ty_talvt.
- *--[ Al ser dinámico, tengo que hacerlo sin JOIN :') :"(
- select * from (zcl_fieldcatalog=>c_tab_alv)
- into CORRESPONDING FIELDS OF table t_tab_01
- where prog = p_prog and nalv = p_nalv.
- select * from (zcl_fieldcatalog=>c_tab_alv_text)
- into CORRESPONDING FIELDS OF table t_text
- where prog = p_prog and nalv = p_nalv and langu = sy-langu.
- LOOP AT t_tab_01 ASSIGNING FIELD-SYMBOL(<ax>).
- try.
- data(bx) = t_text[ fieldname = <ax>-fieldname ].
- MOVE-CORRESPONDING bx to <ax>.
- catch cx_root.
- endtry.
- <ax>-bup = icon_trend_up.
- <ax>-bdo = icon_trend_down.
- ENDLOOP.
- SELECT * FROM (zcl_fieldcatalog=>c_tab_alv_tool)
- INTO CORRESPONDING FIELDS OF TABLE t_tool
- WHERE prog = p_prog
- AND nalv = p_nalv.
- LOOP AT g_fcat->t_tool INTO DATA(al).
- t_tab_02 = VALUE #( BASE t_tab_02 ( name = al-var value = al-val ) ).
- ENDLOOP.
- LOOP AT t_tool INTO DATA(ax).
- TRY.
- t_tab_02[ name = ax-func ]-flag = abap_true.
- CATCH cx_root.
- ENDTRY.
- ENDLOOP.
- PERFORM data_load_demo.
- ENDFORM.
- FORM alv_refresh.
- PERFORM data_load_demo.
- * t_alv[ c_alv_det ]-fcat = ax.
- t_alv[ c_alv_det ]-grid->set_frontend_fieldcatalog( t_alv[ c_alv_det ]-fcat ).
- t_alv[ c_alv_det ]-grid->refresh_table_display( ).
- ENDFORM.
- FORM data_load_demo.
- DATA: t_newtable TYPE REF TO data,
- t_newline TYPE REF TO data.
- UNASSIGN <t_demo>.
- cl_salv_table=>factory( IMPORTING r_salv_table = DATA(l_alv) CHANGING t_table = t_tab_01 ).
- *--[ Creamos estructura ALV
- DATA(ax) = cl_salv_controller_metadata=>get_lvc_fieldcatalog(
- r_columns = l_alv->get_columns( )
- r_aggregations = l_alv->get_aggregations( ) ).
- REFRESH ax. "<-- Limpiamos
- LOOP AT t_tab_01 INTO DATA(bx).
- ax = VALUE #( BASE ax ( fieldname = bx-fieldname
- rollname = 'CHAR20'
- datatype = 'CHAR'
- inttype = 'C'
- intlen = 18
- * decimals = 2
- do_sum = bx-do_sum
- no_out = bx-no_out
- tech = bx-tech
- edit = bx-edit
- icon = bx-icon
- checkbox = bx-checkbox
- outputlen = bx-outputlen
- hotspot = bx-hotspot
- reptext = bx-seltext
- seltext = bx-seltext
- scrtext_s = bx-scrtext_s
- scrtext_m = bx-scrtext_m
- scrtext_l = bx-scrtext_l
- col_pos = bx-col_pos
- )
- ).
- AT LAST.
- CALL METHOD cl_alv_table_create=>create_dynamic_table
- EXPORTING
- it_fieldcatalog = ax
- IMPORTING
- ep_table = t_newtable.
- ASSIGN t_newtable->* TO <t_demo>.
- CREATE DATA t_newline LIKE LINE OF <t_demo>.
- APPEND INITIAL LINE TO <t_demo> ASSIGNING FIELD-SYMBOL(<dh>).
- DATA: l_data TYPE string.
- t_alv[ c_alv_det ]-fcat = ax.
- LOOP AT t_tab_01 INTO DATA(cx).
- DATA(l_campo) = |<DH>-{ cx-fieldname }|.
- ASSIGN (l_campo) TO FIELD-SYMBOL(<l_campo>).
- CALL FUNCTION 'GENERAL_GET_RANDOM_STRING'
- EXPORTING
- number_chars = 128
- IMPORTING
- random_string = l_data.
- <l_campo> = l_data.
- ENDLOOP.
- ENDAT.
- ENDLOOP.
- ENDFORM.
- FORM data_list.
- CHECK g_error IS INITIAL.
- IF lines( t_tab_01 ) > 0.
- CALL SCREEN '0100'.
- ELSE.
- MESSAGE s398(00) WITH TEXT-e01 DISPLAY LIKE 'E'.
- ENDIF.
- ENDFORM.
- FORM pbo_0100.
- REFRESH t_fcode.
- SET PF-STATUS 'MAIN0100' EXCLUDING t_fcode.
- g_titulo = 'Editor ALV'.
- SET TITLEBAR 'TIT01' WITH TEXT-t01.
- PERFORM alv_create_main.
- ENDFORM.
- FORM alv_create_main.
- * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
- *--[ Creamos ALV_002
- t_alv[ c_alv_main ]-cc = NEW cl_gui_custom_container( container_name = t_alv[ c_alv_main ]-cm ).
- t_alv[ c_alv_main ]-split01 = NEW cl_gui_splitter_container( parent = t_alv[ c_alv_main ]-cc rows = 2 columns = 1 ).
- 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 ).
- 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 ) ).
- 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 ) ).
- 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 ) ).
- t_alv[ c_alv_main ]-split01->set_row_height( id = 1 height = 80 ).
- t_alv[ c_alv_main ]-split02->set_column_width( id = 1 width = 70 ).
- t_alv[ c_alv_main ]-layout-cwidth_opt = abap_true.
- t_alv[ c_alv_main ]-layout-col_opt = abap_true.
- * t_alv[ c_alv_main ]-layout-stylefname = 'CELLTAB'.
- t_alv[ c_alv_main ]-variant-report = sy-cprog.
- * t_alv[ c_alv_main ]-variant-variant = '/DEFAULT'.
- t_alv[ c_alv_main ]-variant-handle = c_alv_main.
- IF lines( t_alv[ c_alv_main ]-fcat ) = 0.
- REFRESH t_fcat_01.
- *--[ Creamos el FCAT de la tabla
- cl_salv_table=>factory( IMPORTING r_salv_table = DATA(l_alv) CHANGING t_table = t_tab_01 ).
- t_fcat_01 = cl_salv_controller_metadata=>get_lvc_fieldcatalog(
- r_columns = l_alv->get_columns( )
- r_aggregations = l_alv->get_aggregations( ) ).
- LOOP AT t_fcat_01 ASSIGNING FIELD-SYMBOL(<f>).
- CASE <f>-fieldname.
- WHEN 'BUP'.
- <f>-hotspot = <f>-icon = abap_true.
- <f>-scrtext_s = <f>-scrtext_m = <f>-reptext = <f>-scrtext_l = 'Subir'.
- <f>-fix_column = abap_true.
- <f>-key = abap_true.
- WHEN 'BDO'.
- <f>-hotspot = <f>-icon = abap_true.
- <f>-scrtext_s = <f>-scrtext_m = <f>-reptext = <f>-scrtext_l = 'Bajar'.
- <f>-fix_column = abap_true.
- <f>-key = abap_true.
- WHEN 'FIELDNAME' .
- <f>-fix_column = abap_true.
- <f>-key = abap_true.
- WHEN 'PROG' OR 'NALV'. <f>-no_out = abap_true.
- WHEN 'MANDT'.
- <f>-no_out = abap_true.
- <f>-tech = abap_true.
- WHEN 'COL_POS'. <f>-no_out = abap_true.
- WHEN 'DO_SUM'. <f>-edit = abap_true. <f>-checkbox = abap_true.
- WHEN 'NO_OUT'. <f>-edit = abap_true. <f>-checkbox = abap_true.
- WHEN 'TECH'. <f>-edit = abap_true. <f>-checkbox = abap_true.
- WHEN 'EDIT'. <f>-edit = abap_true. <f>-checkbox = abap_true.
- WHEN 'ICON'. <f>-edit = abap_true. <f>-checkbox = abap_true.
- WHEN 'CHECKBOX'. <f>-edit = abap_true. <f>-checkbox = abap_true.
- WHEN 'OUTPUTLEN'. <f>-edit = abap_true.
- WHEN 'HOTSPOT'. <f>-edit = abap_true. <f>-checkbox = abap_true.
- WHEN 'DECIMALS_O'. <f>-edit = abap_true.
- WHEN 'SELTEXT' OR
- 'COLTEXT' OR
- 'SCRTEXT_L' OR
- 'SCRTEXT_M' OR
- 'COL_POS' OR
- 'SCRTEXT_S'. <f>-edit = abap_true.
- ENDCASE.
- ENDLOOP.
- t_alv[ c_alv_main ]-fcat = t_fcat_01.
- ENDIF.
- *--[ FieldCatalog
- REFRESH t_fcat_01.
- cl_salv_table=>factory( IMPORTING r_salv_table = l_alv CHANGING t_table = t_tab_02 ).
- t_fcat_01 = cl_salv_controller_metadata=>get_lvc_fieldcatalog(
- r_columns = l_alv->get_columns( )
- r_aggregations = l_alv->get_aggregations( ) ).
- LOOP AT t_fcat_01 ASSIGNING <f>.
- CASE <f>-fieldname.
- WHEN 'VALUE'. <f>-scrtext_s = <f>-scrtext_m = <f>-reptext = <f>-scrtext_l = 'Valor'.
- WHEN 'NAME'. <f>-scrtext_s = <f>-scrtext_m = <f>-reptext = <f>-scrtext_l = 'Nombre'.
- WHEN 'FLAG'. <f>-edit = abap_true. <f>-checkbox = abap_true.
- ENDCASE.
- ENDLOOP.
- t_alv[ c_alv_fc ]-fcat = t_fcat_01.
- DATA(tmp_tool) = t_alv[ c_alv_main ]-toolbar. " PUSH
- PERFORM alv_remove_buttons USING c_alv_main CHANGING tmp_tool.
- t_alv[ c_alv_main ]-toolbar = tmp_tool. "POP
- t_alv[ c_alv_det ]-toolbar = tmp_tool. "POP
- t_alv[ c_alv_fc ]-toolbar = tmp_tool. "POP
- * g_fcat->merge_toolbar( EXPORTING i_nalv = '0001'
- * CHANGING i_toolbar = t_alv[ c_alv_main ]-toolbar ).
- *
- * g_fcat->merge_toolbar( EXPORTING i_nalv = '0002'
- * CHANGING i_toolbar = t_alv[ c_alv_det ]-toolbar ).
- t_alv[ c_alv_main ]-grid->set_table_for_first_display(
- EXPORTING
- i_buffer_active = abap_false
- i_bypassing_buffer = abap_true
- is_variant = t_alv[ c_alv_main ]-variant
- is_layout = t_alv[ c_alv_main ]-layout
- i_save = 'A'
- it_toolbar_excluding = t_alv[ c_alv_main ]-toolbar
- CHANGING
- it_fieldcatalog = t_alv[ c_alv_main ]-fcat "gt_field
- it_outtab = t_tab_01 ).
- t_alv[ c_alv_det ]-grid->set_table_for_first_display(
- EXPORTING
- i_buffer_active = abap_false
- i_bypassing_buffer = abap_true
- is_variant = t_alv[ c_alv_main ]-variant
- is_layout = t_alv[ c_alv_main ]-layout
- i_save = 'A'
- it_toolbar_excluding = t_alv[ c_alv_det ]-toolbar
- CHANGING
- it_fieldcatalog = t_alv[ c_alv_det ]-fcat "gt_field
- it_outtab = <t_demo> ).
- t_alv[ c_alv_fc ]-grid->set_table_for_first_display(
- EXPORTING
- i_buffer_active = abap_false
- i_bypassing_buffer = abap_true
- is_variant = t_alv[ c_alv_main ]-variant
- is_layout = t_alv[ c_alv_main ]-layout
- i_save = 'A'
- it_toolbar_excluding = t_alv[ c_alv_main ]-toolbar
- CHANGING
- it_fieldcatalog = t_alv[ c_alv_fc ]-fcat "gt_field
- it_outtab = t_tab_02 ).
- t_alv[ c_alv_main ]-event = NEW lcl_event_handler( ).
- t_alv[ c_alv_main ]-event->id = t_alv[ c_alv_main ]-id.
- g_alv = t_alv[ c_alv_main ].
- SET HANDLER g_alv-event->handle_toolbar FOR t_alv[ c_alv_main ]-grid.
- SET HANDLER g_alv-event->handle_user_command FOR t_alv[ c_alv_main ]-grid.
- SET HANDLER g_alv-event->handle_data_changed FOR t_alv[ c_alv_main ]-grid.
- SET HANDLER g_alv-event->handle_hotspot FOR t_alv[ c_alv_main ]-grid.
- g_alv-grid->set_toolbar_interactive( ).
- g_alv-grid->set_ready_for_input( 1 ).
- g_alv-grid->register_edit_event( cl_gui_alv_grid=>mc_evt_modified ).
- g_alv-grid->set_ready_for_input( i_ready_for_input = 1 ).
- g_alv = t_alv[ c_alv_fc ].
- g_alv-grid->set_ready_for_input( 1 ).
- g_alv-grid->set_ready_for_input( i_ready_for_input = 1 ).
- ENDFORM.
- FORM alv_remove_buttons USING p_alv TYPE i CHANGING t_tool TYPE ui_functions.
- REFRESH t_tool.
- CASE p_alv.
- * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
- *--[ ALV de Títulos
- WHEN 99.
- t_tool = VALUE #( BASE t_tool ( cl_gui_alv_grid=>mc_fg_edit )
- ( cl_gui_alv_grid=>mc_fg_sort )
- ( cl_gui_alv_grid=>mc_mb_subtot )
- ( cl_gui_alv_grid=>mc_mb_sum )
- ( cl_gui_alv_grid=>mc_mb_variant )
- ( cl_gui_alv_grid=>mc_fc_detail )
- ( cl_gui_alv_grid=>mc_fc_graph )
- ( cl_gui_alv_grid=>mc_fc_info )
- ( cl_gui_alv_grid=>mc_fc_filter )
- ( cl_gui_alv_grid=>mc_mb_export )
- ( cl_gui_alv_grid=>mc_fc_views )
- ( cl_gui_alv_grid=>mc_fc_find )
- ( cl_gui_alv_grid=>mc_fc_print )
- ).
- * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
- *--[ ALV Principal
- WHEN c_alv_main OR c_alv_det.
- t_tool = VALUE #( BASE t_tool ( cl_gui_alv_grid=>mc_fg_edit )
- ( cl_gui_alv_grid=>mc_fg_sort )
- ( cl_gui_alv_grid=>mc_mb_subtot )
- ( cl_gui_alv_grid=>mc_mb_sum )
- ( cl_gui_alv_grid=>mc_mb_variant )
- ( cl_gui_alv_grid=>mc_fc_detail )
- ( cl_gui_alv_grid=>mc_fc_graph )
- ( cl_gui_alv_grid=>mc_fc_info )
- ( cl_gui_alv_grid=>mc_fc_filter )
- * ( CL_GUI_ALV_GRID=>MC_FC_FIND )
- * ( CL_GUI_ALV_GRID=>MC_FC_PRINT )
- ).
- ENDCASE.
- ENDFORM.
- FORM pai_0100.
- DATA(l_okcode) = g_okcode.
- CLEAR g_okcode.
- t_alv[ c_alv_main ]-grid->check_changed_data( ).
- t_alv[ c_alv_fc ]-grid->check_changed_data( ).
- CASE l_okcode.
- WHEN 'BACK'. PERFORM boton_exit_program.
- WHEN 'SAVE'. PERFORM data_save.
- ENDCASE.
- ENDFORM.
- FORM exit_screen USING g_num.
- IF g_num IS NOT INITIAL.
- t_alv[ g_num ]-cc->free( ).
- CLEAR: t_alv[ g_num ]-cc, t_alv[ g_num ]-grid.
- ENDIF.
- LEAVE TO SCREEN 0.
- ENDFORM.
- FORM popup_to_save CHANGING p_subrc TYPE sysubrc.
- DATA: l_ans(1).
- CALL FUNCTION 'POPUP_TO_CONFIRM'
- EXPORTING
- titlebar = TEXT-t07
- * DIAGNOSE_OBJECT = ' '
- text_question = TEXT-q01
- text_button_1 = TEXT-q02
- * ICON_BUTTON_1 = ICON_OKAY
- text_button_2 = TEXT-q03
- * ICON_BUTTON_2 = ICON_CANCEL
- default_button = '2'
- display_cancel_button = abap_false
- start_column = 50
- * START_ROW = 6
- * POPUP_TYPE =
- iv_quickinfo_button_1 = TEXT-q04
- iv_quickinfo_button_2 = TEXT-q05
- IMPORTING
- answer = l_ans
- * TABLES
- * PARAMETER =
- EXCEPTIONS
- text_not_found = 1
- OTHERS = 2.
- IF l_ans = '1'.
- *--[ Bye Bye Bye
- g_save = abap_false.
- CLEAR sy-subrc.
- ELSE.
- p_subrc = 69.
- * EXIT. "-> Back to the future
- ENDIF.
- ENDFORM.
- FORM boton_exit_program.
- IF g_save IS NOT INITIAL.
- PERFORM popup_to_save CHANGING sy-subrc.
- CHECK sy-subrc EQ 0.
- ENDIF.
- LOOP AT t_alv INTO DATA(l_alv) WHERE cc IS NOT INITIAL.
- l_alv-cc->free( ).
- FREE: l_alv-cc.
- CLEAR: l_alv-cc, l_alv-grid.
- ENDLOOP.
- LEAVE TO SCREEN 0.
- ENDFORM.
- FORM data_save.
- DATA: l_001 TYPE zcl_fieldcatalog=>ty_talv,
- l_002 TYPE zcl_fieldcatalog=>ty_talvt,
- l_003 TYPE zcl_fieldcatalog=>ty_alv_tool.
- *--[ Borramos los registros anteriores
- DELETE FROM (zcl_fieldcatalog=>c_tab_alv) WHERE prog = p_prog AND nalv = p_nalv.
- DELETE FROM (zcl_fieldcatalog=>c_tab_alv_text) WHERE prog = p_prog AND nalv = p_nalv.
- DELETE FROM (zcl_fieldcatalog=>c_tab_alv_tool) WHERE prog = p_prog AND nalv = p_nalv.
- LOOP AT t_tab_01 INTO DATA(ax).
- CLEAR: l_001, l_002.
- MOVE-CORRESPONDING ax TO: l_001, l_002.
- l_001-col_pos = sy-tabix. "<-- Nuevo Orden Mundial
- l_002-langu = sy-langu.
- MODIFY (zcl_fieldcatalog=>c_tab_alv) FROM l_001.
- MODIFY (zcl_fieldcatalog=>c_tab_alv_text) FROM l_002.
- AT LAST.
- CLEAR g_save.
- MESSAGE s052(/sdf/mon)." with 'Datos grabados correctamente'.
- ENDAT.
- ENDLOOP.
- l_003-prog = p_prog.
- l_003-nalv = p_nalv.
- LOOP AT t_tab_02 INTO DATA(bx) WHERE flag = abap_true.
- l_003-func = bx-name.
- MODIFY (zcl_fieldcatalog=>c_tab_alv_tool) FROM l_003.
- ENDLOOP.
- ENDFORM.
- FORM data_display.
- t_alv[ c_alv_main ]-grid->refresh_table_display( ).
- * cl_gui_cfw=>set_new_ok_code( new_code = 'REFR' )."<-- HARDRefresh
- cl_gui_cfw=>flush( ).
- ENDFORM.
- DATA: t_fieldname TYPE STANDARD TABLE OF string.
- FORM bot_alv_up_down USING p_updown.
- REFRESH t_fieldname.
- t_alv[ c_alv_main ]-grid->get_selected_rows( IMPORTING et_index_rows = index_rows ).
- IF lines( index_rows ) > 0.
- CASE p_updown.
- WHEN 'U'. SORT index_rows BY index ASCENDING.
- WHEN 'D'. SORT index_rows BY index DESCENDING.
- ENDCASE.
- LOOP AT index_rows INTO DATA(ax).
- READ TABLE t_tab_01 INTO DATA(ah) INDEX ax-index.
- APPEND ah-fieldname TO t_fieldname.
- ENDLOOP.
- ELSE.
- MESSAGE s398(00) WITH 'Debe seleccionar al menos un registro'.
- ENDIF.
- ENDFORM.
- FORM bot_alv_up_done USING p_updown.
- DATA: p_index TYPE lvc_s_row,
- t_index TYPE lvc_t_row.
- PERFORM bot_alv_up_down USING p_updown.
- CHECK lines( index_rows ) > 0.
- LOOP AT t_fieldname INTO DATA(ax).
- READ TABLE t_tab_01 TRANSPORTING NO FIELDS WITH KEY fieldname = ax.
- p_index-index = sy-tabix.
- CASE p_updown.
- WHEN 'U'. PERFORM bot_up USING p_index abap_false.
- WHEN 'D'. PERFORM bot_down USING p_index abap_false.
- ENDCASE.
- ENDLOOP.
- REFRESH index_rows.
- LOOP AT t_fieldname INTO ax.
- READ TABLE t_tab_01 TRANSPORTING NO FIELDS WITH KEY fieldname = ax.
- t_index = VALUE #( BASE t_index ( index = sy-tabix ) ).
- ENDLOOP.
- PERFORM data_display.
- t_alv[ c_alv_main ]-grid->set_selected_rows( EXPORTING it_index_rows = t_index ).
- t_alv[ c_alv_main ]-grid->set_current_cell_via_id( EXPORTING is_row_id = p_index ).
- ENDFORM.
- FORM bot_alv_up.
- PERFORM bot_alv_up_done USING 'U'.
- ENDFORM.
- FORM bot_alv_down.
- PERFORM bot_alv_up_done USING 'D'.
- ENDFORM.
- FORM bot_up USING p_index TYPE lvc_s_row
- p_refresh TYPE xfeld.
- CHECK p_index-index NE 1.
- DATA(l_indice) = p_index-index - 1.
- DATA(cab) = t_tab_01[ p_index-index ].
- DELETE t_tab_01 INDEX p_index-index.
- INSERT cab INTO t_tab_01 INDEX l_indice.
- LOOP AT t_tab_01 ASSIGNING FIELD-SYMBOL(<ax>). <ax>-col_pos = sy-tabix. ENDLOOP.
- CHECK p_refresh = abap_true.
- PERFORM data_display.
- t_alv[ c_alv_main ]-grid->set_current_cell_via_id( EXPORTING is_row_id = p_index ).
- ENDFORM.
- FORM bot_down USING p_index TYPE lvc_s_row
- p_refresh TYPE xfeld.
- CHECK p_index-index NE lines( t_tab_01 ).
- DATA(l_indice) = p_index-index + 1.
- DATA(cab) = t_tab_01[ p_index-index ].
- DELETE t_tab_01 INDEX p_index-index.
- INSERT cab INTO t_tab_01 INDEX l_indice.
- LOOP AT t_tab_01 ASSIGNING FIELD-SYMBOL(<ax>). <ax>-col_pos = sy-tabix. ENDLOOP.
- CHECK p_refresh = abap_true.
- PERFORM data_display.
- t_alv[ c_alv_main ]-grid->set_current_cell_via_id( EXPORTING is_row_id = p_index ).
- ENDFORM.