Club Builder - Foros de discusión Club Builder
Foro de C++Builder en español
 
 FAQFAQ   BuscarBuscar   MiembrosMiembros   Grupos de UsuariosGrupos de Usuarios   RegistrarseRegistrarse 
 PerfilPerfil   Entra para ver tus mensajes privadosEntra para ver tus mensajes privados   EntrarEntrar 

Campos autonumericos en Interbase

 
Publicar nuevo tema   Responder al tema    Foros de discusión -> Bases de Datos
Ver tema anterior :: Ver tema siguiente  
Autor Mensaje
Mensaje    Asunto: Campos autonumericos en Interbase Responder citando

Buenas, queria saber cual es la forma para que te generará un campo autonumerico similar al access en interbase, es decir que cada vez que insertara un registro me generara, 1,2,3... sin necesidad de introducirlo yo manualmente, gracias
Volver arriba
Mensaje    Asunto: Responder citando

Existen varias maneras de hacerlo te muestro la que utilizo.

Utilizando un TIBStoredProc, un TIBDataSet, un procedimiento almacenado dentro de la base de datos con la siguiente informacion,

un Generador, llamado G_Valor, esto dentro de la base

Código:
CREATE GENERATOR G_Valor;


y un procedimiento de la siguiente manera

Código:
CREATE PROCEDURE VALOR_ID
RETURNS (P_ID INTEGER)
AS
BEGIN
     P_ID = GEN_ID(G_Valor,1);
END


ahora bien, dentro del codigo de tu programa utlizando los componentes arriba mencionados, establece el sieguiente codigo.

TIBStoredProc // donde va el procedimiento
TIBDataSet // donde esta la conexion de la tabla, puede ser un TTable
pero por eficacia utilizo el TIBDataSet.

bien en un boton por decir el de agregar, pongo el siguiente codigo..

Código:
TIBDataSet ->Insert();
TIBStoredProc ->ExecProc(); // genero el procedimiento en la base
TIBDataSetNuevo_ID->Value = TIBStoredProc->ParamByName("P_ID")->AsInteger;



te recomiendo, que dentro del TIBStoredProc, asignes dentro de su propiedad, StoredProcName, el nombre del Procedimiento almacenado, para que elijas el procedimiento al cual le vas a incrementar el valor..

saludos.. espero que te sirva..
_________________
Cool
Volver arriba
Ver perfil de usuario Enviar mensaje privado Enviar email MSN Messenger
Mensaje    Asunto: Responder citando

Como comenta Cesar es una buena forma de hacerlo, también resulta útil usar un Trigger en vez de un procedimiento almacenado, ya que puede lanzarse el trigger en el momento de insertar una tupla en la tabla, así no hay que calentarse la cabeza con disparar el procedimiento almacenado ya que el trigger responderá automaticamente a la acción planteada.

Ciao.
_________________
OJO!! Ya tenemos subforo de Bases de Datos!!
Gracias a los admins.
Volver arriba
Ver perfil de usuario Enviar mensaje privado Visitar sitio web del autor MSN Messenger
Mensaje    Asunto: Responder citando

Gracias, por vuestras respuestas, es una duda sencilla, si por ejemplo tengo 5 campos con un código autonumerico como clave primaria [1,2,3,4,5} y borro el tercer registro, desaparece la clave 3?, o por el contrario, se me reasignan las claves desapareciendo la clave 5, era solo eso saludos
Volver arriba
Mensaje    Asunto: Responder citando

eso no funciona asi, cuando incremetas el Generador "genrator", de Interbase o Firebird, no se reasignan los numero de los campos.

el generador, siempre te va a incrementar, el numero consecutivo, si borras el numero 3, pues te va a quedar 1,2,4,5 y si insertas otro registro, este sera el numero 6.

para modificar el valor del generador, debes usar la sentencia de SQL,

Código:
SET GENERTATOR <NOMBRE> TO <NUEVO VALOR>,

de la siguiente manera

Código:
SET GENERATOR G_Valor TO 3


esto hace que el generador, inicie en el numero 3, pero, no se rasignan, los campos, ahora bien, si borras y modificas el valor, del generador, vas a tener probelmas por que al insertar un nuevo registro, este contendra el valor de 4 y si ya existe un registro, con ese numero, como clave primaria, interbase o firebird, te regrasaran una excepcion.. indicando que el numero ya existe, y no puden haber claves repetidas

asi mismo, esto es para la integridad referencial, entre tablas, si borras el 3, y esta tabla contiene una referencia por esa clave a otra tabla, *relacion, para ser exactos, debes utilizar los borrados en cascada..

saludos..

mas informacion..

en

Informacion de Firebird e interbase en español
en la parte de Articulos puedes encontrar informacion que puede servirte

saludos..
_________________
Cool
Volver arriba
Ver perfil de usuario Enviar mensaje privado Enviar email MSN Messenger
Mensaje    Asunto: Responder citando

Gracias por la ayuda, una cosilla solamente más, en mi tabla al interbase decirle que el valor de la clave va a ser autonumerico lo que hago que sería ¿Crear un campo codigo de tipo entero no?, y luego hago el tema de un trigger o un procedimiento como me ha indicado no?
Volver arriba
Mensaje    Asunto: Responder citando

exactamente

CREATE TABLE CLASIFICACIONES (
CLAVE_PARA_IDENTIFICADOR INTEGER NOT NULL,
CL_CLASIFICACION VARCHAR (50) CHARACTER SET WIN1251
);

ALGO ASI
_________________
Cool
Volver arriba
Ver perfil de usuario Enviar mensaje privado Enviar email MSN Messenger
Mensaje    Asunto: Responder citando

Hola, estoy mirando este post, y me gustaria Cesar que me explicará desde donde ejecuto este código:

Código:

CREATE GENERATOR G_Valor;

CREATE PROCEDURE VALOR_ID
RETURNS (P_ID INTEGER)
AS
BEGIN
     P_ID = GEN_ID(G_Valor,1);
END

supongo que será desde el ISQL de interbase, pero ¿como lo guardo?, algun nombre especial?
Volver arriba
Mensaje    Asunto: Responder citando

este codigo, se encuentra, dentro de la base de datos, en la opcion de Store procedure,

y dentro de tu codigo, debes poner un componente, llamando TIBStoredProc, de la paleta Interbase

yo lo puse dentro de un modulo de datos




con las siguientes propiedades, en este caso, las mas importantes, son




EL NOMBRE DE LA BASE A LA QUE TE CONECTAS
EL NOMBRE DEL PROCEDIMENTO QUE TE SIRVE PARA INCREMENTAR, "STOREDPROCNAME", en este caso cambie el nombre por

por

Código:
CREATE PROCEDURE EMPRESA_ID
RETURNS (P_ID INTEGER)
AS
BEGIN
     P_ID = GEN_ID(G_Valor,1);
END



Este es el codigo que utilizo, para Incrementarlo dentro de un Boton, llamado Grabar, tiene otras cosas, pero lo importante es que te sirve para lo que desesas





Espero que te pueda servir asi.. saludos
_________________
Cool


Ultima edición por Cesar C. Salazar Gonzalez el Jue 17 Dic, 2009 4:34 pm, editado 2 veces
Volver arriba
Ver perfil de usuario Enviar mensaje privado Enviar email MSN Messenger
Mensaje    Asunto: Responder citando

Hola Cesar en el código:
Código:

CREATE PROCEDURE VALOR_ID
RETURNS (P_ID INTEGER)
AS
BEGIN
     P_ID = GEN_ID(G_Valor,1);
END

previamente declarando el generador y en ese código me sale el siguiente error SQL:
Dynamic SQL Error
SQL error code = -104
Unexpected end of command
Statement: CREATE PROCEDURE EMPRESA_ID
RETURNS (P_ID INTEGER)
AS
BEGIN
P_ID = GEN_ID(G_Valor,1)
Cesar, sabes ¿por qué se produce esto?, me harias gran favor si me supieras decir algo
Volver arriba
Mensaje    Asunto: Responder citando

posiblemente, te falta un punto y coma al final del GEN_ID


Código:
CREATE PROCEDURE VALOR_ID
RETURNS (P_ID INTEGER)
AS
BEGIN
     P_ID = GEN_ID(G_Valor,1);  <--este punto y coma debe ir
END



CREATE PROCEDURE EMPRESA_ID
RETURNS (P_ID INTEGER)
AS
BEGIN
P_ID = GEN_ID(G_Valor,1);
END

EL CODIGO, ES UN EJEMPLO QUE YO PUSE, ESPERO TE SIRVA
_________________
Cool
Volver arriba
Ver perfil de usuario Enviar mensaje privado Enviar email MSN Messenger
Mensaje    Asunto: Responder citando

Gracias Cesar, como siempre de diez tus respuestas, ya para finalizar todas las dudas aunque no la necesite por el mometno pero para zanjar el tema este, un trigger ¿cómo lo ejecutarias desde C++ Builder?, si no es mucho pedir podrias poner un ejemplo estilo al del procedimiento para ver como se ejecuta, mil gracias por tu ayuda
Volver arriba
Mensaje    Asunto: Responder citando

En tu codigo de ejecucion del procedimiento, que significa esta línea:

Código:


IBDEmpresaE_ID->Value



es decir IBDEmpresaE_ID que es?, un IBTable o lo que devuelve el procedimiento que es eso en concreto?
Volver arriba
Mensaje    Asunto: Responder citando

Empezando por la ultima, IBDEmpresaE_ID->Value , es el campo de la tabla Empresa, a la cual le asigno, el valor del procedimiento, como es una Primary Key, entonces no puede estar en valores, nulos, y unicamente cuando el registro es nuevo, es que se le asigna el valor..

*****************************

en la siguiente, los triggers, comunmente disparadores, se crean igual que el procedure,

de la siguiente manera.
Código:
CREATE TRIGGER <NOMBRE> FOR <A>




AFTER (despues) de las acciones


en la parte del body, de las imagenes, puedes poner cualquier codigo de sql, que puedas consultar,

aqui no necesitas realizar nada, como te das cuenta, dentro de las imagenes, tiene las clausas OR INSERT OR UPDATE OR DELETE, que puedes poner las tres o solo una


esto quiere decir, que cuando insertas o modificas o borras, los triggers son disparados automaticamente, dentro del servidor de Firebird o Interbase

y dentro del codigo, de tu aplicacion puedes poner lo siguiente
siguiendo el mismo ejemplo de la base Empresa


Código:
 DMEMPRESA->IBDEmpresa->Insert(); // se ejecuta el triger
 DMEMPRESA->IBDEmpresa->Edit(); // se ejecuta el triger
 DMEMPRESA->IBDEmpresa->Delete(); // se ejecuta el triger


cual quier de las tres, sentencias te ejecuta el triger, denomicando BEFORE (antes) o bien AFTER que es despues de las acciones

Saludos...
_________________
Cool


Ultima edición por Cesar C. Salazar Gonzalez el Jue 17 Dic, 2009 4:37 pm, editado 2 veces
Volver arriba
Ver perfil de usuario Enviar mensaje privado Enviar email MSN Messenger
Mensaje    Asunto: Gemma Responder citando

Cesar de que programa es el interfaz que utilizas para crear los triggers
Volver arriba
Ver perfil de usuario Enviar mensaje privado
Mostrar mensajes de anteriores:   
Cambiar a:  
No puedes publicar temas nuevos en este foro
No puedes responder a temas en este foro
No puedes editar tus mensajes en este foro
No puedes borrar tus mensajes en este foro
No puedes votar en las encuestas de este foro


Hosting WordPress Indedmedia desde 3,99 €
© 2002–2026 Club Builder · Funciona con phpBB.