PDA

Ver la Versión Completa : Exportar una tabla DBF a MySQL


CHECHE81
05-10-2011, 20:16:08
Saludos¡¡¡ :)
Pues con la novedad que estoy intentando cargar unos datos de unos .dbf pero con la cuestión que algunos tienen 870 columnas algunas menos pero la mayoria anda en ese rango, entonces lo ligue a un cxgrid(v 6.54) donde trae un método para exporta a excel llamado ExportGridToEXCEL pero ho sorpresa solo me trae 245 columnas:confused:, tengo el siguiente código:
// Establece las propiedades del cuadro de dialogo.
SaveDialog.Filter := 'Hoja de Cálculo Excel (*.xls) | *.xls';
SaveDialog.Title := ' Salvar listado como Hoja de Cálculo Excel';
// Si el usuario digitó Ok en el cuadro de dialogo.
if SaveDialog.Execute then
begin
// Salva la información en un archivo de Excell.
ExportGridToEXCEL(SaveDialog.FileName,cxGrid1, True,True,True,'xls');
MessageDlg('La información fué salvada en ' + SaveDialog.FileName, mtInformation, [mbOk], 0);
end;


No se si me falte algún parametro o establecer algún valor o si ese es su limite, pensando en eso me puse a la tarea de investigar como podria crear los campos del Table de datos del .dbf a un ClientDataSet ligado a una tabla que solo tiene el campo Id, encontre información en un link de ROMAN (http://www.clubdelphi.com/foros/showthread.php?t=5033 (http://www.clubdelphi.com/foros/showthread.php?t=5033))pero no se si es correcto como lo estoy utilizando, porque no me crea los campos fisicos por asi llamarlos en mi tabla de la bd de MySQL:

dmConexion.cdsBach1i10.Open;
BACH1I10.Open;
numcol:=BACH1I10.FieldCount;
showmessage(inttostr(numcol));
for I := 0 to numcol-1 do
begin
FieldDefSource := BACH1I10.FieldDefs[i]; //campos de mi table del .dbf
FieldDefDest := dmConexion.cdsBach1i10.FieldDefs.AddFieldDef; //CDS donde quiero crear los capos "fisicos"
FieldDefDest.Assign(FieldDefSource);
end; showmessage('Campos copiados con éxito.');

Cualquier dato se los agradesco, gracias por su tiempo...:cool:

Al González
06-10-2011, 00:01:13
Hola Cheché.

Veré si puedo echar una mirada más tarde.

De momento algo para entretenerse (http://www.clubdelphi.com/foros/showpost.php?p=405903&postcount=3). ;)

Saludos.

Al González
06-10-2011, 08:47:22
[...] o si ese es su limite [...]
Bueno, lo de la rejilla parece que sí es una limitante de Excel, hasta la versión 2007: http://msdn.microsoft.com/en-us/library/aa730921(v=office.12).aspx

The Excel 2007 "Big Grid" increases the maximum number of rows per worksheet from 65,536 to over 1 million, and the number of columns from 256 (IV) to 16,384 (XFD).

Debí leer eso antes de agregar 650 columnas a una rejilla cx para probar. :D

Por cierto, en tu caso puede que algunas de las columnas se estén usando para grupos y elementos similares.

En cuanto a lo demás, ¿podrías replantear con más calma y claridad la pregunta? :)

CHECHE81
06-10-2011, 17:47:33
Así es Al, checando con el soporte de DevExpress esa versión del grid trae esa misma limitante también:
http://www.devexpress.com/Support/Center/p/Q315666.aspx pero la versión 7 del cxGrid ya trae ilimitado esa parte :eek:hay que actualizar la versión pero me imagino será una lana. :)

Bueno pasando a la segunda opción que menciono, la idea sería recorrer mi Table ligada al .dbf, leer el nombre de cada campo (field) e ir creando las "n" columnas o campos(field) dentro de mi ClientDataSet donde tengo ligada mi tabla de mi bd de MySQL, que solo tienen el campo ID y está en espera de que le creemos los campos "fisicos"(field) necesarios vía código y una vez creados los campos cargarle los registros.

A ver si me explique, gracias por su tiempo y tu paciencia Al:p.

Al González
06-10-2011, 19:10:40
Ah, ¿entonces estamos hablando de exportar una tabla DBF a MySQL? :)

Sí es así, ¿podría algún moderador cambiar el título del hilo a lo que está con negritas? Gracias.

Algunas preguntas: ¿es importante que se haga con una tabla de MySQL ya existente (que, como dices, solamente contiene el campo "ID") o vale también que el proceso cree la tabla completa? ¿Esa tabla destino ya contiene registros o está vacía? ¿Cuál es su función antes de recibir la nueva estructura y datos? ¿Ese campo ID ya tiene forma de alimentarse (mediante disparador, autoincrementado, etc.)? ¿La tabla origen no tiene ese campo?

Antes de poder usar un TClientDataSet, la tabla destino ya debe tener la estructura deseada. Desde Delphi puedes crearle los campos usando el objeto conexión, enviando instrucciones DDL como:

"Alter Table NombreDeTabla Add NombreDeCampo TipoDeCampo Not Null" (considerando SQL estándar, desconozco si es la misma sintaxis en MySQL).

En caso de que estés usando TSQLConnection, el método para enviar esa instrucción sería ExecuteDirect.

Si no es indiscreción, danos un poco más de contexto, ¿qué motiva este requerimiento en tu proyecto? ¿Cómo va la jugada?

Un abrazo.

Al.

CHECHE81
07-10-2011, 03:21:08
Disculpa la falta de lucides para el titulo del hilo, como ando atareado haciendo varias cosas y probando otras, se me enrredan las ideas y se me olvidaba que eres "Al", con respecto a:

¿es importante que se haga con una tabla de MySQL ya existente (que, como dices, solamente contiene el campo "ID") o vale también que el proceso cree la tabla completa?

Yo di la opción de que ya tenia creada la tabla con el campo Id solamente, pero también se vale que se cree completamente desde código.


¿Esa tabla destino ya contiene registros o está vacía?

Está completamente vacía, nuevecita de paquete, porlo que si se crea desde código no hay problema.


¿Cuál es su función antes de recibir la nueva estructura y datos?

Ninguna función, solo la de cargar la estructura y datos de la tabla, para poder generar consultar desde nuestro sistema de java o en nuestro administrador de bd (MySQL Workbench).


¿Ese campo ID ya tiene forma de alimentarse (mediante disparador, autoincrementado, etc.)?

Si, es de tipo auto incrementable.


¿La tabla origen no tiene ese campo?

No, la tabla origen no tiene el campo Id.

Estoy utilizando DelphiXE con los DevExpress v 6.54 aqui en el trabajo, para crear varios módulos para la gestión y carga de datos desde archivos .xls, .xlsx, .dbf, que son muchisimos y casi todos llevan una gran cantidad de registros(45,000 ó +) y campos(870), como ya lo habia mencionado antes, entonces estaba pensando exportar del cxGrid a excel y de ahi subirlo a MySQL pero ya vimos que esa no es una opción ya que tiene límites, ahora esta la opción de crear un proceso para cargar los campos y datos de un TTable donde cargue uno de tantos archivo .dbf que tenemos ya que vienen de otras instituciones y hay que cargarlas en nuestra bd de MySQL para hacer los cruces de información y sacar reportes.:rolleyes:

Investigaré al respecto de utilizar instrucciones DDL (http://es.wikipedia.org/wiki/Lenguaje_de_definici%C3%B3n_de_datos)(lenguaje de definición de datos) para ver si no existe algúna diferencia con MySQL y tratar de hacer así la inserción de columnas y de datos, de nuevo gracias por su tiempo.

Saludos¡¡

Al González
07-10-2011, 09:47:54
Hola Cheché.

Encontré este par de enlaces que podrían ser de utilidad:

http://www.clubdelphi.com/foros/showthread.php?t=37880

http://www.tecnoretales.com/linux/importar-archivos-dbf-a-mysql/

Creo que no sería difícil incorporar el proceso en tu aplicación. Ya nos dirás si te funciona o en qué más podemos ayudar, para eso estamos en los foros. :)

Saludos.

CHECHE81
07-10-2011, 17:40:16
Si, que pasa, Al.:cool:

Se me habia pasado comentar que anteriormente a publicar el post, busque y ya habia probado ambos y otras herramientas, pero no nos trae los resultados deseados, en el caso de la aplicación de [AzidRain] (http://www.clubdelphi.com/foros/showthread.php?t=37880) no me jala por algo de incompatibilidad y el caso de utilizar el dbf2mysql (http://www.tecnoretales.com/linux/importar-archivos-dbf-a-mysql/)lo instalamos en una máquina virtual de CENTOS pero nos trae las tablas cortadas a 255 columnas.
Por esa razón estamos buscando desarrollar un proceso en delphi para lograr nuestro objetivo.
Ya les estaré comentando como me va con el desarrollo del proceso y si me atoro en algo, ya les estaré preguntando.:D

Gracias Al por los links y por su tiempo.
Saludos.