PDA

Ver la Versión Completa : Exportar datos de firebird a archivo de texto


capo979
14-08-2007, 13:56:05
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:



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:


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...

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
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
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
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..
TIBTable, los TIBQuery e IBStoredProc son hijos de TDataSet
o hijas, quien sabe :D

jhonny
15-08-2007, 02:42:40
o hijas, quien sabe :D

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

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...

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:

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.


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
Haber que les parece

Pues muy interesante...

Me gusto tambien esto:

Memo1.Lines.Clear;
IBExtract1.ExtractObject(eoDatabase);
Memo1.Lines := IBExtract1.Items;


:D

egostar
15-08-2007, 03:41:15
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
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
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 (http://www.clubdelphi.com/foros/showthread.php?t=46966).


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


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
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 (http://www.clubdelphi.com/foros/showthread.php?t=46966).



Solo cambie el nombre de la tabla de esta forma


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:

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
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:


Memo1.Lines.Clear;
IBExtract1.ExtractObject(eoData, 'LISTA');
Memo1.Lines := IBExtract1.Items;

egostar
15-08-2007, 04:10:47
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.


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
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:

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:


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
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
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 (http://www.clubdelphi.com/foros/showpost.php?p=112824&postcount=6)

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
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
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.