Additional Blogs by Members
cancel
Showing results for 
Search instead for 
Did you mean: 
fmunozb
Active Participant
134,104

Tablas internas de tipo rango en programas ABAP

Introducción

En varios desarrollos ABAP se hace necesario el uso de tablas internas de tipo rango, las cuales suelen ser usadas en expresiones lógicas, ya sean estructuras de selección (IF), estructuras de control (WHILE) o consultas Open SQL en la condición WHERE, se usan para poder abreviar o mejor agrupar  varios datos de manera compacta. Su uso en un programa ABAP es equivalente a crear un parámetro de selección en rango usando SELECT-OPTIONS.

Declaración

Para declarar estos tipos de objetos de datos se hace uso de la palabra reservada TYPE RANGE OF, hay una manera obsoleta de declarar este tipo de variables usando la palabra reservada RANGES; para la explicación vamos a usar TYPE RANGE OF.

Para mayor información sobre la sintaxis usada para la declaración de estos objetos de datos ir a: http://help.sap.com/abapdocu_70/en/ABAPDATA_RANGES.htm.

En el siguiente ejemplo vamos a declarar un objeto de datos llamado RG_MATNR la cual va a ser una tabla interna de rangos para almacenar códigos de material.

DATA: rg_matnr TYPE RANGE OF mara-matnr. 

Tabla de selección

A la tabla interna que se crea usando la anterior declaración se le denomina tabla de selección.

Al declarar un objeto de datos de tipo rango, el sistema crea una tabla interna con la misma estructura de una tabla de selección, por lo general una tabla de selección está formada por una tabla interna y una línea de cabecera, la tabla interna y su línea de cabecera está conformada por las siguientes cuatro columnas: SIGN, OPTION, LOW  y HIGH.

Nota: Para clases no es posible hacer uso de estos objetos de datos con línea de cabecera, por eso lo más recomendable es hacer uso de estas tablas internas sin linea de cabecera, por tal motivo en el código mostrado se hace uso de tablas internas sin líneas de cabecera.

SIGN:

Es de tipo c y longitud 1. El contenido de SIGN determina para cada fila si el resultado de la expresión lógica se incluye o excluye del conjunto resultante. Los valores que puede tomar SIGN son "I" para incluir y "E" para excluir.

OPTION:

Es de tipo c y longitud 2. Contiene la condición de selección de la fila y está formateado como operador lógicos. Los operadores lógicos son "EQ", "NE", "GE", "GT", "LE", "LT", "CP" y "NP" si la columna LOW es no inicial, y "BT", "NB" si la columna HIGH es no inicial.

En la siguiente tabla se describen los operadores lógicos descritos y su sintaxis equivalente.

Operador

Descripción

=, EQ

Igual.

<>, NE

Diferente, no igual.

>=, GE

Mayor igual.

>, GT

Mayor que.

<=, LE

Menor igual.

<, LT

Menor que.

CP

Comprende el patrón: Se hace uso del carácter “*” o '+' para crear el patrón con el que deseamos llevar a cabo la operación lógica del operando que se coloca en la variable LOW. El carácter “*” representa cualquier carácter incluyendo espacios en blanco y el carácter “+” representa caracteres sin incluir espacios en blanco.

NP

No patrón: Tiene la misma descripción de CP salvo que la operación lógica no debe incluir el patrón que se coloca en la variable LOW.

BT

Entre un valor y otro: Incluye un intervalo, se usa LOW y HIGH para saber de donde a donde se debe comparar el conjunto de datos.

NB

No se encuentra entre un valor y otro: Excluye el intervalo, es decir, trae el conjunto de datos que no se encuentra entre LOW y HIGH.

LOW:

Es del tipo con que se definió el objeto de datos rango, para el caso que estamos observando es de tipo MATNR. Nos sirve como operando a la hora de realizar las operaciones lógicas que sean diferentes a “BT” y “NB” .

HIGH:

Al igual que LOW es del tipo con que se definió el objeto de datos rango, para el caso que estamos observando es de tipo MATNR. Esta columna nos sirve como operando a la hora de realizar operaciones lógicas que incluyan intervalos, es decir, los operadores lógicos “BT” y “NB”.

Definición

A la hora de definir nuestro objeto de datos, debemos hacer uso de una estructura que tenga las mismas columnas de la tabla interna, para esto creamos otro objeto de datos pero esta vez de tipo estructura.

DATA: rwa_matnr LIKE LINE OF rg_matnr.

Esta estructura nos va a servir para definir nuestra tabla interna con los diferentes operandos y los operadores lógicos que queremos usar para evaluar el conjunto de datos.

Ejemplo 1:

Queremos que nuestro rango incluya el material 30000001.

rwa_matnr-sign = 'I'.
rwa_matnr-option = 'EQ'.
rwa_matnr-low = '30000001'.
APPEND rwa_matnr TO  rg_matnr.

Ejemplo 2:

Queremos que nuestro rango incluya los materiales que comiencen con 3.

rwa_matnr-sign = 'I'.
rwa_matnr-option = 'CP'.
rwa_matnr-low = '3*'.
APPEND rwa_matnr TO  rg_matnr.

Ejemplo 3:

Queremos que nuestro rango incluya los materiales que van del 20000000 al 29999999.

rwa_matnr-sign = 'I'.

rwa_matnr-option = 'BT'.

rwa_matnr-low = '20000000'.

rwa_matnr-high = '29999999'.

APPEND rwa_matnr TO  rg_matnr.

Uso del objeto de datos rango en programas ABAP.

Anteriormente se había dicho que los objetos de datos rango suelen ser usados en expresiones lógicas, ya sean estructuras de selección (IF), estructuras de control (WHILE) o consultas Open SQL en la condición WHERE.

En estructuras de selección: 

IF wa_matnr IN rg_matnr.
    …
ENDIF.

En estructuras de control:

WHILE wa_matnr IN rg_matnr.
    ...
ENDWHILE.

En consultas Open SQL:

SELECT *

INTO TABLE it_mara

FROM mara

WHERE matnr IN rg_matnr.

Conclusiones

El objeto de datos rango permite que nuestro código sea más claro y compacto, ya que podemos mediante ellos hacer operaciones lógicas complejas sin necesidad de crear código repetitivo.

4 Comments
Former Member
0 Kudos

Buen post Fernando.

Solo hay que tener cuidado de que la Tabla tipo rango contenga la información que deseamos, pues si esta vacía es tanto como si no tuviera filtro, error común que sucede cuando la Tabla tipo rango se llena con los valores de algún query o búsqueda que no tiene resultados.

Former Member
0 Kudos

Disculpen estoy iniciando en ABAP, pero creo que tambien se puede declarar como tipo range y utilizarloWITH HEADER LINE, lo cual sirve en caso de que esten reasignado el valor obtenido despues de asignar la informacion en la WA.

former_member204025
Participant
0 Kudos

Hola! Si las tablas rango, las llenas con resultados de un select, antes de commpletarlo y despues de la sentencia select, se debe verificar que SY-SUBRC eq 0 o en su defecto ver que la tabla interna sea diferente de vacio.

Si cumple con la condición, entonces completara con los valores obtenidos. Sino, deberia emitir un mensaje, dependiendo de lo que pide el programa.

Por otro lado, @Isaac Enriquez, no deberias poner las tablas WITH HEADER LINE, por convencion se usa una tabla de TYPE TABLE of ... y una estructura que servira como cabecera del mismo tipo de la tabla.

Saludos!

0 Kudos
Tengo una Duda, aclaro duda.

Existe un limite de Registros en un campo tipo Range?

Creo que si, especialmente cuando quieres hacer un select... where IN rango.

Si alguien sabe, se lo agradeceré.