Hola a todos tengo un problemilla con un ALV que me trae ya de cabeza....
Quiero poder insertar líneas en un ALV y poder borrarlas pero usando ALV OO,
en principio el programa va a ser un Tabstrip con 4 pestañas y con un area que va a contener un ALV orientado a Objetos, he encontrado un programa de sap para ayudar a emprender un poco como va esto que es BCALV_EDIT_04.
Pero no hay manera cuando inserto la línea "es una línea en blanco" me da un dump...
Errores tiempo ejec. GETWA_NOT_ASSIGNED
Fecha y hora 05.10.2009 13:01:17
Texto breve
Field symbol has not yet been assigned.
¿Qué ha sucedido?
Error in the ABAP Application Program
The current ABAP program "CL_GUI_ALV_GRID===============CP" had to be
terminated because it has
come across a statement that unfortunately cannot be executed.
Mi código actualmente es el siguiente:
*&---------------------------------------------------------------------*
*& Report ZCAT_MANTENIMIENTO_MAESTRO
*&
*&---------------------------------------------------------------------*
*&
*&
*&---------------------------------------------------------------------*
report zcat_mantenimiento_maestro.
* La tabla principal contendra todos los valores de todas las pestañas y
* la tabla secundaria solo contendrá los valores de la pestaña que tiene que visualizar
data: begin of g_zcat_maes_mat_principal occurs 0.
include structure zcat_maes_mat.
data: maktx like makt-maktx.
data: end of g_zcat_maes_mat_principal.
data: begin of g_zcat_maes_mat_auxiliar occurs 0.
include structure zcat_maes_mat .
data: maktx like makt-maktx.
data: celltab type lvc_t_styl.
data: end of g_zcat_maes_mat_auxiliar.
data: flag_ejecutar_tab(5) type c value 'FALSE',
flag_inicio(5) type c value 'FALSE',
flag_1(5) type c value 'FALSE',
number(4) type n value '2000',
g_slide(8) type c,
g_answer type c,
g_flag_permiso(5) type c value 'TRUE'.
controls: tabstrip type tabstrip.
data: go_grid type ref to cl_gui_alv_grid, "ALV GRID
go_custom_container type ref to cl_gui_custom_container, "Contenedor
g_fieldcatalog type lvc_t_fcat, "Catálogo de campos
l_layout type lvc_s_layo, "Layout
l_exclude type ui_functions,
lt_fcodes type ui_functions,
g_et_index_rows type lvc_t_row,
g_et_row_no type lvc_t_roid.
**----------------------------------------------------------------------
class lcl_event_handler definition.
**----------------------------------------------------------------------
public section.
types: begin of stab_key.
types: matnr type matnr.
types: maktx type maktx.
types: end of stab_key.
types: stab_keys type standard table of stab_key,
stab_table type standard table of zcat_maes_mat.
methods: handle_data_changed for event data_changed of cl_gui_alv_grid importing er_data_changed,
handle_after_user_command for event after_user_command of cl_gui_alv_grid importing e_ucomm,
handle_user_command for event user_command of cl_gui_alv_grid importing e_ucomm,
handle_before_user_command for event before_user_command of cl_gui_alv_grid importing e_ucomm,
handle_menu_button for event menu_button of cl_gui_alv_grid importing e_object e_ucomm,
handle_toolbar for event toolbar of cl_gui_alv_grid importing e_object e_interactive.
methods: get_inserted_rows exporting inserted_rows type stab_keys,
get_deleted_rows exporting deleted_rows type stab_table,
refresh_delta_tables,
set_table_is_initial,
set_table_is_not_initial,
table_is_initial returning value(initial) type char01.
private section.
data: inserted_rows type stab_keys,
deleted_rows type standard table of zcat_maes_mat.
* This flag is set if any error occured in one of the
* following methods:
data: error_in_data type c.
* This flag signals that no records were read for the flight
* table initially:
data: initial_table type c.
methods: check_double_entries importing pr_data_changed type ref to cl_alv_changed_data_protocol,
update_delta_tables importing pr_data_changed type ref to cl_alv_changed_data_protocol,
get_cell_values importing row_id type int4
pr_data_changed type ref to cl_alv_changed_data_protocol
exporting key type stab_key.
endclass.
**----------------------------------------------------------------------
class lcl_event_handler implementation.
**----------------------------------------------------------------------
method handle_data_changed.
*data: lv_changed type lvc_s_modi.
data: lv_insert type lvc_s_moce,
l_wa_g_zcat_maes_mat_auxiliar like g_zcat_maes_mat_auxiliar.
error_in_data = space.
* check if there exist double entries
call method check_double_entries( er_data_changed ).
call method update_delta_tables( er_data_changed ).
if error_in_data = 'X'.
call method er_data_changed->display_protocol.
endif.
endmethod.
method handle_before_user_command.
endmethod.
method handle_after_user_command.
endmethod.
*Handle User Command
method handle_user_command .
* PERFORM handle_user_command USING e_ucomm .
endmethod.
method handle_menu_button .
* PERFORM handle_menu_button USING e_object e_ucomm .
endmethod.
*Handle Toolbar
method handle_toolbar.
* PERFORM handle_toolbar USING e_object e_interactive .
endmethod .
method get_inserted_rows.
inserted_rows = me->inserted_rows.
endmethod.
*------------------------------------------------------
method get_deleted_rows.
deleted_rows = me->deleted_rows.
endmethod.
*------------------------------------------------------
method refresh_delta_tables.
clear me->inserted_rows[].
clear me->deleted_rows[].
endmethod.
*------------------------------------------------------
method set_table_is_initial.
initial_table = 'X'.
endmethod.
*------------------------------------------------------
method set_table_is_not_initial.
initial_table = space.
endmethod.
*------------------------------------------------------
method table_is_initial.
if initial_table = 'X'.
initial = 'X'.
else.
initial = space.
endif.
endmethod.
*-----------------------------------------------------------------------
method check_double_entries.
data: lt_good_cells type lvc_t_modi,
ls_good type lvc_s_modi,
ls_key type stab_key,
ls_sflight type stab_table,
l_flightdate like g_zcat_maes_mat_auxiliar-matnr,
l_del_row type lvc_s_moce,
ls_outtab like line of g_zcat_maes_mat_auxiliar,
l_reentered type c.
* §5.Check if there exist already other records with equal key fields.
*.............................................
* Check if the user has entered two new lines where the key fields
* are equal.
*.............................................
* Since CARRID and CONNID are read only, the check is restrained
* to field FLDATE.
*
* Algorithm: Copy all entries in MT_GOOD_CELLS to a dummy table.
* During the copying procedure check if there exists
* already a line with the same Flight date.
*
loop at pr_data_changed->mt_good_cells into ls_good.
case ls_good-fieldname.
when 'MATNR'.
call method pr_data_changed->get_cell_value
exporting
i_row_id = ls_good-row_id
i_fieldname = ls_good-fieldname
importing e_value = l_flightdate.
read table lt_good_cells with key
value = l_flightdate
transporting no fields.
if sy-subrc = 0.
* There exists already a line with the same flight date!
call method pr_data_changed->add_protocol_entry
exporting
i_msgid = '0K' i_msgno = '000' i_msgty = 'E'
i_msgv1 = text-m01
i_fieldname = ls_good-fieldname
i_row_id = ls_good-row_id.
error_in_data = 'X'.
else.
ls_good-value = l_flightdate.
append ls_good to lt_good_cells.
endif.
endcase.
endloop.
endmethod.
*-------------------------------------------------------
method update_delta_tables.
data: l_ins_row type lvc_s_moce,
l_del_row type lvc_s_moce,
ls_key type stab_key,
ls_sflight type zcat_maes_mat,
ls_outtab like line of g_zcat_maes_mat_auxiliar.
* §6.Use protocol attributes MT_DELETED_ROWS and MT_INSERTED_ROWS
* to remember which lines where deleted or inserted. Save this
* information in your internal tables.
*..........
* deleted rows
*.............
loop at pr_data_changed->mt_deleted_rows into l_del_row.
read table g_zcat_maes_mat_auxiliar into ls_outtab index l_del_row-row_id.
if sy-subrc ne 0.
message i000(0k) with text-e01."Fehler beim Löschen
else.
move-corresponding ls_outtab to ls_sflight.
* It should no be possible that the same line is deleted twice,
* so we just add the new key line to 'deleted_rows'.
append ls_sflight to deleted_rows.
* If this line was inserted just before it is deleted:
delete me->inserted_rows
where matnr = ls_outtab-matnr.
endif.
endloop.
*..........
* inserted rows
* At this point ALV has not added new lines
* to gt_outtab, so you can not access their values
* by reading gt_outtab.
* Table MT_GOOD_CELLS holds new values that can be
* referenced using the ROW_ID.
*..........
if me->table_is_initial( ) eq 'X'.
* No flights were selected initially. This is the first new line.
call method get_cell_values
exporting row_id = 1
pr_data_changed = pr_data_changed
importing key = ls_key.
append ls_key to inserted_rows.
call method me->set_table_is_not_initial.
endif.
loop at pr_data_changed->mt_inserted_rows into l_ins_row.
call method get_cell_values
exporting row_id = l_ins_row-row_id
pr_data_changed = pr_data_changed
importing key = ls_key.
* READ TABLE gt_outtab INTO ls_outtab INDEX l_ins_row-row_id.
* Just insert the new row regardless if the input is wrong
append ls_key to inserted_rows.
endloop.
endmethod.
method get_cell_values.
* get values of key cells of row ROW_ID
* CARRIER
call method pr_data_changed->get_cell_value
exporting
i_row_id = row_id
i_fieldname = 'MATNR'
importing
e_value = key-matnr.
if sy-subrc ne 0.
message i000(0k) with text-e02. "Fehler beim Einfügen
endif.
endmethod.
*------------------------------------------------------
endclass.
data: g_event_receiver type ref to lcl_event_handler.
**************************** SELECTION-SCREEN ************************
selection-screen begin of block blk2 with frame title text-001.
parameters : pa_vkorg type vkorg obligatory.
parameters : pa_vtweg type vtweg obligatory.
selection-screen end of block blk2.
**************************** START-OF-SELECTION ************************
start-of-selection.
perform seleccion_datos.
call screen 1500.
end-of-selection.
**************************** END-OF-SELECTION ************************
*&---------------------------------------------------------------------*
*& Form SELECCION_DATOS
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
form seleccion_datos.
* Damos el formato a la ALV de los diferentes campos que se van a ver.
perform build_fieldcat.
endform. " SELECCION_DATOS
*&---------------------------------------------------------------------*
*& Form BUILD_FIELDCAT
*&---------------------------------------------------------------------*
* Creamos el formato del ALV
*----------------------------------------------------------------------*
form build_fieldcat.
* Importante hay que añadir "WITH HEADER LINE
data: l_fieldcatalog type lvc_t_fcat with header line.
clear: l_fieldcatalog, g_fieldcatalog.
refresh: l_fieldcatalog.
l_fieldcatalog-fieldname = 'MATNR'. "Código Campaña
l_fieldcatalog-scrtext_l = 'Material'.
l_fieldcatalog-col_pos = 2.
l_fieldcatalog-key = 'X'.
l_fieldcatalog-outputlen = 18.
l_fieldcatalog-just = 'X'.
l_fieldcatalog-edit = 'X'.
append l_fieldcatalog to g_fieldcatalog.
clear: l_fieldcatalog.
l_fieldcatalog-fieldname = 'MAKXT'. "Código Comunicación
l_fieldcatalog-scrtext_l = 'Comunicación'.
l_fieldcatalog-col_pos = 3.
l_fieldcatalog-key = 'X'.
l_fieldcatalog-outputlen = 40.
l_fieldcatalog-just = 'X'.
l_fieldcatalog-edit = 'X'.
append l_fieldcatalog to g_fieldcatalog.
clear: l_fieldcatalog.
endform. " BUILD_FIELDCAT
*&---------------------------------------------------------------------*
*& Form load_data_into_grid
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
form load_data_into_grid.
data: l_num type i.
describe table g_zcat_maes_mat_auxiliar lines l_num.
* Excluir los botones de la ALV que no nos interesan.
perform exclude_tb_functions changing l_exclude.
* Cargamos la ALV
call method go_grid->set_table_for_first_display
exporting
is_layout = l_layout
it_toolbar_excluding = l_exclude
changing
it_outtab = g_zcat_maes_mat_auxiliar[]
it_fieldcatalog = g_fieldcatalog[].
* call method go_grid->set_ready_for_input exporting i_ready_for_input = 1.
* Para saber si se han marcado la líneas.
call method go_grid->register_edit_event exporting i_event_id = cl_gui_alv_grid=>mc_evt_enter.
* Evento que captura los cambios realizados
call method go_grid->register_edit_event exporting i_event_id = cl_gui_alv_grid=>mc_evt_modified.
* Instanciando el objeto que enlaza eventos y el grid
create object g_event_receiver.
set handler g_event_receiver->handle_data_changed for go_grid.
* SET HANDLER g_event_receiver->handle_user_command FOR go_grid.
* SET HANDLER g_event_receiver->handle_after_user_command FOR go_grid.
* SET HANDLER g_event_receiver->handle_before_user_command FOR go_grid.
* SET HANDLER g_event_receiver->handle_menu_button FOR go_grid.
* SET HANDLER g_event_receiver->handle_toolbar FOR go_grid.
endform. " load_data_into_grid
*&---------------------------------------------------------------------*
*& Module SCREEN_ATRIBUTTES OUTPUT
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
module screen_atributtes output.
data: button01(30) type c value 'COCINA',
button02(30) type c value 'BEBIDA',
button03(30) type c value 'MENAJE',
button04(30) type c value 'ESTRUCTURA'.
endmodule. " SCREEN_ATRIBUTTES OUTPUT
*&---------------------------------------------------------------------*
*& Module STATUS_1500 OUTPUT
*&---------------------------------------------------------------------*
* Status que vamos a usar en la TabStrib
*----------------------------------------------------------------------*
module status_1500 output.
set pf-status 'STATUS_1500'.
endmodule. " STATUS_1500 OUTPUT
*&---------------------------------------------------------------------*
*& Module SAVE_DATA INPUT
*&---------------------------------------------------------------------*
* Guardamos los datos en la base de datos.
*----------------------------------------------------------------------*
module save_data input.
endmodule. " SAVE_DATA INPUT
*&---------------------------------------------------------------------*
*& Module USER_COMMAND_1500 INPUT
*&---------------------------------------------------------------------*
* Acciones a realizar cuando el usuario pulse algún botón.
*----------------------------------------------------------------------*
module user_command_1500 input.
case sy-dynnr.
when 1500.
if sy-ucomm cs 'BUTTON'.
number = 2000.
tabstrip-activetab = sy-ucomm.
g_slide = sy-ucomm.
endif.
if sy-ucomm eq 'BACK' or sy-ucomm eq 'CANCEL' or
sy-ucomm eq 'EXIT'.
flag_ejecutar_tab = 'FALSE'.
* Lo dejo en la primera pestaña. Sino si volvemos atrás y
* seleccionamos otro tipo nos dará problema entre pestaña
* y campo correspondiente.
number = 2000.
tabstrip-activetab = ''.
g_slide = ''.
call function 'POPUP_TO_CONFIRM_STEP'
exporting
textline1 = '¿Desea guardar los datos?'
titel = 'Guardar Datos'
cancel_display = ''
importing
answer = g_answer.
* Volvemos a la pantalla de inicio programa.
if g_answer eq 'J'.
sy-ucomm = 'SAVE'.
elseif g_answer eq 'N'.
set screen 0.
flag_inicio = 'FALSE'.
flag_1 = 'FALSE'.
endif.
endif.
if sy-ucomm eq 'SAVE' and g_flag_permiso eq 'TRUE'.
* Dejo el control en la primera pestaña.
number = 2000.
tabstrip-activetab = ''.
g_slide = ''.
* Grabo los datos del sistema.
perform graba_datos_sistema.
flag_inicio = 'FALSE'.
flag_1 = 'FALSE'.
set screen 0.
elseif sy-ucomm eq 'SAVE'.
message s088(sf) with text-132.
endif.
endcase.
endmodule. " USER_COMMAND_1500 INPUT
*&---------------------------------------------------------------------*
*& Form GRABA_DATOS_SISTEMA
*&---------------------------------------------------------------------*
* Grabamos los datos en las tablas correspondientes.
*----------------------------------------------------------------------*
form graba_datos_sistema.
endform. " GRABA_DATOS_SISTEMA
*&---------------------------------------------------------------------*
*& Module STATUS_2000 OUTPUT
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
module status_2000 output.
* SET PF-STATUS 'xxxxxxxx'.
* SET TITLEBAR 'xxx'.
* Creamos el contenedor del ALV y llamamos al ALV
if go_custom_container is initial.
create object go_custom_container
exporting container_name = 'ZTABLA'.
create object go_grid
exporting
i_parent = go_custom_container.
* Layout
l_layout-no_rowmark = 'X'.
l_layout-zebra = 'X'.
l_layout-cwidth_opt = ''.
perform load_data_into_grid.
else.
l_layout-no_rowmark = 'X'.
l_layout-zebra = 'X'.
l_layout-cwidth_opt = ''.
call method go_grid->refresh_table_display.
perform load_data_into_grid.
endif.
case sy-ucomm.
*
when 'BACK'. "perform clear_variables.
"clear g_datos. refresh g_datos.
leave to screen 0. exit.
*
* when 'CANC'. perform clear_variables.
* clear g_datos. refresh g_datos.
* leave to screen 0. exit.
*
* when 'EXIT'. perform clear_variables.
* clear g_datos. refresh g_datos.
* leave to screen 0. exit.
*
* when 'SELECT'. perform select_all_entries using 'X'.
*
* when 'DESELECT'. perform select_all_entries using space.
*
* when 'CHANGE'. perform graba_datos.
* clear g_datos. refresh g_datos.
* leave to screen 0. exit.
*
endcase.
endmodule. " STATUS_2000 OUTPUT
*&---------------------------------------------------------------------*
*& Module USER_COMMAND_2000 INPUT
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
module user_command_2000 input.
endmodule. " USER_COMMAND_2000 INPUT
*&---------------------------------------------------------------------*
*& Form CLEAR_VARIABLES
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
form clear_variables.
if not go_custom_container is initial.
* Limpiar referencia al objeto
call method go_grid->free.
call method go_custom_container->free.
* Limpiar variables
clear g_event_receiver.
clear go_grid.
clear go_custom_container.
endif.
endform. " CLEAR_VARIABLES
*&---------------------------------------------------------------------*
*& Form EXCLUDE_TB_FUNCTIONS
*&---------------------------------------------------------------------*
* Excluir botones de la ALV
*---------------------------------------------------------------------*
form exclude_tb_functions changing pt_exclude type ui_functions.
data ls_exclude type ui_func.
ls_exclude = cl_gui_alv_grid=>mc_fc_loc_copy_row.
append ls_exclude to pt_exclude.
* ls_exclude = cl_gui_alv_grid=>mc_fc_loc_delete_row.
* append ls_exclude to pt_exclude.
* ls_exclude = cl_gui_alv_grid=>mc_fc_loc_append_row.
* append ls_exclude to pt_exclude.
ls_exclude = cl_gui_alv_grid=>mc_fc_loc_insert_row.
append ls_exclude to pt_exclude.
ls_exclude = cl_gui_alv_grid=>mc_fc_loc_move_row.
append ls_exclude to pt_exclude.
ls_exclude = cl_gui_alv_grid=>mc_fc_loc_copy.
append ls_exclude to pt_exclude.
ls_exclude = cl_gui_alv_grid=>mc_fc_loc_cut.
append ls_exclude to pt_exclude.
ls_exclude = cl_gui_alv_grid=>mc_fc_loc_paste.
append ls_exclude to pt_exclude.
ls_exclude = cl_gui_alv_grid=>mc_fc_loc_paste_new_row.
append ls_exclude to pt_exclude.
ls_exclude = cl_gui_alv_grid=>mc_fc_loc_undo.
append ls_exclude to pt_exclude.
ls_exclude = cl_gui_alv_grid=>mc_fc_check.
append ls_exclude to pt_exclude.
endform. " EXCLUDE_TB_FUNCTIONS " deselect_all_entries
form handle_user_command using i_ucomm type syucomm .
endform .
form handle_menu_button using i_object type ref to cl_ctmenu
i_ucomm type syucomm .
endform. " handle_menu_button
form handle_toolbar using i_object type ref to cl_alv_event_toolbar_set .
endform .
Quiero poder insertar líneas en un ALV y poder borrarlas pero usando ALV OO,
en principio el programa va a ser un Tabstrip con 4 pestañas y con un area que va a contener un ALV orientado a Objetos, he encontrado un programa de sap para ayudar a emprender un poco como va esto que es BCALV_EDIT_04.
Pero no hay manera cuando inserto la línea "es una línea en blanco" me da un dump...
Errores tiempo ejec. GETWA_NOT_ASSIGNED
Fecha y hora 05.10.2009 13:01:17
Texto breve
Field symbol has not yet been assigned.
¿Qué ha sucedido?
Error in the ABAP Application Program
The current ABAP program "CL_GUI_ALV_GRID===============CP" had to be
terminated because it has
come across a statement that unfortunately cannot be executed.
Mi código actualmente es el siguiente:
*&---------------------------------------------------------------------*
*& Report ZCAT_MANTENIMIENTO_MAESTRO
*&
*&---------------------------------------------------------------------*
*&
*&
*&---------------------------------------------------------------------*
report zcat_mantenimiento_maestro.
* La tabla principal contendra todos los valores de todas las pestañas y
* la tabla secundaria solo contendrá los valores de la pestaña que tiene que visualizar
data: begin of g_zcat_maes_mat_principal occurs 0.
include structure zcat_maes_mat.
data: maktx like makt-maktx.
data: end of g_zcat_maes_mat_principal.
data: begin of g_zcat_maes_mat_auxiliar occurs 0.
include structure zcat_maes_mat .
data: maktx like makt-maktx.
data: celltab type lvc_t_styl.
data: end of g_zcat_maes_mat_auxiliar.
data: flag_ejecutar_tab(5) type c value 'FALSE',
flag_inicio(5) type c value 'FALSE',
flag_1(5) type c value 'FALSE',
number(4) type n value '2000',
g_slide(8) type c,
g_answer type c,
g_flag_permiso(5) type c value 'TRUE'.
controls: tabstrip type tabstrip.
data: go_grid type ref to cl_gui_alv_grid, "ALV GRID
go_custom_container type ref to cl_gui_custom_container, "Contenedor
g_fieldcatalog type lvc_t_fcat, "Catálogo de campos
l_layout type lvc_s_layo, "Layout
l_exclude type ui_functions,
lt_fcodes type ui_functions,
g_et_index_rows type lvc_t_row,
g_et_row_no type lvc_t_roid.
**----------------------------------------------------------------------
class lcl_event_handler definition.
**----------------------------------------------------------------------
public section.
types: begin of stab_key.
types: matnr type matnr.
types: maktx type maktx.
types: end of stab_key.
types: stab_keys type standard table of stab_key,
stab_table type standard table of zcat_maes_mat.
methods: handle_data_changed for event data_changed of cl_gui_alv_grid importing er_data_changed,
handle_after_user_command for event after_user_command of cl_gui_alv_grid importing e_ucomm,
handle_user_command for event user_command of cl_gui_alv_grid importing e_ucomm,
handle_before_user_command for event before_user_command of cl_gui_alv_grid importing e_ucomm,
handle_menu_button for event menu_button of cl_gui_alv_grid importing e_object e_ucomm,
handle_toolbar for event toolbar of cl_gui_alv_grid importing e_object e_interactive.
methods: get_inserted_rows exporting inserted_rows type stab_keys,
get_deleted_rows exporting deleted_rows type stab_table,
refresh_delta_tables,
set_table_is_initial,
set_table_is_not_initial,
table_is_initial returning value(initial) type char01.
private section.
data: inserted_rows type stab_keys,
deleted_rows type standard table of zcat_maes_mat.
* This flag is set if any error occured in one of the
* following methods:
data: error_in_data type c.
* This flag signals that no records were read for the flight
* table initially:
data: initial_table type c.
methods: check_double_entries importing pr_data_changed type ref to cl_alv_changed_data_protocol,
update_delta_tables importing pr_data_changed type ref to cl_alv_changed_data_protocol,
get_cell_values importing row_id type int4
pr_data_changed type ref to cl_alv_changed_data_protocol
exporting key type stab_key.
endclass.
**----------------------------------------------------------------------
class lcl_event_handler implementation.
**----------------------------------------------------------------------
method handle_data_changed.
*data: lv_changed type lvc_s_modi.
data: lv_insert type lvc_s_moce,
l_wa_g_zcat_maes_mat_auxiliar like g_zcat_maes_mat_auxiliar.
error_in_data = space.
* check if there exist double entries
call method check_double_entries( er_data_changed ).
call method update_delta_tables( er_data_changed ).
if error_in_data = 'X'.
call method er_data_changed->display_protocol.
endif.
endmethod.
method handle_before_user_command.
endmethod.
method handle_after_user_command.
endmethod.
*Handle User Command
method handle_user_command .
* PERFORM handle_user_command USING e_ucomm .
endmethod.
method handle_menu_button .
* PERFORM handle_menu_button USING e_object e_ucomm .
endmethod.
*Handle Toolbar
method handle_toolbar.
* PERFORM handle_toolbar USING e_object e_interactive .
endmethod .
method get_inserted_rows.
inserted_rows = me->inserted_rows.
endmethod.
*------------------------------------------------------
method get_deleted_rows.
deleted_rows = me->deleted_rows.
endmethod.
*------------------------------------------------------
method refresh_delta_tables.
clear me->inserted_rows[].
clear me->deleted_rows[].
endmethod.
*------------------------------------------------------
method set_table_is_initial.
initial_table = 'X'.
endmethod.
*------------------------------------------------------
method set_table_is_not_initial.
initial_table = space.
endmethod.
*------------------------------------------------------
method table_is_initial.
if initial_table = 'X'.
initial = 'X'.
else.
initial = space.
endif.
endmethod.
*-----------------------------------------------------------------------
method check_double_entries.
data: lt_good_cells type lvc_t_modi,
ls_good type lvc_s_modi,
ls_key type stab_key,
ls_sflight type stab_table,
l_flightdate like g_zcat_maes_mat_auxiliar-matnr,
l_del_row type lvc_s_moce,
ls_outtab like line of g_zcat_maes_mat_auxiliar,
l_reentered type c.
* §5.Check if there exist already other records with equal key fields.
*.............................................
* Check if the user has entered two new lines where the key fields
* are equal.
*.............................................
* Since CARRID and CONNID are read only, the check is restrained
* to field FLDATE.
*
* Algorithm: Copy all entries in MT_GOOD_CELLS to a dummy table.
* During the copying procedure check if there exists
* already a line with the same Flight date.
*
loop at pr_data_changed->mt_good_cells into ls_good.
case ls_good-fieldname.
when 'MATNR'.
call method pr_data_changed->get_cell_value
exporting
i_row_id = ls_good-row_id
i_fieldname = ls_good-fieldname
importing e_value = l_flightdate.
read table lt_good_cells with key
value = l_flightdate
transporting no fields.
if sy-subrc = 0.
* There exists already a line with the same flight date!
call method pr_data_changed->add_protocol_entry
exporting
i_msgid = '0K' i_msgno = '000' i_msgty = 'E'
i_msgv1 = text-m01
i_fieldname = ls_good-fieldname
i_row_id = ls_good-row_id.
error_in_data = 'X'.
else.
ls_good-value = l_flightdate.
append ls_good to lt_good_cells.
endif.
endcase.
endloop.
endmethod.
*-------------------------------------------------------
method update_delta_tables.
data: l_ins_row type lvc_s_moce,
l_del_row type lvc_s_moce,
ls_key type stab_key,
ls_sflight type zcat_maes_mat,
ls_outtab like line of g_zcat_maes_mat_auxiliar.
* §6.Use protocol attributes MT_DELETED_ROWS and MT_INSERTED_ROWS
* to remember which lines where deleted or inserted. Save this
* information in your internal tables.
*..........
* deleted rows
*.............
loop at pr_data_changed->mt_deleted_rows into l_del_row.
read table g_zcat_maes_mat_auxiliar into ls_outtab index l_del_row-row_id.
if sy-subrc ne 0.
message i000(0k) with text-e01."Fehler beim Löschen
else.
move-corresponding ls_outtab to ls_sflight.
* It should no be possible that the same line is deleted twice,
* so we just add the new key line to 'deleted_rows'.
append ls_sflight to deleted_rows.
* If this line was inserted just before it is deleted:
delete me->inserted_rows
where matnr = ls_outtab-matnr.
endif.
endloop.
*..........
* inserted rows
* At this point ALV has not added new lines
* to gt_outtab, so you can not access their values
* by reading gt_outtab.
* Table MT_GOOD_CELLS holds new values that can be
* referenced using the ROW_ID.
*..........
if me->table_is_initial( ) eq 'X'.
* No flights were selected initially. This is the first new line.
call method get_cell_values
exporting row_id = 1
pr_data_changed = pr_data_changed
importing key = ls_key.
append ls_key to inserted_rows.
call method me->set_table_is_not_initial.
endif.
loop at pr_data_changed->mt_inserted_rows into l_ins_row.
call method get_cell_values
exporting row_id = l_ins_row-row_id
pr_data_changed = pr_data_changed
importing key = ls_key.
* READ TABLE gt_outtab INTO ls_outtab INDEX l_ins_row-row_id.
* Just insert the new row regardless if the input is wrong
append ls_key to inserted_rows.
endloop.
endmethod.
method get_cell_values.
* get values of key cells of row ROW_ID
* CARRIER
call method pr_data_changed->get_cell_value
exporting
i_row_id = row_id
i_fieldname = 'MATNR'
importing
e_value = key-matnr.
if sy-subrc ne 0.
message i000(0k) with text-e02. "Fehler beim Einfügen
endif.
endmethod.
*------------------------------------------------------
endclass.
data: g_event_receiver type ref to lcl_event_handler.
**************************** SELECTION-SCREEN ************************
selection-screen begin of block blk2 with frame title text-001.
parameters : pa_vkorg type vkorg obligatory.
parameters : pa_vtweg type vtweg obligatory.
selection-screen end of block blk2.
**************************** START-OF-SELECTION ************************
start-of-selection.
perform seleccion_datos.
call screen 1500.
end-of-selection.
**************************** END-OF-SELECTION ************************
*&---------------------------------------------------------------------*
*& Form SELECCION_DATOS
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
form seleccion_datos.
* Damos el formato a la ALV de los diferentes campos que se van a ver.
perform build_fieldcat.
endform. " SELECCION_DATOS
*&---------------------------------------------------------------------*
*& Form BUILD_FIELDCAT
*&---------------------------------------------------------------------*
* Creamos el formato del ALV
*----------------------------------------------------------------------*
form build_fieldcat.
* Importante hay que añadir "WITH HEADER LINE
data: l_fieldcatalog type lvc_t_fcat with header line.
clear: l_fieldcatalog, g_fieldcatalog.
refresh: l_fieldcatalog.
l_fieldcatalog-fieldname = 'MATNR'. "Código Campaña
l_fieldcatalog-scrtext_l = 'Material'.
l_fieldcatalog-col_pos = 2.
l_fieldcatalog-key = 'X'.
l_fieldcatalog-outputlen = 18.
l_fieldcatalog-just = 'X'.
l_fieldcatalog-edit = 'X'.
append l_fieldcatalog to g_fieldcatalog.
clear: l_fieldcatalog.
l_fieldcatalog-fieldname = 'MAKXT'. "Código Comunicación
l_fieldcatalog-scrtext_l = 'Comunicación'.
l_fieldcatalog-col_pos = 3.
l_fieldcatalog-key = 'X'.
l_fieldcatalog-outputlen = 40.
l_fieldcatalog-just = 'X'.
l_fieldcatalog-edit = 'X'.
append l_fieldcatalog to g_fieldcatalog.
clear: l_fieldcatalog.
endform. " BUILD_FIELDCAT
*&---------------------------------------------------------------------*
*& Form load_data_into_grid
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
form load_data_into_grid.
data: l_num type i.
describe table g_zcat_maes_mat_auxiliar lines l_num.
* Excluir los botones de la ALV que no nos interesan.
perform exclude_tb_functions changing l_exclude.
* Cargamos la ALV
call method go_grid->set_table_for_first_display
exporting
is_layout = l_layout
it_toolbar_excluding = l_exclude
changing
it_outtab = g_zcat_maes_mat_auxiliar[]
it_fieldcatalog = g_fieldcatalog[].
* call method go_grid->set_ready_for_input exporting i_ready_for_input = 1.
* Para saber si se han marcado la líneas.
call method go_grid->register_edit_event exporting i_event_id = cl_gui_alv_grid=>mc_evt_enter.
* Evento que captura los cambios realizados
call method go_grid->register_edit_event exporting i_event_id = cl_gui_alv_grid=>mc_evt_modified.
* Instanciando el objeto que enlaza eventos y el grid
create object g_event_receiver.
set handler g_event_receiver->handle_data_changed for go_grid.
* SET HANDLER g_event_receiver->handle_user_command FOR go_grid.
* SET HANDLER g_event_receiver->handle_after_user_command FOR go_grid.
* SET HANDLER g_event_receiver->handle_before_user_command FOR go_grid.
* SET HANDLER g_event_receiver->handle_menu_button FOR go_grid.
* SET HANDLER g_event_receiver->handle_toolbar FOR go_grid.
endform. " load_data_into_grid
*&---------------------------------------------------------------------*
*& Module SCREEN_ATRIBUTTES OUTPUT
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
module screen_atributtes output.
data: button01(30) type c value 'COCINA',
button02(30) type c value 'BEBIDA',
button03(30) type c value 'MENAJE',
button04(30) type c value 'ESTRUCTURA'.
endmodule. " SCREEN_ATRIBUTTES OUTPUT
*&---------------------------------------------------------------------*
*& Module STATUS_1500 OUTPUT
*&---------------------------------------------------------------------*
* Status que vamos a usar en la TabStrib
*----------------------------------------------------------------------*
module status_1500 output.
set pf-status 'STATUS_1500'.
endmodule. " STATUS_1500 OUTPUT
*&---------------------------------------------------------------------*
*& Module SAVE_DATA INPUT
*&---------------------------------------------------------------------*
* Guardamos los datos en la base de datos.
*----------------------------------------------------------------------*
module save_data input.
endmodule. " SAVE_DATA INPUT
*&---------------------------------------------------------------------*
*& Module USER_COMMAND_1500 INPUT
*&---------------------------------------------------------------------*
* Acciones a realizar cuando el usuario pulse algún botón.
*----------------------------------------------------------------------*
module user_command_1500 input.
case sy-dynnr.
when 1500.
if sy-ucomm cs 'BUTTON'.
number = 2000.
tabstrip-activetab = sy-ucomm.
g_slide = sy-ucomm.
endif.
if sy-ucomm eq 'BACK' or sy-ucomm eq 'CANCEL' or
sy-ucomm eq 'EXIT'.
flag_ejecutar_tab = 'FALSE'.
* Lo dejo en la primera pestaña. Sino si volvemos atrás y
* seleccionamos otro tipo nos dará problema entre pestaña
* y campo correspondiente.
number = 2000.
tabstrip-activetab = ''.
g_slide = ''.
call function 'POPUP_TO_CONFIRM_STEP'
exporting
textline1 = '¿Desea guardar los datos?'
titel = 'Guardar Datos'
cancel_display = ''
importing
answer = g_answer.
* Volvemos a la pantalla de inicio programa.
if g_answer eq 'J'.
sy-ucomm = 'SAVE'.
elseif g_answer eq 'N'.
set screen 0.
flag_inicio = 'FALSE'.
flag_1 = 'FALSE'.
endif.
endif.
if sy-ucomm eq 'SAVE' and g_flag_permiso eq 'TRUE'.
* Dejo el control en la primera pestaña.
number = 2000.
tabstrip-activetab = ''.
g_slide = ''.
* Grabo los datos del sistema.
perform graba_datos_sistema.
flag_inicio = 'FALSE'.
flag_1 = 'FALSE'.
set screen 0.
elseif sy-ucomm eq 'SAVE'.
message s088(sf) with text-132.
endif.
endcase.
endmodule. " USER_COMMAND_1500 INPUT
*&---------------------------------------------------------------------*
*& Form GRABA_DATOS_SISTEMA
*&---------------------------------------------------------------------*
* Grabamos los datos en las tablas correspondientes.
*----------------------------------------------------------------------*
form graba_datos_sistema.
endform. " GRABA_DATOS_SISTEMA
*&---------------------------------------------------------------------*
*& Module STATUS_2000 OUTPUT
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
module status_2000 output.
* SET PF-STATUS 'xxxxxxxx'.
* SET TITLEBAR 'xxx'.
* Creamos el contenedor del ALV y llamamos al ALV
if go_custom_container is initial.
create object go_custom_container
exporting container_name = 'ZTABLA'.
create object go_grid
exporting
i_parent = go_custom_container.
* Layout
l_layout-no_rowmark = 'X'.
l_layout-zebra = 'X'.
l_layout-cwidth_opt = ''.
perform load_data_into_grid.
else.
l_layout-no_rowmark = 'X'.
l_layout-zebra = 'X'.
l_layout-cwidth_opt = ''.
call method go_grid->refresh_table_display.
perform load_data_into_grid.
endif.
case sy-ucomm.
*
when 'BACK'. "perform clear_variables.
"clear g_datos. refresh g_datos.
leave to screen 0. exit.
*
* when 'CANC'. perform clear_variables.
* clear g_datos. refresh g_datos.
* leave to screen 0. exit.
*
* when 'EXIT'. perform clear_variables.
* clear g_datos. refresh g_datos.
* leave to screen 0. exit.
*
* when 'SELECT'. perform select_all_entries using 'X'.
*
* when 'DESELECT'. perform select_all_entries using space.
*
* when 'CHANGE'. perform graba_datos.
* clear g_datos. refresh g_datos.
* leave to screen 0. exit.
*
endcase.
endmodule. " STATUS_2000 OUTPUT
*&---------------------------------------------------------------------*
*& Module USER_COMMAND_2000 INPUT
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
module user_command_2000 input.
endmodule. " USER_COMMAND_2000 INPUT
*&---------------------------------------------------------------------*
*& Form CLEAR_VARIABLES
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
form clear_variables.
if not go_custom_container is initial.
* Limpiar referencia al objeto
call method go_grid->free.
call method go_custom_container->free.
* Limpiar variables
clear g_event_receiver.
clear go_grid.
clear go_custom_container.
endif.
endform. " CLEAR_VARIABLES
*&---------------------------------------------------------------------*
*& Form EXCLUDE_TB_FUNCTIONS
*&---------------------------------------------------------------------*
* Excluir botones de la ALV
*---------------------------------------------------------------------*
form exclude_tb_functions changing pt_exclude type ui_functions.
data ls_exclude type ui_func.
ls_exclude = cl_gui_alv_grid=>mc_fc_loc_copy_row.
append ls_exclude to pt_exclude.
* ls_exclude = cl_gui_alv_grid=>mc_fc_loc_delete_row.
* append ls_exclude to pt_exclude.
* ls_exclude = cl_gui_alv_grid=>mc_fc_loc_append_row.
* append ls_exclude to pt_exclude.
ls_exclude = cl_gui_alv_grid=>mc_fc_loc_insert_row.
append ls_exclude to pt_exclude.
ls_exclude = cl_gui_alv_grid=>mc_fc_loc_move_row.
append ls_exclude to pt_exclude.
ls_exclude = cl_gui_alv_grid=>mc_fc_loc_copy.
append ls_exclude to pt_exclude.
ls_exclude = cl_gui_alv_grid=>mc_fc_loc_cut.
append ls_exclude to pt_exclude.
ls_exclude = cl_gui_alv_grid=>mc_fc_loc_paste.
append ls_exclude to pt_exclude.
ls_exclude = cl_gui_alv_grid=>mc_fc_loc_paste_new_row.
append ls_exclude to pt_exclude.
ls_exclude = cl_gui_alv_grid=>mc_fc_loc_undo.
append ls_exclude to pt_exclude.
ls_exclude = cl_gui_alv_grid=>mc_fc_check.
append ls_exclude to pt_exclude.
endform. " EXCLUDE_TB_FUNCTIONS " deselect_all_entries
form handle_user_command using i_ucomm type syucomm .
endform .
form handle_menu_button using i_object type ref to cl_ctmenu
i_ucomm type syucomm .
endform. " handle_menu_button
form handle_toolbar using i_object type ref to cl_alv_event_toolbar_set .
endform .