FTP | CCD | Buscar | Trucos | Trabajo | Foros |
|
Registrarse | FAQ | Miembros | Calendario | Guía de estilo | Temas de Hoy |
|
Herramientas | Buscar en Tema | Desplegado |
#1
|
|||
|
|||
Locura Con Interbase
Tengo una base de datos con Interbase a la que le he pasado los datos de varias bases en access con un programilla que he tenido que hacer. El campo de la clave primaria se debe incrementar cada vez que se introduce un registro. Con la base de datos vacia no hay ningun problema inserta el registro, incrementa la clave primaria etc. todo bien. El problema esta cuando intento insertar un nuevo registro en la base con los datos pasados desde access me da un error de clave primaria. Los numeros de la clave primaria estan bien ya que con los programas IB_SQL y Database Desktop corre perfectamente del primer al ultimo registro.
Con la aplicacion que estoy haciendo al darme ese problema he pensado en incrementar la clave primaria con codigo, pero sigue dandome el error, poniendole un Dbnavigator he visto que el problema es que la base no corre buscando ni al primer ni ultimo registro y claro si no llega al ultimo registro no puede crear la clave primaria. Alquien me puede comentar a que es debido esto que me tiene totalmente parado. Un saludo y gracias anticipadas. |
#2
|
|||
|
|||
Hola:
Si pusieras el error que te da sería más fácil averiguar lo que puede pasar. De todas formas si con la base de datos vacía coge bien el valor de la llave primaria y no da error puede ser que al añadir el valor cuando ya tienes datos estés duplicando algún valor y te de error por eso. Averigua cual es el mayor valor que tienes y puedes hacer un generador con ese valor y utilizar el generador para incrementar automáticamente los valores del campo clave. Un saludo. |
#3
|
|||
|
|||
El error efectivamente es que intenta duplicar el campo de la clave primaria, por que no coge la referencia del ultimo registro para incrementar en uno al insertar otro nuevo. Esto lo he hecho con codigo pero da el mismo error. El problema es que con datos no corre la base hasta el ultimo registro y por eso crea el problema con la clave primaria, y esto es lo que no se y me trae loco.
He puesto un Form y el el un Ibdatabase,Ibtransaction,Ibdataset y un Dbnavigator enlazandolos todos y le he dado al cursor para que corran los registros y el tema esta en que la clava primara se encuentra con un orden que el IBdataset le pone, pero que no es el correlativo como podia ser 1,2,3,4,5 etc. y por eso no coge el ultimo registro para incrementar el numero e insetar el nuevo registro. Alguien sabe porque no deja los registros ordenados como se ven con los otros programes que he señalado en la consulta?. Última edición por perillan fecha: 28-06-2005 a las 11:55:39. |
#4
|
||||
|
||||
Bueno... puestos así, es imposible saber que pasa. No comentas siquiera cómo es que generas los nuevos valores para la llave primaria, ni has puesto un trozo de código que lo aclare.
¿te basas en un generador? Si es así, pues alterá el valor del generador para que parta del primer número válido para la clave primaria y problema solucionado. Hasta luego.
__________________
Juan Antonio Castillo Hernández (jachguate) Guía de Estilo | Etiqueta CODE | Búsca antes de preguntar | blog de jachguate |
#5
|
|||
|
|||
Perdonar si me estoy esplicando mal, el tema es que ahora he estado con ello y en el programilla ultimo con el from la base de datos y el dbnavigator con la base activada no tienen un orden correlativo los numeros del campo primario o llave.Si inserto un registro con el dbnavigator genera un numero repetido y da error no pudiendose hacer la insercion. Como el ultimo registro es el 900 si yo lo pongo manuel con el 901 lo inserta perfectamente. Si la base de datos la dejo sin registro ninguno (limpia) se genera perfectamente la clave primaria en el nuevo registro y todo perfecto.
La clave primaria es un campo integer y lo que no entiendo es porque si hay datos elige un numero cualquiera y no el ultimo retistro metido con lo que no daria problemas. Un saludo |
#6
|
|||
|
|||
Hola:
No es que te expliques mal, es que no nos contestas lo que te hemos preguntado, y entonces hay que ir adivinando, y a veces uno adivina bien, otras mal y otras no tiene ganas de adivinanzas. ¿Qué error exacto te da? ¿Cómo generas los nuevos valores cuando te da el error? Estás empeñado en el orden del campo llave y eso en este caso no tiene ninguna importancia, a no ser que busques el valor mayor y quieras que esté en el último registro para ir a buscarlo allí, en cuyo caso bastaría con ordenar la tabla por ese campo. Lo que a mi me parece, es que piensas que por poner un DBNavigator y añadir un registro, va a ir al último registro, va a coger el valor que tiene y va a incrementarlo, y esto no es así. El valor incrementado lo tienes que generar tu de alguna manera, por el solo hecho de añadir un registro no se va a generar el solo, puedes hacerlo manualmente como tu dices o de una forma automática, con un generador por ejemplo. Con un generador: Crea un generador, por ejemplo G_CODIGOMIO Asignale el valor más alto que tengas en el campo En el IBDataSet, propiedad GeneratorField pones.. Generator: G_CODIGOMIO Field: ELQUESEA Increment by: 1 Apply Event: On New Record Con esto cada vez que añadas un registro automáticamente se incrementará el último valor en uno y se colocará ese valor en el campo ELQUESEA Un saludo. |
#7
|
|||
|
|||
Hola: el error que da es el siguiente:
violation fo primary or uniquey constrart "integ-2" on table "tabla". El generador lo he tenido creado, así como la configuración del ibdataset igual al ejemplo que me pones. Lo que no tengo ni se como se hace es es asignarle el valor mas ato al generador. Un saludo. |
#8
|
|||
|
|||
Hola:
Si creas el generador sin más el valor que coge es 0 y seguramente por eso te dará el error. Yo lo hago con IBExpert (es muy bueno y gratuito en su versión personal). Te digo los pasos con IBExpert, de otra forma ahora mismo no se hacerlo. Registrar la base de datos, después de registrada doble click para conectarse, aparece la opción generadores, con el botón dcho. sobre él aparece un menú para crear nuevo o si ya existen con doble click sobre el nombre del generador se va pasando a la ventana de la dcha. donde se puede cambiar el valor. Una vez cambiado el valor o el nombre no olvidar compilarlo (botón con rayo amarillo) y Commit para que coja los nuevos valores. Un saludo. |
#9
|
|||
|
|||
Muchas gracias por todo Fidel.
Es mi gran desconocimiento con interbase. El problema estaba como tu dices en el generador que yo no sabia que habia que asignarle un valor. Lo he hecho con IB_SQL y funciona perfectamente. Un cordial saludo. Agustin. |
|
|
|