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 

crear base de datos dinamicamente

 
Publicar nuevo tema   Responder al tema    Foros de discusión -> Bases de Datos
Ver tema anterior :: Ver tema siguiente  
Autor Mensaje
Mensaje    Asunto: crear base de datos dinamicamente Responder citando

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
Ver perfil de usuario Enviar mensaje privado Enviar email MSN Messenger
Mensaje    Asunto: Responder citando

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
Ver perfil de usuario Enviar mensaje privado Enviar email
Mensaje    Asunto: Responder citando

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
Ver perfil de usuario Enviar mensaje privado Enviar email MSN Messenger
Mensaje    Asunto: Triggers Responder citando

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
Ver perfil de usuario Enviar mensaje privado Enviar email MSN Messenger
Mensaje    Asunto: Responder citando

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 ( Laughing ), 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
Ver perfil de usuario Enviar mensaje privado Enviar email
Mensaje    Asunto: Responder citando

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
Ver perfil de usuario Enviar mensaje privado Enviar email MSN Messenger
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.