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.


Deshabilitar el INPUT a un campo de SELECTION-OPTIONS

En algunos casos, se exige que unos determinados usuarios no puedan utilizar unos campos específicos en la pantalla de selección. En este ejemplo se mostrará como deshabilitar el input de un campo LOW y HIGH de un SELECTION-OPTIONS.

Para empezar, tendremos los cuatro primeros campos del SELECTION-OPTIONS de la tabla SFLIGHT (carrid, connid, fldate y price).

Los cuatro SELECTION-OPTIONS para la tabla SFLIGHT.

A continuación, se recorre un LOOP AT SCREEN y almacenamos los datos en una tabla auxiliar para ver los datos iniciales:

  LOOP AT SCREEN.
    APPEND screen TO g_it_screen.
  ENDLOOP.

Valores de la tabla interna screen sin modificaciones.

Una vez conocido los datos de la tabla interna, cambiaremos las propiedades de los campos INPUT en el primer SELECTION-OPTIONS con un IF. 

El código es el siguiente:

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
SELECTION-SCREEN: BEGIN OF BLOCK b01 WITH FRAME.

SELECT-OPTIONS: p01 FOR sflight-carrid,
                p02 FOR sflight-connid,
                p03 FOR sflight-fldate.

SELECTION-SCREEN SKIP 1.

SELECT-OPTIONS: p04 FOR sflight-price.

SELECTION-SCREEN:  END OF BLOCK b01.

INITIALIZATION.
* Deshabilitar un campo
  LOOP AT SCREEN.
    IF screen-name = 'P01-LOW'.
      screen-input = 0.
    ELSEIF screen-name = 'P01-HIGH'.
      screen-input = 0.
    ENDIF.

    MODIFY SCREEN. 
    APPEND screen TO g_it_screen.
  ENDLOOP.

START-OF-SELECTION.
  BREAK-POINT.

Se observa que ahora los campos input del primer parámetro se han desactivado.

Campos input del SELECTION-OPTIONS desactivados.

Asignar valores iniciales al filtrado de SELECT-OPTIONS en la pantalla de selección

Si se desea que los campos de SELECT-OPTIONS tengan por defecto un valor, será necesario modificar los

Por ejemplo, si se desean seleccionar los datos de la tabla SFLIGHT con las compañías AA y DL, tendremos que recurrir al evento INITIALIZATION para asignarle los valores de la búsqueda. De este modo, el usuario no tendrá que dar al botón de búsqueda avanzada, ya que los parámetros ya habrán sido introducidos.


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.

* Pantalla de selección
SELECTION-SCREEN: BEGIN OF BLOCK b01 WITH FRAME.

SELECT-OPTIONS: p01 FOR sflight-carrid,
                p02 FOR sflight-connid,
                p03 FOR sflight-fldate.

SELECTION-SCREEN SKIP 1.

SELECT-OPTIONS: p04 FOR sflight-price.

SELECTION-SCREEN:  END OF BLOCK b01.

INITIALIZATION.
  p01-sign = 'I'. "Incluir
  p01-option = 'EQ'. "=
  p01-low = 'AA'.
  APPEND p01.

  p01-sign = 'I'.
  p01-option = 'EQ'.
  p01-low = 'DL'.
  APPEND p01.

START-OF-SELECTION.
* Copiado de los datos a la tabla con los filtros
  SELECT * FROM sflight INTO TABLE g_it_sflight
           WHERE carrid IN p01
           AND   connid IN p02
           AND   fldate IN p03
           AND   price  IN p04.

* Ver en el Debugging los valores de la tabla g_it_sflight
  BREAK-POINT.

En este ejemplo, la variable p01 es una tabla interna cuyos campos son:

  1. p01-SIGN: Para incluir ('I') o excluir un dato ('E').
  2. p01-OPTION: Operación lógica ('EQ', 'BT', 'NE', etc).
  3. p01-LOW: Límite inferior.
  4. p01-HIGH: Límite superior.
Por tanto, se han añadido los datos a la tabla interna en el evento INITIALIZATION.

Filtrar datos de una base de datos con SELECT-OPTIONS y SQL

¿Quieres filtrar los datos de una base de datos? En esta entrada se explicará como copiar la base de datos a una tabla interna con una sentencia SQL.

Es fundamental tener conocimiento de las sentencias SELECT-OPTIONS y SELECTION-SCREEN en este ejercicio para la pantalla de selección, y de la sentencia SQL para copiar los datos filtrados a la tabla.

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.

* Pantalla de selección
SELECTION-SCREEN: BEGIN OF BLOCK b01 WITH FRAME TITLE text-001.
  
SELECT-OPTIONS: p01 FOR sflight-carrid,
                p02 FOR sflight-connid,
                p03 FOR sflight-fldate.

SELECTION-SCREEN SKIP 1.

SELECT-OPTIONS: p04 FOR sflight-price.

SELECTION-SCREEN: END OF BLOCK b01.

* Copiado de los datos a la tabla con los filtros
SELECT * FROM sflight INTO TABLE g_it_sflight
         WHERE carrid IN p01
         AND   connid IN p02
         AND   fldate IN p03
         AND   price  IN p04.

* Ver en el debugging los valores de la tabla g_it_sflight
BREAK-POINT.

Se ha incluido un BREAK-POINT para ver la tabla interna g_it_sflight en el debugging.

Si ejecutamos, veremos que en la pantalla de selección aparecen los nombres de las variables. Para poder editarlo tenemos que ir a los textos de selección:

Ir a los textos de selección.
Editar los campos para mostrar en la pantalla de selección.
 Ya tenemos la pantalla lista para mostrar y ejecutar el programa.

Pantalla de selección con los textos editados.

Cambiar el formato de la fecha

¿No os gusta el formato de la fecha por defecto en ABAP y queréis cambiar su formato de una manera sencilla? Aquí se explicará cómo hacerlo.

Nos apoyaremos de la variable del sistema SY-DATUM y la función CONCATENATE.

Si la fecha es el 19 de noviembre de 2013, el valor de la variable SY-DATUM es 20131119. Como podéis observar, sigue el siguiente formato: AAAAMMDD. Nuestro objetivo va a ser pasarlo al siguiente formato: DD/MM/AAAA con la función CONCATENATE.

REPORT  z_fecha.

DATA texto TYPE string.

CONCATENATE sy-datum+6(2) sy-datum+4(2) sy-datum+0(4) INTO texto SEPARATED BY '/'.

WRITE: texto.

En el valor 20131119 nos situamos en las posiciones 6, 4 y 0 con longitud de 2, 2 y 4 respectivamente, y separamos los textos por el carácter "/".

viernes, 15 de noviembre de 2013

Cargar la tabla SFLIGHT en MiniSAP (NetWeaver Trial)

¿Has instalado MiniSAP y te das cuenta que la famosa tabla SFLIGHT existe pero está vacía? En esta entrada os voy a explicar cómo rellenar la tabla.

Entramos en la transacción SE38 y buscamos el siguiente programa: SAPBC_DATA_GENERATOR


Programa para rellenar los datos de la tabla SFLIGHT.

A continuación pulsamos F8 para ejecutar el programa, y nos saldrá la siguiente ventana:

Programa SAPBC_DATA_GENERATOR ejecutado con F8.

Observamos que nos pide la cantidad de datos para rellenar las tablas SPFLI, SFLIGHT y SBOOK. Se recomienda dejarlo por defecto y volvemos a pulsar F8 para iniciar el rellenado de datos.

Posiblemente nos saltará el siguiente mensaje:

Mensaje que sale al ejecutar el programa.

Nos pregunta que regenerará los datos de las tablas indicadas, ya que posiblemente haya datos guardados en la tabla. Decimos que si, y se habrá finalizado el proceso.

Ya se tiene la tabla SFLIGHT lista para aprender con MiniSAP.

jueves, 14 de noviembre de 2013

Copiar una tabla y estructura a partir de la declaración de variables

En este ejemplo se va a mostrar cómo copiar la estructura y la tabla en el proceso de declaración de variables para ambos métodos de declaración de tablas internas. Cabe indicar que no se copia ni el contenido de la estructura ni el de la tabla interna.
  • Primer método (Cabecera + Tabla):
    * Tipos
    TYPES: BEGIN OF g_ty_encabezado,
      nombre(20) TYPE c,
      apellido(20) TYPE c,
      telefono(9) TYPE n,
    END OF g_ty_encabezado.
    
    TYPES: g_tt_mitabla TYPE TABLE OF g_ty_encabezado.
    
    * Declaración de variables
    DATA: g_st_encabezado TYPE g_ty_encabezado,
          g_it_mitabla TYPE g_tt_mitabla.
    
    * Copiado de la cabecera
    DATA: g_st_encabezado_copia LIKE LINE OF g_it_mitabla.
    
    * Copiado de la tabla
    DATA: g_it_mitabla_copia LIKE g_it_mitabla.
    

  • Segundo método (Cabecera + Tabla con el mismo nombre):
  • * Declaración de la tabla
    DATA: BEGIN OF g_it_mitabla OCCURS 0,
      campo1(9) TYPE c,
      campo2(9) TYPE c,
      END OF g_it_mitabla.
    
    * Copiado de la cabecera:
    DATA: g_st_encabezado_copia LIKE LINE OF g_it_mitabla.
    
    * Copiado de la tabla: 
    DATA: g_it_mitabla_copia LIKE g_it_mitabla OCCURS 0 WITH HEADER LINE.
Como se puede apreciar, si se quiere copiar el encabezado de una tabla, la sentencia LIKE LINE OF funciona para ambos métodos. Sin embargo, las sentencias son distintas cuando se copia la tabla interna.

Para ver las diferencias entre ambos métodos en un loop, se recomienda ver esta entrada.

Declaración de tablas internas (dos métodos)

Una tabla interna se caracteriza por tener una agrupación de datos con una misma estructura. Existen dos formas de declarar una tabla interna, para ello vamos a ver cómo se hace con esta sencilla tabla:

Nombre Apellido Teléfono
Juan Pérez 612345678
Lucas García 698765432
María Gutiérrez 600111222

Primera forma:

REPORT  z_tabla1.

* Tipos
TYPES: BEGIN OF g_ty_encabezado,
  nombre(20) TYPE c,
  apellido(20) TYPE c,
  telefono(9) TYPE n,
END OF g_ty_encabezado.

TYPES: g_tt_mitabla TYPE TABLE OF g_ty_encabezado.

* Declaración de variables
DATA: g_st_encabezado TYPE g_ty_encabezado,
      g_it_mitabla TYPE g_tt_mitabla.

* Rellenado de la tabla
g_st_encabezado-nombre = 'Juan'.
g_st_encabezado-apellido = 'Pérez'.
g_st_encabezado-telefono = '612345678'.
APPEND g_st_encabezado TO g_it_mitabla.

g_st_encabezado-nombre = 'Lucas'.
g_st_encabezado-apellido = 'García'.
g_st_encabezado-telefono = '698765432'.
APPEND g_st_encabezado TO g_it_mitabla.

g_st_encabezado-nombre = 'María'.
g_st_encabezado-apellido = 'Gutiérrez'.
g_st_encabezado-telefono = '600111222'.
APPEND g_st_encabezado TO g_it_mitabla.

* Mostrar en pantalla la tabla
LOOP AT g_it_mitabla INTO g_st_encabezado.
  WRITE:/ g_st_encabezado-nombre,
          AT 22 g_st_encabezado-apellido,
          AT 44 g_st_encabezado-telefono.
ENDLOOP.

Segunda forma:

REPORT  z_tabla2.

* Declarado de variables
DATA: BEGIN OF g_it_mitabla OCCURS 0,
    nombre(20) TYPE c,
    apellido(20) TYPE c,
    telefono(9) TYPE n,
END OF g_it_mitabla.

* Rellenado de la tabla
g_it_mitabla-nombre = 'Juan'.
g_it_mitabla-apellido = 'Pérez'.
g_it_mitabla-telefono = '612345678'.
APPEND g_it_mitabla.

g_it_mitabla-nombre = 'Lucas'.
g_it_mitabla-apellido = 'García'.
g_it_mitabla-telefono = '698765432'.
APPEND g_it_mitabla.

g_it_mitabla-nombre = 'María'.
g_it_mitabla-apellido = 'Gutiérrez'.
g_it_mitabla-telefono = '600111222'.
APPEND g_it_mitabla.

* Mostrar en pantalla la tabla
LOOP AT g_it_mitabla.
  WRITE:/ g_it_mitabla-nombre,
          AT 22 g_it_mitabla-apellido,
          AT 44 g_it_mitabla-telefono.
ENDLOOP.

Se aprecia que en el primer método se crea primero el encabezado y la tabla con TYPES, y a continuación se declaran las variables. Sin embargo, en el segundo método se crea directamente la tabla.

Nótese que a la hora de hacer un LOOP a la tabla, en el primer método se indica la tabla y el encabezado, mientras que en el segundo caso sólo se indica el nombre de la tabla, ya que el nombre del encabezado y tabla interna es el mismo.

miércoles, 13 de noviembre de 2013

Cómo instalar MiniSAP (NetWeaver Trial)

En esta entrada se va a explicar cómo instalar MiniSAP. Se recomienda instalarlo en una máquina virtual, ya que se crean cuentas de usuarios de Windows y además se evitan posibles errores de instalación que puedan dañar el sistema operativo.

En este tutorial se explica cómo instalarlo en una máquina virtual de Windows 7 Professional 32bits.

Archivos y pasos necesarios para la instalación:

  1. Registrarse en la página oficial de SAP.
  2. Descargarse la versión de NetWeaver Trial más apropiada para vuestro equipo. En mi caso es para Windows 32bits.
  3. Descargarse SAPgui (lo podeis encontrar en Google). Introducir la carpeta GUI en la carpeta de descarga de NetWeaver Trial.
  4. Instalar una máquina virtual y Windows 7 Professional. VirtualBox es un programa gratuito para instalar máquinas virtuales.
  5. Instalar la última versión de Java.
  6. Cambiar el nombre de equipo a un nombre menor de 11 caracteres. En mi caso lo he llamado MINISAP
  7. Cambiar el nombre del equipo.
  8. Instalar Microsoft Loopback Adaptor.
    • Ir a la ventana de comandos (ejecutando como administrador) y escribir hdwwiz.exe
    • Ejecutar hdwwiz.exe en la ventana de comandos.
    • Seguir el siguiente proceso para instalar Microsoft Loopback Adaptor:
    • Instalación Microsoft Loopback Adapter.
  9. Introducir una dirección IP fija en el nuevo adaptador. Introducir la de la captura.
  10. Introducción de la dirección IP fija

  11. Modificación del archivo hosts.
    • Ir al directorio: C:\Windows\System32\drivers\etc
    • Abrir el archivo hosts con el bloc de notas.
    • Introducir la dirección IP y el nombre del equipo:
    • Editar el archivo hosts.
  12. En este punto ya tienes la máquina virtual lista para instalar NetWeaver Trial (MiniSAP). Antes de empezar la instalación, se recomienda asignar a la máquina más de 3GB de memoria RAM para evitar posibles errores de instalación.
  13. Iniciar el instalador sapinst como administrador (SAP_NetWeaver_702e_Installation_Master>IM_WINDOWS_I386>sapinst)
  14. Seguir la siguiente secuencia en el proceso de instalación:
  15. Seleccionar Central System.
    Seleccionar Run a new option y continuar.
    Aceptar los términos de uso.
    Seleccionar el directorio de instalación java de nuestro sistema.
    Introducir una contraseña para el sistema.
    Se mostraran advertencias de errores. Dar a cancelar para continuar.
    Se muestra el resumen de la configuración
    Inicio de la instalación
    Después de 8h, finaliza la instalación.

  16. Cambiamos la sesión de usuario e iniciamos el usuario sapadm con la contraseña introducida en el proceso de instalación para activar el sistema SAP.
  17. Cambiamos el usuario a sapadm (contraseña introducida en el proceso de instalación).
    Activamos el sistema SAP abriendo el programa SAP Management Console creado en el escritorio.
    Volvemos a introducir la contraseña del sistema.
    Esperar a que aparezca la señal verde.

  18. Cambiamos el usuario (no cerrar la sesión sapadm) dejando abierto la señal verde e instalamos el SAP GUI for Windows 7. En este punto añadiremos el localhost para iniciar sesión.

Instalar SAP GUI en el usuario principal.

Seleccionar SAP GUI for Windows 7 e iniciar la instalación.
Iniciamos el SAP Logon y creamos una nueva entrada.
Damos a siguiente para iniciar la entrada.  
Rellenar los datos localhost.
Iniciar la entrada creada.
Iniciar sesión con BCUSER y contraseña abcd1234.

En el próximo vídeo se muestra todos los pasos indicados anteriormente, salvo la creación del usuario: