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 Buscar Temas de Hoy Marcar Foros Como Leídos

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 09-10-2017
Avatar de lbidi
lbidi lbidi is offline
Miembro
 
Registrado: oct 2003
Ubicación: Montevideo- URUGUAY
Posts: 417
Poder: 21
lbidi Va por buen camino
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.
Responder Con Cita
  #2  
Antiguo 09-10-2017
Avatar de ecfisa
ecfisa ecfisa is offline
Moderador
 
Registrado: dic 2005
Ubicación: Tres Arroyos, Argentina
Posts: 10.508
Poder: 36
ecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to behold
Hola.

No he usado los componentes, pero revisa si el método GetLastAutoGenValue del la clase TADCustomConnection te sirve.

Saludos
__________________
Daniel Didriksen

Guía de estilo - Uso de las etiquetas - La otra guía de estilo ....
Responder Con Cita
  #3  
Antiguo 10-10-2017
Avatar de lbidi
lbidi lbidi is offline
Miembro
 
Registrado: oct 2003
Ubicación: Montevideo- URUGUAY
Posts: 417
Poder: 21
lbidi Va por buen camino
Gracias ecfisa, pruebo y comento.

Saludos
Responder Con Cita
  #4  
Antiguo 10-10-2017
botones67 botones67 is offline
Miembro
 
Registrado: may 2003
Posts: 104
Poder: 0
botones67 cantidad desconocida en este momento
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
Código SQL [-]
datos.modulodb.proce.ExecProc;
      datos.modulodb.Cliente_Maestro.FieldByName('id').AsInteger := datos.modulodb.PROCE.ParamByName('CODD3').AsInteger;
// lado del servidor procedimiento almacanedo
Código SQL [-]
CREATE PROCEDURE NUEVO
      RETURNS( CODD3 INTEGER)
      AS
        BEGIN
          CODD3=GEN_ID(MAESTRO_ID_GEN,1);
          SUSPEND;
       END


Un saludo y suerte.
Responder Con Cita
  #5  
Antiguo 13-03-2018
Avatar de bulc
bulc bulc is offline
Miembro
 
Registrado: jun 2010
Posts: 412
Poder: 14
bulc Va por buen camino
Sí, usa la función GetLastAutoGenValue con FDConnection

Te indicará el número del Generador en la actualidad, como te han dicho ya.
Código Delphi [-]
Var nGen : Integer;
Begin
  nGen :=  DataModuleX.FDConnection1.GetLastAutoGenValue('Gen_aTable')
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
Responder Con Cita
  #6  
Antiguo 13-03-2018
Avatar de bulc
bulc bulc is offline
Miembro
 
Registrado: jun 2010
Posts: 412
Poder: 14
bulc Va por buen camino
Cita:
Empezado por botones67 Ver Mensaje
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
Código SQL [-]
datos.modulodb.proce.ExecProc;
      datos.modulodb.Cliente_Maestro.FieldByName('id').AsInteger := datos.modulodb.PROCE.ParamByName('CODD3').AsInteger;
// lado del servidor procedimiento almacanedo
Código SQL [-]
CREATE PROCEDURE NUEVO
      RETURNS( CODD3 INTEGER)
      AS
        BEGIN
          CODD3=GEN_ID(MAESTRO_ID_GEN,1);
          SUSPEND;
       END


Un saludo y suerte.
No entiendo cómo se ejecuta el SP 'NUEVO' en las dos primeras líneas. ¿Puedes ampliarlo, por favor?
Responder Con Cita
  #7  
Antiguo 14-03-2019
amadis amadis is offline
Miembro
 
Registrado: may 2005
Ubicación: San José, Colón, Entre Ríos, Argentina
Posts: 315
Poder: 19
amadis Va por buen camino
¿alguien ha conseguido obtener el ultimo ID desde in INSERT/SELECT??

Cita:
Empezado por bulc Ver Mensaje
Te indicará el número del Generador en la actualidad, como te han dicho ya.
Código Delphi [-]
Var nGen : Integer;
Begin
  nGen :=  DataModuleX.FDConnection1.GetLastAutoGenValue('Gen_aTable')
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
Responder Con Cita
  #8  
Antiguo 14-03-2019
Avatar de Casimiro Notevi
Casimiro Notevi Casimiro Notevi is offline
Moderador
 
Registrado: sep 2004
Ubicación: En algún lugar.
Posts: 32.021
Poder: 10
Casimiro Notevi Tiene un aura espectacularCasimiro Notevi Tiene un aura espectacular
¿No te sirven las respuestas que han dado?
Responder Con Cita
  #9  
Antiguo 14-03-2019
Avatar de bulc
bulc bulc is offline
Miembro
 
Registrado: jun 2010
Posts: 412
Poder: 14
bulc Va por buen camino
Sí, gracias

Lo daba por terminado. Los siento.
Responder Con Cita
  #10  
Antiguo 14-03-2019
Avatar de Casimiro Notevi
Casimiro Notevi Casimiro Notevi is offline
Moderador
 
Registrado: sep 2004
Ubicación: En algún lugar.
Posts: 32.021
Poder: 10
Casimiro Notevi Tiene un aura espectacularCasimiro Notevi Tiene un aura espectacular
Cita:
Empezado por bulc Ver Mensaje
Lo daba por terminado. Los siento.
Pero tú no eres quien ha preguntado
Responder Con Cita
  #11  
Antiguo 15-03-2019
amadis amadis is offline
Miembro
 
Registrado: may 2005
Ubicación: San José, Colón, Entre Ríos, Argentina
Posts: 315
Poder: 19
amadis Va por buen camino
Si en IBEXPERT ejecuto el siguiente codigo

Código SQL [-]
insert into tabla
(campo)
values
('prueba')
returning id

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
Responder Con Cita
  #12  
Antiguo 15-03-2019
Avatar de Casimiro Notevi
Casimiro Notevi Casimiro Notevi is offline
Moderador
 
Registrado: sep 2004
Ubicación: En algún lugar.
Posts: 32.021
Poder: 10
Casimiro Notevi Tiene un aura espectacularCasimiro Notevi Tiene un aura espectacular
Aparentemente con los "FD" será algo similar, llamas a:
Código Delphi [-]
FDConnection1.GetLastAutoGenValue('Gen_aTable')
Responder Con Cita
  #13  
Antiguo 15-03-2019
amadis amadis is offline
Miembro
 
Registrado: may 2005
Ubicación: San José, Colón, Entre Ríos, Argentina
Posts: 315
Poder: 19
amadis Va por buen camino
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

Código Delphi [-]
[FireDAC][Phys][FB]invalid request BLR at offset 55
generator TABLA is not defined

Cita:
Empezado por bulc Ver Mensaje
Te indicará el número del Generador en la actualidad, como te han dicho ya.
Código Delphi [-]
Var nGen : Integer;
Begin
  nGen :=  DataModuleX.FDConnection1.GetLastAutoGenValue('Gen_aTable')
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
Responder Con Cita
  #14  
Antiguo 15-03-2019
Avatar de Casimiro Notevi
Casimiro Notevi Casimiro Notevi is offline
Moderador
 
Registrado: sep 2004
Ubicación: En algún lugar.
Posts: 32.021
Poder: 10
Casimiro Notevi Tiene un aura espectacularCasimiro Notevi Tiene un aura espectacular
Cita:
Empezado por amadis Ver Mensaje
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
¿Qué código estás usando? ¿y cuál es el error?
Responder Con Cita
  #15  
Antiguo 15-03-2019
Avatar de bulc
bulc bulc is offline
Miembro
 
Registrado: jun 2010
Posts: 412
Poder: 14
bulc Va por buen camino
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?
Responder Con Cita
  #16  
Antiguo 15-03-2019
Avatar de Casimiro Notevi
Casimiro Notevi Casimiro Notevi is offline
Moderador
 
Registrado: sep 2004
Ubicación: En algún lugar.
Posts: 32.021
Poder: 10
Casimiro Notevi Tiene un aura espectacularCasimiro Notevi Tiene un aura espectacular
Cita:
Empezado por bulc Ver Mensaje
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?
Eso está disponible desde firebird 2, creo recordar.
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.
Responder Con Cita
  #17  
Antiguo 15-03-2019
amadis amadis is offline
Miembro
 
Registrado: may 2005
Ubicación: San José, Colón, Entre Ríos, Argentina
Posts: 315
Poder: 19
amadis Va por buen camino
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

Código SQL [-]
insert into tabla
(campo)
values
('prueba')
returning id


Cita:
Empezado por Casimiro Notevi Ver Mensaje
Eso está disponible desde firebird 2, creo recordar.
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.
Responder Con Cita
  #18  
Antiguo 15-03-2019
Avatar de Casimiro Notevi
Casimiro Notevi Casimiro Notevi is offline
Moderador
 
Registrado: sep 2004
Ubicación: En algún lugar.
Posts: 32.021
Poder: 10
Casimiro Notevi Tiene un aura espectacularCasimiro Notevi Tiene un aura espectacular
Cita:
Empezado por amadis Ver Mensaje
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
Código SQL [-]insert into tabla (campo) values ('prueba') returning id
Vale, entonces ese es el código que usas, bien.
Responder Con Cita
  #19  
Antiguo 17-06-2020
fduron.mx fduron.mx is offline
Registrado
 
Registrado: jun 2020
Posts: 1
Poder: 0
fduron.mx Va por buen camino
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:
  • RDB$GENERATOR_NAME (almacena el nombre del generador que se ha creado automáticamente en RDB$GENERATORS)
  • RDB$IDENTITY_TYPE (almacena un 0 para las columnas definidas como IDENTITY y NULL para las demás)
Hasta el momento la única manera de obtener el valor actual de un generador, es a través de la la función GEN_ID(<nombreDelGenerador>, 0) no entraré en detalles en el uso de esta función.

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:
Código SQL [-]
select rdb$generator_name

from rdb$relation_fields

where rdb$relation_name = 'TABLA_X'
and rdb$field_name = 'ID'
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:

Código SQL [-]
 select GEN_ID(RDB$3, 0) from RDB$DATABASE
Desde Delphi:

Código Delphi [-]
FDQuery1.Connection.GetLastAutoGenValue('RDB$3');


Para obtener el siguiente valor del generador
Código SQL [-]
 select NEXT VALUE FOR RDB$3 from RDB$DATABASE

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:

Código SQL [-]
insert into tabla
(id, campo)
values
(next value for RDB$3, 'prueba')
 returning id


Desde delphi usando las propiedades del componente FDQuery
Código Delphi [-]
FDQuery1.UpdateOptions.AutoIncFields := 'ID';
FDQuery1.UpdateOptions.FetchGeneratorsPoint := gpImmediate;
FDQuery1.UpdateOptions.GeneratorName := 'RDB$3';

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
Responder Con Cita
Respuesta


Herramientas Buscar en Tema
Buscar en Tema:

Búsqueda Avanzada
Desplegado

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

Temas Similares
Tema Autor Foro Respuestas Último mensaje
FireDAC - Problema con relación Maestro/detalle y columna AutoInc jarlos Conexión con bases de datos 4 01-06-2016 06:32:27
Asignar el valor de un campo AutoInc definido en un tirgger_BI KAYO Firebird e Interbase 1 23-09-2008 18:47:05
campo autoinc teclilla Tablas planas 3 14-06-2008 03:10:52
obtener el valor de un campo (Tquery) Yoli Conexión con bases de datos 5 08-04-2005 23:07:05
Recuperar autoinc. después de Insert to aig MS SQL Server 2 22-09-2004 11:41:28


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


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