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)
-   -   Campo AutoIncremental PrimaryKey (https://www.clubdelphi.com/foros/showthread.php?t=3268)

cpal 29-08-2003 23:35:56

Campo AutoIncremental PrimaryKey
 
Holas,
Tengo un problema, quiero que mi campo autoincremental (se hacerlo, generador y trigger) el prblema es que como es llave primaria, tengo que poner que es NOT NULL y de esa forma no me permite grabar registros ¿Comop uedo hacerlo?. Ahh, uso Interbse 6.0

jachguate 30-08-2003 00:00:19

Si no te permite grabarlo en IB console u otra interfaz SQL es quizas porque tu trigger está definido como after insert, cuando en realidad debiera ser before insert.

Si no te permite grabarlo desde Delphi, simplemente pone a false la propiedad Required del campo.

Hasta luego.

;)

cpal 30-08-2003 16:37:47

Esta definido en Before Insert, y cuando creo la base es NOT NULL PRIMARY KEY, si no pusiese el NOT NULL, estaria todo bien, pero no me admitiria que es PRIMARI KEY, es decir yo quiero un campo autoincremental que sea PRIMARY KEY, y eso es lo que no me acepta. ¿Alguna idea?

NickName 30-08-2003 20:34:30

Cita:

es decir yo quiero un campo autoincremental que sea PRIMARY KEY, y eso es lo que no me acepta. ¿Alguna idea?
La tabla

Código:

CREATE TABLE Empleados
(
  Codigo                INTEGER NOT NULL,
  FECHAREGISTRO        DATE,
  PRIMARY KEY (Codigo)
);

El Generador
Código:

CREATE GENERATOR CodigoEmpleado;
El Trigger

Código:

create trigger NuevoEmpleado for Empleados
      active before insert
as
begin
      if (new.Codigo is null) then
                new.Codigo = gen_id(CodigoEmpleado, 1);
end ^

Espero te sirva....

Saludos..

cpal 02-09-2003 00:30:34

holas
ya probe con tu concejo, pero me sigue botando el mismo error, es decir, lo creo, pero al momento de guardar, me bota el error de que no he puesto datos a la llave primaria, paree que primero se ejecut la llamada del NOT NULL, y ahi es donde ta el error, porque si no fuese ot null, funciona de las mil maravillas

Julià T. 02-09-2003 02:13:30

Prueba lo siguiente:

Código:


CREATE TABLE Empleados
(
  Codigo INTEGER DEFAULT -1 NOT NULL,
  FECHAREGISTRO        DATE,
  PRIMARY KEY (Codigo)
);
CREATE TABLE Empleados

Código:

create trigger NuevoEmpleado for Empleados
      active before insert
as
begin
      if (new.Codigo=-1 null) then
                new.Codigo = gen_id(CodigoEmpleado, 1);
end ^


jacanche 02-09-2003 03:23:52

Hola,
Ese error sucede cuando ya tiene datos la tabla e intentas añadir un campo not null, por medio del Alter Table, ¿ es ese tu caso?, es la unica manera que se me ocurre que pueda generarse ese error, si es asi, no lo vas a poder hacer de esa manera, tienes que crear la tabla con la nueva estructura e insertar los registros que tuvieras.


Saludos
Alfredo

erickperez6 03-09-2003 15:04:18

Yo tenia el mismo problema, lo que hago es pasarle un valor temporal al campo codigo, luego de guardar el registro someto la transaccion con un commit o commitretaing, y despues de hacer esto el trigger hace su trabajo y el valor temporal que le pase al campo codigo lo cambia por el valor devuelto por el generador.

Realmente no me parece la solucion mas correcta, pero resolvio mi problema por los momentos.

cpal 04-09-2003 19:41:17

Ya probe de todo, no sale, alguna otra idea???

Julià T. 04-09-2003 21:17:54

como indica jacanche, antes de convertir la tabla no deben existir campos null, si existen, la conversión fallará.

Creo que ese el problema

NickName 08-09-2003 23:12:51

Prueba con un Backup y luego Restore a tu Base de datos.

has tus pruebas.....

Ojala Funcione.

Saludos.

Argaron 09-09-2003 18:39:29

Hola no se que componentes estas utilizando, si utilizas los de Interbase, trae un componente llamado IBDataSet que tiene la priedad GENERATOR FIELD, en la cual puedes indicar que generador usar, sobre que campo y cuando lo debe usar, al insertar, hacer el post etc,etc. En tu caso seria enlazar el generador creado con el campo clave y que lo incrementara con el post.

cpal 10-09-2003 17:55:02

SE que con Delphi se puede solucionar, pero lo que necesito es que la misma BD haga el incremento del campo. probe con el

...
default -1
...

que me aconcejaron atras, pero al crear el trigger me bota el error en

if (new.idcliente=-1 null) then

en la parte de NULL

buitrago 10-09-2003 19:21:50

Hey....!!!!!!!

Esto es lo que yo hago.....y me funcion perfecto. Si es para el autoincremental.

Bien ahi va:

Creo mi Generator, nombrarlo Mi_Generador.
Creo un Procedure Almacenado que se nombrará MI_Procedure_Generador
Este es su código

Create procedure MI_Procedure_Generador
returns (NUEVO integer)
As
Begin
NUEVO = GEN_ID(MI_Procedure_Generador,1);
SUSPEND
END

Y claro, tengo una tabla que le nombraremos MI_TABLA con un campo de llame primerria que le nombraremos MI_CODIGO

Voy bien?

En Delphi ahora:

Tengo un IBTable con sus campos creados.
Les creo todos sus TFields pero atención!!!!!!!, al Field del Código (MI_TABLAMI_CODIGO) cambiale la propieda required y colocala en False.

Creas un TIBStoredProc que apunte a el Procedimiento de Interbase o FireBird. A este TIBStoredProc ponle asociado otro TIBTransaction que al de la Tabla.
Además, sácale su Parametro a través de la propiedad Params
Debe decirte que es de tipo OutPut y que ademas es Integer

Ahora en el evento OnBeforePost de la Tabla, al final, despues que has visto todos los chequeos que puedan hacer explotar la grabación, esccribe esto:

if MI_TABLA.State in [dsInsert] then Begin
Aqui pones la Transaccion del Procedimiento en StartTransaction;
Le das Prepare;
desues ExecProc;
Le das Commit a la Transaccion
y ahora dices :
MI_TABLAMI_CODIGO.Value = ParamByName('NUEVO').AsInteger;
End; // del begin

Espero que sirva, esto lo uso mucho y pone casi la probabilidad que se ejecute el Generador y no se grabe a 0, ay que como ven es hecho en el OnBeforePost pero justo antes de darle el mando a Interbase.

Si amarraste todo bien, viva el consecutivo!!!!!!!!!!!!!!!!!!!

espero que sirva de ayuda.

Fernando Buitrago

Nota: Tengo los dedos cansaos', jejejejejej


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

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