![]() |
Generadores
Hola compa�eros,
Tengo un inconveniente con los generadores, bueno extactamente con ellos no sino con la obtenci�n del valor. Cuando ejecuto la sentencia sql para obtener el �ltimo, y asignarlo en el campo, tarda casi un segundo o mas en mostrarse y se nota la tardanza, el c�dogo que utilizo es: Cita:
Lo que necesito es saber si hay alg�n procedimiento m�s optimo, se que este lo es, pero alguno donde no se note el refresco, he intentado desactivar los controles pero no me asigna el valor en el campo o no lo muestra. Como pueden ver estoy utilizando dbexpress. Si hago un procedimiento almacenado donde pueda obtener el dato, no se si sea m�s veloz u optimo, si es as�, tendr�a que hacer uno por cada tabla que necesite incrementar. Agradezco la ayuda de antemano. PD: Disculpen si no he contstado o dado consejo alguno de los dif. hilos, pero estoy contra el reloj con este proyecto. Prometo colaborar cuando vaya finalizando, espero sea pronto. Gracias :rolleyes: |
Hola delphoros!
Creo que esta vez me contestar� a mi duda, y espero le sirva a todos los que han tenido y tendr�n esta misma. He utilizado un procedimiento almacenado en la BD sencillo que ejecuta un generador: Cita:
Se crea una function para ejecutar el SP y retornar el valor: Cita:
Ahora la respuesta es mucho m�s r�pida y no se nota la asignaci�n. Yo estoy trabajando en el mismo pc y tengo instalado un SO de servidor, esta tardanza era bastante preocupante ya que en el mismo pc daba el retardo, no quer�a imaginar cuando se hicieran las pruebas en red a otros pc. L�gico esta que al cancelar una inserci�n se perder� el consecutivo, pero esto lo controlar� m�s adelante en la misma BD realizando los controles de actualiaci�n en cascada y otras cositas que he estado viendo en el motor FireBird, IB y el libro de La cara Oculta de Delphi 4 Gracias y espero les sirva. |
Para no perder el consecutivo yo hago lo siguiente:
Hice un "trigger before insert" y es ahi donde ejecuto el Id = Gen_Id(<NombreGenerador>, 1); y tengo entendido que solo se va a ejecutar cuando realmente se este insertando en la tabla el codigo me queda asi (aunque no lo se poner entre "quote:") CREATE TRIGGER SETFOLIO FOR ORDENGAS ACTIVE BEFORE INSERT POSITION 0 as begin new.folio = gen_id(folio_gen,1); end y como usualmente nesecitamos saber cual es la clave para regresarla a la pantalla o imprimirlo, yo lo soluciono con un procedimiento que es el encargado de insertar los datos a la tabla: ALTER PROCEDURE APPENDORDEN (CARRO SMALLINT, PLACAS VARCHAR(10), KILOMETROS INTEGER, SUCURSAL INTEGER, CHOFER VARCHAR(30), AUTORIZO VARCHAR(30), TIPO VARCHAR(10)) RETURNS (FOLIO INTEGER) AS begin insert into ordengas(carro, placas,kilometros,sucursal,chofer,autorizo,tipo) values (:carro,:placas,:kilometros,:sucursal,:chofer,:autorizo,:tipo); folio=gen_id(folio_gen,0); end como veran, este es el procedimiento que llamo cuando inserto un nuevo registro; le paso los valores validados previamente para que halla menos posibilidades de error y el procedimiento al tratar de insertar los datos en la tabla se dispara el trigger SETFOLIO el cual aumenta el generador y me asigna el valor en el campo folio, para despues retornar el valor de el numero de folio desde el mismo procedimiento... ...Como se pone el codigo entre rayitas??? :D |
Hola,
Cita:
Regla a no olvidar con generadores: un generador tocado (incrementado o disminuido su valor) no es posible deshacer el cambio con rollback. Otra regla: Los generadores pueden garantizar valores enteros �nicos, pero no necesariamente en secuencia (sin huecos). En cierta forma son conceptos excluyentes, puedes crear un mecanismo que genere valores unicos, pero sin la garant�a de secuencia (los generadores), y al contrario: puedes crear un mecanismo que garantice la secuencia, pero entonces no garantizar�s la unicidad (este mecanismo no lo tiene implementado InterBase). Vamos, que los dos a la vez no es posible. Saludos. |
Cita:
Cita:
Hasta pronto... p.d. se nota que ya se usar las citas???:D |
| La franja horaria es GMT +2. Ahora son las 13:22:31. |
Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2026, Jelsoft Enterprises Ltd.
Traducci�n al castellano por el equipo de moderadores del Club Delphi