jueves, 10 de enero de 2013

Uso de textos estándar en programas ABAP

Uso de textos estándar en los desarrollos ABAP

Introducción

En varias ocasiones se requiere que un programa funcione para diferentes sociedades, para lo cual se deben usar técnicas que permitan usar determinada información que sea pertinente a la sociedad, en los formularios como cheques, facturas, entregas, entre otros, se requiere que cada uno muestre información específica a la sociedad, una forma de hacer esto es haciendo uso de los textos estándar.

Creación de un texto estándar

Para crear un texto estándar debe ingresar a la transacción SO10.



Se llenan los datos necesarios, lo usual en el campo ID del texto es colocar ST que corresponde a texto estándar y en el idioma el que trae por defecto, para el caso ES que corresponde a Español. Una vez ingresemos el nombre del Texto lo creamos dando clic en el botón correspondiente; llegamos a la siguiente pantalla en donde colocamos la información que va a suministrar nuestro texto estándar cuando lo usemos.


Uso del texto estándar

Una vez ya creado nuestro texto la idea es usarlo dentro de nuestros programas, para lo cual empleamos el módulo de función READ_TEXT. En el código que se muestra a continuación se observa la manera de hacer esto.

  DATA: lines TYPE TABLE OF tline.
  CALL FUNCTION 'READ_TEXT'
    EXPORTING
*     CLIENT                        = SY-MANDT
      id                            = 'ST'
      language                      = sy-langu
      name                          = 'AVISO DE PAGO'
      object                        = 'TEXT'
*     ARCHIVE_HANDLE                = 0
*     LOCAL_CAT                     = ' '
*   IMPORTING
*     HEADER                        =
*     OLD_LINE_COUNTER              =
    TABLES
      lines                         = lines
    EXCEPTIONS
      id                            = 1
      language                      = 2
      name                          = 3
      not_found                     = 4
      object                        = 5
      reference_check               = 6
      wrong_access_to_archive       = 7
      OTHERS                        = 8
            .
  IF sy-subrc <> 0.
    MESSAGE ID sy-msgid TYPE sy-msgty NUMBER sy-msgno
    WITH sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4.
  ENDIF.



En la tabla interna LINES si el llamado del módulo de función es correcto nos queda almacenado el texto estándar.


Como observamos en la anterior imagen, nos queda la información en la tabla para que la usemos en nuestra aplicación. 

Transporte de los textos entre instancias y mandantes

Cuando creamos textos estándar estos no generan orden de transporte, por lo cual a continuación mostrare cuales son las alternativas que tenemos para pasar los textos.
  1. Manualmente: Consiste en ingresar en los mandantes e instancias en los que deseamos usar nuestros textos a través de la transacción SO10, sin embargo para esto requerimos tener acceso a todos los mandantes y sus instancias.
  2. Usando ordenes de transporte: Consiste en crear una orden de transporte y asociar el objeto texto, lo primero que debemos hacer es crear una orden de transporte ya sea de parametrización o de workbench, esta creación la hacemos por la SE10,  luego usamos una de las siguientes opciones:
    • Ejecutando el report RSTXTRAN: Ingresamos a la SE38 o a la SE80 y ejecutamos el report RSTXTRAN, posteriormente ingresamos la tarea, el objeto, el nombre, el id y el idioma del texto, así como se muestra en la imagen. Después de ejecutar los pasos correspondientes, si observamos la orden esta ya tiene el objeto texto que deseamos transportar. 
    • La otra opción es modificando la orden directamente, para lo cual por la SE10 seleccionamos la tarea y allí adicionamos el objeto, para esto en la edición de la orden en la pestaña objetos agregamos una entrada nueva, colocando en la columna ID programa R3TR, en Tipo Objeto TEXT y en objeto TEXT,AVISO DE PAGO,ST,S, como se muestra en la imagen. 

Conclusiones

El uso de textos estándar permite que no metamos literales dentro de nuestros programas, ayudando al mantenimiento del software, ya que no es necesario modificar nuestro programa cuando sea necesario cambiar un texto estándar; si al texto de ejemplo que creamos llamado 'AVISO DE PAGO' quisiéramos que se imprimiera diferente de acuerdo a la sociedad, lo podemos crear 'AVISO DE PAGO_<Sociedad>', donde <Sociedad> sería el código de la sociedad en SAP.   







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

viernes, 23 de diciembre de 2011

Proceso de certificación en ABAP

Para el proceso de certificación como ABAP se llevó a cabo una metodología de auto aprendizaje, con el objetivo de sacar adelante la certificación sin pagar por la academia. Para poder lograr el objetivo se conformó un grupo de estudio de varios compañeros ABAP, exactamente tres conmigo, la metodología consistió en:
  1. Fecha de realización de la academia (Recomiendo dos meses de estudio)
  2. Búsqueda de los temas de estudio.
  3. Cronograma de actividades con fechas y responsables de exponer cada tema.
  4. Reuniones periódicas de avance en los que se expongan los temas por cada responsable.
  5. Búsqueda de la mayor cantidad de simuladores del exámen en línea
  6. Tranquilidad y descanso por lo menos dos días antes de presentar el examen.
  7. Celebración.
Recomiendo usar esta metodología ya que fue llevada a cabo por mi grupo de estudio, obteniendo como resultado que todos los integrantes nos certificamos gracias a Dios.


Descripción general del blog

Este blog busca servir como fuente de información con lo concerniente al desarrollo SAP, con lo cual busco dar mi aporte a la comunidad en Internet, de la que estoy muy agradecido por ser una fuente contínua de información que me ha servido para mejorar sustancialmente mi perfil como ingeniero de sistemas, y como consultor SAP.


Ver el perfil de Fernando Muñoz Beltrán en LinkedIn