ALV ROBOT.

posted under by Antonio Lopez

Este es un reporte que muestra un tipo de ALV sin necesidad de usar dynpro, es solo un simple reporte, en el cual me apoyo de una tabla llamada ZRF_t0002, contiene entre otros campos:
zrf_t0002-id_cliente, zrf_t0002-nombre, zrf_t0002-apellido1, zrf_t0002-apellido2.
es facil de impelementar y le da una vista mas profesional a nuetros reportes, espero sea de utilidad.

REPORT zalv_robot .

TABLES: ddshretval,
zrf_t0002.

TYPE-POOLS: slis.

DATA: BEGIN OF it_cliente OCCURS 0,
cliente LIKE zrf_t0002-id_cliente,
END OF it_cliente.

DATA: BEGIN OF it_match OCCURS 0, " Esta tabla nos devuelve la ayuda
shlpname LIKE ddshretval-shlpname,
fieldname LIKE ddshretval-fieldname,
recordpos LIKE ddshretval-recordpos,
fieldval LIKE ddshretval-fieldval,
retfield LIKE ddshretval-retfield,
END OF it_match.


TYPES: BEGIN OF tp_data,
cliente LIKE zrf_t0002-id_cliente,
nombre LIKE zrf_t0002-nombre,
apellido1 LIKE zrf_t0002-apellido1,
apellido2 LIKE zrf_t0002-apellido2,
END OF tp_data,
tp_tbl_data TYPE STANDARD TABLE OF tp_data.



* Report data to be shown.
DATA: it_data TYPE STANDARD TABLE OF tp_data.

* Heading of the report.
DATA: t_heading TYPE slis_t_listheader.

*======================= Selection Screen ==========================*
DATA: vcliente LIKE zrf_t0002-id_cliente,
vnombre LIKE zrf_t0002-nombre.
SELECTION-SCREEN: BEGIN OF BLOCK b1 WITH FRAME TITLE text-t01.
SELECT-OPTIONS id_cli FOR zrf_t0002-id_cliente.
SELECTION-SCREEN: END OF BLOCK b1.

*======================== Event Blocks =============================*
AT SELECTION-SCREEN ON VALUE-REQUEST FOR id_cli-low.
SELECT id_cliente
FROM zrf_t0002
INTO TABLE it_cliente
WHERE id_cliente IN id_cli.
SORT it_cliente BY cliente.


CALL FUNCTION 'F4IF_INT_TABLE_VALUE_REQUEST'
EXPORTING
retfield = 'CLIENTE'
window_title = 'CLIENTE'
value_org = 'S'
TABLES
value_tab = it_cliente
return_tab = it_match
EXCEPTIONS
parameter_error = 1
no_values_found = 2
OTHERS = 3.

IF sy-subrc EQ 0.
READ TABLE it_match INDEX 1.
vcliente = it_match-fieldval.
MOVE vcliente TO id_cli-low.
SELECT SINGLE nombre FROM zrf_t0002
INTO vnombre WHERE id_cliente IN id_cli.
ENDIF.

AT SELECTION-SCREEN ON VALUE-REQUEST FOR id_cli-high.
SELECT id_cliente
FROM zrf_t0002
INTO TABLE it_cliente
WHERE id_cliente IN id_cli.
SORT it_cliente BY cliente.


CALL FUNCTION 'F4IF_INT_TABLE_VALUE_REQUEST'
EXPORTING
retfield = 'ID_CLIENTE'
window_title = 'CLIENTE'
value_org = 'S'
TABLES
value_tab = it_cliente
return_tab = it_match
EXCEPTIONS
parameter_error = 1
no_values_found = 2
OTHERS = 3.

IF sy-subrc EQ 0.
READ TABLE it_match INDEX 1.
vcliente = it_match-fieldval.
MOVE vcliente TO id_cli-high.
SELECT SINGLE nombre FROM zrf_t0002
INTO vnombre WHERE id_cliente IN id_cli.

ENDIF.

START-OF-SELECTION.
PERFORM get_data USING it_data.


END-OF-SELECTION.
PERFORM build_alv USING it_data t_heading.

*======================== Subroutines ==============================*

*&------------------------------------------------------------------*
*& Form get_data
*&------------------------------------------------------------------*
* Gets the information to be shown in the report.
*-------------------------------------------------------------------*
FORM get_data USING t_data TYPE tp_tbl_data.

SELECT zrf_t0002~id_cliente
zrf_t0002~nombre
zrf_t0002~apellido1
zrf_t0002~apellido2

INTO TABLE t_data
FROM zrf_t0002
WHERE zrf_t0002~id_cliente IN id_cli.

ENDFORM. " get_data


*&------------------------------------------------------------------*
*& Form build_alv
*&------------------------------------------------------------------*
* Builds and display the ALV Grid.
*-------------------------------------------------------------------*
FORM build_alv USING t_data TYPE tp_tbl_data
t_heading TYPE slis_t_listheader.

* ALV required data objects.
DATA: w_title TYPE lvc_title,
w_repid TYPE syrepid,
w_comm TYPE slis_formname,
w_status TYPE slis_formname,
x_layout TYPE slis_layout_alv,
t_event TYPE slis_t_event,
t_fieldcat TYPE slis_t_fieldcat_alv,
t_sort TYPE slis_t_sortinfo_alv.



REFRESH t_fieldcat.
REFRESH t_event.
REFRESH t_sort.
CLEAR x_layout.
CLEAR w_title.

* Field Catalog
PERFORM set_fieldcat2 USING:
1 'CLIENTE' 'CLIENTE' 'ZRF_T0002' 7 space 'CLIENTE'
'CLIENTE' 'CLIENTE' 'CLIENTE' space space space space space
space t_fieldcat ,
3 'NOMBRE' 'NOMBRE' 'ZRF_T0002' 15 space 'NOMBRE' 'NOMBRE'
'NOMBRE' 'NOMBRE' space space space space space space t_fieldcat ,
4 'APELLIDO1' 'APELLIDO1' 'ZPM_T0004' 25 space 'APELLIDO1'
'APELLIDO1' 'APELLIDO1' 'APELLIDO1' space
space space space space space t_fieldcat ,
5 'APELLIDO2' 'APELLIDO2' 'ZPM_T0004' 25 space 'APELLIDO2'
'APELLIDO2' 'APELLIDO2' 'APELLIDO2' space
space space space space space t_fieldcat .


* Layout
x_layout-zebra = 'X'.

* Top of page heading
PERFORM set_top_page_heading USING t_heading t_event.

* Events
PERFORM set_events USING t_event.

* GUI Status
w_status = ''.
w_repid = sy-repid.

* Title

* User commands
w_comm = 'USER_COMMAND'.


* Displays the ALV grid
CALL FUNCTION 'REUSE_ALV_GRID_DISPLAY'
EXPORTING
i_callback_program = w_repid
it_fieldcat = t_fieldcat
is_layout = x_layout
it_sort = t_sort
i_callback_pf_status_set = w_status
i_callback_user_command = w_comm
i_save = 'X'
it_events = t_event
i_grid_title = w_title
TABLES
t_outtab = t_data
EXCEPTIONS
program_error = 1
OTHERS = 2.
IF sy-subrc <> 0.
MESSAGE ID sy-msgid TYPE sy-msgty NUMBER sy-msgno
WITH sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4.
ENDIF.

ENDFORM. " build_alv.


*&------------------------------------------------------------------*
*& Form set_top_page_heading
*&------------------------------------------------------------------*
* Creates the report headings.
*-------------------------------------------------------------------*
FORM set_top_page_heading USING t_heading TYPE slis_t_listheader
t_events TYPE slis_t_event.

DATA: x_heading TYPE slis_listheader,
x_event TYPE LINE OF slis_t_event.

* Report title
CLEAR t_heading[].
CLEAR x_heading.
x_heading-typ = 'H'.
x_heading-info = ''(001).
APPEND x_heading TO t_heading.

* Date of execution
CLEAR x_heading.
x_heading-typ = 'S'.
x_heading-key = 'Date: '.
WRITE sy-datum TO x_heading-info.
APPEND x_heading TO t_heading.

* Time of execution
CLEAR x_heading.
x_heading-typ = 'S'.
x_heading-key = 'Time: '.
WRITE sy-uzeit TO x_heading-info.
APPEND x_heading TO t_heading.

* Top of page event
x_event-name = slis_ev_top_of_page.
x_event-form = 'TOP_OF_PAGE'.
APPEND x_event TO t_events.

ENDFORM.

*&------------------------------------------------------------------*
*& Form set_events
*&------------------------------------------------------------------*
* Sets the events for ALV.
* The TOP_OF_PAGE event is alredy being registered in
* the set_top_page_heading subroutine.
*-------------------------------------------------------------------*
FORM set_events USING t_events TYPE slis_t_event.

DATA: x_event TYPE LINE OF slis_t_event.

ENDFORM.

*&------------------------------------------------------------------*
*& Form set_order
*&------------------------------------------------------------------*
* Adds an entry to the order table.
*-------------------------------------------------------------------*
FORM set_order USING p_fieldname p_tabname p_up p_down p_subtot
t_sort TYPE slis_t_sortinfo_alv.

DATA: x_sort TYPE slis_sortinfo_alv.

CLEAR x_sort.
x_sort-fieldname = p_fieldname.
x_sort-tabname = p_tabname.
x_sort-up = p_up.
x_sort-down = p_down.
x_sort-subtot = p_subtot.
APPEND x_sort TO t_sort.


ENDFORM. "set_order

*-------------------------------------*
FORM set_fieldcat2 USING
p_colpos p_fieldname p_ref_fieldname p_ref_tabname
p_outputlen p_noout
p_seltext_m p_seltext_l p_seltext_s p_reptext_ddic p_ddictxt
p_hotspot p_showasicon p_checkbox p_edit
p_dosum
t_fieldcat TYPE slis_t_fieldcat_alv.

DATA: wa_fieldcat TYPE slis_fieldcat_alv.

CLEAR wa_fieldcat.

* General settings
wa_fieldcat-fieldname = p_fieldname.
wa_fieldcat-col_pos = p_colpos.
wa_fieldcat-no_out = p_noout.
wa_fieldcat-hotspot = p_hotspot.
wa_fieldcat-checkbox = p_checkbox.
wa_fieldcat-icon = p_showasicon.
wa_fieldcat-do_sum = p_dosum.

IF p_ref_tabname IS INITIAL.
wa_fieldcat-rollname = p_ref_fieldname.
ELSE.
wa_fieldcat-ref_tabname = p_ref_tabname.
IF p_ref_fieldname EQ space.
wa_fieldcat-ref_fieldname = wa_fieldcat-fieldname.
ELSE.
wa_fieldcat-ref_fieldname = p_ref_fieldname.
ENDIF.
ENDIF.

* Set output length.
IF NOT p_outputlen IS INITIAL.
wa_fieldcat-outputlen = p_outputlen.
ENDIF.

* Set text headers.
IF NOT p_seltext_m IS INITIAL.
wa_fieldcat-seltext_m = p_seltext_m.
ENDIF.

IF NOT p_seltext_l IS INITIAL.
wa_fieldcat-seltext_l = p_seltext_l.
ENDIF.

IF NOT p_seltext_s IS INITIAL.
wa_fieldcat-seltext_s = p_seltext_s.
ENDIF.

IF NOT p_reptext_ddic IS INITIAL.
wa_fieldcat-reptext_ddic = p_reptext_ddic.
ENDIF.

IF NOT p_ddictxt IS INITIAL.
wa_fieldcat-ddictxt = p_ddictxt.
ENDIF.

* Set as editable or not.
IF NOT p_edit IS INITIAL.
wa_fieldcat-input = 'X'.
wa_fieldcat-edit = 'X'.
ENDIF.

APPEND wa_fieldcat TO t_fieldcat.

ENDFORM. "set_fieldcat2

*======================== Subroutines called by ALV ================*

*&------------------------------------------------------------------*
*& Form top_of_page
*&------------------------------------------------------------------*
* Called on top_of_page ALV event.
* Prints the heading.
*-------------------------------------------------------------------*
FORM top_of_page.
CALL FUNCTION 'REUSE_ALV_COMMENTARY_WRITE'
EXPORTING
it_list_commentary = t_heading.
ENDFORM. " alv_top_of_page

*&------------------------------------------------------------------*
*& Form user_command
*&------------------------------------------------------------------*
* Called on user_command ALV event.
* Executes custom commands.
*-------------------------------------------------------------------*
FORM user_command USING r_ucomm LIKE sy-ucomm
rs_selfield TYPE slis_selfield.


ENDFORM. "user_command

ALV TREE

posted under by Antonio Lopez

Este Programa permite crear un ALV TREE en un customcontrol, debemos tener customcontrol en nuestra dynproo llamado "CCONTAINER".

En este ejemplo utilizo una tabla llamada zrf_t0000, cuya estructura es la siguiente.
MANDT-----------MANDT
ID--------------NUMC
DEPARTAMENTOS---CHAR
PANTALLAS-------CHAR
TRANSACCIONES---CHAR



CODIGO:
********************************
Screen Flow Logic:
********************************
PROCESS BEFORE OUTPUT.
MODULE STATUS_0100.

PROCESS AFTER INPUT.
MODULE USER_COMMAND_0100.
--------------------------------


**********************
*INCLUDE TOP
**********************
*&---------------------------------------------------------------------*
*& Include ZALVTREETOP *
*& *
*&---------------------------------------------------------------------*
PROGRAM ZALVTREE.

tables:
ZRF_T0000.

include .

DATA: g_alv_tree TYPE REF TO cl_gui_alv_tree,
g_custom_container TYPE REF TO cl_gui_custom_container.

DATA: gt_TONO TYPE ZRF_T0000 OCCURS 0, "Output-Table
ok_code LIKE sy-ucomm,
save_ok LIKE sy-ucomm, "OK-Code
g_max type i value 255,
lztono like line of GT_tono.

DATA:
CAT_CAMPOS TYPE LVC_T_FCAT,
LCAT_CAMPOS LIKE LINE OF CAT_CAMPOS.



*---------------------------------------------------------------
* LOCAL CLASSES
*---------------------------------------------------------------
*§1. Define a (local) class for event handling

CLASS lcl_tree_event_receiver DEFINITION.

PUBLIC SECTION.
*§2. Define an event handler method for each event you want to react to.
METHODS handle_node_double_click
FOR EVENT node_double_click OF cl_gui_alv_tree
IMPORTING node_key sender.
* 'sender' is an implicit event parameter that is provided by
* ABAP Objects runtime system. It contains a reference to the
* object that fired the event. You may directly use it to
* call methods of this instance.

ENDCLASS.
******************************************************************
CLASS lcl_tree_event_receiver IMPLEMENTATION.
*§3. Implement your event handler methods.

METHOD handle_node_double_click.
data: lt_children type lvc_t_nkey.
data temp type p.
DATA: e_node_text type LVC_VALUE.
DATA: TRANSACCION(10) TYPE C.
*first check if the node is a leaf, i.e. can not be expanded

call method sender->get_children
exporting i_node_key = node_key
importing et_children = lt_children.

if lt_children is initial.
****************************************************************
CALL METHOD sender->get_outtab_line
EXPORTING i_node_key = node_key
IMPORTING e_node_text = e_node_text.

SELECT TRANSACCIONES INTO TRANSACCION
FROM ZRF_T0000
WHERE PANTALLAS = e_node_text.
ENDSELECT.
CALL TRANSACTION TRANSACCION.
****************************************************************
endif.
ENDMETHOD.
ENDCLASS.



**********************
* INCLUDE OUTPUT
**********************
*----------------------------------------------------------------------*
* INCLUDE ZALVTREEO01 *
*----------------------------------------------------------------------*
*&---------------------------------------------------------------------*
*& Module STATUS_0100 OUTPUT
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
MODULE status_0100 OUTPUT.
SET PF-STATUS 'GUI'.
SET TITLEBAR 'MAINTITLE'.

IF g_alv_tree IS INITIAL.
PERFORM init_tree.

CALL METHOD cl_gui_cfw=>flush
EXCEPTIONS cntl_system_error = 1
cntl_error = 2.
IF sy-subrc NE 0.
CALL FUNCTION 'POPUP_TO_INFORM'
EXPORTING
titel = 'Automation Queue failure'(801)
txt1 = 'Internal error:'(802)
txt2 = 'A method in the automation queue'(803)
txt3 = 'caused a failure.'(804).
ENDIF.
ENDIF.

ENDMODULE. " STATUS_0100 OUTPUT


******************
*INCLUDE IN
******************
*----------------------------------------------------------------------*
* INCLUDE ZALVTREEI01 *
*----------------------------------------------------------------------*
*&---------------------------------------------------------------------*
*& Module USER_COMMAND_0100 INPUT
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
module USER_COMMAND_0100 input.
CASE SY-UCOMM.
WHEN 'CANC' OR 'EXIT' OR 'BACK'.
LEAVE PROGRAM.
WHEN OTHERS.
* §6. Call dispatch to process toolbar functions
CALL METHOD cl_gui_cfw=>dispatch.
ENDCASE.
CALL METHOD cl_gui_cfw=>flush.
endmodule. " USER_COMMAND_0100 INPUT


***********************
*INCLUDE FORMS
***********************
*----------------------------------------------------------------------*
* INCLUDE ZALVTREEF01 *
*----------------------------------------------------------------------*
*&---------------------------------------------------------------------*
*& Form init_tree
*&---------------------------------------------------------------------*
* INICIALIZACION DEL TREE
*----------------------------------------------------------------------*
* --> p1 text
* <-- p2 text
*----------------------------------------------------------------------*
form init_tree.
* create container for alv-tree
* DATA: l_tree_container_name(30) TYPE c.


CREATE OBJECT g_custom_container
EXPORTING
container_name = 'CCONTAINER'
EXCEPTIONS
cntl_error = 1
cntl_system_error = 2
create_error = 3
lifetime_error = 4
lifetime_dynpro_dynpro_link = 5.
IF sy-subrc <> 0.
MESSAGE x208(00) WITH 'ERROR'(100).
ENDIF.

* create tree control
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 = 'X'
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.
IF sy-subrc <> 0.
MESSAGE x208(00) WITH 'ERROR'. "#EC NOTEXT
ENDIF.

* §2. Create Hierarchy-header
* The simple ALV Tree uses the text of the fields which were used
* for sorting to define this header. When you use
* the 'normal' ALV Tree the hierarchy is build up freely
* by the programmer this is not possible, so he has to define it
* himself.
DATA l_hierarchy_header TYPE treev_hhdr.
PERFORM build_hierarchy_header CHANGING l_hierarchy_header.

* §3. Create empty Tree Control
* IMPORTANT: Table 'gt_sflight' 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.

PERFORM CATCAMPOS.

* create info-table for html-header
data: lt_list_commentary type slis_t_listheader,
l_logo type sdydo_value.
perform build_comment using
lt_list_commentary
l_logo.

data: ls_variant type disvariant.
ls_variant-report = sy-repid.

CALL METHOD g_alv_tree->set_table_for_first_display
EXPORTING
i_structure_name = 'ZRF_T0000'
is_hierarchy_header = l_hierarchy_header
it_list_commentary = lt_list_commentary
i_logo = l_logo
i_background_id = 'ALV_BACKGROUND'
is_variant = ls_variant
i_save = 'A'
CHANGING
it_outtab = gt_TONO "table must be empty !
it_fieldcatalog = CAT_CAMPOS.

* §4. Create hierarchy (nodes and leaves)
PERFORM create_hierarchy.
PERFORM register_events.
* §5. Send data to frontend.
CALL METHOD g_alv_tree->frontend_update.
* wait for automatic flush at end of pbo
ENDFORM. " init_tree

FORM CATCAMPOS.
REFRESH CAT_CAMPOS.
CLEAR LCAT_CAMPOS.
LCAT_CAMPOS-FIELDNAME = 'DEPARTAMENTOS'.
LCAT_CAMPOS-REF_TABLE = 'ZRF_T0000'.
LCAT_CAMPOS-COLTEXT = 'DEPARTAMENTO'.
LCAT_CAMPOS-OUTPUTLEN = 10.
LCAT_CAMPOS-EMPHASIZE = 'C200'.
*LCAT_CAMPOS-NO_OUT = 'X'.
APPEND LCAT_CAMPOS TO CAT_CAMPOS.

CLEAR LCAT_CAMPOS.
LCAT_CAMPOS-FIELDNAME = 'PANTALLAS'.
LCAT_CAMPOS-REF_TABLE = 'ZRF_T0000'.
LCAT_CAMPOS-COLTEXT = 'PROCESO'.
LCAT_CAMPOS-OUTPUTLEN = 10.
LCAT_CAMPOS-EMPHASIZE = 'C200'.
*LCAT_CAMPOS-NO_OUT = 'X'.
APPEND LCAT_CAMPOS TO CAT_CAMPOS.

CLEAR LCAT_CAMPOS.
LCAT_CAMPOS-FIELDNAME = 'ID'.
LCAT_CAMPOS-REF_TABLE = 'ZRF_T0000'.
LCAT_CAMPOS-COLTEXT = 'ID'.
LCAT_CAMPOS-OUTPUTLEN = 10.
LCAT_CAMPOS-EMPHASIZE = 'C200'.
*LCAT_CAMPOS-NO_OUT = 'X'.
APPEND LCAT_CAMPOS TO CAT_CAMPOS.

CLEAR LCAT_CAMPOS.
LCAT_CAMPOS-FIELDNAME = 'TRANSACCIONES'.
LCAT_CAMPOS-REF_TABLE = 'ZRF_T0000'.
LCAT_CAMPOS-COLTEXT = 'TRANSACCION'.
LCAT_CAMPOS-OUTPUTLEN = 10.
LCAT_CAMPOS-EMPHASIZE = 'C200'.
*LCAT_CAMPOS-NO_OUT = 'X'.
APPEND LCAT_CAMPOS TO CAT_CAMPOS.

endform. " init_tree


**&---------------------------------------------------------------------
**
**& Form build_hierarchy_header
**&---------------------------------------------------------------------
**
** build hierarchy-header-information
**----------------------------------------------------------------------
**
** -->P_L_HIERARCHY_HEADER strucxture for hierarchy-header
**----------------------------------------------------------------------
**
FORM build_hierarchy_header CHANGING
p_hierarchy_header TYPE treev_hhdr.

p_hierarchy_header-heading = 'DEPARTAMENTOS'(300).
p_hierarchy_header-tooltip = 'Escoga un departamento...'(400).
p_hierarchy_header-width = 10.
p_hierarchy_header-width_pix = ' '.

ENDFORM. " build_hierarchy_header
*&---------------------------------------------------------------------*
*& Form build_comment
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
* -->P_LT_LIST_COMMENTARY text
* -->P_L_LOGO text
*----------------------------------------------------------------------*
form build_comment using
pt_list_commentary type slis_t_listheader
p_logo type sdydo_value.

data: ls_line type slis_listheader.
GET TIME.
* LIST HEADING LINE: TYPE H
clear ls_line.
ls_line-typ = 'H'.
* LS_LINE-KEY: NOT USED FOR THIS TYPE
ls_line-info = 'Rodocletas Feliz S.A. de C.V.'. "#EC NOTEXT
append ls_line to pt_list_commentary.
* STATUS LINE: TYPE S
clear ls_line.
ls_line-typ = 'S'.
ls_line-key = 'valid until'. "#EC NOTEXT
ls_line-info = SY-DATUM. "#EC NOTEXT
append ls_line to pt_list_commentary.
ls_line-key = 'time'.
ls_line-info = SY-UZEIT. "#EC NOTEXT
append ls_line to pt_list_commentary.
* ACTION LINE: TYPE A
clear ls_line.
ls_line-typ = 'A'.
* LS_LINE-KEY: NOT USED FOR THIS TYPE
ls_line-info = 'Seleccione un departamento y su transaccion'."NOTEXT
append ls_line to pt_list_commentary.

p_logo = 'ENJOYSAP_LOGO'.


endform. " build_comment
*&---------------------------------------------------------------------*
*& Form create_hierarchy
*&---------------------------------------------------------------------*
* CREACION DE JERARQUIA
*----------------------------------------------------------------------*
* --> p1 text
* <-- p2 text
*----------------------------------------------------------------------*
form create_hierarchy.
DATA: ls_TONO TYPE ZRF_T0000,
lt_TONO TYPE ZRF_T0000 OCCURS 0,
ldepartamento type ZRF_T0000-departamentos,
ldepartamento_anterior type ZRF_T0000-departamentos,
lpantalla type ZRF_T0000-pantallas,
lpantalla_anterior type ZRF_T0000-pantallas.

DATA: l_VISTA TYPE lvc_nkey,
l_DEPARTAMENTO_key TYPE lvc_nkey,
l_PANTALLA_key TYPE lvc_nkey,
l_last_key TYPE lvc_nkey.

* §4a. Select data
SELECT * FROM ZRF_T0000 INTO TABLE lt_TONO up to g_max rows.

* §4b. Sort output table according to your conceived hierarchy
* We sort in this order:
* departamento and pantalla (top level nodes)
* carrier id (next level)

SORT lt_TONO BY DEPARTAMENTOS pantallas.

* Note: The top level nodes do not correspond to a field of the
* output table. Instead we use data of the table to invent another
* hierarchy level above the levels that can be build by sorting.

* §4c. Add data to tree

LOOP AT lt_TONO INTO ls_TONO.
* Prerequesite: The table is sorted.
* You add a node everytime the values of a sorted field changes.
* Finally, the complete line is added as a leaf below the last
* node.

ldepartamento = ls_TONO-departamentos.
lpantalla = ls_tono-pantallas.

* Top level nodes:
IF ldepartamento <> ldepartamento_anterior.
ldepartamento_anterior = ldepartamento.

*Providing no key means that the node is added on top level:
PERFORM add_depto USING ldepartamento
''
CHANGING l_departamento_key.
* The departament changed, thus, there is no predecessor carrier
ENDIF.

* pantalla nodes:
* (always inserted as child of the last depto
* which is identified by 'l_departamento_key')
IF lpantalla <> lpantalla_anterior. "on change of l_carrid
lpantalla_anterior = lpantalla.
PERFORM add_pantalla_line USING ls_tono
l_departamento_key
CHANGING l_pantalla_key.
ENDIF.

*add the related information of each row into each nodo.
PERFORM add_complete_line USING ls_tono
l_pantalla_key
CHANGING l_last_key.
ENDLOOP.

ENDFORM. " create_hierarchy

**&---------------------------------------------------------------------
**& Form add_depto
**&---------------------------------------------------------------------
FORM add_depto USING depto TYPE c
p_relat_key TYPE lvc_nkey
CHANGING p_node_key TYPE lvc_nkey.

DATA: l_node_text TYPE lvc_value,
ls_tono TYPE ZRF_T0000,
l_month(15) TYPE c. "output string for depto

* get depto name for node text
l_node_text = depto.

* add node:
* ALV Tree firstly inserts this node as a leaf if you do not provide
* IS_NODE_LAYOUT with field ISFOLDER set. In form 'add_carrid_line'
* the leaf gets a child and thus ALV converts it to a folder
* automatically.
*
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 = l_node_text
is_outtab_line = ls_tono
IMPORTING
e_new_node_key = p_node_key.

ENDFORM. " add_month
**--------------------------------------------------------------------

FORM add_pantalla_line USING ps_TONO TYPE ZRF_T0000
p_relat_key TYPE lvc_nkey
CHANGING p_node_key TYPE lvc_nkey.

DATA: l_node_text TYPE lvc_value,
ls_TONO TYPE ZRF_T0000.

* add node
* ALV Tree firstly inserts this node as a leaf if you do not provide
* IS_NODE_LAYOUT with field ISFOLDER set. In form 'add_carrid_line'
* the leaf gets a child and thus ALV converts it to a folder
* automatically.
*
l_node_text = ps_TONO-pantallas.
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 = l_node_text
is_outtab_line = ls_TONO
IMPORTING
e_new_node_key = p_node_key.

ENDFORM. " add_carrid_line
*&---------------------------------------------------------------------
*
*& Form add_complete_line
*&---------------------------------------------------------------------
*
FORM add_complete_line USING ps_tono TYPE ZRF_T0000
p_relat_key TYPE lvc_nkey
CHANGING p_node_key TYPE lvc_nkey.

DATA: l_node_text TYPE lvc_value.

write PS_TONO-pantallas to l_node_text.

* add leaf:
* ALV Tree firstly inserts this node as a leaf if you do not provide
* IS_NODE_LAYOUT with field ISFOLDER set.
* Since these nodes will never get children they stay leaves
* (as intended).
*
CALL METHOD g_alv_tree->add_node
EXPORTING
i_relat_node_key = p_relat_key
i_relationship = cl_gui_column_tree=>relat_last_child
is_outtab_line = ps_tono
i_node_text = l_node_text
IMPORTING
e_new_node_key = p_node_key.

ENDFORM. " add_complete_line

*&---------------------------------------------------------------------*
*& Form register_events
*&---------------------------------------------------------------------*
* text

form register_events.
DATA: lt_events TYPE cntl_simple_events,
l_event TYPE cntl_simple_event,
l_event_receiver TYPE REF TO lcl_tree_event_receiver.

call method g_alv_tree->get_registered_events
importing events = lt_events.

l_event-eventid = cl_gui_column_tree=>eventid_node_double_click.
APPEND l_event TO lt_events.

CALL METHOD g_alv_tree->set_registered_events
EXPORTING
events = lt_events
EXCEPTIONS
cntl_error = 1
cntl_system_error = 2
illegal_event_combination = 3.
IF sy-subrc <> 0.
MESSAGE x208(00) WITH 'ERROR'. "#EC NOTEXT
ENDIF.

CREATE OBJECT l_event_receiver.
SET HANDLER l_event_receiver->handle_node_double_click FOR g_alv_tree.


endform. " register_events

REPORTES - ALV - TEXTEDIT (CUSTOM CONTROL)

posted under by Antonio Lopez
PROGRAMA PARA HACER UN TEXTO EDITABLE EN UN CUSTOM CONTROL, IMPLEMENTANDO METODOS DE EVENTOS (F1 Y F4), EL LAYOUT DE LA PANTALLA DEBE SER UN CUSTOM CONTROL LLAMADO "textedit" Y UN CAMPO DE SALIDA LLAMADO "field", SU FLUJO LOGICO ES:

PROCESS BEFORE OUTPUT.
MODULE status_0100.

PROCESS AFTER INPUT.
MODULE cancel AT EXIT-COMMAND.
MODULE user_command_0100.




REPORT demo_custom_control .

* Declarations *****************************************************

CLASS event_handler DEFINITION.
PUBLIC SECTION.
METHODS: handle_f1 FOR EVENT f1 OF cl_gui_textedit
IMPORTING sender,
handle_f4 FOR EVENT f4 OF cl_gui_textedit
IMPORTING sender.
ENDCLASS.

DATA: ok_code LIKE sy-ucomm,
save_ok LIKE sy-ucomm.

DATA: init,
container TYPE REF TO cl_gui_custom_container,
editor TYPE REF TO cl_gui_textedit.

DATA: event_tab TYPE cntl_simple_events,
event TYPE cntl_simple_event.

DATA: line(256) TYPE c,
text_tab LIKE STANDARD TABLE OF line,
field LIKE line.

DATA handle TYPE REF TO event_handler.

* Reporting Events ***************************************************

START-OF-SELECTION.
line = 'First line in TextEditControl'.
APPEND line TO text_tab.
line = '--------------------------------------------------'.
APPEND line TO text_tab.
line = '...'.
APPEND line TO text_tab.
CALL SCREEN 100.

* Dialog Modules *****************************************************

MODULE status_0100 OUTPUT.
SET PF-STATUS 'SCREEN_100'.
IF init is initial.
init = 'X'.
CREATE OBJECT:
container EXPORTING container_name = 'TEXTEDIT',
editor EXPORTING parent = container,
handle.
event-eventid = cl_gui_textedit=>event_f1.
event-appl_event = ' '. "system event
APPEND event TO event_tab.
event-eventid = cl_gui_textedit=>event_f4.
event-appl_event = 'X'. "application event
APPEND event TO event_tab.
CALL METHOD: editor->set_registered_events
EXPORTING events = event_tab.
SET HANDLER handle->handle_f1
handle->handle_f4 FOR editor.
ENDIF.
CALL METHOD editor->set_text_as_stream
EXPORTING text = text_tab.
ENDMODULE.

MODULE cancel INPUT.
LEAVE PROGRAM.
ENDMODULE.

MODULE user_command_0100 INPUT.
save_ok = ok_code.
CLEAR ok_code.
CASE save_ok.
WHEN 'INSERT'.
CALL METHOD editor->get_text_as_stream
IMPORTING text = text_tab.
WHEN 'F1'.
MESSAGE i888(sabapdocu) WITH text-001.
WHEN OTHERS.
MESSAGE i888(sabapdocu) WITH text-002.
CALL METHOD cl_gui_cfw=>dispatch.
ENDCASE.
SET SCREEN 100.
ENDMODULE.

* Class Implementations **********************************************

CLASS event_handler IMPLEMENTATION.
METHOD handle_f1.
DATA row TYPE i.
MESSAGE i888(sabapdocu) WITH text-003.
CALL METHOD sender->get_selection_pos
IMPORTING from_line = row.
CALL METHOD sender->get_line_text
EXPORTING line_number = row
IMPORTING text = field.
CALL METHOD cl_gui_cfw=>set_new_ok_code
EXPORTING new_code = 'F1'.
CALL METHOD cl_gui_cfw=>flush.
ENDMETHOD.

METHOD handle_f4.
DATA row TYPE i.
MESSAGE i888(sabapdocu) WITH text-004.
CALL METHOD sender->get_selection_pos
IMPORTING from_line = row.
CALL METHOD sender->get_line_text
EXPORTING line_number = row
IMPORTING text = field.
CALL METHOD cl_gui_cfw=>flush.
ENDMETHOD.
ENDCLASS.

Imagenes en Custom Control (Dynpro)

posted under by Antonio Lopez
para poder insertar una foto en nuestro programa, primero la tenemos que importar al workbench mediante la transaccion SE78, para este ejemplo la importaremos y le daremos el nombre de MTTO2 la imagen debe estar en formato bmp para que funcione correctamente, nuestro programa debe tener un Custom control de nombre "picture", previamente para que aparezca ahi la imagen que queremos cargar


******************************
*TOP
******************************
TYPES:
PICT_LINE(256) TYPE C.

DATA:
PICT_TAB TYPE TABLE OF PICT_LINE,
URL(255) TYPE C.
DATA:
CONTAINER1 TYPE REF TO CL_GUI_CUSTOM_CONTAINER,
PICTURE TYPE REF TO CL_GUI_PICTURE.
DATA:
L_BYTECOUNT TYPE I,
L_TDBTYPE LIKE STXBITMAPS-TDBTYPE,
L_CONTENT TYPE STANDARD TABLE OF BAPICONTEN
INITIAL SIZE 0.
DATA:
GRAPHIC_SIZE TYPE I.
DATA:
BEGIN OF GRAPHIC_TABLE OCCURS 0,
LINE(255) TYPE X,
END OF GRAPHIC_TABLE.


******************************
*out
******************************
module STATUS_0600 output.
SET PF-STATUS 'xxxx'.
SET TITLEBAR 'xxxx'.
perform LOAD_IMAGE.
endmodule. " STATUS_0600 OUTPUT


******************************
*FORM
******************************
form LOAD_IMAGE.
CREATE OBJECT: CONTAINER1 EXPORTING CONTAINER_NAME = 'PICTURE',
PICTURE EXPORTING PARENT = CONTAINER1.
CALL FUNCTION 'SAPSCRIPT_GET_GRAPHIC_BDS'
EXPORTING
I_OBJECT = 'GRAPHICS'
I_NAME = 'MTTO2'
I_ID = 'BMAP'
I_BTYPE = 'BCOL'
* IMPORTING
* E_BYTECOUNT = L_BYTECOUNT
TABLES
CONTENT = L_CONTENT
EXCEPTIONS
NOT_FOUND = 1
BDS_GET_FAILED = 2
BDS_NO_CONTENT = 3
OTHERS = 4.

CALL FUNCTION 'SAPSCRIPT_CONVERT_BITMAP'
EXPORTING
OLD_FORMAT = 'BDS'
NEW_FORMAT = 'BMP'
BITMAP_FILE_BYTECOUNT_IN = L_BYTECOUNT
IMPORTING
BITMAP_FILE_BYTECOUNT = GRAPHIC_SIZE
TABLES
BDS_BITMAP_FILE = L_CONTENT
BITMAP_FILE = GRAPHIC_TABLE
EXCEPTIONS
OTHERS = 1.

CALL FUNCTION 'DP_CREATE_URL'
EXPORTING
TYPE = 'IMAGE'
SUBTYPE = 'BMP'
TABLES
DATA = GRAPHIC_TABLE
CHANGING
URL = URL.

CALL METHOD PICTURE->LOAD_PICTURE_FROM_URL
EXPORTING
URL = URL.

CALL METHOD PICTURE->SET_DISPLAY_MODE
EXPORTING
display_mode = picture->display_mode_normal_center.

endform. " LOAD_IMAGE

ALV Editable

posted under by Antonio Lopez
Para poder editar un grid de ALV, directamente, este es el codigo a seguir:

***************************************************
*TOP
***************************************************
CLASS lcl_event_receiver DEFINITION DEFERRED.

DATA: T_INTERNA TYPE T_EXTERNA OCCURS 0 WITH HEADER LINE,
G_CUSTOM_CONTAINER TYPE REF TO CL_GUI_CUSTOM_CONTAINER,
GRID TYPE REF TO CL_GUI_ALV_GRID,
CAT_CAMPOS TYPE LVC_T_FCAT,
LCAT_CAMPOS LIKE LINE OF CAT_CAMPOS,
event_receiver TYPE REF TO lcl_event_receiver,
LAYOUT_GRID1 TYPE LVC_S_LAYO.

DATA: lt_sel_rows TYPE lvc_t_row,
ls_sel_row TYPE lvc_s_row,
ls_selected_line like lvc_s_row,
INDEX_1 TYPE N,
er_data_changed TYPE REF TO cl_alv_changed_data_protocol.

*************************************
CLASS lcl_event_receiver DEFINITION.

PUBLIC SECTION.
METHODS:
handle_double_click
FOR EVENT double_click OF CL_GUI_ALV_GRID
IMPORTING e_row e_column,


handle_data_changed
for event data_changed of cl_gui_alv_grid
importing er_data_changed.

ENDCLASS.
******************************************

******************************************
CLASS lcl_event_receiver IMPLEMENTATION.
METHOD handle_double_click.

ENDMETHOD. "handle_double_click

METHOD handle_data_changed.
DATA: lt_data_changed TYPE lvc_t_modi,
LS_DATA_CHANGED LIKE LINE OF LT_DATA_CHANGED.

APPEND LINES OF er_data_changed->mt_mod_cells TO
LT_DATA_CHANGED.

IF NOT LT_DATA_CHANGED IS INITIAL.
INDEX_1 = 1.
READ TABLE LT_DATA_CHANGED INDEX INDEX_1 INTO LS_DATA_CHANGED.

SELECT * FROM T_EXTERNA INTO TABLE T_INTERNA.
READ TABLE T_INTERNA INDEX LS_DATA_CHANGED-ROW_ID INTO T_EXTERNA.
REFRESH T_INTERNA.

CASE LS_DATA_CHANGED-FIELDNAME.
* AQUI SE COMPARA EN NOMBRE DE LOS CAMPOS DE LA TABLA,
* SUPONGAMOS QUE EXISTE UN CAMPO QUE SE LLAMA NOMBRE_C
WHEN 'NOMBRE_C'.
ZAV_T0001-NOMBRE_C = LS_DATA_CHANGED-VALUE.

ENDCASE.

*AQUI ACTUALIZAMOS LA TABLA DE LA BD !!!!!!
UPDATE T_EXTERNA FROM T_EXTERNA.

CLEAR T_EXTERNA.
REFRESH T_INTERNA.
REFRESH lt_data_changed.
CLEAR lt_data_changed.
CLEAR LS_DATA_CHANGED.
CLEAR er_data_changed.

ENDIF.

CALL METHOD cl_gui_cfw=>set_new_ok_code
EXPORTING
new_code = 'DC'.

ENDMETHOD. "handle_data_changed

ENDCLASS.



***************************************************
* OUT
***************************************************

module STATUS_0001 output.
SET PF-STATUS 'xxxx'.
SET TITLEBAR 'xxxx'.
PERFORM GRID_1.

endmodule.


***************************************************
* FORM
***************************************************

form GRID_1.

IF NOT ( G_CUSTOM_CONTAINER IS INITIAL ).
CALL METHOD G_CUSTOM_CONTAINER->free
EXCEPTIONS cntl_error = 1
cntl_system_error = 2.


CALL METHOD GRID->free
EXCEPTIONS cntl_error = 1
cntl_system_error = 2.

CLEAR G_CUSTOM_CONTAINER.

ENDIF.

IF G_CUSTOM_CONTAINER IS INITIAL.
CREATE OBJECT G_CUSTOM_CONTAINER
EXPORTING
CONTAINER_NAME = 'GRD_EDIT'.
CREATE OBJECT GRID
EXPORTING
I_PARENT = G_CUSTOM_CONTAINER.

PERFORM PREPARA_GRID.

ENDIF.

SELECT * FROM T_ERXSTERNA INTO TABLE T_INTERNA.
LAYOUT_GRID1-cwidth_opt = 'X'.
LAYOUT_GRID1-NO_TOOLBAR = 'X'. "nO MUESTRA LA BARRA DE HERR.

PERFORM LLENACAT.

CALL METHOD GRID->SET_TABLE_FOR_FIRST_DISPLAY
EXPORTING IS_LAYOUT = LAYOUT_GRID1
CHANGING IT_OUTTAB = T_INTERNA[]
IT_FIELDCATALOG = CAT_CAMPOS .

REFRESH T_INTERNA.

endform. " GRID_1

*&---------------------------------------------------------------------*
*& Form LLENACAT
*&---------------------------------------------------------------------*
* text
form LLENACAT.

CLEAR LCAT_CAMPOS.
LCAT_CAMPOS-fieldname = 'NOMBRE_C'.
LCAT_CAMPOS-ref_table = 'ZAV_T0001'.
LCAT_CAMPOS-coltext = 'NOMBRE'.
LCAT_CAMPOS-emphasize = 'C110'.
LCAT_CAMPOS-EDIT = 'X'.
APPEND LCAT_CAMPOS TO CAT_CAMPOS.

endform. " LLENACAT


*&---------------------------------------------------------------------*
*& Form PREPARA_GRID
*&---------------------------------------------------------------------*
* text
Form PREPARA_GRID.

CREATE OBJECT event_receiver.
SET HANDLER event_receiver->handle_double_click FOR GRID.
set handler event_receiver->handle_data_changed for GRID.
CREATE OBJECT er_data_changed.

CALL METHOD grid->set_ready_for_input
exporting
i_ready_for_input = 1.

CALL METHOD grid->register_edit_event
exporting
i_event_id = cl_gui_alv_grid=>mc_evt_enter.


endform. " PREPARA_GRID

Google
 
top