Club Delphi  
    FTP   CCD     Enlaces   Buscar   Trucos   Trabajo   Foros

Retroceder   Foros Club Delphi > Bases de datos > Firebird e Interbase
Registrarse FAQ Miembros Calendario Guía de estilo Buscar Temas de Hoy Marcar Foros Como Leídos

Respuesta
 
Herramientas Desplegado
  #1  
Antiguo 05-09-2003
muli muli is offline
Miembro
 
Registrado: jun 2003
Ubicación: A Coruña
Posts: 121
muli Va por buen camino
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;
__________________
SI UN PROBLEMA TIENE SOLUCION, YA NO ES UN PROBLEMA, Y SI NO LA TIENE PARA QUE PREOCUPARSE.
Responder Con Cita
  #2  
Antiguo 06-09-2003
Avatar de kinobi
kinobi kinobi is offline
Miembro
 
Registrado: may 2003
Posts: 2.621
kinobi Va por buen camino
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.
Responder Con Cita
  #3  
Antiguo 11-09-2003
antonio antonio is offline
Registrado
 
Registrado: may 2003
Ubicación: Valencia
Posts: 7
antonio Va por buen camino
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
Responder Con Cita
  #4  
Antiguo 11-09-2003
Avatar de kinobi
kinobi kinobi is offline
Miembro
 
Registrado: may 2003
Posts: 2.621
kinobi Va por buen camino
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.

Última edición por kinobi fecha: 11-09-2003 a las 18:49:57.
Responder Con Cita
  #5  
Antiguo 12-09-2003
antonio antonio is offline
Registrado
 
Registrado: may 2003
Ubicación: Valencia
Posts: 7
antonio Va por buen camino
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
Responder Con Cita
  #6  
Antiguo 29-11-2007
capo979 capo979 is offline
Miembro
 
Registrado: abr 2007
Posts: 87
capo979 Va por buen camino
Hago como lo dice Kinobi pero me dice que da error de parsing por SET,

alguien sabe que puede ser
Responder Con Cita
  #7  
Antiguo 10-12-2007
Avatar de peccatum
peccatum peccatum is offline
Miembro
 
Registrado: oct 2005
Posts: 86
peccatum Va por buen camino
ja

es el mismo problema que tengo

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

Última edición por peccatum fecha: 10-12-2007 a las 05:34:41.
Responder Con Cita
  #8  
Antiguo 10-12-2007
Avatar de ariefez
ariefez ariefez is offline
Miembro
 
Registrado: sep 2005
Ubicación: Perú - Lima
Posts: 63
ariefez Va por buen camino
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.
Responder Con Cita
  #9  
Antiguo 11-12-2007
Avatar de peccatum
peccatum peccatum is offline
Miembro
 
Registrado: oct 2005
Posts: 86
peccatum Va por buen camino
genial, si que funciona

gracias!
Responder Con Cita
  #10  
Antiguo 10-06-2008
Avatar de peccatum
peccatum peccatum is offline
Miembro
 
Registrado: oct 2005
Posts: 86
peccatum Va por buen camino
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?
Responder Con Cita
  #11  
Antiguo 11-06-2008
Avatar de jhonny
jhonny jhonny is offline
Jhonny Suárez
 
Registrado: may 2003
Ubicación: Colombia
Posts: 6.466
jhonny Va por buen camino
Cita:
Empezado por peccatum Ver Mensaje
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.
__________________
Lecciones de mi Madre. Tema: modificación del comportamiento, "Pará de actuar como tu padre!"
Responder Con Cita
  #12  
Antiguo 11-06-2008
Avatar de peccatum
peccatum peccatum is offline
Miembro
 
Registrado: oct 2005
Posts: 86
peccatum Va por buen camino
la unica version que siempre tuve es esta: Firebird-1.5.3.4870-0-Win32.exe

Responder Con Cita
  #13  
Antiguo 11-06-2008
Avatar de jhonny
jhonny jhonny is offline
Jhonny Suárez
 
Registrado: may 2003
Ubicación: Colombia
Posts: 6.466
jhonny Va por buen camino
Cita:
Empezado por peccatum Ver Mensaje
la unica version que siempre tuve es esta: Firebird-1.5.3.4870-0-Win32.exe

Pues ciertamente es muy extraño, debería funcionar sin problemas
__________________
Lecciones de mi Madre. Tema: modificación del comportamiento, "Pará de actuar como tu padre!"
Responder Con Cita
  #14  
Antiguo 11-06-2008
Avatar de peccatum
peccatum peccatum is offline
Miembro
 
Registrado: oct 2005
Posts: 86
peccatum Va por buen camino
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..
Responder Con Cita
  #15  
Antiguo 11-06-2008
Avatar de peccatum
peccatum peccatum is offline
Miembro
 
Registrado: oct 2005
Posts: 86
peccatum Va por buen camino
no hay caso ...

no entiendo
Responder Con Cita
  #16  
Antiguo 11-06-2008
Avatar de rastafarey
rastafarey rastafarey is offline
Miembro
 
Registrado: nov 2003
Posts: 888
rastafarey Va por buen camino
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.
__________________
Todos los dias sale un pendejo a la calle y el que se lo encuentra es del.
Responder Con Cita
  #17  
Antiguo 11-06-2008
Avatar de peccatum
peccatum peccatum is offline
Miembro
 
Registrado: oct 2005
Posts: 86
peccatum Va por buen camino
---------- 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
Responder Con Cita
Respuesta


Herramientas
Desplegado

Normas de Publicación
no Puedes crear nuevos temas
no Puedes responder a temas
no Puedes adjuntar archivos
no Puedes editar tus mensajes

El código vB está habilitado
Las caritas están habilitado
Código [IMG] está habilitado
Código HTML está deshabilitado
Saltar a Foro


La franja horaria es GMT +2. Ahora son las 12:45:52.


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