* ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
* Descripción : Plantilla para crear Arboles
* Autor : MGUTIERREZ
* Ultima Modif : 20.02.2008
* ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
*
* Buscar y reemplazar
* QQQQQ : Nombre de la estructura que aparecerá en el Arbol
*
REPORT Z_TREE.
TABLES: /gex/01, /gex/07.
DATA: g_alv_tree TYPE REF TO cl_gui_alv_tree,
g_custom_container TYPE REF TO cl_gui_custom_container,
g_toolbar TYPE REF TO cl_gui_toolbar.
DATA: gt_datos TYPE /gex/01 OCCURS 0,
wa_datos TYPE /gex/01,
gt_fieldcatalog TYPE lvc_t_fcat,
ok_code LIKE sy-ucomm,
save_ok LIKE sy-ucomm,
g_fav_key TYPE lvc_nkey.
*###############################################################
* LOCAL CLASSES
*###############################################################
CLASS lcl_toolbar_event_receiver DEFINITION.
PUBLIC SECTION.
* Define an event handler method to react to fired function codes
* of the toolbar. .
METHODS: on_function_selected
FOR EVENT function_selected OF cl_gui_toolbar
IMPORTING fcode.
* Evento para el dobleclick
METHODS handle_item_double_click
FOR EVENT item_double_click OF cl_gui_alv_tree
IMPORTING node_key
fieldname.
ENDCLASS. "lcl_toolbar_event_receiver DEFINITION
CLASS lcl_toolbar_event_receiver IMPLEMENTATION.
METHOD handle_item_double_click.
READ TABLE gt_datos INTO wa_datos INDEX 1.
CASE fieldname.
WHEN 'CLASE' OR 'EJEEXP' OR 'NUMEXP' OR 'EXPEDIENTE'.
ENDCASE.
ENDMETHOD. "handle_item_double_click
*
METHOD on_function_selected.
DATA: lt_selected_nodes TYPE lvc_t_nkey,
l_selected_node TYPE lvc_nkey,
l_rc TYPE c.
DATA: node TYPE lvc_nkey,
gt_texto(120).
* Query the function codes of the toolbar in your implementation.
CASE fcode.
WHEN 'DELETE'.
CALL METHOD g_alv_tree->get_selected_nodes
CHANGING
ct_selected_nodes = lt_selected_nodes.
CALL METHOD cl_gui_cfw=>flush.
READ TABLE lt_selected_nodes INTO l_selected_node INDEX 1.
IF sy-subrc EQ 0.
CALL FUNCTION 'POPUP_TO_CONFIRM_STEP'
EXPORTING
textline1 = 'Realmente quiere borrar'
textline2 = 'si confirma borrará la carpeta!!'
titel = 'Confirmacion'
cancel_display = ' '
IMPORTING
answer = l_rc.
IF l_rc EQ 'J'.
CALL METHOD g_alv_tree->delete_subtree
EXPORTING
i_node_key = l_selected_node.
* update frontend
CALL METHOD g_alv_tree->frontend_update.
ENDIF.
ELSE. "sy-subrc EQ 0
MESSAGE i000(0k) WITH 'Por favor marca una carpeta'.
ENDIF.
WHEN 'DELEXP'.
CALL METHOD g_alv_tree->get_selected_item
IMPORTING
e_selected_node = node.
CALL METHOD cl_gui_cfw=>flush.
IF NOT node IS INITIAL.
* READ TABLE gt_datos ."INDEX node.
* CONCATENATE gt_datos-clase gt_datos-ejeexp gt_datos-numexp
* INTO gt_texto SEPARATED BY '/'.
CALL FUNCTION 'POPUP_TO_CONFIRM_STEP'
EXPORTING
textline1 = 'Realmente quiere borrar el expediente:'
textline2 = gt_texto
titel = 'Confirmacion'
cancel_display = ' '
IMPORTING
answer = l_rc.
IF l_rc EQ 'J'.
CALL METHOD g_alv_tree->delete_subtree
EXPORTING
i_node_key = node.
* update frontend
CALL METHOD g_alv_tree->frontend_update.
ENDIF.
ELSE. "sy-subrc EQ 0
MESSAGE i000(0k) WITH 'Por favor marca un expediente'.
ENDIF.
ENDCASE.
ENDMETHOD. "on_function_selected
ENDCLASS. "lcl_toolbar_event_receiver IMPLEMENTATION
DATA: l_event_receiver TYPE REF TO lcl_toolbar_event_receiver.
SELECTION-SCREEN BEGIN OF BLOCK bloque1 WITH FRAME TITLE text-001.
PARAMETERS: p_clase LIKE /gex/01-clase OBLIGATORY,
p_ejer LIKE /gex/01-ejeexp OBLIGATORY.
SELECTION-SCREEN END OF BLOCK bloque1.
* START-OF-SELECTION --------------------------------------------------*
START-OF-SELECTION.
CALL SCREEN 100.
* END-OF-SELECTION ----------------------------------------------------*
END-OF-SELECTION.
MODULE pbo OUTPUT.
SET PF-STATUS 'MAIN100'.
SET TITLEBAR 'TITULO_100'.
IF g_alv_tree IS INITIAL.
PERFORM init_tree.
CALL METHOD cl_gui_cfw=>flush
EXCEPTIONS
cntl_system_error = 1
cntl_error = 2.
ENDIF.
ENDMODULE. " PBO OUTPUT
MODULE pai INPUT.
save_ok = ok_code.
CLEAR ok_code.
CASE save_ok.
WHEN 'EXIT' OR 'BACK' OR 'CANC'.
PERFORM exit_program.
WHEN OTHERS.
* Toolbar events are registered in constructur method of
* CL_ALV_TREE_BASE as application events. So the dispatch call
* is a must if you want to use the standard toolbar.
CALL METHOD cl_gui_cfw=>dispatch.
ENDCASE.
CALL METHOD cl_gui_cfw=>flush.
ENDMODULE. " PAI INPUT
FORM init_tree.
* Creamos el container
DATA: l_tree_container_name(30) TYPE c.
DATA: l_cabecera TYPE treev_hhdr.
DATA: l_comentario TYPE slis_t_listheader.
PERFORM comentarios USING l_comentario.
l_tree_container_name = 'CCONTAINER1'.
CREATE OBJECT g_custom_container
EXPORTING
container_name = l_tree_container_name
EXCEPTIONS
cntl_error = 1
cntl_system_error = 2
create_error = 3
lifetime_error = 4
lifetime_dynpro_dynpro_link = 5.
* Creamos un control para el arbol
CREATE OBJECT g_alv_tree
EXPORTING
parent = g_custom_container
node_selection_mode = cl_gui_column_tree=>node_sel_mode_single
item_selection = 'X'
no_html_header = ''
no_toolbar = ''
EXCEPTIONS
cntl_error = 1
cntl_system_error = 2
create_error = 3
lifetime_error = 4
illegal_node_selection_mode = 5
failed = 6
illegal_column_name = 7.
PERFORM crear_cabecera_jerarquia CHANGING l_cabecera.
PERFORM catalogo_campos.
* IMPORTANT: Table 'gt_datos' must be empty. Do not change this table
* (even after this method call). You can change data of your table
* by calling methods of CL_GUI_ALV_TREE.
* Furthermore, the output table 'gt_outtab' must be global and can
* only be used for one ALV Tree Control.
CALL METHOD g_alv_tree->set_table_for_first_display
EXPORTING
is_hierarchy_header = l_cabecera
it_list_commentary = l_comentario
i_logo = 'NAVARRA'
i_background_id = 'ALV_BACKGROUND'
CHANGING
it_fieldcatalog = gt_fieldcatalog
it_outtab = gt_datos. "table must be empty !
PERFORM crear_jerarquia.
PERFORM modificar_barra.
PERFORM registrar_eventos.
* Send data to frontend.
CALL METHOD g_alv_tree->frontend_update.
ENDFORM. " init_tree
FORM crear_cabecera_jerarquia CHANGING
p_hierarchy_header TYPE treev_hhdr.
p_hierarchy_header-heading = 'Expedientes'.
p_hierarchy_header-t_image = '@7K@'.
p_hierarchy_header-tooltip = 'Texto explicativo al pasar el cursor!'.
p_hierarchy_header-width = 50.
p_hierarchy_header-width_pix = 'X'.
ENDFORM. " crear_cabecera_jerarquia
FORM exit_program.
CALL METHOD g_custom_container->free.
LEAVE PROGRAM.
ENDFORM. " exit_program
FORM catalogo_campos.
DATA: ls_fieldcatalog TYPE lvc_s_fcat.
* Creamos el catalogo de campos con la estructura que le pasamos!
CALL FUNCTION 'LVC_FIELDCATALOG_MERGE'
EXPORTING
i_structure_name = '/GEX/01'
CHANGING
ct_fieldcat = gt_fieldcatalog.
* Cambiamos el catalogo de campos!
LOOP AT gt_fieldcatalog INTO ls_fieldcatalog.
CASE ls_fieldcatalog-fieldname.
WHEN 'CLASE'.
ls_fieldcatalog-key = 'X'.
ENDCASE.
MODIFY gt_fieldcatalog FROM ls_fieldcatalog.
ENDLOOP.
ENDFORM. " catalogo_campos
FORM registrar_eventos.
DATA: lt_events TYPE cntl_simple_events,
l_event TYPE cntl_simple_event.
CALL METHOD g_alv_tree->get_registered_events
IMPORTING
events = lt_events.
* register events on frontend
CALL METHOD g_alv_tree->set_registered_events
EXPORTING
events = lt_events
EXCEPTIONS
cntl_error = 1
cntl_system_error = 2
illegal_event_combination = 3.
CREATE OBJECT l_event_receiver.
SET HANDLER l_event_receiver->on_function_selected FOR g_toolbar.
SET HANDLER l_event_receiver->handle_item_double_click FOR g_alv_tree.
ENDFORM. " registrar_eventos
FORM crear_jerarquia.
DATA: lt_datos TYPE TABLE OF /gex/01,
wa_datos TYPE /gex/01,
l_top_key TYPE lvc_nkey.
DATA: ls_texto TYPE lvc_value.
DATA: l_last_key TYPE lvc_nkey.
* Buscamos los datos.
SELECT * FROM /gex/07 WHERE clase_p = p_clase AND
ejeexp_p = p_ejer.
wa_datos-clase = /gex/07-clase_p.
wa_datos-ejeexp = /gex/07-ejeexp_p.
wa_datos-numexp = /gex/07-numexp_p.
COLLECT wa_datos INTO lt_datos.
ENDSELECT.
SORT lt_datos BY clase ejeexp numexp.
LOOP AT lt_datos INTO wa_datos.
SELECT SINGLE titulo FROM /gex/01 INTO /gex/01-titulo
WHERE clase = wa_datos-clase
AND ejeexp = wa_datos-ejeexp
AND numexp = wa_datos-numexp.
ls_texto = /gex/01-titulo.
PERFORM add_carpeta USING wa_datos space ls_texto space
CHANGING l_top_key.
SELECT * FROM /gex/07 WHERE clase_p = wa_datos-clase
AND ejeexp_p = wa_datos-ejeexp
AND numexp_p = wa_datos-numexp.
SELECT SINGLE * FROM /gex/01 WHERE clase = /gex/07-clase_h
AND ejeexp = /gex/07-ejeexp_h
AND numexp = /gex/07-numexp_h.
ls_texto = /gex/01-titulo.
MOVE-CORRESPONDING /gex/01 TO wa_datos.
PERFORM add_nodo USING wa_datos
l_top_key ls_texto
'@IF@'
CHANGING l_last_key .
ENDSELECT.
ENDLOOP.
ENDFORM. " crear_jerarquia
FORM add_nodo USING p_datos TYPE /gex/01
p_relat_key TYPE lvc_nkey
p_node_text TYPE lvc_value
p_node_image TYPE tv_image
CHANGING p_new_key.
DATA: l_layout_node TYPE lvc_s_layn,
l_handle_line TYPE i.
l_layout_node-n_image = p_node_image.
CALL METHOD g_alv_tree->add_node
EXPORTING
i_relat_node_key = p_relat_key
i_relationship = cl_gui_column_tree=>relat_last_child
i_node_text = p_node_text
is_outtab_line = p_datos
is_node_layout = l_layout_node
IMPORTING
e_new_node_key = p_new_key.
ENDFORM. "add_nodo
FORM add_carpeta USING p_datos TYPE /gex/01
p_relat_key TYPE lvc_nkey
p_node_text TYPE lvc_value
p_node_image TYPE tv_image
CHANGING p_new_key.
DATA: l_layout_node TYPE lvc_s_layn,
l_handle_favourite_folder TYPE i.
l_layout_node-isfolder = 'X'. "Carpeta por defecto!
* l_layout_node-n_image = p_node_image. "En vez de la carpeta
* estos campos al expandir y contraer!!
*l_layout_node-N_IMAGE = '@01@'.
*l_layout_node-EXP_IMAGE = '@02@'.
CALL METHOD g_alv_tree->add_node
EXPORTING
i_relat_node_key = p_relat_key
i_relationship = cl_gui_column_tree=>relat_last_child
i_node_text = p_node_text
is_outtab_line = p_datos
is_node_layout = l_layout_node
IMPORTING
e_new_node_key = p_new_key.
ENDFORM. "add_carpeta
FORM comentarios USING e04_lt_top_of_page TYPE slis_t_listheader.
DATA: ls_line TYPE slis_listheader.
CLEAR ls_line.
REFRESH: e04_lt_top_of_page.
* TITULO ****
* H = Header, S = Selection, A = Action
ls_line-typ = 'H'.
ls_line-info+20 = 'Expedientes'.
APPEND ls_line TO e04_lt_top_of_page.
CLEAR ls_line.
ENDFORM. "comentarios
FORM modificar_barra.
CALL METHOD g_alv_tree->get_toolbar_object
IMPORTING
er_toolbar = g_toolbar.
CHECK NOT g_toolbar IS INITIAL.
CALL METHOD g_toolbar->add_button
EXPORTING
fcode = ''
icon = ''
butn_type = cntb_btype_sep.
CALL METHOD g_toolbar->add_button
EXPORTING
fcode = 'DELETE'
icon = '@11@'
butn_type = cntb_btype_button
text = 'Borrar Nodo'
quickinfo = text-901. "Delete subtree
CALL METHOD g_toolbar->add_button
EXPORTING
fcode = 'DELEXP'
icon = '@11@'
butn_type = cntb_btype_button
text = 'Borrar Hijo'
quickinfo = text-901. "Delete subtree
ENDFORM. "modificar_barra