viernes, 5 de abril de 2013

Sets y Ranges, evitando hardcodes

¿Qué es un SET?



En este tutorial vamos a explicar brevemente que son los Sets, que utilidad tienen, como se crean y para que se utilizan. También presentaremos un par de sencillos programas en ABAP para ilustrar el funcionamiento de los RANGES y de los Sets. 

Los programadores ABAP a menudo sienten la necesidad de contar con un conjunto de valores, un rango de valores no dependiente del código. Por lo que no tendremos que tocar el código cada vez que necesitemos cambiar algo de ese conjunto de valores. 

El Set de valores nos permite utilizar este conjunto de valores, que no son dependiente del código del programa, es decir no estan en el propio código, dando una mayor flexivilidad a los programas que necesitan de estos conjuntos de valores. 

Los Sets son conjuntos de parámetros de selección, funcionan de manera similar a los rangos (RANGES) y pueden ser almacenados internamente por SAP, lo cual permite mantenerlos actualizados sin necesidad de alterar el código fuente de un programa que los utilice, esta es su mayor ventaja, nos ayudan a evitar el uso de hardcode (valores constantes) en un programa. La tabla SAP donde internamente se almacenan los SETs es SETLEAF y para aquellos interesados en verla es posible analizarla con la transacción SE11. Para entender como funcionan los SET primero debemos entender como funcionan los RANGES.

Los conjuntos son estructuras flexibles para la organización de jerarquías de cantidades.
 

Los conjuntos pueden utilizarse para agrupar los valores o intervalos de valores dando un conjunto y varios juegos formando una jerarquía.


RANGES


Los RANGES permiten especificar una serie de rangos de valores para ser utilizados en las sentencias de selección, funcionan de manera similar a la cláusula SELECT-OPTIONS que utilizamos en los programas ABAP, de hecho esta cláusula lo que hace es utilizar rangos. 

Cuando ejecutamos la cláusula: SELECT * FROM mara WHERE matnr IN mirango el motor de base de datos que interpreta esta sentencia PL/SQL leerá la tabla MARA y recuperara todos aquellos registros cuyo campo MATNR este comprendido dentro del rango de valores especificado “mirango”. 

Para que esto funcione debemos tener definido el contenido de "mirango" para que ABAP pueda hacer la búsqueda deseada dentro del rango de valores que nos interesa recuperar, por ejemplo: si deseamos recuperar desde MARA todos los materiales cuyos números de material (MATNR) este comprendido entre 2 y 3 debemos definir un rango cuyo valor bajo o inicial (LOW) sea 2 y cuyo valor alto o final (HIGH) sea 3. 


Para entender esto con mas claridad véase el siguiente código de ejemplo: 

* ---------------------------------------------------------------------
* Sistema : SAP R/3
* Nombre : Ejemplo de uso de RANGES.
* Modulo : Basis
* Autor : Exequiel Lopez.
* Fecha : 4/05/2006.
* ---------------------------------------------------------------------
REPORT zexe001.
* ---------------------------------------------------------------------
TABLES: mara.
* ---------------------------------------------------------------------
RANGES: mirango FOR mara-matnr.
* ---------------------------------------------------------------------
  mirango-sign = 'I'.
  mirango-option = 'BT'.
  mirango-low = '000000000000000001'. 
  mirango-high = '000000000000000003'.
  APPEND mirango.
* ---------------------------------------------------------------------
 SELECT *
   FROM mara
  WHERE matnr IN mirango.
   WRITE : / mara-matnr.
 ENDSELECT.
* ---------------------------------------------------------------------
Este programita buscara todos los materiales especificados en el RANGE “mirango”, es decir recuperara y listara en pantalla todos aquellos materiales cuyo MATNR este comprendido entre los valores 000000000000000001 y 000000000000000003.

Que hacen los SETs


Los SETs permiten es almacenar los valores de LOW y HIGH de los rangos en una tabla de sistema, en este caso la tabla SETLEAF, para poder descargar estos parámetros en un rango y poder usarlos en un programa, esto evita el problema de la inclusión de hardcodes en un programa, además no solo podremos almacenar un rango simple como 2 a 3 del ejemplo, sino que podemos tener múltiples renglones de rangos que no necesariamente tienen que ser consecutivos. 

Transacciones asociadas a los SETs

  • La transacción para creación es GS01.
  • La transacción para modificarlos es GS02.
  • La transacción para consultarlos es GS03.

Pasos para la creaciónc de un SETs


1. Vamos a la Transacción GS01.




2. Seleccionamos el tipo de SET, y el nombre que le vamos a dar. En este caso será un SET, básico.

3. En el campo de Referencia podríamos hacer referencia a otro SET de datos.

4. Si no vamos a usar las referencias, en la pantalla siguente tendremos que meter el  campo que contendrá los valores a los que hacemos referencia con el SET.


5. Una vez definido el campo de  la tabla, será el momento de introducir los valores del SET, una vez introducidos se pulsa "Grabar" y "Salir".



Ventajas de los SET de datos


  • 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.

Ejemplo de creación de un SET 


Vamos a demostrar la creación y el uso de un SET:

  1. Invocar a la transacción GS01.
  2. Darle nombre al set, por ejemplo ZEXE001
  3. Darle un nombre de tabla a usar, por ejemplo MARA
  4. Poner el Tipo de Set como SET BASICO
  5. Pulsar Enter
  6. Darle un nombre de campo a usar, por ejemplo MATNR
  7. Completar los valores de rango y poner un comentario para cada línea: 
 
De valor    A valor  Texto breve otros campos . . .
    1         2       línea 1
    4         7       línea 2
  
Una vez completado dar click en el botón SAVE. 

Lo que estamos diciéndole aquí es que con este SET vamos a buscar los materiales comprendidos entre 1 y 2 y los materiales comprendidos entre 4 y 7. Los valores "De valor" y "A valor" son los valores que se han introducido para el valor del rango para el campo MATNR. Eso significa que para este SET vamos a tener valores comprendidos entres 1 y 2 y entre 4 y 7 por lo que le programa que presentamos mas abajo debería buscar todos los materiales comprendidos entres 1 y 2 y entre 4 y 7 inclusive. Para usar el set hay que leerlo en el programa primero, descargarlo a una variable de rangos y luego usar la variable de rangos para hacer el SELECT. Los campos valsign valoption valfrom y valto pertenecen a la tabla SETLEAF y representan lo siguiente: 


  • valfrom - El valor desde, por ejemplo desde matnr = 2 inclusive.
  • valto - El valor hasta, por ejemplo hasta matnr = 3 inclusive.
  • valsign - Campo SIGN en la estructura de tablas SELECT-OPTIONS
  • valoption - Campo OPTION en la estructura de tablas SELECT-OPTIONS

Ejemplo del uso de SETs como rangos en una selección:
* ---------------------------------------------------------------------
* Sistema : SAP R/3
* Nombre : Ejemplo de uso de SETS.
* Modulo : Basis
* Autor : Exequiel Lopez.
* Fecha : 4/05/2006.
* ---------------------------------------------------------------------
REPORT zexe002.
* ---------------------------------------------------------------------
TABLES: mara, setleaf.
* ---------------------------------------------------------------------
RANGES: mirango FOR mara-matnr.
* ---------------------------------------------------------------------
SELECT valsign valoption valfrom valto
  INTO (mirango-sign, mirango-option,
        mirango-low, mirango-high)
  FROM setleaf
 WHERE setname = 'ZEXE001'.
 APPEND mirango.
ENDSELECT.
* ---------------------------------------------------------------------
SKIP.
SKIP.
Write : / 'El rango usado es:'.
SKIP.
LOOP AT mirango.
  WRITE : / mirango-sign, mirango-option,
            mirango-low, mirango-high.
ENDLOOP.
* ---------------------------------------------------------------------
SKIP.
SKIP.
Write : / 'Los materiales obtenidos son:'.
SKIP.
SELECT * FROM mara
 WHERE matnr IN mirango.
 WRITE : / mara-matnr.
ENDSELECT.
* ---------------------------------------------------------------------
*


El funcionamiento del programa es sumamente simple: 


Primero descarga de la tabla SETLEAF el SET llamado ‘ZEXE001’ que acabamos de crear con anterioridad en este ejemplo y deposita sus valores de rango (valsign valoption valfrom valto ) en una variable tipo RANGES llamada ‘mirango’. Como el SET puede tener un numero variable de lineas por cada una de las lineas leidas hace un APPEND a la variable mirango ( que de hecho es tratada por ABAP como a una tabla interna). A continuacion nos presenta a traves de Write cual es el contenido de este SET. Finalmente lo utiliza en la clausula SELECT y nos presenta los resultados. En el caso de que no tengo materiales creados en su mandante de prueba puede cambiar facilmente los valores del rango 1 a 2 y 4 a 7 por cualquiera que se ajuste a sus datos de prueba. Y eso es basicamente todo.







No hay comentarios:

Publicar un comentario

Nota: solo los miembros de este blog pueden publicar comentarios.