domingo, 8 de diciembre de 2013

Crear bases de datos

Crear las siguientes tablas:

1. Tabla: ZBIBLIO_SOCIOS
Campo Tipo
Código de socio NUMC-4
DNI CHAR-9
Nombre CHAR-30
Apellido CHAR-30
Teléfono CHAR-15
Dirección 1 CHAR-75
Dirección 2 CHAR-75
Dirección 3 CHAR-75
Dirección 4 CHAR-75

2. Tabla: ZBIBLIO_LIBROS
Campo Tipo
Código de libro NUMC-8
Autor CHAR-75
Título CHAR-125
Ejemplares disponibles INT-4
Ejemplares totales INT-4

3. Tabla: ZBIBLIO_PRESTAM
Campo Tipo
Código de préstamo NUMC-12
Código de socio (Clave externa con tabla de socios)
Código de libro (Clave externa con tabla de socios)
Fecha inicio préstamo DAT
Fecha estimada devolución DAT
Fecha real devolución DAT

El primer paso es crear todos los dominios en la SE11. Habrá tantos dominios como tipo de variables, es decir, un dominio para CHAR-9, otro para CHAR-15 y así sucesivamente con cada uno de los tipos de las tres tablas.

Creación de un dominio.
Características de un dominio. 
Finalmente se habrán creado los siguientes dominios:

Lista de dominios creados.
A continuación, se crean los tipos de datos. Por tanto, volvemos a la SE11 para crear los tipos de datos.
Creación del tipo de datos.

En este ejemplo, tendremos que crear todos los tipos de datos de las tres tablas y asignarle el dominio correspondiente. Este dominio se puede repetir, como es el caso de los campos Nombre y Apellido en la tabla Z_BIBLIO_SOCIOS, ya que su tipo es un CHAR-30. La única diferencia entre los tipos de datos Nombre y Apellido es las descripciones.
Asignando un dominio creado al tipo de datos.
Se aconseja rellenar las descripciones del campo, ya que ayudará a la visualización cuando se utilicen ALVs.
Creando etiquetas de descripción para mostrar en ALVs. 
Una vez con todos los tipos de datos creados, pasamos a crear la base de datos en la SE11. Seleccionamos la clase e introducimos los campos de la tabla.

Creamos una base de datos.
Asignamos la clase y navegación de datos.
Todo tabla debe de comenzar por el mandante, con lo que asignamos el elemento MANDT al primer campo.
Añadimos el mandante y los campos (asignando los tipos creados previamente).
Pulsamos el botón de ajustes técnicos de la tabla para asignar la clase APPL0 y un tamaño de registro categoría 0 (780 registros).
Asignar clase de datos y el número de registros que tendrá la tabla.
A continuación, seleccionamos la categoría de ampliación de la tabla en Detalles:

Categoría de ampliación en Detalles.
Seleccionamos ampliable de cualquier manera.
Y finalmente, vamos al generador de actualizador de tabla en Utilidades:

Ir al generador de mantenimiento de tabla en utilidades.
Seleccionamos el grupo de autorización y el grupo de funciones. Se recomienda que para cada tabla tenga su propio grupo de funciones. En este caso, la llamamos igual que el nombre de la tabla. Además, asignamos la imagen resumen con un 9000 (Se recomienda que se empiece a contar a partir de ese número).
Seleccionamos categoría de actualización, el grupo de funciones y la imagen resumen.
Pinchamos en crear, grabamos y activamos la tabla.

Se repite cada uno de los pasos con las otras dos tablas.

Las claves externas se explican en esta entrada.

Para introducir datos en la tabla de forma manual, iremos a la transacción SM30


jueves, 28 de noviembre de 2013

ALV Report de una base de datos (I_STRUCTURE_NAME)

Cuando consultamos una base de datos, es posible que las descripciones de los campos hayan sido añadidas en los elementos de datos de cada campo, por tanto no será necesario rellenar el FIELDCAT como en el primer ejemplo ALV. Sólo hay que indicar el nombre de la estructura y la tabla interna.

En este ejemplo se va a mostrar la SFLIGHT.

REPORT  z_sflight.

* Cargar la tabla SFLIGHT de la base de datos
TABLES: sflight.

* Definición de variables
DATA: g_it_sflight TYPE TABLE OF sflight.

* Copiado de los datos a la tabla con los filtros
SELECT * FROM sflight INTO TABLE g_it_sflight.

* ALV
CALL FUNCTION 'REUSE_ALV_GRID_DISPLAY'
  EXPORTING
    i_structure_name = 'SFLIGHT'
  TABLES
    t_outtab         = g_it_sflight.

ALV Report de una base de datos

jueves, 21 de noviembre de 2013

Añadir un botón en un ALV Report

En la transacción SE80, visualizamos el programa SAPLKKBL.

Visualizamos el programa SAPLKKBL.

Navegamos en el árbol hasta la pestaña GUI Status>STANDARD. Pinchamos con el botón derecho y lo copiamos a nuestro programa.

Copiamos STANDARD en la pestaña Status GUI.

Añadimos el nombre de nuestro programa.

Volvemos a nuestro programa principal, y comprobamos que tenemos el STANDARD en la pestaña GUI Status.

Comprobamos que tenemos GUI Status>Standard en nuestro programa.
Pinchamos dos veces en STANDARD y veremos los botones disponibles. En esta nueva ventana añadimos un nuevo botón, asignándole un nombre, un icono y un atajo del teclado (No asignar el atajo F4, ya que el botón no funcionaría).

Añadimos un botón con el nombre &BT1.

Asignamos un icono.
Asignamos un atajo del teclado.


Ya tenemos el GUI Status listo para incorporar. Se va a mostrar un código en el que se muestran los cuatro primeros campos de la tabla SFLIGHT con un nuevo botón en el menú. Cuando se pulsa el botón, saldrá un mensaje de notificación.

El código es el siguiente:


REPORT  z_test.

* Cargar la tabla SFLIGHT de la base de datos
TABLES: sflight.

* Cargamos los datos tipo slis
TYPES: slis.

* Definición de variables
DATA: g_it_sflight TYPE TABLE OF sflight,
      g_st_sflight TYPE sflight.

DATA: g_it_fieldcat TYPE slis_t_fieldcat_alv,
      g_st_fieldcat TYPE slis_fieldcat_alv.

DATA: g_repid TYPE sy-repid.

* SQL para copiar la tabla sflight a la tabla interna
SELECT * FROM sflight INTO TABLE g_it_sflight.

* Variable con el nombre del programa
g_repid = sy-repid.

* Datos del fieldcat para el ALV
g_st_fieldcat-fieldname = 'CARRID'.
g_st_fieldcat-seltext_s = 'Comp.'.
APPEND g_st_fieldcat TO g_it_fieldcat.

g_st_fieldcat-fieldname = 'CONNID'.
g_st_fieldcat-seltext_s = 'Vuelo'.
APPEND g_st_fieldcat TO g_it_fieldcat.

g_st_fieldcat-fieldname = 'FLDATE'.
g_st_fieldcat-seltext_s = 'Fecha'.
APPEND g_st_fieldcat TO g_it_fieldcat.

g_st_fieldcat-fieldname = 'PRICE'.
g_st_fieldcat-seltext_s = 'Tarifa'.
APPEND g_st_fieldcat TO g_it_fieldcat.

CALL FUNCTION 'REUSE_ALV_GRID_DISPLAY'
  EXPORTING
    i_callback_program       = g_repid
    i_callback_pf_status_set = 'MI_STANDARD'
    i_callback_user_command  = 'MI_USER_COMMAND'
    it_fieldcat              = g_it_fieldcat[]
  TABLES
    t_outtab                 = g_it_sflight[]
  EXCEPTIONS
    program_error            = 1
    OTHERS                   = 2.

*&---------------------------------------------------------------------*
*&      Form  mi_user_command
*&---------------------------------------------------------------------*
*
*----------------------------------------------------------------------*
FORM mi_user_command USING r_ucomm LIKE sy-ucomm
                                   rs_selfield TYPE slis_selfield.
  CASE r_ucomm. 
    WHEN '&BT1'. "Se ha hecho click en el botón
      MESSAGE 'Has pulsado el botón creado' TYPE 'I'.
  ENDCASE.
ENDFORM.                    "mi_user_command

*&---------------------------------------------------------------------*
*&      Form  mi_standard
*&---------------------------------------------------------------------*
*
*----------------------------------------------------------------------*
FORM mi_standard USING rt_extab TYPE slis_t_extab.
  SET PF-STATUS 'STANDARD'. "Nombre del Status GUI
ENDFORM.                    "mi_standard

Nuestro botón y el mensaje monstrado.

Top of page en un ALV Report con imagen

Para crear un encabezado a nuestro ALV Report con REUSE_ALV_GRID_DISPLAY, se necesitará crear un FORM y nombrarle en i_callback_top_of_page. Dentro del FORM, se incluirá la función REUSE_ALV_COMMENTARY_WRITE para mostrar el texto del encabezado. Además, será necesario indicar el nombre del programa en i_callback_program. 

En el encabezado podremos distinguir tres áreas:

  1. Header: Se muestra el texto con un tamaño de fuente grande.
  2. Selection: Podremos mostrar el par de valores clave y valor.
  3. Action: Se muestra el texto en cursiva.

El código es el siguiente:


REPORT  z_sflight.

* Cargar la tabla SFLIGHT de la base de datos
TABLES: sflight.

* Cargamos los datos tipo slis
TYPES: slis.

* Definición de variables
DATA: g_it_sflight TYPE TABLE OF sflight,
      g_st_sflight TYPE sflight.

DATA: g_it_fieldcat TYPE slis_t_fieldcat_alv,
      g_st_fieldcat TYPE slis_fieldcat_alv.

DATA: g_repid TYPE sy-repid.

* SQL para copiar la tabla sflight a la tabla interna
SELECT * FROM sflight INTO TABLE g_it_sflight.

* Variable con el nombre del programa
g_repid = sy-repid.

* Datos del fieldcat para el ALV
g_st_fieldcat-fieldname = 'CARRID'.
g_st_fieldcat-seltext_s = 'Comp.'.
APPEND g_st_fieldcat TO g_it_fieldcat.

g_st_fieldcat-fieldname = 'CONNID'.
g_st_fieldcat-seltext_s = 'Vuelo'.
APPEND g_st_fieldcat TO g_it_fieldcat.

g_st_fieldcat-fieldname = 'FLDATE'.
g_st_fieldcat-seltext_s = 'Fecha'.
APPEND g_st_fieldcat TO g_it_fieldcat.

g_st_fieldcat-fieldname = 'PRICE'.
g_st_fieldcat-seltext_s = 'Tarifa'.
APPEND g_st_fieldcat TO g_it_fieldcat.

CALL FUNCTION 'REUSE_ALV_GRID_DISPLAY'
  EXPORTING
    i_callback_program     = g_repid
    i_callback_top_of_page = 'MI_TOP_OF_PAGE'
    it_fieldcat            = g_it_fieldcat[]
  TABLES
    t_outtab               = g_it_sflight[]
  EXCEPTIONS
    program_error          = 1
    OTHERS                 = 2.

*&---------------------------------------------------------------------*
*&      Form  mi_top_of_page
*&---------------------------------------------------------------------*
*       
*----------------------------------------------------------------------*
FORM mi_top_of_page.
*ALV Header declarations
  DATA: l_it_header TYPE slis_t_listheader,
        l_st_header TYPE slis_listheader,
        l_it_line LIKE l_st_header-info,
        ld_lines TYPE i,
        ld_linesc(10) TYPE c.

* Tipo H para escribir con la fuente grande
  l_st_header-typ  = 'H'.
  l_st_header-info = 'SFLIGHT DATA'.
  APPEND l_st_header TO l_it_header.
  CLEAR l_st_header.

* Tipo S para indicar parámetro clave y su valor (fecha)
  l_st_header-typ  = 'S'. "Selection
  l_st_header-key = 'Date: '.
  CONCATENATE  sy-datum+6(2) '.'
               sy-datum+4(2) '.'
               sy-datum(4) INTO l_st_header-info.   "Fecha de hoy
  APPEND l_st_header TO l_it_header.
  CLEAR: l_st_header.

* Tipo A para escribir en cursiva
  l_st_header-typ  = 'A'. "Action
  l_st_header-info = 'ALV Report'.
  APPEND l_st_header TO l_it_header.
  CLEAR: l_st_header.

  CALL FUNCTION 'REUSE_ALV_COMMENTARY_WRITE'
    EXPORTING
      it_list_commentary = l_it_header[]
      i_logo             = 'ENJOYSAP_LOGO'.

ENDFORM.                    "mi_top_of_page


Top of page con imagen en un ALV Report.

miércoles, 20 de noviembre de 2013

Añadir patrón de rayas y tamaño de columna optimizado en un ALV Report (IS_LAYOUT)

Si se desea mostrar el patrón rayado y tener el ancho de columna optimizado, se tiene que recurrir a la variable IS_LAYOUT del ALV. En este caso para activar dichas opciones, sólo hay que cambiar el valor de dos variables con una X.

En este ejemplo se muestran los cuatro primeros campos de la tabla SFLIGHT.

REPORT  z_sflight.

* Cargar la tabla SFLIGHT de la base de datos
TABLES: sflight.

* Cargamos los datos tipo slis
TYPES: slis.

* Definición de variables
DATA: g_it_sflight TYPE TABLE OF sflight,
      g_st_sflight TYPE sflight.

DATA: g_it_fieldcat TYPE slis_t_fieldcat_alv,
      g_st_fieldcat TYPE slis_fieldcat_alv.

Data: g_st_layout type slis_layout_alv.

* SQL para copiar la tabla sflight a la tabla interna
SELECT * FROM sflight INTO TABLE g_it_sflight.

* Datos del is_layout para el ALV
g_st_layout-zebra = 'X'.
g_st_layout-colwidth_optimize = 'X'.

* Datos del fieldcat para el ALV
g_st_fieldcat-fieldname = 'CARRID'.
g_st_fieldcat-seltext_s = 'Comp.'.
APPEND g_st_fieldcat TO g_it_fieldcat.

g_st_fieldcat-fieldname = 'CONNID'.
g_st_fieldcat-seltext_s = 'Vuelo'.
APPEND g_st_fieldcat TO g_it_fieldcat.

g_st_fieldcat-fieldname = 'FLDATE'.
g_st_fieldcat-seltext_s = 'Fecha'.
APPEND g_st_fieldcat TO g_it_fieldcat.

g_st_fieldcat-fieldname = 'PRICE'.
g_st_fieldcat-seltext_s = 'Tarifa'.
APPEND g_st_fieldcat TO g_it_fieldcat.

* Función ALV
CALL FUNCTION 'REUSE_ALV_GRID_DISPLAY'
  EXPORTING
    is_layout     = g_st_layout
    it_fieldcat   = g_it_fieldcat[]

  TABLES
    t_outtab      = g_it_sflight[]
  EXCEPTIONS
    program_error = 1
    OTHERS        = 2.

Patrón rayado y ancho de columna optimizado en un ALV.

ALV Report de una tabla interna

Para poder mostrar un ALV Report de una tabla interna se necesitará como mínimo una tabla interna llamada it_fieldcat. En dicha tabla interna. se indicarán los nombres de los campos de nuestra tabla interna y una descripción del campo para mostrar en el título de la columna.

En este ejemplo se van a mostrar los cuatro primeros campos de la tabla SFLIGHT:

REPORT  z_sflight.

* Cargar la tabla SFLIGHT de la base de datos
TABLES: sflight.

* Cargamos los datos tipo slis
TYPES: slis.

* Definición de variables
DATA: g_it_sflight TYPE TABLE OF sflight,
      g_st_sflight TYPE sflight.

DATA: g_it_fieldcat TYPE slis_t_fieldcat_alv,
      g_st_fieldcat TYPE slis_fieldcat_alv.

* SQL para copiar la tabla sflight a la tabla interna
SELECT * FROM sflight INTO TABLE g_it_sflight.

* Datos del fieldcat para el ALV
g_st_fieldcat-fieldname = 'CARRID'. "Nombre del campo de la tabla
g_st_fieldcat-seltext_m = 'Compañía'. "Descripción media
g_st_fieldcat-seltext_s = 'Comp.'. "Descripción corta
APPEND g_st_fieldcat TO g_it_fieldcat.

g_st_fieldcat-fieldname = 'CONNID'.
g_st_fieldcat-seltext_m = 'Nº vuelo'.
g_st_fieldcat-seltext_s = 'Vuelo'.
APPEND g_st_fieldcat TO g_it_fieldcat.

g_st_fieldcat-fieldname = 'FLDATE'.
g_st_fieldcat-seltext_m = 'Fecha de vuelo'.
g_st_fieldcat-seltext_s = 'Fecha'.
APPEND g_st_fieldcat TO g_it_fieldcat.

g_st_fieldcat-fieldname = 'PRICE'.
g_st_fieldcat-seltext_m = 'Tarifa de vuelo'.
g_st_fieldcat-seltext_s = 'Tarifa'.
APPEND g_st_fieldcat TO g_it_fieldcat.

* Función ALV
CALL FUNCTION 'REUSE_ALV_GRID_DISPLAY'
  EXPORTING
    it_fieldcat   = g_it_fieldcat[]
  TABLES
    t_outtab      = g_it_sflight[]
  EXCEPTIONS
    program_error = 1
    OTHERS        = 2.

ALV Report de los cuatro primeros campos de la tabla SFLIGHT.
En este ejemplo,  se ha introducido una descripción mediana y corta. Si se cambia el tamaño de la columna del ALV, también lo hará el nombre de la columna.

martes, 19 de noviembre de 2013

Pantalla de selección dinámica

En este ejercicio va a existir un RADIOBUTTON en el que si indica búsqueda básica, se mostrarán los tres primeros campos de búsqueda del SELECT-OPTIONS de la tabla SFLIGHT, mientras que si indica búsqueda avanzada, se mostrarán los 6 primeros:

Búsqueda básica de SFLIGHT.
Búsqueda avanzada de SFLIGHT.
El truco está en utilizar el evento AT SELECTION SCREEN OUTPUT y modificar las propiedades de la tabla interna SCREEN. En este caso, se utilizará un identificador en el campo SCREEN-GROUP1 y se desactivará los campos correspondientes del SELECT-OPTIONS según el tipo de búsqueda seleccionado.


Valores de la variable interna SCREEN.

REPORT  z_sflight.

* Cargar la tabla SFLIGHT de la base de datos
TABLES: sflight.

* Definición de variables
DATA: g_it_sflight TYPE TABLE OF sflight,
      g_st_sflight TYPE sflight.

DATA: g_it_screen TYPE TABLE OF screen.

* Pantalla de selección
PARAMETERS: p01 RADIOBUTTON GROUP rb1 USER-COMMAND uc DEFAULT 'X' .

SELECT-OPTIONS: so1 FOR sflight-carrid MODIF ID MD1,
                so2 FOR sflight-connid MODIF ID MD1,
                so3 FOR sflight-fldate MODIF ID MD1.
SELECTION-SCREEN SKIP 1.

PARAMETERS: p02 RADIOBUTTON GROUP rb1.

SELECT-OPTIONS: so4 FOR sflight-carrid MODIF ID MD2,
                so5 FOR sflight-connid MODIF ID MD2,
                so6 FOR sflight-fldate MODIF ID MD2.
SELECTION-SCREEN SKIP 1.
SELECT-OPTIONS: so7 FOR sflight-price MODIF ID MD2,
                so8 FOR sflight-currency MODIF ID MD2,
                so9 FOR sflight-planetype MODIF ID MD2.

AT SELECTION-SCREEN OUTPUT.
  IF p01 = 'X'.
    LOOP AT SCREEN.
      IF screen-group1 = 'MD2'.
        screen-active = 0.
        MODIFY SCREEN.
      ENDIF.
    ENDLOOP.
  ELSE.
    LOOP AT SCREEN.
      IF screen-group1 = 'MD1'.
        screen-active = 0.
        MODIFY SCREEN.
      ENDIF.
    ENDLOOP.
  ENDIF.
  APPEND screen TO g_it_screen.   

START-OF-SELECTION.
  BREAK-POINT.

¿Que diferencias hay entre los eventos AT SELECTION SCREEN y AT SELECTION SCREEN OUTPUT? En el primero, el evento se ejecuta cuando se ha dado al botón de ejecutar, mientras que en el segundo se ejecuta cada vez que se ha hecho un cambio en la pantalla de selección.