![]() |
![]() |
![]() |
![]() |
![]() |
FTP | ![]() |
![]() |
CCD | ![]() |
![]() |
Buscar | ![]() |
![]() |
Trucos | ![]() |
![]() |
Trabajo | ![]() |
![]() |
Foros | ![]() |
|
Registrarse | FAQ | Miembros | Calendario | Guía de estilo | Temas de Hoy |
![]() |
|
Herramientas | Buscar en Tema | Desplegado |
|
#1
|
|||
|
|||
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 |
#2
|
||||
|
||||
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 |
#3
|
|||
|
|||
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?
|
#4
|
||||
|
||||
Cita:
Código:
CREATE TABLE Empleados ( Codigo INTEGER NOT NULL, FECHAREGISTRO DATE, PRIMARY KEY (Codigo) ); Código:
CREATE GENERATOR CodigoEmpleado; 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 ^ Saludos.. |
#5
|
|||
|
|||
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 |
#6
|
|||
|
|||
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 ^ |
#7
|
|||
|
|||
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 |
#8
|
|||
|
|||
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. |
#9
|
|||
|
|||
Ya probe de todo, no sale, alguna otra idea???
|
#10
|
|||
|
|||
como indica jacanche, antes de convertir la tabla no deben existir campos null, si existen, la conversión fallará.
Creo que ese el problema |
#11
|
||||
|
||||
Prueba con un Backup y luego Restore a tu Base de datos.
has tus pruebas..... Ojala Funcione. Saludos. |
#12
|
|||
|
|||
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.
|
#13
|
|||
|
|||
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 |
#14
|
|||
|
|||
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 |
![]() |
|
|
![]() |
|