Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Conexión con bases de datos (https://www.clubdelphi.com/foros/forumdisplay.php?f=2)
-   -   BeforePost y TField.Required (https://www.clubdelphi.com/foros/showthread.php?t=30076)

rafa_adrim 08-02-2006 14:11:09

BeforePost y TField.Required
 
Buenas tengo un problemilla que no se como arreglar. (delphi 6.0 y Interbase 6.0)

Las gestiones de clave primaria automàtica lo gestionio mediante un Generator de interbase, mejor dicho, un storedprocedure que devuelve el proximo valor de un Generator.

Bien el problema es el siguiente, para no perder ningun número de generator lo logico seria en el Beforepost llamar a este storedprocedure y assignar el resultado de dicha funcion a la primary key.

Bien funciona correctamente salvo un casuistica que se me escapa.

Cuando alguno de los TFields de la tabla tiene el Required a true, delphi hace la comprovación de Required después de generar la llamada al evento Beforepost con el consiguiente problema: Si algun campo que es Required no esta rellenado se muestra un error, el post no se hace y si despues el cliente cancela la creación del registro pierdo el número del generator que he assignado previamente en el evento Beforepost.

Mi pregunta: Es posible hacer que delphi primero compruebe Required y después llame a Beforepost.

PD: La otra solución seria assignar la primary key en el trigger beforeinsert de interbase pero el problema es que despues desde delphi no se me refresca el valor assignado por el servidor aunque le diga al TField que actua com a primary key que es del tipos AutogenerateValue := autoinc.

Muchas gracias.

jmariano 08-02-2006 20:04:28

Lamentablemente, salvo que te crees tu propia clase TDataSet y sobrecargues el método Post, no es posible cambiar el comportamiento.

Lo mejor es la segunda solución que propones, establecer el valor de la clave en el servidor mediante un disparador. (Dices que el valor del campo no te aparece actualizado, ¿Probaste a hacer un Refresh? ¿Estás usando un TClientDataSet?).

Saludos!

rafa_adrim 09-02-2006 00:47:23

Utilizo un TTable de BDE, y el refresh lo he probado pero no funciona.
Gracias de todas formas.

jmariano 09-02-2006 12:00:38

He buscado un poquito por ahí tu problema y tienes razón, existe un problema entre el BDE y esta versión de Interbase, por el que no se reflejan bien los valores de los campos clave que son actualizados en el servidor después de una inserción.

Por lo que encontré, sólo hay dos maneras de solucionarlo:

1. Actuar como lo has hecho hasta ahora: creando un procedimiento almacenado y ejecutándolo en el evento OnBeforePost o en OnNewRecord para actualizar el campo clave de autoincremento.

2. Ó, actualizando dicho campo en el servidor a través de un disparador y, luego, cerrando y volviendo a abrir la tabla (en vez de ejecutar Refresh) para que se actualice el valor del campo en el cliente. (Claro que esta operación es más costosa y requiere que salvemos la posición del registro actual para volver a posicionarnos donde estábamos).

Yo te aconsejaría, más que usar el BDE, utilizar los componentes nativos para acceder a Interbase (los de la pestaña InterBase) o cualquier librería de componentes que exísten por ahí para tal propósito (algunas son, incluso, gratuitas).

Saludos!

rafa_adrim 09-02-2006 13:46:08

Gracias,

Me lo estoy planteando el problema es que estamos hablando de una aplicación que existe desde el 99, con mas de 90 tablas y unos 160 formularios de gestión.

Claro migrar esto a por ejemplo ibx es muy traumàtico.

Bueno la solucion que he hecho al final es la siguiente, por si ha alguien le interesa:

1. Tener un storedprocedure que devuelve en número siguente de un generador siempre i cuando no haya ningun valor en una tabla de números a recuperar. (Tabla idRecuperado)
2. En el beforepost assignar el número que devuelve el storedprocedure.
3. En caso de que hang cancel inserto el número que se va a perder en la tabla idRecuperado para que la proxima el storedprocedure lo reaproveche.

La opción de que cada vez que se crea un registro cerrar i abrir la ttable es muy muy costosa en terminos de rendimiento de datos al servidor ya que el bde cada vez que abre una tabla hace una gran carga de datos en local.

Bueno hay la información por si alguien la necesitase.
Gracias otra vez.

rafa_adrim 09-02-2006 13:47:36

joder cada vez escrivo peor.
Perdón.


La franja horaria es GMT +2. Ahora son las 21:37:42.

Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi