![]() |
Obtener campo autoinc con Firedac
Hola, como comente en otros post, estoy migrando una bd a FireBird.
He creado algunas tablas con algun campo autoinc con su correspondiente trigger. Mi consulta es luego de terminar el insert en una tabla, necesito obtener cual es el numero "autogenerado" para insertar en otra tabla como referencia. He leido algunos post donde indican que el componente firedac trae alguna propiedad para ello pero no he podido acceder a ella. Es esta la mejor solucion ? Saludos y gracias. |
Hola.
No he usado los componentes, pero revisa si el método GetLastAutoGenValue del la clase TADCustomConnection te sirve. Saludos :) |
Gracias ecfisa, pruebo y comento.
Saludos |
Hola compañeros.
Supondo que tendrás un tigger before insert. Yo además tengo un procedimiento almacenado que pasa a una variable antes del Post o de ApplyUpdates en nuevo valor generado por el generador al lado del servidor luego con ese valor sería fácil pasarlo a otra tabla. // lado del ejecutable antes de post o ApplyUpdates // lado del servidor procedimiento almacanedo
Un saludo y suerte. |
Sí, usa la función GetLastAutoGenValue con FDConnection
Te indicará el número del Generador en la actualidad, como te han dicho ya.
Me pregunto si existe una función parecida para el caso de haber definido un campo IDentificador con Firebird 3.0 mediante: ID Integer Generated by Default as Identity Primary Key; Saludos, bulc |
Cita:
|
¿alguien ha conseguido obtener el ultimo ID desde in INSERT/SELECT??
Cita:
|
¿No te sirven las respuestas que han dado?
|
Sí, gracias
Lo daba por terminado. Los siento.
|
Cita:
|
Si en IBEXPERT ejecuto el siguiente codigo
Inserta y me devuelve el ID que es un AUTOINCREMENT IDENTITY COLUMN Ahora si lo ejecuto desde un FDQUERY Tengo el siguiente error: [FireDAC][Phys][FB]Dynamic SQL Error SQL error code = -104 Token unknown - line 5, column 1 returning Soy nuevo con firebird y estoy aprendiendo muchas cosas aún. Con Sybase Advantage Database lo hacía de forma similar, pero en lugar del returning ejecutaba SELECT LASTAUTOINC( STATEMENT ) as id from tabla |
Aparentemente con los "FD" será algo similar, llamas a:
|
Bluc
¿como hiciste para obtener el campo Identity? Ya que por lo visto esa función GetLastAutoGenValue sólo es para Generators, o bien a mi no me anda. Si la ejecuto me da error
Cita:
|
Cita:
|
No existe esa función
si no se ha usado el sistema de autoincremento mediante Trigger y Generador.
Cabe pensar que usando Firebird 3.0 sería más cómodo usar un Incremento de contador automático. Bueno, claramente es posible. Pero con el sistema de Trigger y Generador se tiene esa ventaja. Yo me he decantado por usar esa última modalidad. Desconozco si en caso de usar el novedoso sistema automático de Firebird 3.0, se puede recoger el último número generado mediante esa función GetLastAutoGenValue. ¿Alguien lo sabe? |
Cita:
Otra cosa distinta es que los componentes que está usando permita hacer uso de ello. De todas formas, si no pone el código que está usando, ni da más información, es difícil ayudar. |
Utilizo Firebird 3, y el campo clave ID es un AUTOINCREMENT IDENTITY COLUMN
El código que utilizo, lo puse antes arriba, es el siguiente, lo ejecuto en un FDQuery
Cita:
|
Cita:
|
Firebird 3.0 Generalidades de las columnas tipo IDENTITY
En firebird 3.0 se introdujo el uso de las columnas tipo IDENTITY, este tipo de campos producen identificadores únicos en la columna declarada utilizando un generador interno; para soportar este tipo de columnas se han agregado un par de campos a la tabla RDB$RELATION_FIELDS:
Ahora bien, al momento de declarar una columna de tipo IDENTITY no es necesario crear el disparador, tampoco creamos un generador por nuestra cuenta, todo esto se realiza internamente por el motor de Firebird 3. Sin embargo, el generador existe, y para obtener el valor actual del generador que le fue asignado a nuestro columna, primero debemos averiguar que nombre le ha puesto Firebird a dicho generador, para lo cual, realizamos una consulta a la tabla RDB$RELATION_FIELDS de la siguiente manera: El resultado de esta consulta nos arrojará el nombre del generador que se le ha asignado a la columna ID en la tabla TABLA_X (supongamos que el resultado fue RDB$3), enseguida solo resta ejecutar las instrucciones ya conocidas para el manejo e incremento de generadores: Para obtener el valor actual del generador usando instrucciones SQL: Desde Delphi:
Para obtener el siguiente valor del generador
A partir de Firebird 2.0 se recomienda usar NEXT VALUE FOR en lugar de GEN_ID(<NombreGenerador>, <Incremento>) a menos que se desee incrementar el generador en un valor diferente a 1 Finalmente, una vez que hemos identificado el nombre del generador de nuestra columna IDENTITY podemos obtener el valor del generador mientras se ejecuta la sentencia INSERT, por ejemplo:
Desde delphi usando las propiedades del componente FDQuery
gpImmediate incrementa en 1 el valor del generador RDB$3 justo en el momento en el que se inserta un nuevo registro en la tabla, y le asigna el valor obtenido al campo ID, sin la necesidad de incluir la instrucción NEXT VALUE FOR en la sentencia SQL |
La franja horaria es GMT +2. Ahora son las 03:21:19. |
Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi