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)
-   -   Restaurar valor de un generador (https://www.clubdelphi.com/foros/showthread.php?t=72543)

GustavoCruz 24-02-2011 20:35:22

Restaurar valor de un generador
 
Buenas tardes amigos foreros.

Pues el título lo dice todo. Me gustaría saber cómo hago para restaurar el valor un generador.

Mil gracias por vuestra ayuda

GustavoCruz

Casimiro Noteví 24-02-2011 20:41:18

El sistema "de toda la vida":

SET GENERATOR GEN_TBTIPOSIVA_ID TO 0;

El nuevo sistema desde FB 2.1:

ALTER SEQUENCE GEN_TBTIPOSIVA_ID RESTART WITH 0;

GustavoCruz 26-02-2011 14:28:57

Hola Casimiro Notevi, gracias por tu respuesta.

He intentado como me sujeriste y me muestra un error. Lo que quiero hacer es que cuando en un determinado momento y inserte un valor en una tabla, este valor sea tomado por el generador. Esto es porque necesito controlar unos datos que se generarán anualmente, De este modo; Tengo una tabla de configuraciones en la cual hay un campo que me almacena el inicio de una numeración y este valor ser debe reiniciar cada año, o cuando el usuario lo decida en la cantidad que él quiera.

Me imaginé que eso se solucionaba con un trigger. pero la sentencia que me sugieres no es me está funcionando.


Saludos y Mil gracias por tu tiempo


Gustavo Cruz

Casimiro Noteví 26-02-2011 14:35:45

Cita:

Empezado por GustavoCruz (Mensaje 392074)
He intentado como me sujeriste y me muestra un error.

¿Qué error?, eso no puede dar ningún error.
SET GENERATOR GEN_TBTIPOSIVA_ID TO 0;
Evidentemente GEN_TBTIPOSIVA_ID debes sustituirlo por el nombre de tu generador.

Cita:

Empezado por GustavoCruz (Mensaje 392074)
Lo que quiero hacer es que cuando en un determinado momento y inserte un valor en una tabla, este valor sea tomado por el generador

Creo que no te entiendo, el valor del campo de la tabla es el que coge el valor del generador, no al revés.

Y si quieres hacerlo al revés, entonces dale el valor que quieras:
SET GENERATOR GEN_TBTIPOSIVA_ID TO 38374384;

Gallosuarez 26-02-2011 16:09:59

Posible solución ...
 
Gustavo:

Para reiniciar a cero un generador desde un bloque PSQL (es decir desde un procedimiento almacenado o desde un disparador), tienes que ejecutar la siguiente instrucción:
Código SQL [-]
SELECT GEN_ID(NOMBRE_GENERADOR, (SELECT (GEN_ID(NOMBRE_GENERADOR, 0) * -1) FROM RDB$DATABASE)) FROM RDB$DATABASE

Una vez que lo hayas reiniciado a cero le puedes sumar cierta cantidad para ponerlo a cierto valor.

Código SQL [-]
SELECT GEN_ID(NOMBRE_GENERADOR, NUEVO_VALOR) FROM RDB$DATABASE

Saludos,
Gerardo Suárez Trejo

PD. No estoy muy seguro si la solución que te da Casimiro funcione haciendo lo desde un bloque PSQL, según yo creo que no.... saludos nuevamente

Casimiro Noteví 26-02-2011 16:15:44

Perdón, no había leído "desde un trigger"

GustavoCruz 02-03-2011 18:08:56

Hola a todos y gracias por sus respuestas y sugerencias,

He probado como mi amigo Gallosuarez me ha indicado, pero me aparece el siguiente error que me lanza IBExpert
Código SQL [-]
---------- STATEMENT ----------

CREATE trigger contable_bi0 for contable
active before insert position 0
AS
begin
  /* Trigger text */
  SELECT GEN_ID(gen_contrataciones, (SELECT (GEN_ID(gen_contrataciones, 0) * -1) FROM RDB$DATABASE)) FROM RDB$DATABASE;
  SELECT GEN_ID(gen_contrataciones, new.concontrato) FROM RDB$DATABASE;
end



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

Invalid token.
Dynamic SQL Error.
SQL error code = -104.
Token unknown - line 6, column 119.
;.

Gracias por vuestro tiempo y vuestra ayuda

Gustavo Cruz

guillotmarc 02-03-2011 21:14:40

Buenas tardes.

Cita:

Empezado por GustavoCruz (Mensaje 392449)
Hola a todos y gracias por sus respuestas y sugerencias,

He probado como mi amigo Gallosuarez me ha indicado, pero me aparece el siguiente error que me lanza IBExpert

Probablemente porqué lo ejecutas como una consulta y es un script.

Prueba a ejecutarlo desde Tools -> Script Executive, en lugar de hacerlo desde Tools -> SQL Editor.

Saludos.

Gallosuarez 03-03-2011 01:00:08

Posible solución ...
 
Gustavo:

Acuérdate que TODA instrucción SELECT dentro de un bloque PSQL debe de llevar la clausula INTO :valor_de_variable. Es por esta razón que te marca un error en ";" Es decir, el compilador de la base de datos está esperando dicha instrucción.

Aquí te pongo un procedimiento donde yo lo utilizo.
Código SQL [-]
CREATE OR ALTER PROCEDURE CALC_CTRL_SEP
RETURNS (
    CTRL_SEP VARCHAR(14))
AS
declare variable aa char(2);
declare variable id_u_admtva char(1);
declare variable entidad char(2);
declare variable id_estado smallint;
declare variable tipo_plantel char(2);
declare variable no_plantel char(3);
declare variable consecutivo smallint;
begin
/* Calcula el Número de Control SEP de acuerdo a los parámetros del sistema */
  select id_u_admtva, id_estado, tipo_plantel, no_plantel
  from sysparams into :id_u_admtva, :id_estado, :tipo_plantel, :no_plantel;
  consecutivo = next value for gen_ctrl_sep;
/* Resetea gen_ctrl_sep = 0 */
  if (consecutivo > 9999) then
  begin
    select gen_id(gen_ctrl_sep, (select (gen_id(gen_ctrl_sep, 0) * -1)
    from rdb$database)) from rdb$database into :consecutivo;
    consecutivo = next value for gen_ctrl_sep;
  end
  entidad = lpad(cast(id_estado as varchar(2)), 2, '0');
  aa = right(cast(extract(year from current_date) as char(4)), 2);
  CTRL_SEP = aa || id_u_admtva || entidad || tipo_plantel ||
    no_plantel || lpad(cast(consecutivo as varchar(4)), 4, '0');
end

Saludos,
Gerardo Suárez Trejo.

PD. En tu caso, debes de utilizar las llamadas variables Tontas ... ¿me explico?

GustavoCruz 03-03-2011 02:05:33

Gracias Gallosuarez, por tu colaboración. Eso era exactamente lo que estaba ocurriendo.

He notado que ultimamente sufro de segera :D:D:D

Nuevamente mil gracias por sus sugerencias y respuestas


Gustavo Cruz


La franja horaria es GMT +2. Ahora son las 19:12:04.

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