 |
Club Builder Foro de C++Builder en español
|
| Ver tema anterior :: Ver tema siguiente |
| Autor |
Mensaje |
Frank Invitado
|
Publicado: Mie 19 Ene, 2005 1:25 pm Asunto: Campos autonumericos en Interbase |
|
|
| 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 |
|
 |
Cesar C. Salazar Gonzalez Master


Registrado: 01 Oct 2002Mensajes: 2155Ubicación: San Cristóbal de Las Casas, Chiapas
|
Publicado: Mie 19 Ene, 2005 4:37 pm Asunto: |
|
|
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.. _________________
 |
|
| Volver arriba |
|
 |
XyVy Master


Registrado: 25 Ago 2002Mensajes: 557Ubicación: Murcia (España)
|
Publicado: Vie 21 Ene, 2005 4:28 pm Asunto: |
|
|
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 |
|
 |
Frank Invitado
|
Publicado: Mar 25 Ene, 2005 2:17 pm Asunto: |
|
|
| 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 |
|
 |
Cesar C. Salazar Gonzalez Master


Registrado: 01 Oct 2002Mensajes: 2155Ubicación: San Cristóbal de Las Casas, Chiapas
|
Publicado: Mar 25 Ene, 2005 4:07 pm Asunto: |
|
|
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.. _________________
 |
|
| Volver arriba |
|
 |
Frank Invitado
|
Publicado: Mie 26 Ene, 2005 12:10 pm Asunto: |
|
|
| 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 |
|
 |
Cesar C. Salazar Gonzalez Master


Registrado: 01 Oct 2002Mensajes: 2155Ubicación: San Cristóbal de Las Casas, Chiapas
|
Publicado: Mie 26 Ene, 2005 5:30 pm Asunto: |
|
|
exactamente
CREATE TABLE CLASIFICACIONES (
CLAVE_PARA_IDENTIFICADOR INTEGER NOT NULL,
CL_CLASIFICACION VARCHAR (50) CHARACTER SET WIN1251
);
ALGO ASI _________________
 |
|
| Volver arriba |
|
 |
Luisma Invitado
|
Publicado: Jue 27 Ene, 2005 12:05 pm Asunto: |
|
|
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 |
|
 |
Cesar C. Salazar Gonzalez Master


Registrado: 01 Oct 2002Mensajes: 2155Ubicación: San Cristóbal de Las Casas, Chiapas
|
Publicado: Jue 27 Ene, 2005 5:57 pm Asunto: |
|
|
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 _________________

Ultima edición por Cesar C. Salazar Gonzalez el Jue 17 Dic, 2009 4:34 pm, editado 2 veces |
|
| Volver arriba |
|
 |
Frank Invitado
|
Publicado: Jue 27 Ene, 2005 11:04 pm Asunto: |
|
|
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 |
|
 |
Cesar C. Salazar Gonzalez Master


Registrado: 01 Oct 2002Mensajes: 2155Ubicación: San Cristóbal de Las Casas, Chiapas
|
Publicado: Vie 28 Ene, 2005 5:00 am Asunto: |
|
|
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 _________________
 |
|
| Volver arriba |
|
 |
Frank Invitado
|
Publicado: Vie 28 Ene, 2005 1:48 pm Asunto: |
|
|
| 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 |
|
 |
Dave Invitado
|
Publicado: Vie 28 Ene, 2005 3:24 pm Asunto: |
|
|
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 |
|
 |
Cesar C. Salazar Gonzalez Master


Registrado: 01 Oct 2002Mensajes: 2155Ubicación: San Cristóbal de Las Casas, Chiapas
|
Publicado: Sab 29 Ene, 2005 9:12 pm Asunto: |
|
|
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... _________________

Ultima edición por Cesar C. Salazar Gonzalez el Jue 17 Dic, 2009 4:37 pm, editado 2 veces |
|
| Volver arriba |
|
 |
Cristina Cdt

Registrado: 16 Dic 2004Mensajes: 4
|
Publicado: Lun 31 Ene, 2005 1:36 pm Asunto: Gemma |
|
|
| Cesar de que programa es el interfaz que utilizas para crear los triggers |
|
| Volver arriba |
|
 |
|
|
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
|
© 2002–2026 Club Builder · Funciona con phpBB.
|