 |
Club Builder Foro de C++Builder en español
|
| Ver tema anterior :: Ver tema siguiente |
| Autor |
Mensaje |
snupoo Lt Cmdr


Registrado: 19 Feb 2004Mensajes: 108Ubicación: Merida yucatan Mexico
|
Publicado: Jue 30 Oct, 2008 2:31 am Asunto: crear base de datos dinamicamente |
|
|
Hola a todos en el foro.
tengo una base de datos que cree con el SQL Manager for InterBase & Firebird como pueden ver uso el firebird, con los componentes de interbase, la aplicación en si ya funciona y es muy sencilla, solo lleva el control de las facturas, el problema surge por que necesito que el programa cree la base de datos y las tablas si no existen de manera automática, cuando el usuario le de de alta a su empresa.
la estructura una de las bases y una de sus tablas es la siguiente:
base de datos
| Código: | CREATE DATABASE '127.0.0.1/gds_db:C:\Empresa.gdb'
PAGE_SIZE = 4096
DEFAULT CHARACTER SET WIN1251
|
tabla
| Código: |
CREATE TABLE CLIENTES (
ID_CLIENTE INTEGER NOT NULL,
CLAVE CHAR(6) NOT NULL,
NOMBRE CHAR(100) NOT NULL,
RFC CHAR(13) NOT NULL,
CALLE_COL CHAR(30),
N_INTE CHAR(5),
N_EXTE CHAR(5),
CPOSTAL CHAR(5),
ESTADO CHAR(20),
TIPO CHAR,
NETO DOUBLE PRECISION,
CURP CHAR(18),
COLONIA CHAR(50),
MUNICIPIO CHAR(50),
LOCALIDAD CHAR(40),
TELEFONO CHAR(12),
/* Keys */
PRIMARY KEY (ID_CLIENTE),
CONSTRAINT UQ_CLIENTES
UNIQUE (CLAVE),
CONSTRAINT UQ_NOMBRE
UNIQUE (NOMBRE),
CONSTRAINT UQ_RFC
UNIQUE (RFC)
);
CREATE UNIQUE INDEX IDX_CLAVE
ON CLIENTES
(CLAVE);
CREATE UNIQUE INDEX IDX_ID_CLIENTE
ON CLIENTES
(ID_CLIENTE);
CREATE UNIQUE INDEX IDX_NOMBRE
ON CLIENTES
(NOMBRE);
SET TERM ^ ;
CREATE TRIGGER BI_CLIENTES_ID_CLIENTE FOR CLIENTES
ACTIVE BEFORE INSERT POSITION 0
AS
BEGIN
IF (NEW.ID_CLIENTE IS NULL) THEN
NEW.ID_CLIENTE = GEN_ID(CLIENTES_ID_CLIENTE_GEN, 1);
END^
SET TERM ; ^
|
lo que necesito es saber como crear desde código c++ builder esta base de datos y su tabla.
Saludos y espero haberme explicado. _________________ [img]http://folding.extremeoverclocking.com/sigs/sigimage.php?un=snupoo&t=86565/sigimage.gif[/img]
A programar se aprende programando |
|
| Volver arriba |
|
 |
Angel Master


Registrado: 15 Abr 2003Mensajes: 2311Ubicación: Toledo (España)
|
Publicado: Jue 30 Oct, 2008 8:36 am Asunto: |
|
|
Te pongo un trozo del código que estoy usando yo:
1. Para crea la base de datos
| Código: | IBDatabase1->Connected = false;
IBDatabase1->Params->Clear();
IBDatabase1->DatabaseName = ViadeAcceso + "IBDatabase.gdb";
IBDatabase1->Params->Add("USER 'sysdba'");
IBDatabase1->Params->Add("PASSWORD 'masterkey'");
IBDatabase1->Params->Add("PAGE_SIZE 4096");
IBDatabase1->SQLDialect = 3;
IBDatabase1->CreateDatabase(); |
Con la base de datos que quieres crear sería:
| Código: | IBDatabase1->DatabaseName = "C:\\Empresa.gdb"; |
(Recuerda la barra doble en el código)
2. Para comprobar si una tabla existe o no, el código me lo facilitó Leo
| Código: | TIBQuery *qVerTablas = new TIBQuery(this);
qVerTablas->Database = IBDatabase1;
qVerTablas->Transaction = IBTransaction1;
qVerTablas->SQL->Text = "SELECT COUNT(RDB$RELATION_NAME) Tablas FROM RDB$RELATIONS WHERE RDB$RELATION_NAME = :Tabla"; |
3. Para crear las tablas
Necesitas un TIBQuery, que puedes crear dinámicamente o usar uno que ya tengas definido. Yo tengo, además, puesto un TIBTransaction.
| Código: | TIBQuery *qQuery = new TIBQuery(this);
qQuery->Database = IBDatabase1;
qQuery->Transaction = IBTransaction1; |
Luego, para definir las tablas, usas ese mismo TIBQuery, pero primero comprobamos que existe la tabla:
| Código: | qVerTablas->Close();
qVerTablas->ParamByName("Tabla")->AsString = "CLIENTES";
qVerTablas->Open();
if (qVerTablas->FieldByName("Tablas")->AsInteger == 0)
{
qQuery->Close();
qQuery->SQL->Text = "CREATE TABLE CLIENTES (ID_CLIENTE INTEGER NOT NULL, CLAVE CHAR(6) NOT NULL, NOMBRE CHAR(100) NOT NULL, RFC CHAR(13) NOT NULL, CALLE_COL CHAR(30), N_INTE CHAR(5), N_EXTE CHAR(5), CPOSTAL CHAR(5), ESTADO CHAR(20), TIPO CHAR, NETO DOUBLE PRECISION, CURP CHAR(18), COLONIA CHAR(50), MUNICIPIO CHAR(50), LOCALIDAD CHAR(40), TELEFONO CHAR(12), PRIMAY KEY(ID_CLIENTE))";
qQuery->ExecSQL();
} |
Y para los índices alternativos:
| Código: | qQuery->Close();
qQuery->SQL->Text = "CREATE UNIQUE INDEX IDX_CLAVE ON CLIENTES (CLAVE)";
qQuery->ExecSQL(); |
Estos dos códigos los he probado y funcionan bien tal cual. Donde no te puedo ayudar es en el tema del trigger porque no lo he usado nunca. _________________ Un saludo
Necesitamos tu ayuda: Envía AI al 27595 (Coste 1,20 euros + IVA) |
|
| Volver arriba |
|
 |
snupoo Lt Cmdr


Registrado: 19 Feb 2004Mensajes: 108Ubicación: Merida yucatan Mexico
|
Publicado: Jue 30 Oct, 2008 5:34 pm Asunto: |
|
|
Gracias Angel con lo que pones es de gran ayuda.
Saludos y Gracias de nuevo. _________________ [img]http://folding.extremeoverclocking.com/sigs/sigimage.php?un=snupoo&t=86565/sigimage.gif[/img]
A programar se aprende programando |
|
| Volver arriba |
|
 |
snupoo Lt Cmdr


Registrado: 19 Feb 2004Mensajes: 108Ubicación: Merida yucatan Mexico
|
Publicado: Jue 20 Nov, 2008 9:10 pm Asunto: Triggers |
|
|
Hola de nuevo con este problema Gracias a Ángel he podido crear la tabla y sus indices pero no consigo crear los triggers
Hago lo siguiente
primero creo los generadores
| Código: |
IBQuery1->SQL->Clear();
IBQuery1->SQL->Text = "CREATE GENERATOR GEN_EMPRESAS_ID;";
IBQuery1->ExecSQL();
IBQuery1->Close();
IBQuery1->SQL->Clear();
IBQuery1->SQL->Text = "SET GENERATOR GEN_EMPRESAS_ID TO 0;";
IBQuery1->ExecSQL();
IBQuery1->Close();
|
hasta aca todo bien
luego trato de crear el trigger
| Código: |
IBQuery1->SQL->Clear();
IBQuery1->SQL->Text = "SET TERM ^ ; ";
IBQuery1->ExecSQL();
IBQuery1->Close();
|
pero me marca el siguiente error
| Cita: |
Dynamic SQL error
SQL error code = -104
Token unknown - line 1, column 5
TERM.
|
Agradesco su ayuda con cualquier sugerencia.
Saludos. _________________ [img]http://folding.extremeoverclocking.com/sigs/sigimage.php?un=snupoo&t=86565/sigimage.gif[/img]
A programar se aprende programando |
|
| Volver arriba |
|
 |
Angel Master


Registrado: 15 Abr 2003Mensajes: 2311Ubicación: Toledo (España)
|
Publicado: Vie 21 Nov, 2008 10:57 am Asunto: |
|
|
Triggers yo no he usado, pero PROCEDURES y GENERATORS sí y los creo con un IBSQL en lugar de un IBQuery.
| Código: | IBSql->Close();
IBSql->SQL->Text = "CREATE GENERATOR Id_pelicula";
IBSql->ExecQuery();
IBSql->Close();
IBSql->SQL->Text = "CREATE PROCEDURE Gen_pelicula RETURNS (Registro INTEGER) AS BEGIN Registro = GEN_ID(Id_pelicula, 1); END";
IBSql->ExecQuery(); |
Imagino que para crear un trigger será similar. Tirando de San Google ( ), he encontrado esto: Componentes de acceso a Interbase/Firebird, y en las páginas 2-3 viene código; no sé si podrás adaptarlo. _________________ Un saludo
Necesitamos tu ayuda: Envía AI al 27595 (Coste 1,20 euros + IVA) |
|
| Volver arriba |
|
 |
snupoo Lt Cmdr


Registrado: 19 Feb 2004Mensajes: 108Ubicación: Merida yucatan Mexico
|
Publicado: Vie 21 Nov, 2008 6:19 pm Asunto: |
|
|
Muchas Gracias de nuevo ángel.
Viendo como creas tus PROCEDURES he eliminado las lineas que tienen:
| Código: |
SET TERM ^ ;
....
SET TERM ; ^
|
dejando solo el siguiente código en el SQL del IBQuery y así si que me funciona
| Código: |
CREATE TRIGGER BI_CLIENTES_ID_CLIENTE FOR CLIENTES
ACTIVE BEFORE INSERT POSITION 0
AS
BEGIN
IF (NEW.ID_CLIENTE IS NULL) THEN
NEW.ID_CLIENTE = GEN_ID(CLIENTES_ID_CLIENTE_GEN, 1);
END
|
Saludos. _________________ [img]http://folding.extremeoverclocking.com/sigs/sigimage.php?un=snupoo&t=86565/sigimage.gif[/img]
A programar se aprende programando |
|
| 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.
|