Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Conexión con bases de datos (https://www.clubdelphi.com/foros/forumdisplay.php?f=2)
-   -   Exportar una tabla DBF a MySQL (https://www.clubdelphi.com/foros/showthread.php?t=76041)

CHECHE81 05-10-2011 20:16:08

Exportar una tabla DBF a MySQL
 
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:
Código Delphi [-]
  // 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)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:
Código Delphi [-]
  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. ;)

Saludos.

Al González 06-10-2011 08:47:22

Cita:

Empezado por CHECHE81 (Mensaje 414656)
[...] 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/libr...ffice.12).aspx

Cita:

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

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

Cita:

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

Cita:

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

Cita:

¿Ese campo ID ya tiene forma de alimentarse (mediante disparador, autoincrementado, etc.)?
Si, es de tipo auto incrementable.

Cita:

¿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(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/im...s-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] no me jala por algo de incompatibilidad y el caso de utilizar el dbf2mysql 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.



La franja horaria es GMT +2. Ahora son las 01:53:19.

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