Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Firebird e Interbase (https://www.clubdelphi.com/foros/forumdisplay.php?f=19)
-   -   Exportar datos de firebird a archivo de texto (https://www.clubdelphi.com/foros/showthread.php?t=46937)

capo979 14-08-2007 13:56:05

Exportar datos de firebird a archivo de texto
 
Hola les quería preguntar si es posible en firebird 1.5 exportar los datos de la base de datos a un archivo de texto dejandolos todos los datos como insert.

La idea es si hay algún programa que trae el instalador del firebird tipo el gbak o alguno que esté en la carpeta bin de firebird que me permita hacer lo antes mencionado.

Muchas gracias por escucharme

saludos a todos

Gabo 14-08-2007 14:03:13

El programa Database Worckbench te permite exportar los datos de una tabla de la manera que quieres...

capo979 14-08-2007 14:06:23

si eso si se que hay programas que lo hacen pero yo quiero hacerlo desde mi programa en delphi y dejarlo en un archivo en formato de texto. Por ejemplo si el gbak lo permite usaría gbak ya que a mis clientes les doy el gbak. No es una utilidad para utilizarla yo sino directamente mis clientes.

jhonny 14-08-2007 16:05:19

¿Que componentes de conexion a BD usas?

jhonny 14-08-2007 16:57:48

Bueno, lo mas normal es que tu aplicación tenga descendientes de TDataSet, entonces hice estas dos funciones, que te devuelven la cadena insert, tu diras si te sirven:

Código Delphi [-]

function DatoFormateado(const Campo: TField): String;
begin
  if (Campo is TStringField) or (Campo is TDateField) then
  begin
    Result := ''''+Campo.AsString+'''';
  end
  else
    Result := StringReplace(Campo.AsString, ',', '.', [rfReplaceAll]);
end;

function ExportarInsert(DataSet: TDataSet; Tabla: String): String;
var
  i :Integer;
  cadena :string;
begin
  cadena := '';
  cadena := 'insert into '+Tabla+' values(';
  for i := 0 to DataSet.FieldCount -1 do
  begin
    cadena := cadena + DatoFormateado(DataSet.Fields[i]);
    if ((DataSet.FieldCount -1) = i) then
      cadena := cadena + ')'
    else
      cadena := cadena + ',';
  end;
  Result := cadena + ';';
end;

Solo es cuestion de que pongas a recorrer cualquier DataSet y exportes los resultado de la función ExportarInsert en un archivo, un ejemplo de esto es:

- Coloque un TMemo y una tabla, a los cuales se les hace esto:

Código Delphi [-]
Tabla1.First;
Memo1.Lines.Clear;
while not Tabla1.Eof do
begin
  Memo1.Lines.Add(ExportarInsert(Tabla1, 'TablaPrueba'));
  Tabla1.Next;
end;

Espero te sirva ;).

capo979 14-08-2007 17:29:42

Los componentes de base de datos que utilizo son de la paleta Interbase el TIBDatabase

gracias

jhonny 14-08-2007 17:43:57

Ahh bueno, entonces si te sirve la función, ya que los TIBTable, los TIBQuery e IBStoredProc son hijos de TDataSet, podrias usar uno de esos para traer la tabla que quieres y usar la función que mas arriba te he explicado.

capo979 14-08-2007 18:37:10

Muchas gracias por todo lo voy a probar

saludos

eduarcol 14-08-2007 19:24:28

Hola, esta de pelos el codigo jhony, disculpa que me meta, pero no te sirve un simple respaldo???

capo979 14-08-2007 19:27:25

No me sirve un simple respaldo porque mis clientes se pasan los datos entre ellos y para quedar con toda la historia se tienen que pasar parte de la base es un sistema que lo maneja mucha gente por eso

gracias

saludos

jhonny 14-08-2007 20:18:07

Gracias eduarcol...

Cita:

Empezado por capo979 (Mensaje 222985)
No me sirve un simple respaldo porque mis clientes se pasan los datos entre ellos y para quedar con toda la historia se tienen que pasar parte de la base es un sistema que lo maneja mucha gente por eso

gracias

saludos

Bueno, ¿Pero te sirvio la función?.

capo979 14-08-2007 20:20:45

Gracias si la función estuvo joyita asi que ya la estoy usando una masa todo

gracias che!!!

suerte

saludos

jhonny 14-08-2007 20:37:25

Cita:

Empezado por capo979 (Mensaje 222999)
Gracias si la función estuvo joyita asi que ya la estoy usando una masa todo

gracias che!!!

suerte

saludos

Que bueno hombre, :D.

P.D: No conocia eso de "una masa" :D.

Delphius 14-08-2007 21:17:39

Cita:

P.D: No conocia eso de "una masa"
Ese término significa: Todo bien, OK, sin problemas, etc.

Se usa mucho en Buenos Aires, o como los llamamos quienes viven en el interior: porteños.
Es evidente que esta persona es de Argentina.

Yo al menos, no se que se use en otros lugares.
Saludos,

jhonny 14-08-2007 21:23:24

Cita:

Empezado por Delphius (Mensaje 223029)
Es evidente que esta persona es de Argentina.

Yo también lo deducía asi, pero esa deducción la saque, por lo de "CHE" :D, pero si no hubiera usado el "CHE", no hubiera sabido de donde era :)

Delfino 15-08-2007 02:35:26

Si no me equivoco mucho el componente TIBExtract tb te ayudaria a generar los insert de los datos, miralo y cuentanos..
Cita:

TIBTable, los TIBQuery e IBStoredProc son hijos de TDataSet
o hijas, quien sabe :D

jhonny 15-08-2007 02:42:40

Cita:

Empezado por Delfino (Mensaje 223130)
o hijas, quien sabe :D

Jo jo jo, en ese caso, dejemoslo en prole. :D.

Cita:

Empezado por Delfino
Si no me equivoco mucho el componente TIBExtract tb te ayudaria a generar los insert de los datos, miralo y cuentanos..

Pero creo que el TIBExtract esta amarrado a la tecnologia de los IBX, mientras que mi humilde y sencilla funcioncita, funciona con cualquier miembro pertenciente a la prole de TDataSet ;), estan los BDE, dbexpress, ADO, IBX, componentes como el TClientDataSet, Tablas en memoria como las RXMemoryData y demas familiares :D

jhonny 15-08-2007 03:02:20

De todas maneras hay que reconocer que estos IBX tienen unas cosas muy divertidas, me puse a buscar un poco, sobre lo que Delfino a comentado y me he encontrado con que termine haciendo lo siguiente:

- Puse un TIBDatabase en un Form, tambien un TIBExtract, un TButton, un TMemo y un TIBTransaction, a los cuales no les cambie el nombre, pero hice los respectivos enlaces.

En el OnClick del Boton hice...

Código Delphi [-]
Memo1.Lines.Clear;
IBExtract1.ExtractObject(eoTable, 'Lista', [etData]); //Lista es el nombre de la tabla que quice llamar
Memo1.Lines := IBExtract1.Items;

Y adivinen que... todo funciono de maravillas y a una velocidad impresionante. La verdad es que son divertidos estos componentes :)

jhonny 15-08-2007 03:23:29

Acabo de hacerle una pequeña mejora a la función que mas arriba explique llamada DatoFormateado, resulta que cuando un dato es menor a su tamaño del campo, toma el resto como espacios y no creo que eso sea conveniente para nadie, de manera pues que la función quedaria asi:

Código Delphi [-]
function DatoFormateado(const Campo: TField): String;
begin
  if (Campo is TStringField) or (Campo is TDateField) then
  begin
    Result := ''''+Trim(Campo.AsString)+'''';
  end
  else
    Result := StringReplace(Campo.AsString, ',', '.', [rfReplaceAll]);
end;

Y el resto sigue igual ;).

egostar 15-08-2007 03:27:12

Hablando de cosas divertidas, hay otro componente que extrae la información de la base de datos. El componente IBDatabaseInfo.

Código Delphi [-]
var
  I: Integer;
begin
  IBDataBase1.Open;
  Memo1.Lines.Add(IBDataBaseInfo1.Version);
  Memo1.Lines.Add(IBDataBaseInfo1.DBFileName);
  Memo1.Lines.Add(IBDataBaseInfo1.DBSiteName);
  for I := 0 to IBDataBaseInfo1.UserNames.Count - 1 do
      Memo1.Lines.Add(IBDataBaseInfo1.UserNames[i]);
  Memo1.Lines.Add(InttoStr(IBDataBaseInfo1.CurrentMemory));
  Memo1.Lines.Add(InttoStr(IBDataBaseInfo1.MaxMemory));
  IBDataBase1.Close;
end;

Haber que les parece

Salud OS

jhonny 15-08-2007 03:36:11

Cita:

Empezado por egostar
Haber que les parece

Pues muy interesante...

Me gusto tambien esto:

Código Delphi [-]
  Memo1.Lines.Clear;
  IBExtract1.ExtractObject(eoDatabase);
  Memo1.Lines := IBExtract1.Items;

:D

egostar 15-08-2007 03:41:15

Cita:

Empezado por jhonny (Mensaje 223153)
Pues muy interesante...

Me gusto tambien esto:

:D

:D:D, Por supuesto amigo jhonny, perdón por no haberlo comentado, de hecho, ya lo tengo en mi bitácora de funciones disponibles, porque se me acaba de ocurrir algo con ese código:cool::)

Salud OS.

jhonny 15-08-2007 03:50:04

Cita:

Empezado por egostar (Mensaje 223154)
perdón por no haberlo comentado

Pues no entendi, ¿que es lo que no habias comentado? :(:o

Pregunto, porque esa rutinita anterior no la habia mencionado en este hilo, pues esa rutina extrae toda la metadata de la BD, mientras que la primera solo trae los datos de una tabla ;)

Pero hay que tener cuidado con los Blob porque ninguna de las funciones que hemos mencionado hasta ahora los trae.

egostar 15-08-2007 03:53:51

Cita:

Empezado por jhonny (Mensaje 223155)
Pues no entendi, ¿que es lo que no habias comentado? :(:o

Pregunto, porque esa rutinita anterior no la habia mencionado en este hilo, pues esa rutina extrae toda la metadata de la BD, mientras que la primera solo trae los datos de una tabla ;)

Pero hay que tener cuidado con los Blob porque ninguna de las funciones que hemos mencionado hasta ahora los trae.

Que me gustaba tu rutina, pero tengo un problema, me manda este error al ejecutarlo. yo solo quiere los datos de una sola tabla que se llama EVENTOS y que me acabas de ayudar a crearla en este hilo.

Cita:

Dynamic SQL Error
SQL error code = -204
Table unknown
Eventos
At line 1, column 10.
Solo cambie el nombre de la tabla de esta forma

Código Delphi [-]
  Memo1.Lines.Clear;
  IBExtract1.ExtractObject(eoTable, 'Eventos', [etData]); // Aqui me da el error
  Memo1.Lines := IBExtract1.Items;

Salud OS

jhonny 15-08-2007 03:59:53

Cita:

Empezado por egostar (Mensaje 223157)
Que me gustaba tu rutina, pero tengo un problema, me manda este error al ejecutarlo. yo solo quiere los datos de una sola tabla que se llama EVENTOS y que me acabas de ayudar a crearla en este hilo.



Solo cambie el nombre de la tabla de esta forma

Código Delphi [-]
  Memo1.Lines.Clear;
  IBExtract1.ExtractObject(eoTable, 'Eventos', [etData]); // Aqui me da el error
  Memo1.Lines := IBExtract1.Items;

Salud OS

Evidentemente te estas conectando a una BD diferente o simplemente en esa BD no esta creada dicha tabla...

Un detalle, si usas esa rutina te traera la estructura de la tabla 'Eventos' y los datos, pero si la usas asi:

Código Delphi [-]
  Memo1.Lines.Clear;
  IBExtract1.ExtractObject(eoData, 'LISTA');
  Memo1.Lines := IBExtract1.Items;

Te traera solo los datos, tu decidiras lo que prefieres :)

egostar 15-08-2007 04:03:53

mmm, cosa rara, le quite el último parámetro para solo traer los datos y ya no me dio el error, pero no me muestra nada y tiene 3 datos en la tabla.

Curioso.

jhonny 15-08-2007 04:06:38

Cita:

Empezado por egostar (Mensaje 223161)
mmm, cosa rara, le quite el último parámetro para solo traer los datos y ya no me dio el error, pero no me muestra nada y tiene 3 datos en la tabla.

Curioso.

Coloca de nuevo el parametro a ver que sucede (Eso como cuando uno reinicia un computador :D). Dale y me cuentas.

Nota: Ademas, recuerda que una cosa es muy distinta de la otra, si solo quieres ver los datos, no basta con solo quitar el ultimo parametro, si no que tambien tienes que cambiar el primero, asi:

Código Delphi [-]
  Memo1.Lines.Clear;
  IBExtract1.ExtractObject(eoData, 'LISTA');
  Memo1.Lines := IBExtract1.Items;

egostar 15-08-2007 04:10:47

Cita:

Empezado por jhonny (Mensaje 223162)
Coloca de nuevo el parametro a ver que sucede (Eso como cuando uno reinicia un computador :D). Dale y me cuentas.

Que crees, el problema fue que el nombre de la tabla lo debo poner en mayúsculas, vaya, esto es case sensitive, orale.

Código Delphi [-]
  IBExtract1.ExtractObject(eoTable, 'EVENTOS'); //Funciona

  IBExtract1.ExtractObject(eoTable, 'Eventos'); // NO Funciona

Salud OS

jhonny 15-08-2007 04:15:54

Jejeje, acababa de descubrir lo mismo :D, pero tengo una duda, eso solo traera la estructura de la tabla, sin sus indices, triggers, ni datos, ni nada mas ¿Eso es lo que necesitas?

egostar 15-08-2007 04:26:45

Cita:

Empezado por jhonny (Mensaje 223164)
Jejeje, acababa de descubrir lo mismo :D, pero tengo una duda, eso solo traera la estructura de la tabla, sin sus indices, triggers, ni datos, ni nada mas ¿Eso es lo que necesitas?

Pues no:o, es que como no sabia que me mostraba no sabía que iba a necesitar, pero ya viendo bien, pues si, voy a necesitar todo.:D:D

Se me está ocurriendo hacer algún seudo-clone de la base para efectos de respaldar información, pero no de toda la base de datos sino solo de una o dos tablas. Pero ese será tema de otro hilo si no encuentro "pie con bola":D:D:D

Por hoy, me voy a casa, aunque seguramente me conectare de allá, porque tengo que preparar 4 sistemitas (instaladores) que me pidieron y debo entregar mañana.

Salud OS.

jhonny 15-08-2007 04:29:43

Si quieres todo de esa tabla tendras que hacer esto:

Código Delphi [-]
  Memo1.Lines.Clear;
  IBExtract1.ExtractObject(eoTable, 'EVENTOS', [etTrigger, etForeign, etIndex, etDomain, etCheck, etGrant, etData]);
  Memo1.Lines := IBExtract1.Items;

Pero como ya mencione anteriormente, si quieres toda la BD, tendras que hacer, esto:

Código Delphi [-]
  Memo1.Lines.Clear;
  IBExtract1.ExtractObject(eoDatabase);
  Memo1.Lines := IBExtract1.Items;

En todo caso, tambien me voy para la casa :D.

MAHE 15-08-2007 05:41:27

consulta
 
Hola buenas noches quiero saber de la base de datos FIREFORD que es? para que sirve, ademas saber las siguientes preguntas especificas saber:
1.- cuales son sus ventajas,
2.- desventajas,
3.- limitaciones , y
4.-Funcionalidades

Porfa, ayuda de cualquier que se maneje bien en el tema

saludos a todos, MAHE


P.D. y muchas a Bluesteel

ArdiIIa 15-08-2007 06:34:20

Cita:

Empezado por MAHE
Hola buenas noches quiero saber de la base de datos FIREFORD que es? para que sirve, ademas saber las siguientes preguntas especificas saber:
1.- cuales son sus ventajas,
2.- desventajas,
3.- limitaciones , y
4.-Funcionalidades

Porfa, ayuda de cualquier que se maneje bien en el tema

saludos a todos, MAHE


P.D. y muchas a Bluesteel

Amigo Mahe Bienvenido al foro.
Te recomiendo la lectura de ESTO

Y ya de paso te comento que no es muy afortunado ir enviando mensajes privados a los usuarios que están en línea para que te resuelvan esta misma cuestión. Basta con que lo hayas puesto aquí.

Con respecto a Firebird, tienes amplia información en este foro, solamente la tienes que buscar...

Saludos.

capo979 15-08-2007 19:09:52

Si soy de argentina del interior muchas gracias a todos muy bueno todo

jhonny 15-08-2007 19:23:34

Cita:

Empezado por capo979 (Mensaje 223278)
Si soy de argentina del interior muchas gracias a todos muy bueno todo

Una pregunta, ¿Hiciste la corrección que mencione anteriormente, para la función que cree inicialmente y la seguiste usando? o ¿Simplemente pasaste a usar las propiedades descubiertas del TIBExtract?, lo pregunto porque solo quiero saber si haz preferido adaptabilidad o velocidad ;)

capo979 15-08-2007 22:32:22

todavia no lo he probado bien bien cuando lo haga te aviso

saludos

capo979 17-08-2007 14:21:50

Una pregunta de IBExtract. Como se hace si por ejemplo tengo una tabla de clientes y quiero que el ibextract me saque todos los clientes que nacieron antes de una determinada fecha, o sea yo quiero que ibextract me de en insert lo que yo quiero no toda la tabla.

gracias

saludos

jhonny 17-08-2007 14:45:14

Cita:

Empezado por capo979 (Mensaje 224093)
Una pregunta de IBExtract. Como se hace si por ejemplo tengo una tabla de clientes y quiero que el ibextract me saque todos los clientes que nacieron antes de una determinada fecha, o sea yo quiero que ibextract me de en insert lo que yo quiero no toda la tabla.

gracias

saludos

No creo que eso se pueda hacer con IBExtract, pero podrias crear un procedimiento almacenado, que haga lo mismo.


La franja horaria es GMT +2. Ahora son las 12:30:43.

Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2026, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi