Inicio > Oracle > friki > arreglo

arreglo

Experto:
Usuario:
Fecha: 11/06/2004
Valoración: (3,00 sobre 5) Categoría: Oracle
10/06/2004
cbadilla, usuario preguntando en Oracle
Usuario
No se como hacer un arreglo en Oracle Forms del Developer 6.0

Además tiene que ser un arreglo de datos distintos (char,numerico, date);

Además es posible que como parametro pueda pasar un arreglo al report y que el report lo procese.
11/06/2004
cbadilla, experto respondiendo en Oracle
Experto
Yo lo solucioné simulando un array con un VARCHAR2 de la sig. manera:

- Me creé un package (en el mismo form) para el arreglo.
- El package tenía como variable de trabajo un VARCHAR2 con el máximo de long. (32767 creo q es), a este varchar2 le llamé "arreglo". El package tiene otra variable "contador" de tipo INTEGER, inicialmente a 0 y q cuenta el nº de elementos.
- La idea es dividir el varchar2 en subcadenas del mismo tamaño (particiones), cada subcadena es un elemento del array. A su vez, el elemento puede ser cualquiera, aunque hay que hacer conversiones antes de guardarlo/recuperarlo del array.

Por ejemplo, un elemento se podría definir como:

type t_elem = record
cadena varchar2(10),
fecha varchar2(8),
numero varchar2(5)
end;

El elemento definido es un registro con tres campos, todos varchar2, porque la idea es guardar todo como texto, aunque luego veremos como sacar los datos en su tipo correcto. Un elemento ocupa 23 carácteres (10+8+5), por lo que podemos tener 32767/23=1424 elementos como máximo.

Si tenemos definidas las vars. del package como:

arreglo VARCHAR2(32752); -- 1424 elementos
contador INTEGER := 0;


entonces, podemos definir métodos de acceso al arreglo:

PROCEDURE Insertar(p_cad V2, p_fecha DATE, p_nro NUMBER) IS
BEGIN

arreglo := arreglo || LPAD(p_cad, 10) || LPAD(TO_CHAR(p_fecha, 'DDMMYYYY'),8) || RPAD(TO_CHAR(p_nro),5);
contador := contador + 1;
END;


Los métodos de consulta serían tal que así:

FUNCTION Fecha(indice: INTEGER) RETURN DATE IS
BEGIN
RETURN TO_DATE( SUBSTR( SUBSTR(arreglo, (indice-1)*23+1, 23), 11, 8), 'DDMMYYYY');
END;

FUNCTION Numero(indice: INTEGER) RETURN DATE IS
BEGIN
RETURN TO_NUMBER( SUBSTR( SUBSTR(arreglo, (indice-1)*23+1, 23), 19, 5));
END;

Etcétera....

Lo malo de esta solución es que no se pueden crear arreglos muy grandes (depende tb. del tamaño de los elementos del arreglo, claro). Lo bueno es que funciona bastante bien y lo hace en cualquier versión del Developer Forms. Con esta técnica he implementado arreglos, listas, pilas, colas, ...

Si metes el package en una libreria PLL, podrás usarla desde el form y desde el report. Podrías pasarle un varchar2 con el arreglo y el report interpretarlo, mediante la pll enlazada al report.

Si todo esto es insuficiente, quizás podría resolver tu problema almacenando los elementos del arreglo en una tabla temporal.

Un saludo.
11/06/2004
cbadilla, usuario preguntando en Oracle
Usuario
gracias
Más opciones
Enlaces patrocinados
Respuestas relacionadas