Club Delphi  
    FTP   CCD     Buscar   Trucos   Trabajo   Foros

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

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 29-08-2003
cpal cpal is offline
Registrado
 
Registrado: jun 2003
Posts: 8
Poder: 0
cpal Va por buen camino
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
Responder Con Cita
  #2  
Antiguo 30-08-2003
Avatar de jachguate
jachguate jachguate is offline
Miembro
 
Registrado: may 2003
Ubicación: Guatemala
Posts: 6.254
Poder: 28
jachguate Va por buen camino
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.

__________________
Juan Antonio Castillo Hernández (jachguate)
Guía de Estilo | Etiqueta CODE | Búsca antes de preguntar | blog de jachguate
Responder Con Cita
  #3  
Antiguo 30-08-2003
cpal cpal is offline
Registrado
 
Registrado: jun 2003
Posts: 8
Poder: 0
cpal Va por buen camino
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?
Responder Con Cita
  #4  
Antiguo 30-08-2003
Avatar de NickName
NickName NickName is offline
Miembro
 
Registrado: may 2003
Ubicación: Guerrero, México
Posts: 96
Poder: 22
NickName Va por buen camino
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..
Responder Con Cita
  #5  
Antiguo 02-09-2003
cpal cpal is offline
Registrado
 
Registrado: jun 2003
Posts: 8
Poder: 0
cpal Va por buen camino
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
Responder Con Cita
  #6  
Antiguo 02-09-2003
Julià T. Julià T. is offline
Miembro
 
Registrado: may 2003
Ubicación: en el teclado
Posts: 314
Poder: 21
Julià T. Va por buen camino
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 ^
Responder Con Cita
  #7  
Antiguo 02-09-2003
jacanche jacanche is offline
Miembro
 
Registrado: may 2003
Ubicación: Campeche,Campeche,Mexico
Posts: 137
Poder: 22
jacanche Va por buen camino
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
Responder Con Cita
  #8  
Antiguo 03-09-2003
erickperez6 erickperez6 is offline
Miembro
 
Registrado: may 2003
Posts: 152
Poder: 22
erickperez6 Va por buen camino
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.

Última edición por erickperez6 fecha: 03-09-2003 a las 15:06:31.
Responder Con Cita
  #9  
Antiguo 04-09-2003
cpal cpal is offline
Registrado
 
Registrado: jun 2003
Posts: 8
Poder: 0
cpal Va por buen camino
Ya probe de todo, no sale, alguna otra idea???
Responder Con Cita
  #10  
Antiguo 04-09-2003
Julià T. Julià T. is offline
Miembro
 
Registrado: may 2003
Ubicación: en el teclado
Posts: 314
Poder: 21
Julià T. Va por buen camino
como indica jacanche, antes de convertir la tabla no deben existir campos null, si existen, la conversión fallará.

Creo que ese el problema
Responder Con Cita
  #11  
Antiguo 08-09-2003
Avatar de NickName
NickName NickName is offline
Miembro
 
Registrado: may 2003
Ubicación: Guerrero, México
Posts: 96
Poder: 22
NickName Va por buen camino
Prueba con un Backup y luego Restore a tu Base de datos.

has tus pruebas.....

Ojala Funcione.

Saludos.
Responder Con Cita
  #12  
Antiguo 09-09-2003
Argaron Argaron is offline
Miembro
 
Registrado: may 2003
Posts: 20
Poder: 0
Argaron Va por buen camino
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.
Responder Con Cita
  #13  
Antiguo 10-09-2003
cpal cpal is offline
Registrado
 
Registrado: jun 2003
Posts: 8
Poder: 0
cpal Va por buen camino
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
Responder Con Cita
  #14  
Antiguo 10-09-2003
buitrago buitrago is offline
Miembro
 
Registrado: sep 2003
Posts: 156
Poder: 21
buitrago Va por buen camino
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
Responder Con Cita
Respuesta



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 00:38:02.


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
Copyright 1996-2007 Club Delphi