jueves, 30 de julio de 2015

Clase CL_SALV_TABLE: Introducción

La clase CL_SALV_TABLE es una aproximación  basada  en el paradigma de la programación orienta objetos para el desarrollo de listados ALV en aplicaciones SAP. La clase CL_SALV_TABLE forma parte del modelo basado en objetos para ALV ( ALV Object Model ) que agrupa diferentes clases globales para la implementación de listados ALV y que esta  incluido a partir de la versión 6.40 de SAP.

CL_SALV_TABLE se utiliza para crear listados ALV de dos dimensiones y con un estilo de hoja de calculo de forma fácil y rápida en nuestras aplicaciones ABAP.

La única limitación de esta clase es que no existe ningún  método para crear ALV editables.

Para crear la instancia de la clase CL_SALV_TABLE invocamos a su método FACTORY.
Una vez creado, para mostrar por pantalla el ALV por primera vez invocamos el método DISPLAY
Para refrescar los datos del ALV en la pantalla, invocamos al método REFRESH

Podeis visualizar sus atributos y métodos desde la transacción SE24.

Clase global CL_SALV_TABLE

CL_SALV_TABLE a pantalla completa:
En el siguiente ejemplo, implementamos un ALV a pantalla completa utilizando la clase CL_SALV_TABLE.

*&---------------------------------------------------------------------*
*& Report:  ZZCL_SALV_TABLE_FULL_SCREEN
*& Fecha :  29.07.2015
*& Autor :  David Rueda Barrón
*&---------------------------------------------------------------------*
*& Creacion de ALV a pantalla completa con la clase CL_SALV_TABLE
*&---------------------------------------------------------------------*

REPORT ZZCL_SALV_TABLE_FULL_SCREEN.

TYPES: BEGIN OF type_matnr,
  matnr type mara-matnr,
  maktx type makt-maktx,
  MTART type mara-MTART,
  MATKL type mara-matkl,
  MEINS type mara-MEINS,
 END OF type_matnr.

DATA: ti_mara type STANDARD TABLE OF type_matnr.

DATA gr_table type ref to cl_salv_table.  "instancia de la clase
DATA cx_salv  TYPE REF TO cx_salv_msg.

DATA gr_msg  TYPE string.
*&---------------------------------------------------------------------*
*& START-OF-SELECTION
*&---------------------------------------------------------------------*
START-OF-SELECTION.

SELECT m~matnr t~maktx m~mtart m~matkl m~meins
  INTO CORRESPONDING FIELDS OF TABLE ti_mara
  FROM mara as m
  INNER JOIN makt as t
     ON m~matnr EQ t~matnr
    AND t~spras EQ sy-langu.

try.
      cl_salv_table=>factory(
        importing
          r_salv_table = gr_table
        changing
          t_table      = ti_mara ).
catch cx_salv_msg INTO cx_salv.
* gestionamos las excepciones que puedan suceder
  gr_msg = cx_salv->get_text( ).
  MESSAGE gr_msg TYPE 'E'.
endtry.

gr_table->display( ).

CL_SALV_TABLE a pantalla completa

CL_SALV_TABLE dentro de una dynpro:
En el siguiente ejemplo, implementamos un ALV dentro de un objeto contenedor para que pueda ser visualizado en una  dynpro de una aplicación ABAP de tipo modul pool.

Como hemos comentado, en este caso, el ALV va ha estar contenido en una dynpro.
El programa principal se encargara  de rellenar la tabla interna y llamar a la dynpro.


*&---------------------------------------------------------------------*
*& Report:  ZZCL_SALV_TABLE_DYNPRO
*& Fecha :  29.07.2015
*& Autor :  David Rueda Barrón
*&---------------------------------------------------------------------*
*& Creación de ALV dentro de Dynpro con la clase CL_SALV_TABLE
DATA ti_mara type STANDARD TABLE OF type_matnr.
*&---------------------------------------------------------------------* REPORT ZZCL_SALV_TABLE_DYNPRO. TYPES: BEGIN OF type_matnr, matnr type mara-matnr, maktx type makt-maktx, MTART type mara-MTART, MATKL type mara-matkl, MEINS type mara-MEINS, END OF type_matnr.
DATA ok_code type sy-ucomm. 

DATA gr_table     TYPE REF TO cl_salv_table.  "instancia de la clase
DATA gr_container TYPE REF TO cl_gui_custom_container.

DATA cx_salv  TYPE REF TO cx_salv_msg.

DATA gr_msg  TYPE string.
*&---------------------------------------------------------------------*
*& START-OF-SELECTION
*&---------------------------------------------------------------------*
START-OF-SELECTION.

SELECT m~matnr t~maktx m~mtart m~matkl m~meins
  INTO CORRESPONDING FIELDS OF TABLE ti_mara
  FROM mara as m
  INNER JOIN makt as t
     ON m~matnr EQ t~matnr
    AND t~spras EQ sy-langu.

CALL SCREEN 4001.


Para crear la dynpro, tenéis que hacer doble click sobre el número de dynpro 4001.

Doble click sobre el número de dynpro para crearla

Como cualquier dynpro, lo primero es introducir una descripción, el resto de campos los dejamos como están, no hace falta modificarlos para esta prueba .

descripción de la dynpro

En la pestaña Lista Elementos, escribimos OK_CODE  en la única celda que hay editable.
Nota: OK_CODE es una variable global del programa principal de tipo SY-UCOMM.

OK_CODE para recoger el código de función de cada evento de la dynpro

Después hay que implementar los módulos STATUS y USER_COMMAND en la pestaña Lóg. proceso.

   1. Descomentamos la linea de MODULE STATUS_4001
   2. Doble click sobre nombre del modulo STATUS_4001 para crearlo.
   3. Guardamos el nuevo modulo en el include ZZCL_SALV_TABLE_DYNPRO_PBO
Crear el Modulo STATUS_4001
 
   4. Descomentamos la linea de código que empieza por SET_STATUS....
   5. Sustituimos las  XXXXXXX  por el nombre de nuestro status, por ejemplo: ZZSTATUS_4001
   6. Doble click sobre el nombre del status y creamos un nuevo Status diálogo.
   7. Desplegar la sección Teclas de función.
   8. En los siguientes iconos, escribimos los siguientes códigos de funciones:


Códigos de funciones para el status de la dynpro 4001

Lo siguiente es implementar el modulo USER_COMMAND_4001:

   1. Descomentamos la instrucción MODULE USER_COMMAND_4001.
   2. Doble click sobre nombre del modulo USER_COMMAND_4001 para crearlo.
   3. Guardamos el nuevo modulo en el include ZZCL_SALV_TABLE_DYNPRO_PAI

Crear el modulo USER_COMMAND_4001
   4. Dentro del modulo USER_COMMAND_4001 colocamos el siguiente código:

DATA wl_command TYPE sy-ucomm.

wl_command = ok_code.
clear ok_code.

CASE wl_command.
   WHEN 'BACK' OR 'EXIT' OR 'CANCEL'.
      SET SCREEN 0.
      LEAVE SCREEN.
ENDCASE.

Activamos todos los includes , la dynpro 4001 y el status ZZSTATUS_4001.
Con esto ya tenemos creada una dynpro y las funcione para poder cerrarla.

Ahora toca incrustar en ella nuestro ALV de la clase CL_SALV_TABLE.

   1. Volvemos ala dynpro 4001 y pulsamos el boton LAYOUT en la barra de herramientas.
   2. Dibujamos un objeto contenedor en la dypro, le damos el nombre de ZCONTENEDOR_ALV.
   3. Activamos y cerramos el editor de Dynpros

Añadimos un contenedor a la dynpro 4001

   4.Creamos un nuevo modulo en la sección PROCESS BEFORE OUTPUT de la dynpro 4001.
      Guardamos el modulo en el include ZZCL_SALV_TABLE_DYNPRO_PBO
     
nuevo modulo PBO - SET_ALV
   5. Incluimos el siguiente código dentro del modulo:

if ( gr_container is not bound ).
*   Si es la primera vez, instancia las clases y muestra los datos de la tabla
    create object gr_container
      exporting
        container_name              = 'ZCONTENEDOR_ALV'
      exceptions
        cntl_error                  = 1
        cntl_system_error           = 2
        create_error                = 3
        lifetime_error              = 4
        lifetime_dynpro_dynpro_link = 5
        others                      = 6.

    if ( sy-subrc <> 0 ).
      message id sy-msgid type sy-msgty number sy-msgno
                 with sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4.
    endif.

    cl_salv_table=>factory(
             exporting
                 r_container    = gr_container
                 list_display   = ' '
               importing
                 r_salv_table   = gr_table
               changing
                 t_table        = ti_mara ).

    gr_table->display( ).
  else.
*   Si ya estan instanciadas las clases, pues refrescamso los datos de la pantalla
    gr_table->refresh( ).
  endif.


Activamos todos los includes, dynpros y status.
Ejecutamos para ver el resultado

ALV con CL_SALV_TABLE dentro de una dynpro


En resumen, la clase CL_SALV_TABLE reduce el código que necesitamos para crear listados ALV por pantalla pero no podemos crear ALV editables..

Entradas siguientes:
Clase CL_SALV_TABLE: Modificar atributos de las columnas

No hay comentarios:

Publicar un comentario