Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Firebird e Interbase (https://www.clubdelphi.com/foros/forumdisplay.php?f=19)
-   -   Actualizar un valor en un generador desde un Sp (https://www.clubdelphi.com/foros/showthread.php?t=3422)

muli 05-09-2003 21:27:12

Actualizar un valor en un generador desde un Sp
 
Necesito actualizar el valor de un generador desde un Sp, con un valor que se encuentra en ese generador, algo

CREATE PROCEDURE Actualizar_Codigo
DECLARE VARIABLE ValorNuevoGenerador INTEGER;
BEGIN
ValorNuevoGenerador =GEN_ID(CODIGO, 0)+1;
// Que instruccion utilizo para agregar en el Generador Codigo el nuevo valor
END;

kinobi 06-09-2003 09:37:17

Hola,

Código:

SET TERM !! ;

CREATE PROCEDURE Establecer_GENERADOR_X (
ParNuevoValor INTEGER)
AS
  DECLARE VARIABLE ValorActual INTEGER;
BEGIN
  /* 1 .. recuperamos el valor actual del generador */
  ValorActual = GEN_ID(GENERADOR_X, 0);

  /* 2 .. fijamos el nuevo valor del generador */
  ValorActual = GEN_ID(GENERADOR_X, (:ParNuevoValor) - :ValorActual);
END !!

SET TERM ; !!

Lo que hace es aprovecharse de la posibilidad de leer (pero no modificar) el valor actual de un generador (/* 1 .. */), y que los generadores pueden tomar saltos mayores que 1 y negativos, si es necesario (/* 2 .. */).

Hay una pega, Si DESPUES de recuperar el valor actual del generador (/* 1 .. */) y ANTES de fijar el nuevo valor (/* 2 .. */), otro usuario hiciese "saltar" el generador (hacia delante, o hacia atrás), ya no se podría garantizar que el generador quedará fijado al valor que pasamos como parámetro al procedimiento. Esto es debido a que los generadores (y por extensión la función GEN_ID) no están sujetos al control de la transacción que los modifica. En entornos de un sólo usuario (o que garanticemos que cuando se utilice el procedimiento sólo hay un usuario conectado a la base de datos), el procedimiento funcionará correctamente, en entornos multiusuario no es posible garantizarlo.

Saludos.

antonio 11-09-2003 18:24:44

muli, lo que quieres hacer lo puedes hacer de una forma más sencilla así:

CREATE PROCEDURE Actualizar_Codigo
BEGIN
ValorNuevoGenerador =GEN_ID(CODIGO, 1);
END

para lo que dice kinobi, en Firebird puedes hacerlo así, de una forma también má sencilla:

CREATE PROCEDURE Establecer_GENERADOR_X (
ParNuevoValor INTEGER)
AS
BEGIN
set generator codigo to :parnuevovalor ;
END

Pero en IB 5.6 la forma de hacerlo es la que dice kinobi. En IB 6.x y posteriores no lo conozco.

Un saludo

kinobi 11-09-2003 18:32:08

Hola,

Cita:

Posteado originalmente por antonio
para lo que dice kinobi, en Firebird puedes hacerlo así, de una forma también má sencilla:

CREATE PROCEDURE Establecer_GENERADOR_X (
ParNuevoValor INTEGER)
AS
BEGIN
set generator codigo to :parnuevovalor ;
END

Esto sólo funcionaría en Firebird 1.5 (y no estoy completamente seguro de ello), pero desde luego que no funcionaría con Firebird 1.0.x

Saludos.

Actualización:
he estado revisando el changelog de la versión 1.5 y no hacen mención a que se pueda introducir una sentencia DDL como "SET GENERATOR ..." dentro del código de un procedimiento almacenado. Así que me temo que, salvo que se me haya pasado en el changelog o tú puedas demostrarlo, no es posible fijar el valor de un generador dentro de un procedimiento con "SET GENERATOR ..." tampoco con la versión 1.5 de Firebird.

antonio 12-09-2003 11:14:11

Efectivamente, tienes toda la razón, eso solo va desde una consulta, pero no desde un procedure o un trigger, y siempre en Firebird 1.5

capo979 29-11-2007 14:30:35

Hago como lo dice Kinobi pero me dice que da error de parsing por SET,

alguien sabe que puede ser

peccatum 10-12-2007 05:32:40

ja

es el mismo problema que tengo

voy a probar de hacerlo desde un tquery ....

ariefez 10-12-2007 17:30:12

en ese caso tendrias q usar EXECUTE STATEMENT

Código SQL [-]
EXECUTE STATEMENT 'SET GENERATOR codigo TO ' || :NuevoValor;

donde NuevoValor es una varchar almacenando el nuevo valor.

peccatum 11-12-2007 04:46:01

genial, si que funciona

gracias!

peccatum 10-06-2008 23:55:25

Hola

Tengo un problema con ésto.

En mi DB hay un trigger que tiene la siguiente linea

Código SQL [-]
 EXECUTE STATEMENT 'SET GENERATOR codigo TO 0';

me da el siguiente error:

---------- ERROR MESSAGE ----------

Invalid token.
Dynamic SQL Error.
SQL error code = -104.
Token unknown - line 4, char 7.
STATEMENT.

----------------------------------------

Lo extraño es que andaba perfectamente, lo unico que paso en el medio: debí reinstalar firebird en la maquina donde esta la DB por formateo(por supuesto, la misma version)...

A alguien se le ocurre cual puede ser el problema?

jhonny 11-06-2008 00:01:39

Cita:

Empezado por peccatum (Mensaje 292680)
Hola

Tengo un problema con ésto.

En mi DB hay un trigger que tiene la siguiente linea

Código SQL [-]
 EXECUTE STATEMENT 'SET GENERATOR codigo TO 0';

me da el siguiente error:

---------- ERROR MESSAGE ----------

Invalid token.
Dynamic SQL Error.
SQL error code = -104.
Token unknown - line 4, char 7.
STATEMENT.

----------------------------------------

Lo extraño es que andaba perfectamente, lo unico que paso en el medio: debí reinstalar firebird en la maquina donde esta la DB por formateo(por supuesto, la misma version)...

A alguien se le ocurre cual puede ser el problema?

¿No sera que quizá instalaste alguna versión anterior a la de FireBird 1.5 en esa maquina?, digo, es que acabo de hacer una prueba y por lo menos si me compila y me crea dicho trigger tranquilamente.

peccatum 11-06-2008 00:07:21

la unica version que siempre tuve es esta: Firebird-1.5.3.4870-0-Win32.exe

:confused::eek:

jhonny 11-06-2008 00:17:52

Cita:

Empezado por peccatum (Mensaje 292687)
la unica version que siempre tuve es esta: Firebird-1.5.3.4870-0-Win32.exe

:confused::eek:

Pues ciertamente es muy extraño, debería funcionar sin problemas :confused:

peccatum 11-06-2008 03:26:08

voy a probar reinstalando la version de FB... manotazo de ahogado ya que mucho no se me ocurre...

si alguien tiene algúna idea, estoy pendiente del hilo,

gracias..

peccatum 11-06-2008 04:53:05

no hay caso ...

no entiendo :mad:

rastafarey 11-06-2008 15:10:10

resp
 
Código SQL [-]
..
declare variable I integer;
as
begin
  I = GEN_ID(Nombre_Generador, 1);
end

Eso es todo ya te lo explicaron que es lo no entiendes.

peccatum 11-06-2008 15:56:05

---------- ERROR MESSAGE ----------

Invalid token.
Dynamic SQL Error.
SQL error code = -104.
Token unknown - line 4, char 7.
STATEMENT.

----------------------------------------


eso ...


igual ya resolvi el asunto de otra manera.... pero queda la intriga por q antes andaba de esa forma y ahora no .... en fin


La franja horaria es GMT +2. Ahora son las 01:20:55.

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