Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   SQL (https://www.clubdelphi.com/foros/forumdisplay.php?f=6)
-   -   Exportar con sql (https://www.clubdelphi.com/foros/showthread.php?t=62791)

odrack 14-01-2009 19:48:53

Exportar con sql
 
Un saludo a todos en el foro.

Tengo un pequeño problemita con esta consulta (SQL).
Código Delphi [-]
    query2.Close;
    query2.SQL.Clear;
    query2.SQL.add(' select numreferencia, clvarticulo, descripcion, fecharecepcion, cantidad');
    query2.sql.add(' INTO OUTFILE "C:/'+edit2.text+'.csv" FIELDS TERMINATED BY "," OPTIONALLY ENCLOSED BY ","');
    query2.SQL.add(' LINES TERMINATED BY "\n"');
    query2.SQL.add(' FROM '+TBL+' where (fecha between '+quotedstr(fecha1)+' and '+quotedstr(fecha2)+')');
    query2.ExecSQL;

Esto hace que me exporte un archivo a excel (*.CSV) por medio de TQuery.
Con esto no hay ningun problema ya que lo ejecuta bien, el problema que tengo es que se guarda el archivo en la maquina servidor y no en mi equipo local, debo aclarar que es una aplicación que trabaja en red. ¿Como puedo guardar el archivo en mi equipo y no en el servidor?:confused:

Esto lo hago asi ya que en codegear delphi 32 no he encontrado los archivo para poder exportarlos por medio de TExcelAplication:(

Saludos!!:D

Al González 14-01-2009 20:04:36

Este hilo puede servirte: http://www.clubdelphi.com/foros/showthread.php?t=62307 ;)

En cuanto a los componentes Servers, como TExcelApplication, la documentación más completa la encontrarás en las páginas de MSDN, ya que son envolturas de clases de Microsoft adaptadas a Delphi Win32. :)

Saludos.

Al.

coso 14-01-2009 20:34:07

hola, puedes exportarlo directamente a formato .xls

Código Delphi [-]
     q.Active := false;
     q.SQL.Text := 'select * into ["Excel 8.0;Database=c:\test.xls"].[hoja1] from tabla'; 
     q.ExecSQL;

y la ruta sera relativa (aunque no estoy seguro) a tu aplicación.

odrack 14-01-2009 20:41:58

Saludos

He visto las dos formas y la opcion de Al González trabaja con Interbase y yo trabajo con MySQL, y no he podido hacer mucho con esto y se le agradece la ayuda, en cuanto al codigo de coso
Código Delphi [-]
 q.Active := false;
     q.SQL.Text := 'select * into ["Excel 8.0;Database=c:\test.xls"].[hoja1] from tabla'; 
     q.ExecSQL;

me manda un error aqui ["Excel 8.0;Database=c:\test.xls"].[hoja1] from usuarios.

La version que ultilizo de excel es office excel 2007, tiene algo que ver??:p

coso 14-01-2009 21:21:28

:confused: q raro, a mi me funciona asi tal cual y no me ha fallado...no tendras algun errorcillo de sintaxis? quiza sea lo del Excel 2007

Al González 14-01-2009 21:24:39

Cita:

Empezado por odrack (Mensaje 334487)
Saludos

He visto las dos formas y la opcion de Al González trabaja con Interbase y yo trabajo con MySQL, y no he podido hacer mucho con esto...

Oiga señor, ¿leyó el mensaje #8 de ese hilo? ;)


Cita:

Empezado por odrack (Mensaje 334487)
...en cuanto al codigo de coso
Código Delphi [-]
 q.Active := false;
     q.SQL.Text := 'select * into ["Excel 8.0;Database=c:\test.xls"].[hoja1] from tabla'; 
     q.ExecSQL;

me manda un error aqui ["Excel 8.0;Database=c:\test.xls"].[hoja1] from usuarios.

La version que ultilizo de excel es office excel 2007, tiene algo que ver??:p

No creo que MySQL acepte esa sintaxis, probablemente sólo funciona con SQL Server. Creo que Coso pensó que lo estabas haciendo con SQL Server, en parte porque no mencionaste al principio el motor usado. ;)

Saludos.

Al. :)

coso 14-01-2009 21:29:00

no, no me fije en el motor, pero creia que era algo general que se puede tratar una hoja de excel como base de datos, siempre que especifiques el driver. Al menos, esta es la manera general de especificar un driver y un fichero...no recuerdo de donde lo saque X/

odrack 14-01-2009 21:53:37

Hola a todos.

Si habia visto el hilo y el mensaje #8, solo que con el codigo que tengo funciona igual a diferencia que lo hago desde un TQuery y no un dataset como lo muestran, aun que no estoy seguro que el ejemplo que mencionan lo guarde en mi equipo y no en el servidor, ya que trabajo en una aplicación clietne servidor.

una disculpa por no haber especificado el motor de base de datos :D, seguire investigando una forma de guardar la información en mi equipo!!

Saludos

Al González 15-01-2009 01:00:32

Cita:

Empezado por odrack (Mensaje 334507)
...a diferencia que lo hago desde un TQuery y no un dataset como lo muestran, aun que no estoy seguro que el ejemplo que mencionan lo guarde en mi equipo y no en el servidor, ya que trabajo en una aplicación clietne servidor....

Bueno, aquí lo que habría que conocer es que un TQuery es un TDataSet (polimorfismo), por lo que la función SaveToCsv que sugiero (o algún código similar) te funcionará perfectamente con un TQuery, un TTable, un TADOQuery, etc. (porque todos son derivados de la clase TDataSet). :)

Y respecto a la otra inquietud, que podrás guardar el archivo CSV en la ruta que tú le indiques (parámetro AsciiFilePath), mientras esa ruta sea accesible por tu programa, claro está, y sin importar dónde se encuentre el servidor de la base de datos. :)

Espero haber orientado un poco más.

Saludos.

Al.

odrack 15-01-2009 01:06:39

Hola !!!

Creo que no tenia entendido bien lo del dataset, pero he investigado un poco
y aun sigo con el mismo problema, mi unica teoria es la forma en la que me conecto a mi base de datos, quiero suponer que es por que utilizo ODBC para mi conexion y es ahi donde los datos se estan guardando en el servidor ya que cuando ejecuto el sql me guarda los datos en el servidor, aun no entiendo bien como funciona la sentencia que ejecuto.

Tambien me he di cuenta que por defaul en la instalación de delphi 32 no vienen los componentes listos para usarse y tube que abrir los paquetes para su instalación, ahora ya he instalado los componentes para office.

espero que con ExcelApplication1 tenga un mejor resultado

Saludos!!!
Pd. espero haber me dado a entender :p

Al González 15-01-2009 01:57:14

Mi sugerencia con los mensajes anteriores es prescindir de la cláusula "INTO OUTFILE", y traerte la consulta como normalmente lo harías si quisieras, por ejemplo, mostrar el listado en un DBGrid. Entonces, ya abierta esa consulta (y con Open, en lugar de ExecSQL), llamar a la función SaveToCSV o alguna similar a las del hilo referido.

Basándome en tu código original, quedaría más o menos así:
Código Delphi [-]
query2.Close;
query2.SQL.Clear;
query2.SQL.add(' select numreferencia, clvarticulo, descripcion, fecharecepcion, cantidad');
query2.SQL.add(' FROM '+TBL+' where (fecha between '+quotedstr(fecha1)+' and '+quotedstr(fecha2)+')');
query2.Open;
SaveToCSV (query2, 'C:\' + Edit2.Text + '.csv', '"', ',');

Temo que la cláusula INTO OUTFILE (que para mi es una cosa desconocida porque no trabajo con MySQL) siempre te creará el archivo en donde se encuentre el servidor o la base de datos, no localmente. Por ello la alternativa de cargar una consulta "normal" y luego exportarla con alguna función de utilería como SaveToCSV (incluso es posible que existan otras que exporten directamente a Excel).

Saludos.

Al.

odrack 15-01-2009 07:18:54

Saludos!!

Tienes razon, cuando ejecutas la sentencia into outfile la ejecuta donde se encuentra el servidor. He resuelto el problema instalando Texcelapplication y trabajar directamente con un Tquery como buscador y texcelapplication para exportar.

Gracias a todos por la ayuda!!!:)


La franja horaria es GMT +2. Ahora son las 07:09:14.

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