PDA

Ver la Versión Completa : Exportar con sql


odrack
14-01-2009, 19:48:53
Un saludo a todos en el foro.

Tengo un pequeño problemita con esta consulta (SQL).

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


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

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


...en cuanto al codigo de coso

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
...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, sí 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í:

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