Club Delphi  
    FTP   CCD     Buscar   Trucos   Trabajo   Foros

Retroceder   Foros Club Delphi > Principal > Conexión con bases de datos
Registrarse FAQ Miembros Calendario Guía de estilo Buscar Temas de Hoy Marcar Foros Como Leídos

Conexión con bases de datos

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 04-04-2017
amadis amadis is offline
Miembro
 
Registrado: May 2005
Ubicación: Colón, Entre Ríos, Argentina
Posts: 219
Poder: 14
amadis Va por buen camino
Lightbulb Cómo abrir archivos CSV con FireDac (Delphi XE5) en pocos pasos

Estimados colegas, este post surge a raíz de la necesidad de levantar archivos csv a una tabla para luego trabajar con ella, en mis comienzos (2005) lo había hecho en Delphi 7 y el TJvCsvDataSet de las Jedi, paquete que instalé con cientos de componentes sólo para el CSV. Y así como ese caso podría enumerar varios más… Con mi escaso conocimiento buscaba fuera lo que no sabía hacer sin componentes de terceros o lo desconocía, todos mis programas de esa época aún funcionan, lo único que al par de años tenía pereza de funcionar era el querido Delphi 7 con millones de componentes que no usaba. Que luego fui depurando casi en su totalidad.

Luego di un salto enorme a XE5 con el sigo trabajando prácticamente sin componentes de terceros, y me he visto en la necesidad de actualizar mi viejo programa que leía archivos CSV para efectuar actualizaciones de precios a un soft de gestión.
Si bien el SCV es un formato muy común para intercambio y exportación de datos, desde ese entonces no lo había vuelto a utilizar a través de mis programas con una interface. Luego de investigar y probar con ADO, lo cual funciona pero tuve inconvenientes abriendo archivos de estructura variable y desconocida, seguí profundizando y viendo que otra cosa me estaba perdiendo del XE5. Ya que la mayoría, cuando aprendemos algo y si funciona lo utilizamos mientras se pueda, en parte algunos desconfiamos de lo nuevo pero lo principal es el tiempo de aprendizaje del que muchas veces no disponemos.

Finalmente la aventura me llevó a probar FireDAC, aproveché la oportunidad y experimenté conexiones con MySql, Firebird y AdvantageDatabase (SyBase) que son las bases con las que suelo trabajar, me sorprendió la sencillez.
Yendo al grano y sin más rodeos, luego de recorrer cantidad de foros buscando info sobre este punto y habiendo encontrado poco en concreto he decidido compartirlo con todos ustedes para facilitar el aprendizaje a otros.

En el proyecto demo que voy a describir utilicé un Formulario (Form1 – principal.pas), algunos Tlabel sin importancia, 2 Tedit, (uno para ruta del csv y otro para el separador), un TOpendialog, u Tbutton para ejecutar el Opendialog de búsqueda de archivo., Un Tbitbutton (Kind:= BkClose).
Un datasource y Dbgrid para visualizar el contenido, y lo indispensable de FireDAC que son TFDGUIxWaitCursor, TFDMemTable y TFDDataMove.

El trabajo se realiza con los dos últimos, primero creamos el FDMemTable1 y luego el FDDatamove1, en este último asignamos como destino el FDMemtable1.
Y luego debemos especificar la estructura de los archivos que vamos a abrir, esto podemos hacerlo en tiempo de diseño, y dejar establecidos los parámetros pero funcionará correctamente sólo con archivos de la misma estructura.
Como necesito abrir archivos donde se desconoce de antemano (al momento de programar) cuál será la estructura, lo hacemos en Tiempo de Ejecución, lo cual implica sólo unas pocas líneas de código.

Por lo que he visto lo componentes que he usado siguen vigentes hasta XE8, luego a partir de Seattle surgen unos cambios de nombre y reemplazos pero la lógica es similar.

Aquí debajo está el código del botón que ejecuta el Opendialog y luego se encarga del proceso de carga. También se adjunta el proyecto , que debería funcionar en todas las versiones de delphi XE hasta la 8

Código Delphi [-]
procedure TForm1.Button1Click(Sender: TObject);
var
i: integer;
begin
opendialog1.InitialDir := GetCurrentDir;
  if opendialog1.Execute
    then
      begin
          FDMemtable1.free;    //  destruimos componentes para eliminar datos default y cargados anteriormente
          FDDataMove1.Free;    //   idem anterior

          FDMemtable1 := TFDMemTable.Create(Form1); // creamos
          FDDataMove1:= TFDDataMove.Create(Form1);
          DataSource1.DataSet := fdmemtable1;   // vinculamos la tabla al datasource
          FDDataMove1.Options := [poOptimiseDest, PoClearDest]; // optimizacion y limpieza del destino (la limpieza no me funcionó todas las veces, por eso destruyo antes de comenzar).
          FDDataMove1.TextFileName := opendialog1.FileName;   // cargamos archivo desde un opendialog.
          FDDataMove1.GuessTextFormat ([ taDelimSep,taHeader,taFields]); // este comando crea la estructura de datos según adivina leyendo los primeros registros

          for i := 0 to FDDataMove1.TextDataDef.Fields.Count-1           //  para evitar problemas con campos FLOAT paso todos los campos a String.
            do  FDDataMove1.TextDataDef.Fields[i].DataType := atString;    // De no hacerlo he tenido errores [FireDAC][Comp][DM]-607. Bad text value [17,5] format for mapping item [->B]. '10,24' is not a valid integer value.

          FDDataMove1.TextAnalyzeSample := 50;  // El default es 10, con esto profundizamos el analisis para adivinar estructura de tabla y campos
          FDDataMove1.TextDataDef.Delimiter := #0;  // opcional, para campos sin QUOTED VALUES "valor" que es la opción default del componente

          FDDataMove1.TextDataDef.Separator :=  edsepara.Text[1]; // indicamos separador de campos en este caso ';'
          FDDataMove1.TextDataDef.RecordFormat := rfCustom;  // si usamos la configuración anterior de DELIMITER debemos pasar RecordFormat a rfCustom
          FDDataMove1.Destination := FDMemTable1;     // asignar el destino a la tabla en memoria FDMemtable1
          FDDataMove1.SourceKind := skText;    // tipo del origen, default es skDataSet, debemos usar skText para los CSV
          FDDataMove1.TextAnalyze := []; // Eliminamos parametros para evitar  conflictos, de esta forma toma la estructura adivinada previamente, sino vuelve a analizar

          FDDataMove1.Execute;   // y Eureka!   Tenemos los datos en la tabla y visibles en el Dbgrid
    end;

end;

Si no van a trabajar con campos FLOAT, pueden omitir el FOR.

Espero resulte de utilidad!
Archivos Adjuntos
Tipo de Archivo: rar FDCSV.rar (57,5 KB, 33 visitas)
Responder Con Cita
  #2  
Antiguo 04-04-2017
Avatar de Casimiro Notevi
Casimiro Notevi Casimiro Notevi is offline
Moderador
 
Registrado: Sep 2004
Ubicación: En algún lugar.
Posts: 28.659
Poder: 10
Casimiro Notevi Tiene un aura espectacularCasimiro Notevi Tiene un aura espectacular
Responder Con Cita
  #3  
Antiguo 04-04-2017
Avatar de ecfisa
ecfisa ecfisa is offline
Moderador
 
Registrado: Dec 2005
Ubicación: Tres Arroyos, Argentina
Posts: 10.126
Poder: 30
ecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to behold
Muchas gracias por el aporte.

Saludos
__________________
Daniel Didriksen

Guía de estilo - Uso de las etiquetas - La otra guía de estilo ....
Responder Con Cita
  #4  
Antiguo 05-04-2017
Avatar de ElKurgan
[ElKurgan] ElKurgan is offline
Miembro Premium
 
Registrado: Nov 2005
Posts: 1.079
Poder: 15
ElKurgan Va por buen camino
Thumbs up

Gracias por compartir
Responder Con Cita
  #5  
Antiguo 02-10-2018
ayepes2003 ayepes2003 is offline
Registrado
 
Registrado: Nov 2015
Posts: 2
Poder: 0
ayepes2003 Va por buen camino
Question

para todos un buen día, he regresado después de muchos años de ausencia,

en la versión delphi 7, para importar archivos no era fácil, jejejje volvi ahora con Embarcadero® Delphi 10.2 Version 25.0.31059.3231 , quisiera poder desarrollar y usar los componentes de firedac, no logro hacer funcionar esto.

Amadis, gracias por compatir esta información.

este código lo tienes en la versión delphi 10.2, he descargado el proyecto y me genero errorres al compilar.

los componentes no se llaman igual.

Última edición por ayepes2003 fecha: 02-10-2018 a las 07:35:01. Razón: aclarar la version que uso
Responder Con Cita
  #6  
Antiguo 02-10-2018
Avatar de Casimiro Notevi
Casimiro Notevi Casimiro Notevi is offline
Moderador
 
Registrado: Sep 2004
Ubicación: En algún lugar.
Posts: 28.659
Poder: 10
Casimiro Notevi Tiene un aura espectacularCasimiro Notevi Tiene un aura espectacular
Cita:
Empezado por ayepes2003 Ver Mensaje
.
Por favor, dale un repaso a la guía de estilo, gracias
Responder Con Cita
  #7  
Antiguo 02-10-2018
amadis amadis is offline
Miembro
 
Registrado: May 2005
Ubicación: Colón, Entre Ríos, Argentina
Posts: 219
Poder: 14
amadis Va por buen camino
Estimado, actualmente trabajo en XE8 y ese proyecto funciona perfectamente. Tengo además las versiones de Delphi Berlin Starter y La Tokio Comunity pero estas ultimas no incluyen FIREDAC, en unos dias si tengo un tiempo libre me descargo un trial de la ultima versión y lo testeo en una máquina virtual. Pero tengo entendido que no ha habido grandes cambios a ese nivel.
Responder Con Cita
  #8  
Antiguo 03-10-2018
ayepes2003 ayepes2003 is offline
Registrado
 
Registrado: Nov 2015
Posts: 2
Poder: 0
ayepes2003 Va por buen camino
Question

Gracias Amadis por tu respuesta.

Yo descargue la versión comunity edition hace pocos días, y dentro de los componentes aparece FirecDac_ETL.

yo descargue el proyecto y lo abri en esta version de delphi, al abrirlo es cuando detecto que no esta el componente. FDDataMove1

intente homologar, es decir crear un proyecto e ir colocando los componentes, pero no logro hacer que funcione.

Yo en la versión delphi 7, use un código basado en tstringlist. pero no lo veo practico a estas fechas, jejeje

Estoy retomando delphi y tengo una oportunidad de emprender un proyecto muy interesante, y como tambien requiero hacer app para android.

creo que es la opción, mientras hay dinero, a pesar q el tema de licenciamiento con la version comunity no encontre restricciones de componentes.
Responder Con Cita
  #9  
Antiguo 09-10-2018
amadis amadis is offline
Miembro
 
Registrado: May 2005
Ubicación: Colón, Entre Ríos, Argentina
Posts: 219
Poder: 14
amadis Va por buen camino
Lightbulb Usar TBatchMove en lugar de TDatamove (Importar CSV Xe8, Tokio, Berlin, Community)

Buenas estimados Colegas.

Recién estos días he tenido tiempo de estudiar el tema, y probar con Delphi Community.

Por lo visto el componente TDATAMOVE ha sido discontinuado desde la versión XE7, aunque por cuestiones de compatibilidad lo siguieron incluyendo hasta XE8, por eso no noté errores cuando compilé el ejemplo en XE8.

En su lugar se recomienda usar TBatchMove, He visto que en XE8 y Community se incluye un ejemplo en la carpeta de SAMPLES
C:\Users\Public\Documents\Embarcadero\Studio\19.0\Samples\Object Pascal\Database\FireDAC\Samples\Comp Layer\TFDBatchMove\Main

Tomando como base el ejemplo antes mencionado he adaptado el proyecto de ejemplo .

Por lo que vi el proceso puede reducirse a 5 lineas de codigo, que son simple ejecucion del Batch y asignaciones de reader y writer. Pero da errores con campos float. Por lo que requiere al igual que con el viejo DataMove un poco de personalización.

aquí tienen el codigo adaptado. Igualmente se adjunta el ejemplo

Código Delphi [-]
procedure TForm1.Button1Click(Sender: TObject);
var
i: integer;
begin

opendialog1.InitialDir := GetCurrentDir;
  if opendialog1.Execute
    then
      begin

          fdmemtable1.free;    //  destruimos componentes para eliminar datos default y cargados anteriormente
          FDBatchMove1.Free;    //   idem anterior
          fdmemtable1 := TFDMemTable.create(Form1); // creamos
          FDBatchMove1:= TFDBatchMove.Create(Form1);
          dataSource1.DataSet := fdmemtable1;   // vinculamos la tabla al datasource
      //Create text reader and set FDBatchMode as owner. Then
  // FDBatchMove will automatically manage the reader instance.
  with TFDBatchMoveTextReader.Create(FDBatchMove1)
  do begin
    // Set text data file name
    FileName := opendialog1.FileName;
    // Setup file format
    DataDef.Separator := edsepara.Text[1]; // ** indicamos separador de campos en este caso ';'
    DataDef.Delimiter := #0;  //** opcional, para campos sin QUOTED VALUES "valor" que es la opción default del componente
    Datadef.RecordFormat := rfCustom; //**
     for i := 0 to Datadef.Fields.Count-1         //  ** para evitar problemas con campos FLOAT paso todos los campos a String.
            do  Datadef.Fields[i].DataType := atString;    // ** De no hacerlo he tenido errores [FireDAC][Comp][DM]-607. Bad text value [17,5] format for mapping item [->B]. '10,24' is not a valid integer value.

    for i := 0 to Datadef.Fields.Count-1         //  debemos antes agregar los campos el FDMentable sino obtenemos un error de que no puede crear el dataset.
            do  fdmemtable1.FieldDefs.Add(Datadef.Fields[i].FieldName,ftString, 20, False);
    DataDef.WithFieldNames := True; // setear si tiene los nombres de campo en primera linea
  end;

  // Create dataset writer and set FDBatchMode as owner. Then
  // FDBatchMove will automatically manage the writer instance.
  with TFDBatchMoveDataSetWriter.Create(FDBatchMove1) do begin
    // Set destination dataset
    DataSet := FDMemtable1;
    // Do not set Optimise to True, if dataset is attached to UI
    Optimise := False;
  end;
  // Analyze source text file structure
  FDBatchMove1.GuessFormat;
  FDBatchMove1.Analyze := ([ taDelimSep,taHeader,taFields]); // este comando crea la estructura de datos según adivina leyendo los primeros registros
  FDBatchMove1.AnalyzeSample := 50;  // El default es 10, con esto profundizamos el analisis para adivinar estructura de tabla y campos

          FDBatchMove1.Execute;   // y Eureka!   Tenemos los datos en la tabla y visibles en el Dbgrid
    end;

end;
Archivos Adjuntos
Tipo de Archivo: rar FDCSV.rar (53,9 KB, 2 visitas)

Última edición por amadis fecha: 09-10-2018 a las 15:34:01. Razón: orreccion de título
Responder Con Cita
  #10  
Antiguo 09-10-2018
Avatar de Casimiro Notevi
Casimiro Notevi Casimiro Notevi is offline
Moderador
 
Registrado: Sep 2004
Ubicación: En algún lugar.
Posts: 28.659
Poder: 10
Casimiro Notevi Tiene un aura espectacularCasimiro Notevi Tiene un aura espectacular
Responder Con Cita
Respuesta


Herramientas Buscar en Tema
Buscar en Tema:

Búsqueda Avanzada
Desplegado

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
FireDac y archivos sch oscjae Conexión con bases de datos 2 23-05-2016 21:27:03
¿cómo conectar base de datos access con un ado en delphi pasos? Master23 Conexión con bases de datos 16 24-10-2010 04:39:22
pasos para abrir una tabla db jhcaboverde Conexión con bases de datos 2 29-09-2010 21:25:59
Como desvirgar al Windows vista en pocos minutos ArdiIIa Seguridad 13 04-06-2008 22:26:03
Archivos .D . D01 . DIR .I .T ¿como los puedo abrir? Delphitest Tablas planas 4 28-01-2008 23:27:55


La franja horaria es GMT +2. Ahora son las 18:13:17.


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