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-2007
Avatar de Ivanzinho
[Ivanzinho] Ivanzinho is offline
Miembro Premium
 
Registrado: ene 2005
Ubicación: Galicia
Posts: 595
Poder: 20
Ivanzinho Va por buen camino
Extract metadata por código

Hola foro, quería saber si conocen alguna forma de extraer el metadata de una base de datos firebird desde código Delphi, y posteriormente crear una nueva BD ejecutando este metadata. Utilizo Delphi 7 y Firebird 1.52. El caso es el siguiente :

Tengo una aplicación en la que se pueden declarar distintas empresas a gestionar, las cuales tendrán sus propias bases de datos indepentedientes. Lo que quiero es que el usuario administrador de la aplicación pueda crear nuevas empresas y por tanto sus correspondientes BD sin la mediación de un informático.

Había pensado, en caso de que no se posible la extracción del metadata, hacer el backup/restore de una BD existente y luego vaciarla por medio de un procedimiento almacenado, pero este tiene el problema que habria que actualizarlo cada vez que se agregen o borren tablas de la BD, a no ser, que se pueda recorrer alguna tabla de sistema en donde se encuentren las distintas tablas e irlas borrando.

En definitiva, ¿que me aconsejan?.

Gracias.

Un saúdo
__________________
Si no lees esto no vivirás tranquilo
Non lle poñades chatas â obra namentras non se remata. O que pense que vai mal que traballe n’ela; hai sitio para todos. (Castelao)

Última edición por Ivanzinho fecha: 15-03-2007 a las 13:06:56.
Responder Con Cita
  #2  
Antiguo 15-03-2007
Avatar de ArdiIIa
[ArdiIIa] ArdiIIa is offline
Miembro Premium
 
Registrado: nov 2003
Ubicación: Valencia city
Posts: 1.481
Poder: 22
ArdiIIa Va por buen camino
Precisamente estos días estuve tocando este tema y te recomiendo la utilización de unos componentes que trae Marathon y que realiza ese cometido perfectamente. De hecho, Marathon incorpora una dll que mediante OLE es la encargada de gestionar eso, y de la cual está disponible todo el código.

Te pongo un archivo con el que estaba realizando pruebas, este en particular trataba de sacar la metadata y generar los DOMAINS de una DB que carecía de ellos.
Verás que ellos que se utilizan los componentes de Marathon ademas del VirtualTreeView.

Otra opción mas simple, es utilizar el IbExtract (de la paleta interbase), aunque es menos versátil que lo que te comentaba anteriormente.

ARCHIVO

Saludos
__________________
Un poco de tu generosidad puede salvar la vida a un niño. ASÍ DE SENCILLO
Responder Con Cita
  #3  
Antiguo 15-03-2007
Avatar de Ivanzinho
[Ivanzinho] Ivanzinho is offline
Miembro Premium
 
Registrado: ene 2005
Ubicación: Galicia
Posts: 595
Poder: 20
Ivanzinho Va por buen camino
Muchas gracias por la respuesta Ardilla, voy a revisar lo que me pasaste y ya comentaré como me fué.

Un saúdo.
__________________
Si no lees esto no vivirás tranquilo
Non lle poñades chatas â obra namentras non se remata. O que pense que vai mal que traballe n’ela; hai sitio para todos. (Castelao)
Responder Con Cita
  #4  
Antiguo 15-03-2007
Avatar de ArdiIIa
[ArdiIIa] ArdiIIa is offline
Miembro Premium
 
Registrado: nov 2003
Ubicación: Valencia city
Posts: 1.481
Poder: 22
ArdiIIa Va por buen camino
Cita:
Empezado por Ivanzinho
Tengo una aplicación en la que se pueden declarar distintas empresas a gestionar, las cuales tendrán sus propias bases de datos indepentedientes. Lo que quiero es que el usuario administrador de la aplicación pueda crear nuevas empresas y por tanto sus correspondientes BD sin la mediación de un informático.
Leyendo esto mas detenidamente y considerando que el programa es "multi-empresa" ten en cuenta que no sería necesario que cada empresa contara con su propia BD (a no ser que sea requisito indispensable), si los datos son comunes a todas ellas, podrías estructurar la DB de tal forma que todas las tablas tengan en campo EMRPRESA y de este modo poder discernir de que empresa son los datos. De este modo a mi me parece algo más sólido que tener varias DB.
__________________
Un poco de tu generosidad puede salvar la vida a un niño. ASÍ DE SENCILLO
Responder Con Cita
  #5  
Antiguo 15-03-2007
Avatar de Ivanzinho
[Ivanzinho] Ivanzinho is offline
Miembro Premium
 
Registrado: ene 2005
Ubicación: Galicia
Posts: 595
Poder: 20
Ivanzinho Va por buen camino
Cita:
Empezado por ArdiIIa
Leyendo esto mas detenidamente y considerando que el programa es "multi-empresa" ten en cuenta que no sería necesario que cada empresa contara con su propia BD (a no ser que sea requisito indispensable), si los datos son comunes a todas ellas, podrías estructurar la DB de tal forma que todas las tablas tengan en campo EMRPRESA y de este modo poder discernir de que empresa son los datos. De este modo a mi me parece algo más sólido que tener varias DB.
Pensé en ello al iniciar la aplicación, pero al final me decidí por una BD por empresa por los siguentes motivos: BackUp independiente por empresa, BD más ligeras, si se fastidia un fichero .fdb solo tengo que restaurar los datos de esa empresa, a la hora de programar me parecio mas simple el tener separadas las empresas, ... Pero puedo estar equivocado, es solo mi opinión, ¿a qué te refieres con que sea más sólido?

Un saúdo.
__________________
Si no lees esto no vivirás tranquilo
Non lle poñades chatas â obra namentras non se remata. O que pense que vai mal que traballe n’ela; hai sitio para todos. (Castelao)
Responder Con Cita
  #6  
Antiguo 15-03-2007
Avatar de ArdiIIa
[ArdiIIa] ArdiIIa is offline
Miembro Premium
 
Registrado: nov 2003
Ubicación: Valencia city
Posts: 1.481
Poder: 22
ArdiIIa Va por buen camino
Cita:
Empezado por Ivanzinho
Pensé en ello al iniciar la aplicación, pero al final me decidí por una BD por empresa por los siguentes motivos: BackUp independiente por empresa, BD más ligeras, si se fastidia un fichero .fdb solo tengo que restaurar los datos de esa empresa, a la hora de programar me parecio mas simple el tener separadas las empresas, ... Pero puedo estar equivocado, es solo mi opinión, ¿a qué te refieres con que sea más sólido?
.
Precisamente a eso, a la hora de diseñar la DB y programar, puede resultar algo mas arduo, pero una vez montado resulta muy eficaz:
Código SQL [-]
 "Select * From Facturas where empresa = Empresa_seleccionada"
Por contra, del otro modo estás obligado al mantenimiento de tantos FDB como empresas tengas.
Claro está que todas las consideraciones que se puedan hacer al respecto pueden ser variadas, pero una de las ventajas que yo le veo a Firebird con respecto a otros sistemas es que no "desperdigan" varios ficheros por el disco, sino que todo lo hacen en un solo fichero y siguiendo esa política, es por lo que en mi humilde opinión, veo más sólido el tener un solo fichero, pero tal y como comento, esto no tiene porqué ser ley, siempre habrá que adaptarse a los requerimientos.
__________________
Un poco de tu generosidad puede salvar la vida a un niño. ASÍ DE SENCILLO
Responder Con Cita
  #7  
Antiguo 15-03-2007
Avatar de Ivanzinho
[Ivanzinho] Ivanzinho is offline
Miembro Premium
 
Registrado: ene 2005
Ubicación: Galicia
Posts: 595
Poder: 20
Ivanzinho Va por buen camino
Lo del mantenimiento del los FDB fué una cosa en la que pensé al plantearme 1 BD por aplicación o 1 BD por empresa, pero como se trata de una aplicación que tratará a lo sumo 5 empresas me decidí por la segunda opción. Otra cosa sería una aplicación para una gestoría que puede tratar cientos de empresas, entonces podría planteame otra forma, pero en este caso me decidí por este método porque non le vi ninguna desventaja a tener una sola BD. Pero bueno, creo que esto ya se escapa del tema del hilo y en caso de ser necesario se debería continuar con la discusión en uno nuevo.

Muchas gracias de nuevo por tu interes.

Un saúdo
__________________
Si no lees esto no vivirás tranquilo
Non lle poñades chatas â obra namentras non se remata. O que pense que vai mal que traballe n’ela; hai sitio para todos. (Castelao)
Responder Con Cita
  #8  
Antiguo 15-03-2007
Avatar de RONPABLO
[RONPABLO] RONPABLO is offline
Miembro Premium
 
Registrado: oct 2004
Posts: 1.514
Poder: 21
RONPABLO Va por buen camino
Yo tengo una aplicacion que trabaja con 3 bds diferentes y no veo la hora de tener tiempo para ponerlas en una sola, perder el poder que dan los query y dejarle todo el enlace de empresas a Delphi no es bueno, es mejor que los querys te den los resultados discriminados, en algun momento vas a necesitar juntar datos de una empresa a otra y vas a tener que consultar en firebird la bd de una empresa, ir a Delphi para tener unos datos de la empresa, enviar los filtros otra vez a firebird en la otra bd, volver a consultar, volver a Delphi y al final para juntar la informacion. Cuando sean muchos datos esto se volvera muy lento y cada vez mas complejo.
un solo ejemplo como harias la siguiente consulta en varias bd:


Código SQL [-]
Select * from Empresas a where 
a.id not in (select b.empresa from InsumosEntreempresas b)

Recuerda que Firebird no permite querys entre bds
Responder Con Cita
  #9  
Antiguo 16-03-2007
Avatar de Ivanzinho
[Ivanzinho] Ivanzinho is offline
Miembro Premium
 
Registrado: ene 2005
Ubicación: Galicia
Posts: 595
Poder: 20
Ivanzinho Va por buen camino
Cita:
Empezado por RONPABLO
Yo tengo una aplicacion que trabaja con 3 bds diferentes y no veo la hora de tener tiempo para ponerlas en una sola, perder el poder que dan los query y dejarle todo el enlace de empresas a Delphi no es bueno, es mejor que los querys te den los resultados discriminados, en algun momento vas a necesitar juntar datos de una empresa a otra y vas a tener que consultar en firebird la bd de una empresa, ir a Delphi para tener unos datos de la empresa, enviar los filtros otra vez a firebird en la otra bd, volver a consultar, volver a Delphi y al final para juntar la informacion. Cuando sean muchos datos esto se volvera muy lento y cada vez mas complejo.

Recuerda que Firebird no permite querys entre bds
Eso mismos me pasa a mi con una aplicación heredada de paradox, y también estoy deseando cambiarlo, pero es que en el caso que nos ocupa, la información de las distintas empresas es totalmente independiente y en ningún caso será necesario el cruce de datos. No discuto que sea mejor una o varias BD, simplemente que dependiendo de los requerimientos puede ser más conveniente un método u otro, pero vuelvo a aclarar, simplemente es mi punto de vista.

Un saúdo
__________________
Si no lees esto no vivirás tranquilo
Non lle poñades chatas â obra namentras non se remata. O que pense que vai mal que traballe n’ela; hai sitio para todos. (Castelao)

Última edición por Ivanzinho fecha: 16-03-2007 a las 11:49:42.
Responder Con Cita
  #10  
Antiguo 16-03-2007
Avatar de Spynosa
Spynosa Spynosa is offline
Miembro
 
Registrado: nov 2004
Ubicación: Ecija - Sevilla
Posts: 99
Poder: 20
Spynosa Va por buen camino
puedes hacer un backup con solo los metadatos

Código Delphi [-]
with IBBackupService1 do
  begin
    ServerName :='localhost';
    LoginPrompt := False;
    Params.Add('user_name=sysdba');
    Params.Add('password=masterkey');
    Active := True;
    try
      Verbose := True;
       Options := [MetadataOnly];
      DatabaseName := 'c:\mibase.fdb';
      BackupFile.Add('mibase.fbk');

      ServiceStart;
      While not Eof do
        Memo1.Lines.Add(GetNextLine);
    finally
      Active := False;
    end;

y luego un restore

Código Delphi [-]

 with IBRestoreService1 do
  begin
    ServerName := 'localhost';
    LoginPrompt := False;
    Params.Add('user_name=sysdba');
    Params.Add('password=masterkey');
    Active := True;
    try
      Verbose := True;
      Options := [Replace, UseAllSpace];
      PageBuffers := 3000;
      PageSize := 4096;
      DatabaseName.Add('c:\mibase2.fdb');

      BackupFile.Add('c:\mibase.fbk');
      ServiceStart;
      While not Eof do
        Memo1.Lines.Add(GetNextLine);
    finally
      Active := False;
    end;
  end;
Responder Con Cita
  #11  
Antiguo 16-03-2007
Avatar de Ivanzinho
[Ivanzinho] Ivanzinho is offline
Miembro Premium
 
Registrado: ene 2005
Ubicación: Galicia
Posts: 595
Poder: 20
Ivanzinho Va por buen camino
Muchas gracias a todos por vuestras respuestas, al final me voy a decidir por la solución propuesta por Spynos, ya que tengo implementado un modulo para backups y restores y es lo que mejor se me adecúa. Muchas gracias a ArdiIIa por presentarme Marathon, el cual desconcia, y por el ejemplo de uso que acompañó.

Un saúdo.
__________________
Si no lees esto no vivirás tranquilo
Non lle poñades chatas â obra namentras non se remata. O que pense que vai mal que traballe n’ela; hai sitio para todos. (Castelao)
Responder Con Cita
  #12  
Antiguo 14-09-2007
paty_rlopez paty_rlopez is offline
Miembro
 
Registrado: ene 2006
Ubicación: Torreón
Posts: 46
Poder: 0
paty_rlopez Va por buen camino
Question problemacon GetNextLine

hola estube haciendo lo del ejemplo pero cuando llega a esta linea:
Código:
Memo1.Lines.Add(GetNextLine);
me marca un error
Cita:
cannot open file coco270720072.gbk
este es exactamente mi codigo

¿alguien me pueder decir que tengo mal?
Código:
procedure TForm1.Button1Click(Sender: TObject);
begin
with IBBackupService1 do
  begin
    ServerName := '127.0.0.1'; 
    LoginPrompt := False; 
    Params.Add('user_name=sysdba');
    Params.Add('password=masterkey'); 
    Active := True; 
    try 
      Verbose := True; 
      Options := [NonTransportable, IgnoreLimbo]; 
      DatabaseName := 'c:\coco\cocodelphi.fdb';
      SQL1.Close;
      SQL1.SQL.TExt := 'Select * from Corte__Ultimo';
      SQL1.ExecQuery;
      BackupFile.Add('COCO'+ SQL1.FieldByName('FECHA_RESUMEN').AsString + SQL1.FieldByName('Turno').AsString+'.gbk');
      ServiceStart; 
      While not Eof do 
        Memo1.Lines.Add(GetNextLine); 
    finally 
      Active := False; 
    end; 
  end; 
end;
Gracias por su atencion
Saludos Cordiales
__________________
Saludos Cordiales
Responder Con Cita
  #13  
Antiguo 14-09-2007
paty_rlopez paty_rlopez is offline
Miembro
 
Registrado: ene 2006
Ubicación: Torreón
Posts: 46
Poder: 0
paty_rlopez Va por buen camino
Red face solucion

perdonen las molestias, ya encontre mi error
la fecha me la regresaba con estos caracteres '//' por lo que el nombre del archivo no era valido

gracias y disculpen
__________________
Saludos Cordiales
Responder Con Cita
  #14  
Antiguo 24-09-2007
Delfino Delfino is offline
Miembro
 
Registrado: jul 2003
Ubicación: Madrid
Posts: 974
Poder: 21
Delfino Va por buen camino
Puedes mediante GBak tb hacer un backup de solo los metadata..
__________________
¿Microsoft? No, gracias..
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
¿existe un Extract Week? o algo similar amadis SQL 2 05-02-2007 14:19:32
contraer por codigo, cxGrid (+) los nodos abiertos cerrarlos por codigo sakuragi OOP 6 27-07-2005 18:23:07
Problemas con Extract eduarcol SQL 20 17-07-2004 00:36:55
Problemas con Extract buitrago Firebird e Interbase 3 09-12-2003 15:03:01
Simular un extract date pache Firebird e Interbase 2 24-07-2003 00:40:11


La franja horaria es GMT +2. Ahora son las 08:05:42.


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