Esta plantilla contiene las rutinas básicas para utilizar un LVC modificable, además de unos ejemplos de bloqueo de registros y captura de modificaciones en pantalla y PF-STATUS.
Debido a que es ejemplo, muchas partes no compilarán si se copia/pega.
Debido a que es ejemplo, muchas partes no compilarán si se copia/pega.
*&---------------------------------------------------------------------*
*& Report NOMBRE_REPORTE
*&
*&---------------------------------------------------------------------*
**********************************************************************
* DATOS DE CABECERA
**********************************************************************
REPORT nombre_reporte.
TYPE-POOLS: slis, truxs.
**********************************************************************
* DECLARACIONES DE DATOS
**********************************************************************
TYPES:
BEGIN OF typ_alv,
T_SAKNR type SAKNR, "Número de la cuenta de mayor
T_TXT20 VSTXT_011T, "Denominación de la estructura de balance/PyG
MODIFICABLE. "para bloquear ciertas filas especificas
TYPES:
flag, "indicador de registro marcado
field_style TYPE lvc_t_styl, "lvc: deshabilitar campos de la tabla
END OF typ_alv.
DATA: t_salida TYPE TABLE OF typ_alv WITH HEADER LINE,
DATA:
g_subrc LIKE sy-subrc,
tabix LIKE sy-tabix,
ok_code TYPE sy-ucomm.
************************************************************************
* DATOS PARA MANEJO ALV *
************************************************************************
DATA:
gs_layout TYPE lvc_s_layo,
gs_fieldcat TYPE lvc_t_fcat,
g_exit_caused_by_caller,
gs_exit_caused_by_user TYPE slis_exit_by_user,
g_repid LIKE sy-repid.
*"Callback
DATA:
gt_events TYPE slis_t_event,
gt_list_top_of_page TYPE slis_t_listheader,
g_status_set TYPE slis_formname VALUE 'PF_STATUS_SET',
g_user_command TYPE slis_formname VALUE 'USER_COMMAND',
g_top_of_page TYPE slis_formname VALUE 'TOP_OF_PAGE',
g_top_of_list TYPE slis_formname VALUE 'TOP_OF_LIST',
g_data_changed TYPE slis_formname VALUE 'DATA_CHANGED',
g_end_of_list TYPE slis_formname VALUE 'END_OF_LIST'.
*"Variants
DATA: gs_variant LIKE disvariant,
g_save.
**********************************************************************
* START-OF-SELECTION
**********************************************************************
START-OF-SELECTION.
PERFORM procesa_datos. "procesamiento de los datos en t_salida
IF t_salida[] IS INITIAL.
MESSAGE text-e02 TYPE 'W'.
EXIT.
ENDIF.
PERFORM inicializar_tabla. "desactivar registros de lvc
PERFORM inicializa_alv.
**********************************************************************
* END-OF-SELECTION
**********************************************************************
END-OF-SELECTION.
PERFORM muestra_alv TABLES t_salida.
**********************************************************************
* METODOS COMUNES
*********************************************************************
**********************************************************************
* METODOS ALV
**********************************************************************
*&---------------------------------------------------------------------*
*& Form INICIALIZAR_TABLA
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
* --> p1 text
* <-- p2 text
*----------------------------------------------------------------------*
FORM inicializar_tabla .
DATA ls_stylerow TYPE lvc_s_styl .
* desactivar campos
LOOP AT t_salida.
tabix = sy-tabix.
IF t_salida-modificable IS INITIAL. "indicador de registro modificable
* IMPORTANTE: los campos declarados deben ir en orden alfabetico
ls_stylerow-fieldname = 'T_SAKNR' .
ls_stylerow-style = cl_gui_alv_grid=>mc_style_disabled.
APPEND ls_stylerow TO t_salida-field_style.
ls_stylerow-fieldname = 'T_TXT20' .
ls_stylerow-style = cl_gui_alv_grid=>mc_style_disabled.
APPEND ls_stylerow TO t_salida-field_style.
MODIFY t_salida INDEX tabix.
ENDIF.
ENDLOOP.
ENDFORM. " INICIALIZAR_TABLA
*&---------------------------------------------------------------------*
*& Form inicializa_alv
*&---------------------------------------------------------------------*
FORM inicializa_alv.
g_repid = sy-repid.
PERFORM layout_init USING gs_layout.
* TODO: inicializar fieldcat
PERFORM fieldcat_init.
PERFORM eventtab_build USING gt_events[].
gs_variant-report = g_repid.
g_save = 'X'.
ENDFORM. "inicializa_alv
*&---------------------------------------------------------------------*
*& Form muestra_alv
*&---------------------------------------------------------------------*
FORM muestra_alv TABLES gt_outtab.
DATA e VALUE 'E'.
CHECK gs_fieldcat[] IS NOT INITIAL.
* TODO: inicializar cabecera
PERFORM comment_build USING gt_list_top_of_page[].
CALL FUNCTION 'REUSE_ALV_GRID_DISPLAY_LVC'
EXPORTING
i_buffer_active = 'X'
i_callback_program = g_repid
i_callback_pf_status_set = 'ALV_STATUS' "insertar PF-STATUS propio
i_callback_user_command = 'USER_COMMAND' "controlar acciones sobre registros
* i_structure_name = ''
it_fieldcat_lvc = gs_fieldcat[]
is_layout_lvc = gs_layout
i_default = 'A'
i_save = g_save
is_variant = gs_variant
it_events = gt_events[]
IMPORTING
e_exit_caused_by_caller = g_exit_caused_by_caller
es_exit_caused_by_user = gs_exit_caused_by_user
TABLES
t_outtab = gt_outtab
EXCEPTIONS
program_error = 1
OTHERS = 2.
IF sy-subrc <> 0.
CASE 'X'.
WHEN g_exit_caused_by_caller.
MESSAGE 'g_exit_caused_by_caller' TYPE e.
WHEN gs_exit_caused_by_user-back.
MESSAGE 'gs_exit_caused_by_user-back' TYPE e.
WHEN gs_exit_caused_by_user-exit.
MESSAGE 'gs_exit_caused_by_user-exit' TYPE e.
WHEN gs_exit_caused_by_user-cancel.
MESSAGE 'gs_exit_caused_by_user-cancel' TYPE e.
WHEN OTHERS.
MESSAGE 'Others ALV' TYPE e.
ENDCASE.
ENDIF.
ENDFORM. "muestra_alv
*&---------------------------------------------------------------------*
*& Form layout_init
*&---------------------------------------------------------------------*
FORM layout_init USING rs_layout TYPE lvc_s_layo.
* rs_layout-detail_popup = 'X'.
rs_layout-box_fname = 'FLAG'.
rs_layout-stylefname = 'FIELD_STYLE'.
rs_layout-zebra = 'X'.
rs_layout-edit = 'X'.
ENDFORM. "layout_init
*&---------------------------------------------------------------------*
*& Form eventtab_build
*&---------------------------------------------------------------------*
FORM eventtab_build USING rt_events TYPE slis_t_event.
DATA: ls_event TYPE slis_alv_event.
*
CALL FUNCTION 'REUSE_ALV_EVENTS_GET'
EXPORTING
i_list_type = 0
IMPORTING
et_events = rt_events.
* top of page
READ TABLE rt_events WITH KEY name = slis_ev_top_of_page
INTO ls_event.
IF sy-subrc = 0.
MOVE g_top_of_page TO ls_event-form.
APPEND ls_event TO rt_events.
ENDIF.
* data changed: procesar cambios en datos especificos de alv modificable
ls_event-name = slis_ev_data_changed.
ls_event-form = g_data_changed.
APPEND ls_event TO rt_events.
ENDFORM. "eventtab_build
*&---------------------------------------------------------------------*
*& Form top_of_page
*&---------------------------------------------------------------------*
FORM top_of_page.
CALL FUNCTION 'REUSE_ALV_COMMENTARY_WRITE'
EXPORTING
i_logo = '' "<-- inserte logo empresa
it_list_commentary = gt_list_top_of_page.
ENDFORM. "top_of_page
**********************************************************************
* RUTINAS ESPECIFICAS POR REPORTE
**********************************************************************
*&---------------------------------------------------------------------*
*& Form comment_build
*&---------------------------------------------------------------------*
FORM comment_build USING lt_top_of_page TYPE slis_t_listheader.
DATA: ls_line TYPE slis_listheader.
DATA: texto TYPE string.
*
** LIST HEADING LINE: TYPE H
* CLEAR ls_line.
* ls_line-typ = 'H'."Cabecera
** LS_LINE-KEY: NOT USED FOR THIS TYPE
* ls_line-info = text-100.
* APPEND ls_line TO lt_top_of_page.
** STATUS LINE: TYPE S
* CLEAR ls_line.
* ls_line-typ = 'S'.
* ls_line-key = text-013.
* ls_line-info = v_bukrs.
* APPEND ls_line TO lt_top_of_page.
** ACTION LINE: TYPE A
* CLEAR ls_line.
* ls_line-typ = 'A'."Adicional
** LS_LINE-KEY: NOT USED FOR THIS TYPE
* ls_line-info = 'Info. adicional'.
* APPEND ls_line TO lt_top_of_page.
* LIST HEADING LINE: TYPE H
CLEAR ls_line.
ls_line-typ = 'H'."Cabecera
* LS_LINE-KEY: NOT USED FOR THIS TYPE
ls_line-info = text-100.
APPEND ls_line TO lt_top_of_page.
ENDFORM. "comment_build
*&---------------------------------------------------------------------*
*& Form fieldcat_init
*&---------------------------------------------------------------------*
FORM fieldcat_init.
DATA: ls_fieldcat TYPE lvc_s_fcat.
CLEAR ls_fieldcat.
ls_fieldcat-fieldname = 'T_SAKNR'.
ls_fieldcat-ref_table = 'SKB1'.
ls_fieldcat-ref_field = 'SAKNR'.
ls_fieldcat-edit = 'X'.
ls_fieldcat-col_opt = 'X'.
APPEND ls_fieldcat TO gs_fieldcat.
CLEAR ls_fieldcat.
ls_fieldcat-fieldname = 'T_TXT20'.
ls_fieldcat-ref_table = 'T011T'.
ls_fieldcat-ref_field = 'VSTXT'.
ls_fieldcat-edit = 'X'.
ls_fieldcat-col_opt = 'X'.
APPEND ls_fieldcat TO gs_fieldcat.
ENDFORM. "fieldcat_init
*&---------------------------------------------------------------------*
*& Form alv_status
*&---------------------------------------------------------------------*
FORM alv_status USING rt_extab TYPE slis_t_extab.
SET PF-STATUS 'PF101'.
ENDFORM. "alv_status
*&---------------------------------------------------------------------*
*& Form user_command
*&---------------------------------------------------------------------*
FORM user_command USING r_ucomm LIKE sy-ucomm
rs_selfield TYPE slis_selfield.
LOOP AT t_salida WHERE flag = 'X'.
CASE r_ucomm.
WHEN 'DELE'.
IF t_salida-modificable = 'X'.
DELETE t_salida INDEX sy-tabix.
ENDIF.
ENDCASE.
ENDLOOP.
rs_selfield-refresh = 'X'. "refrescar pantalla
ENDFORM. "user_command
*&---------------------------------------------------------------------*
*& Form data_changed
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
* -->RR_DATA text
*----------------------------------------------------------------------*
FORM data_changed USING rr_data TYPE REF TO cl_alv_changed_data_protocol.
* ejemplo de uso de data changed para validar monto, no aplica al caso
DATA: ls_modif TYPE lvc_s_modi,
value TYPE wert8,
max_value TYPE wert8 VALUE '4700000000.00'.
LOOP AT rr_data->mt_mod_cells INTO ls_modif.
IF ls_modif-fieldname CS '_USD'.
PERFORM mueve_monto USING ls_modif-value 'USD'
CHANGING value.
IF value > max_value.
MESSAGE text-e11 TYPE 'I'.
CALL METHOD rr_data->modify_cell
EXPORTING
i_row_id = ls_modif-row_id
i_fieldname = ls_modif-fieldname
i_value = max_value.
ENDIF.
ENDIF.
ENDLOOP.
ENDFORM. "data_changed
*& Report NOMBRE_REPORTE
*&
*&---------------------------------------------------------------------*
**********************************************************************
* DATOS DE CABECERA
**********************************************************************
REPORT nombre_reporte.
TYPE-POOLS: slis, truxs.
**********************************************************************
* DECLARACIONES DE DATOS
**********************************************************************
TYPES:
BEGIN OF typ_alv,
T_SAKNR type SAKNR, "Número de la cuenta de mayor
T_TXT20 VSTXT_011T, "Denominación de la estructura de balance/PyG
MODIFICABLE. "para bloquear ciertas filas especificas
TYPES:
flag, "indicador de registro marcado
field_style TYPE lvc_t_styl, "lvc: deshabilitar campos de la tabla
END OF typ_alv.
DATA: t_salida TYPE TABLE OF typ_alv WITH HEADER LINE,
DATA:
g_subrc LIKE sy-subrc,
tabix LIKE sy-tabix,
ok_code TYPE sy-ucomm.
************************************************************************
* DATOS PARA MANEJO ALV *
************************************************************************
DATA:
gs_layout TYPE lvc_s_layo,
gs_fieldcat TYPE lvc_t_fcat,
g_exit_caused_by_caller,
gs_exit_caused_by_user TYPE slis_exit_by_user,
g_repid LIKE sy-repid.
*"Callback
DATA:
gt_events TYPE slis_t_event,
gt_list_top_of_page TYPE slis_t_listheader,
g_status_set TYPE slis_formname VALUE 'PF_STATUS_SET',
g_user_command TYPE slis_formname VALUE 'USER_COMMAND',
g_top_of_page TYPE slis_formname VALUE 'TOP_OF_PAGE',
g_top_of_list TYPE slis_formname VALUE 'TOP_OF_LIST',
g_data_changed TYPE slis_formname VALUE 'DATA_CHANGED',
g_end_of_list TYPE slis_formname VALUE 'END_OF_LIST'.
*"Variants
DATA: gs_variant LIKE disvariant,
g_save.
**********************************************************************
* START-OF-SELECTION
**********************************************************************
START-OF-SELECTION.
PERFORM procesa_datos. "procesamiento de los datos en t_salida
IF t_salida[] IS INITIAL.
MESSAGE text-e02 TYPE 'W'.
EXIT.
ENDIF.
PERFORM inicializar_tabla. "desactivar registros de lvc
PERFORM inicializa_alv.
**********************************************************************
* END-OF-SELECTION
**********************************************************************
END-OF-SELECTION.
PERFORM muestra_alv TABLES t_salida.
**********************************************************************
* METODOS COMUNES
*********************************************************************
**********************************************************************
* METODOS ALV
**********************************************************************
*&---------------------------------------------------------------------*
*& Form INICIALIZAR_TABLA
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
* --> p1 text
* <-- p2 text
*----------------------------------------------------------------------*
FORM inicializar_tabla .
DATA ls_stylerow TYPE lvc_s_styl .
* desactivar campos
LOOP AT t_salida.
tabix = sy-tabix.
IF t_salida-modificable IS INITIAL. "indicador de registro modificable
* IMPORTANTE: los campos declarados deben ir en orden alfabetico
ls_stylerow-fieldname = 'T_SAKNR' .
ls_stylerow-style = cl_gui_alv_grid=>mc_style_disabled.
APPEND ls_stylerow TO t_salida-field_style.
ls_stylerow-fieldname = 'T_TXT20' .
ls_stylerow-style = cl_gui_alv_grid=>mc_style_disabled.
APPEND ls_stylerow TO t_salida-field_style.
MODIFY t_salida INDEX tabix.
ENDIF.
ENDLOOP.
ENDFORM. " INICIALIZAR_TABLA
*&---------------------------------------------------------------------*
*& Form inicializa_alv
*&---------------------------------------------------------------------*
FORM inicializa_alv.
g_repid = sy-repid.
PERFORM layout_init USING gs_layout.
* TODO: inicializar fieldcat
PERFORM fieldcat_init.
PERFORM eventtab_build USING gt_events[].
gs_variant-report = g_repid.
g_save = 'X'.
ENDFORM. "inicializa_alv
*&---------------------------------------------------------------------*
*& Form muestra_alv
*&---------------------------------------------------------------------*
FORM muestra_alv TABLES gt_outtab.
DATA e VALUE 'E'.
CHECK gs_fieldcat[] IS NOT INITIAL.
* TODO: inicializar cabecera
PERFORM comment_build USING gt_list_top_of_page[].
CALL FUNCTION 'REUSE_ALV_GRID_DISPLAY_LVC'
EXPORTING
i_buffer_active = 'X'
i_callback_program = g_repid
i_callback_pf_status_set = 'ALV_STATUS' "insertar PF-STATUS propio
i_callback_user_command = 'USER_COMMAND' "controlar acciones sobre registros
* i_structure_name = ''
it_fieldcat_lvc = gs_fieldcat[]
is_layout_lvc = gs_layout
i_default = 'A'
i_save = g_save
is_variant = gs_variant
it_events = gt_events[]
IMPORTING
e_exit_caused_by_caller = g_exit_caused_by_caller
es_exit_caused_by_user = gs_exit_caused_by_user
TABLES
t_outtab = gt_outtab
EXCEPTIONS
program_error = 1
OTHERS = 2.
IF sy-subrc <> 0.
CASE 'X'.
WHEN g_exit_caused_by_caller.
MESSAGE 'g_exit_caused_by_caller' TYPE e.
WHEN gs_exit_caused_by_user-back.
MESSAGE 'gs_exit_caused_by_user-back' TYPE e.
WHEN gs_exit_caused_by_user-exit.
MESSAGE 'gs_exit_caused_by_user-exit' TYPE e.
WHEN gs_exit_caused_by_user-cancel.
MESSAGE 'gs_exit_caused_by_user-cancel' TYPE e.
WHEN OTHERS.
MESSAGE 'Others ALV' TYPE e.
ENDCASE.
ENDIF.
ENDFORM. "muestra_alv
*&---------------------------------------------------------------------*
*& Form layout_init
*&---------------------------------------------------------------------*
FORM layout_init USING rs_layout TYPE lvc_s_layo.
* rs_layout-detail_popup = 'X'.
rs_layout-box_fname = 'FLAG'.
rs_layout-stylefname = 'FIELD_STYLE'.
rs_layout-zebra = 'X'.
rs_layout-edit = 'X'.
ENDFORM. "layout_init
*&---------------------------------------------------------------------*
*& Form eventtab_build
*&---------------------------------------------------------------------*
FORM eventtab_build USING rt_events TYPE slis_t_event.
DATA: ls_event TYPE slis_alv_event.
*
CALL FUNCTION 'REUSE_ALV_EVENTS_GET'
EXPORTING
i_list_type = 0
IMPORTING
et_events = rt_events.
* top of page
READ TABLE rt_events WITH KEY name = slis_ev_top_of_page
INTO ls_event.
IF sy-subrc = 0.
MOVE g_top_of_page TO ls_event-form.
APPEND ls_event TO rt_events.
ENDIF.
* data changed: procesar cambios en datos especificos de alv modificable
ls_event-name = slis_ev_data_changed.
ls_event-form = g_data_changed.
APPEND ls_event TO rt_events.
ENDFORM. "eventtab_build
*&---------------------------------------------------------------------*
*& Form top_of_page
*&---------------------------------------------------------------------*
FORM top_of_page.
CALL FUNCTION 'REUSE_ALV_COMMENTARY_WRITE'
EXPORTING
i_logo = '' "<-- inserte logo empresa
it_list_commentary = gt_list_top_of_page.
ENDFORM. "top_of_page
**********************************************************************
* RUTINAS ESPECIFICAS POR REPORTE
**********************************************************************
*&---------------------------------------------------------------------*
*& Form comment_build
*&---------------------------------------------------------------------*
FORM comment_build USING lt_top_of_page TYPE slis_t_listheader.
DATA: ls_line TYPE slis_listheader.
DATA: texto TYPE string.
*
** LIST HEADING LINE: TYPE H
* CLEAR ls_line.
* ls_line-typ = 'H'."Cabecera
** LS_LINE-KEY: NOT USED FOR THIS TYPE
* ls_line-info = text-100.
* APPEND ls_line TO lt_top_of_page.
** STATUS LINE: TYPE S
* CLEAR ls_line.
* ls_line-typ = 'S'.
* ls_line-key = text-013.
* ls_line-info = v_bukrs.
* APPEND ls_line TO lt_top_of_page.
** ACTION LINE: TYPE A
* CLEAR ls_line.
* ls_line-typ = 'A'."Adicional
** LS_LINE-KEY: NOT USED FOR THIS TYPE
* ls_line-info = 'Info. adicional'.
* APPEND ls_line TO lt_top_of_page.
* LIST HEADING LINE: TYPE H
CLEAR ls_line.
ls_line-typ = 'H'."Cabecera
* LS_LINE-KEY: NOT USED FOR THIS TYPE
ls_line-info = text-100.
APPEND ls_line TO lt_top_of_page.
ENDFORM. "comment_build
*&---------------------------------------------------------------------*
*& Form fieldcat_init
*&---------------------------------------------------------------------*
FORM fieldcat_init.
DATA: ls_fieldcat TYPE lvc_s_fcat.
CLEAR ls_fieldcat.
ls_fieldcat-fieldname = 'T_SAKNR'.
ls_fieldcat-ref_table = 'SKB1'.
ls_fieldcat-ref_field = 'SAKNR'.
ls_fieldcat-edit = 'X'.
ls_fieldcat-col_opt = 'X'.
APPEND ls_fieldcat TO gs_fieldcat.
CLEAR ls_fieldcat.
ls_fieldcat-fieldname = 'T_TXT20'.
ls_fieldcat-ref_table = 'T011T'.
ls_fieldcat-ref_field = 'VSTXT'.
ls_fieldcat-edit = 'X'.
ls_fieldcat-col_opt = 'X'.
APPEND ls_fieldcat TO gs_fieldcat.
ENDFORM. "fieldcat_init
*&---------------------------------------------------------------------*
*& Form alv_status
*&---------------------------------------------------------------------*
FORM alv_status USING rt_extab TYPE slis_t_extab.
SET PF-STATUS 'PF101'.
ENDFORM. "alv_status
*&---------------------------------------------------------------------*
*& Form user_command
*&---------------------------------------------------------------------*
FORM user_command USING r_ucomm LIKE sy-ucomm
rs_selfield TYPE slis_selfield.
LOOP AT t_salida WHERE flag = 'X'.
CASE r_ucomm.
WHEN 'DELE'.
IF t_salida-modificable = 'X'.
DELETE t_salida INDEX sy-tabix.
ENDIF.
ENDCASE.
ENDLOOP.
rs_selfield-refresh = 'X'. "refrescar pantalla
ENDFORM. "user_command
*&---------------------------------------------------------------------*
*& Form data_changed
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
* -->RR_DATA text
*----------------------------------------------------------------------*
FORM data_changed USING rr_data TYPE REF TO cl_alv_changed_data_protocol.
* ejemplo de uso de data changed para validar monto, no aplica al caso
DATA: ls_modif TYPE lvc_s_modi,
value TYPE wert8,
max_value TYPE wert8 VALUE '4700000000.00'.
LOOP AT rr_data->mt_mod_cells INTO ls_modif.
IF ls_modif-fieldname CS '_USD'.
PERFORM mueve_monto USING ls_modif-value 'USD'
CHANGING value.
IF value > max_value.
MESSAGE text-e11 TYPE 'I'.
CALL METHOD rr_data->modify_cell
EXPORTING
i_row_id = ls_modif-row_id
i_fieldname = ls_modif-fieldname
i_value = max_value.
ENDIF.
ENDIF.
ENDLOOP.
ENDFORM. "data_changed
No hay comentarios:
Publicar un comentario