lunes, 30 de enero de 2012

Set de datos en SAP usándolos con ABAP

Autor  

Fernando Muñoz Beltrán 

 

Introducción 
Un set de datos es un objeto en SAP el cual se usa para agrupar conjuntos o rangos de valores. Para este artículo vamos a enfocarnos en los set de datos que podemos usar para parametrizar información en algún programa en especial. En el ejemplo que voy a mostrar uso un set de datos para crear parametrizaciones en el sistema sin necesidad de crear tablas.

 Ventajas

  • Se crean fácilmente, cada vez que se crea un set de datos este es independiente de otros. 
  • Pueden ser usados transversalmente en el sistema, es decir funcionan para culaquier módulo. 
  • Permiten que la información se centralice y se modifique con facilidad.
Transacciones para su uso
  • GS01: Usada para la creación de set de datos
  • GS02: Usada para la modificación de set de datos
  • GS03: Usada para la visualización de set de datos
Ejemplo

El siguiente ejemplo muestra la manera como se hace la consulta del set de datos y se extrae la información para ser usada en un programa ABAP.
El siguiente ejemplo muestra la manera como se hace la consulta del set de datos y se extrae la información para ser usada en un programa ABAP.


DATA  lit_formula_lines TYPE TABLE OF rgsbf,
        lit_set_lines_basic TYPE TABLE OF rgsbv,
        lit_set_lines_data TYPE TABLE OF rgsb3,
        lit_set_lines_multi TYPE TABLE OF rgsb2,
        lit_set_lines_single TYPE TABLE OF rgsb1,
* Estructuras creadas para ser usadas si es necesario
        lwa_formula_lines TYPE rgsbf,
        lwa_set_lines_basic TYPE rgsbv,
        lwa_set_lines_data TYPE rgsb3,
        lwa_set_lines_multi TYPE rgsb2,
        lwa_set_lines_single TYPE rgsb1,
* Rango creado para hacer consultas o para ser usado como parte de una sentencia lógica
        lr_dauat TYPE RANGE OF afpo-dauat.

* Esta función trae el rango llamado ZORDENES_DESARROLLO
CALL FUNCTION 'G_SET_FETCH'
        EXPORTING
          setnr                     '0000ZORDENES_DESARROLLO'
       TABLES
         formula_lines             lit_formula_lines
         set_lines_basic           lit_set_lines_basic
         set_lines_data            lit_set_lines_data
         set_lines_multi           lit_set_lines_multi
         set_lines_single          lit_set_lines_single
       EXCEPTIONS
         no_authority              1
         set_is_broken             2
         set_not_found             3
         OTHERS                    4
                .
  IF sy-subrc <> 0.
    MESSAGE ID sy-msgid TYPE sy-msgty NUMBER sy-msgno
            WITH sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4.
  ENDIF.
  LOOP AT lit_set_lines_basic INTO lwa_set_lines_basic.
    lwa_dauat-sign 'I'.
    lwa_dauat-option 'BT'.
    lwa_dauat-low lwa_set_lines_basic-from.
    lwa_dauat-high lwa_set_lines_basic-to.
    APPEND lwa_dauat TO lr_dauat.
  ENDLOOP.



martes, 10 de enero de 2012

Configuración de la Conexión de PHP y SAP en Linux

Autor

Fernando Muñoz Beltrán

Introducción

A continuación voy a mostrar cuales son los pasos para crear la conexión entre PHP y SAP. Con este documento se busca tener una guía para implementar la conexión entre PHP y SAP, para este ejemplo la implementación se lleva a cabo en un servidor linux OPENSUSE 11.1, de tal manera que se pueda crear un aplicativo web con conexión a SAP en línea.

INSTALACION DE LA LIBRERIA SAPRFC extension module for PHP

La instalación de esta extensión se lleva a cabo en el servidor de PHP.

REQUERIMIENTOS

La instalación fue realizada en un sistema con opensuse 11.1 de 32 bits. La instalación de la libreria “SAPRFC extension module for PHP”, se hizo teniendo instalado PHP Version 5.2.6, Apache version 2.2.8 y kernel de Linux 2.6.25.18-0.2-pae i686.

La instalación de la librería se va hacer usando el método de construcción de la extensión SAPRFC como un módulo dinámico sin recompilación de PHP.

PASO A PASO DE LA INSTALACIÓN

Para llevar a cabo la correcta instalación del módulo se requieren de los siguientes programas, a excepción del SAP RFCSDK la instalación de ellos se hace por yast:
  • Apache y php.
  • php-devel paquete para la instalación de saprfc como un módulo dinámico
  • GNU tools (compat, autoconf, automake, flex, libtool, gcc, m4, make)
  • Non-Unicode SAP RFCSDK 6.20 para su plataforma en este caso RFC_43-20000055_SDKLinux_on_IA32_32bit.SAR (este programas se descarga desde http://service.sap.com/swdc bajo <Support Packages and Patches - My Company's Application Components SAP WEB AS - SAP WEB AS 6.20 - SAP RFC SDK>).
  1. Descargar la librería SAPRFC para PHP, la cual se encuentra en Sourceforge.
  2. Descargar el SAP RFCSDK desde SAP, en http://service.sap.com/swdc bajo <Support Packages and Patches - My Company's Application Components SAP WEB AS - SAP WEB AS 6.20 - SAP RFC SDK.
  3. Descargar el programa SAPCAR desde ftp://ftp.sap.com/pub/linuxlab/contrib.
  4. Ingresar a modo super usuario.
  5. Descomprimir SAP RFCSDK 6.20, con el comando:
    ./SAPCAR -xf RFC_43-20000055_SDKLinux_on_IA32_32bit.SAR
    Esta operación creará una carpeta llamada rfcsdk en el directorio donde se ejecutó el comando.
  6. Crear la carpeta /usr/sap y allí copiar la carpeta rfcsdk, quedando así /usr/sap/rfcsdk. 
    mkdir /usr/sap 
    mv rfcsdk /usr/sap
  7. Darle permisos al directorio creado con el comando
    chmod -R 755 /usr/sap
  8. Descomprimir las fuentes de la librería saprfc con el comando
    tar -xvzf saprfc-1.4.1.tar.gz
  9. Ejecutar los siguientes comandos
    cd saprfc-1.4.1 
    phpize 
    ./configure 
    make 
    make install
  10. Los comandos generan el módulo dinámico de php denominado saprfc.so, el cual al hacer make install se copia en la carpeta donde se cargan los módulos dinámicos (/usr/lib/php5/extensions).
  11. En la carpeta /etc/php5/conf.d/ donde están los archivos de configuración de los módulos se debe crear el archivo saprfc.ini con la siguiente línea: 
    extension=saprfc.so
  12. Reiniciar Apache
    rcapache2 restart

viernes, 6 de enero de 2012

Programación Dinámica en ABAP


Autor

Fernando Muñoz Beltrán

Introducción

La programación dinámica en ABAP, permite la creación de aplicaciones en aquellas situaciones donde no se conocen los objetos de datos y estos tienen que ser creados en tiempo de ejecución. Mediante el uso de este tipo de programación se puede reducir el código fuente en aquellas situaciones donde el código es repetitivo.

Como desventaja de este tipo de programación es que las sentencias usadas son muy elaboradas ocasionando que el mantenimiento de las aplicaciones se torne compleja.

Conceptos claves de la programación dinámica

Para desarrollar aplicativos usando programación dinámica hay que tener claro los siguientes conceptos:
  1. Field Symbols.
  2. Referencias de Datos.
  3. Generación de objetos de datos dinámicamente.

Field Symbols 1

Son punteros des referenciados, es decir son objetos de datos que apuntan al contenido de una variable. Básicamente cuando accedemos al field symbol estamos accediendo al contenido del objeto de datos, claro esta que esto ocurre cuando el objeto de datos es asignado al field symbol.
Mediante la sentencia FIELD-SYMBOLS se declaran los field symbols dentro del programa. El field symbol puede ser declarado con un tipo definido si se conoce el tipo de la variable al que va apuntar, en caso contrario puede ser de tipo ANY.
Cuando un objeto de datos sea asignado a un field symbol hay que tener en cuenta que el tipo de dato del objeto asignado debe ser compatible con el tipo de dato del field symbol, si esto no se cumple puede ocurrir un error de sintaxis o de tiempo de ejecución, el error en tiempo de ejecución ocurre cuando el tipo de dato del field symbols es ANY.
Cuando ya se desee definir el fiel symbol lo que se hace es asignar el objeto de datos al field symbol mediante la sentencia ASSIGN.

Referencias de Datos 2

Las referencias a los datos son punteros a los objetos de datos, para definir una referencia se hace usando la sentencia TYPE REF TO; un puntero es un apuntador a una dirección de memoria.


Generación de objetos de datos dinámicamente

Mediante el uso de referencias de datos se pueden crear objetos de datos de manera dinámica, para esto también debe usar la sentencia CREATE DATA 3.

Ejemplo

El problema propuesto es crear un programa que permita visualizar los registros de una tabla transparente, la idea es que se muestren las dos formas que existen para generar un reporte en ABAP, ya sea usando la sentencia WRITE o usando el List Viewer (ALV), que tenga como parámetros de entrada el nombre de la tabla, la cantidad de registros deseados y el tipo de salida del reporte.

Pantalla principal

Los parámetros de entrada son el nombre de la tabla, cantidad de registros a mostrar y el tipo de generación (ALV o Reporte normal).

Estructura del programa

Código del programa

YFORMAS_DAR_SALIDA_IT

*&---------------------------------------------------------------------*
*& Report YFORMAS_DAR_SALIDA_IT
*&
*&---------------------------------------------------------------------*
*& Elaboro: Fernando Muñoz Beltrán
*& Email: fmunozb@gmail.com
*&
*&---------------------------------------------------------------------*
*& Programa de ejemplo de programación dinámica
*&


INCLUDE yformas_dar_salita_it_top . " global Data
INCLUDE yformas_dar_salita_it_e01 . " Events

YFORMAS_DAR_SALITA_IT_TOP

*&---------------------------------------------------------------------*
*& Include YFORMAS_DAR_SALITA_IT_TOP                         Report YFORMAS_DAR_SALIDA_IT
*&
*&---------------------------------------------------------------------*


REPORT   yformas_dar_salida_it.


SELECTION-SCREEN BEGIN OF BLOCK a1 WITH FRAME TITLE text-001."'Hola'(001).
PARAMETERSpa_tabla TYPE tabname MATCHCODE OBJECT dd_tabl OBLIGATORY,
            pa_cant TYPE OBLIGATORY DEFAULT 1000.


SELECTION-SCREEN BEGIN OF BLOCK a2 WITH FRAME TITLE text-002.
PARAMETERSpa_tipo1 RADIOBUTTON GROUP r1 DEFAULT 'X',
            pa_tipo2 RADIOBUTTON GROUP r1.
SELECTION-SCREEN END OF BLOCK a2.
SELECTION-SCREEN END OF BLOCK a1.


** Variables referenciadas o campos simbólicos para cargar los datos
FIELD-SYMBOLS<fs_campo> TYPE ANY,
               <fs_wa> TYPE ANY,
               <fs_it> TYPE ANY TABLE.


DATAref_wa TYPE REF TO data,
      ref_it TYPE REF TO data.

YFORMAS_DAR_SALITA_IT_E01

*&---------------------------------------------------------------------*
*&  Include           YFORMAS_DAR_SALITA_IT_E01
*&---------------------------------------------------------------------*


** Se crea el objeto de datos tabla interna con referencia a la tabla
TRY.
    CREATE DATA ref_it TYPE STANDARD TABLE OF (pa_tabla).
  CATCH cx_sy_create_data_error.
    DATAcant TYPE i.
    cant STRLENpa_tabla ).
    WRITE'La tabla 'pa_tabla(cant)' no existe en el diccionario de datos'.
    EXIT.
ENDTRY.
** Se asigna la desreferencia del objeto de datos tabla innterna al field symbol
ASSIGN ref_it->TO <fs_it>.


SELECT FROM (pa_tabla)
  INTO TABLE <fs_it>
  UP TO pa_cant ROWS.


** Se crea el objeto de datos estructura con referencia a la tabla
CREATE DATA ref_wa TYPE (pa_tabla).
** Se asigna la desreferencia del objeto de datos estructura al field symbol
ASSIGN ref_wa->TO <fs_wa>.


START-OF-SELECTION.
  IF pa_tipo1 'X'.
    WRITE'Loop con sentencia write'.
    ULINE.
    NEW-LINE.
    LOOP AT <fs_it> INTO <fs_wa>.
      DO.
        ASSIGN COMPONENT sy-index OF STRUCTURE <fs_wa> TO <fs_campo>.
        IF sy-subrc <> 0.
          NEW-LINE.
          EXIT.
        ENDIF.
        WRITE <fs_campo>.
      ENDDO.
    ENDLOOP.
  ELSEIF pa_tipo2 'X'.
    DATA alv TYPE REF TO cl_salv_table.
    cl_salv_table=>factory(
                            IMPORTING
                              r_salv_table alv
                            CHANGING
                              t_table <fs_it>
                              ).
    alv->display).
  ENDIF.

Referencias

1. Help SAP. Field Symbols
2. Help SAP. Referencias de Datos
3. Help SAP. CREATE DATA