Etiquetas

20111212

ABAP: Plantilla ALV LVC editable con ejemplos básicos

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.


*&---------------------------------------------------------------------*
*& 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