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 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.044
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
  #2  
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



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 05:32:27
Asignar el valor de un campo AutoInc definido en un tirgger_BI KAYO Firebird e Interbase 1 23-09-2008 17:47:05
campo autoinc teclilla Tablas planas 3 14-06-2008 02:10:52
obtener el valor de un campo (Tquery) Yoli Conexión con bases de datos 5 08-04-2005 22:07:05
Recuperar autoinc. después de Insert to aig MS SQL Server 2 22-09-2004 10:41:28


La franja horaria es GMT +2. Ahora son las 00:22:55.


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