Llenar base de datos desde powerBuilder

Desde Venezuela!
Soy completamente novato en PowerBuilder y debo desarrollar una nueva
aplicación. El lenguaje en sí no es complicado, pero veo que el tema
principal es el DataWindows y DataStore...
Mi problema es el siguiente:
Tengo un archivo con el siguiente formato (simplifiquemos el problema):
-Titulo 1
valor 1 ... Valor N
-Titulo 2
valor 1 ... Valor M
...
-Titulo k
valor 1 ... Valor L

He creado una base de datos en SQL Anywhere.. Que para resumir el problema,
digamos que tengo las tablas A, y B...
-Tabla A:
id_a auto increment
Nombre
--------
-Tabla B:
id_b autoincrement
fk_id_a
Nombre

Cada "título" debe ser guardado como un registro en A, y cada "valor"
Como un registro en B que está asociado a un título... En esencia es
fácil y sencillo...
Actualmente
Puedo insertar y recuperar los datos con los DataWindows en la tabla A,
hasta ahí voy bien... El problema para mí es al momento de insertar en
la tabla B...
- Estoy recorriendo el archivo, y momentáneamente
almaceno los datos en dos DW,.. A y B... Fácil... Y los DW me simulan
bien lo que quiero... Y puedo pasar los datos del DW_A a la tabla A sin
problemas...
- Pero como los id de las tablas son autoincrement,
cómo hago para saber el id que acaba de ser insertado en A y así
"¿Enlazar" los próximos "valores" con ese registro?...
Por ahora estoy haciendo algo un poco complicado:

// -- ciclo hasta que se acabe el archivo
ls_titulo = leer_titulo()
row = dw_A.insertRow(0)
dw_A.setItem(row, "nombre", ls_titulo)
dw_A.acceptText()
dw_A.update()
ID_A = dw_A.getItemNumber(row, "id_A")
// -- ciclo hasta encontrar otro titulo
ls_valor = leer_Valor()
row = dw_B.insertRow(0)
dw_B.setItem(row, "nombre", ls_valor)
dw_B.setItem(row, "fk_id_a", ID_A)
// -- fin del ciclo de valores
dw_B.acceptText()
dw_B.Update()
// fin ciclo principal...

Esto funciona, y funciona bien... Pero realmente tengo 4 tablas anidadas en cadena, y esta forma no me parece que sea la correcta, porque tengo que anidar 4 FORs y antes de cada uno tengo que hacer el dw.update() para recuperar la nueva clave que ha sido ingresada... Por supuesto que puedo abstraer el proceso de cada FOR en una función y reducir código, pero igual el proceso seguiría repitiéndose la misma cantidad de veces, y ese UPDATE es el que no me gusta...hay alguna forma más transparente de hacerlo? ¿O así debe ser en PowerBuilder?

El jefe me dijo que todas las validaciones y en general casi todo se puede con los DataWindows, pero no sé por dónde investigar estas estructuras;

1 Respuesta

Respuesta
1

Usar la función autoincrement es bueno cuando solamente usas una DW.

En tu caso se torna tedioso y si sale algún error en laguna DW, el valor queda usado, y por lógica, la numeración desprolija.

Lo que te recomiendo es que usas una tabla para generar ese código de la misma forma que lo hace el autoincrement, solo que lo manejas vos.

Create table sarha. Generateduniquenbr
(
TABLENAME VARCHAR2(60 BYTE) NOT NULL,
COLUMNNAME VARCHAR2(60 BYTE) NOT NULL,
LASTNBRUSED FLOAT(126)
)

En el campo tablename colocaras el nombre de la tabla en la cual vas a grabar el valor incremental.

En el campo columname colocaras el nombre de la columna en la cual vas a grabar el valor incremental.

En el campo lastnbrused vas a colocar el valor inicial con el cual comenzaras el incremental.

Este ultimo campo es el que se va a ir actualizando cada vez que generes un valor nuevo.

Ahora que paso la función que debes usar para calcular ese valor:

CREATE OR REPLACE FUNCTION f_generateduniquenbr (av_table varchar2, av_column varchar2)RETURN NUMBER IS
PRAGMA AUTONOMOUS_TRANSACTION;
ln_valor generateduniquenbr.lastnbrused%TYPE;
begin
UPDATE generateduniquenbr
SET lastnbrused = lastnbrused + 1
WHERE tablename = lower(av_table)
AND columnname = lower(av_column)
RETURNING lastnbrused INTO ln_valor ;
IF SQL%ROWCOUNT < 1 THEN
ln_valor := 1 ;
INSERT INTO generateduniquenbr(tablename, columnname, lastnbrused)
VALUES (lower(av_table), lower(av_column), ln_valor);
END IF ;
COMMIT;
RETURN ln_valor;
EXCEPTION
WHEN OTHERS THEN
ROLLBACK;
RAISE;
END f_generateduniquenbr;
/

En power antes de hacer el update, debes llamar a esta función, la cual te devuelve el valor incremental, y se lo copias a cada DW. Primero copia todo lo que necesites en cada DW generando el valor incremental para cada registro que necesites. A lo ultimo haces el update de las DW y listo. La función esta hecha en Oracle.

muchas gracias, Leonardo!!

muy amable de tu parte!, realmente esperaba un consejo pero no una solución concreta! y funciona! gracias!

Añade tu respuesta

Haz clic para o

Más respuestas relacionadas