Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Impresión (https://www.clubdelphi.com/foros/forumdisplay.php?f=4)
-   -   FastReport enviar datos mediante un while (https://www.clubdelphi.com/foros/showthread.php?t=94464)

shoulder 21-02-2020 20:44:09

FastReport enviar datos mediante un while
 
Hola como delphi y excel es muy lento cuando son mas de 1000 lineas quiero enviar datos a un fastreport y de ahi lo transformo en excel. Pero mi problema que no es solo una tabla sino que por cada linea de excel agrego en cada columna datos. Ejemplo Apellido, nombre, primer sueldo del año..etc. No se como hacer para escribir esto en un fastreport en el masterdetalle.


Seria algo asi que no me funciona: el mastedetalle no esta asociado a ningun dataset y solo me escribe el ultimo registro cuando envio el codigo de abajo. Hay forma mediante este while hacer que el mater tenga como un next para agregar el siguiente registro manual?-
ejemplo: Perez
garcia...





Código Delphi [-]
while not zquery3.EOF do
   begin

          frxReport1.Variables.Variables['apellido']:= QuotedStr(zquery3.Fields[0].AsString);

     zquery3.Next;
   end;

    If frxReport1.PrepareReport() then
      begin
         frxReport1.PrintOptions.ShowDialog := True;
         frxReport1.ShowReport;
      end;

Casimiro Notevi 22-02-2020 18:04:58

No se entiende bien el problema, eso de que delphi y excel son muy lentos :confused:

shoulder 26-02-2020 13:31:54

Fastreport
 
Hola Casimiro si ejecuto un listado por Ole delphi excel, cuando son listados de mas de 1000 lineas se hace lentisimo, comienza a generar linea a linea cada mas mas lento, dentro del while. Por eso encontre que fastreport hace listados de 160 hojas en segundos y lo exporto a excel. Pero se me genera el problema como explico mas arriba cuando quiero enviar a una linea datos de distintas tablas no se como hacer en fastreport. Es decir si se enviar de una tabla con sus relaciones datos a fastreport, pero si quiero enviar a una linea por ejemplo apellido, despues ultimo ingreso en la facultad , etc... combinar datos por linea ahi me hago lio. Con respecto a delphi excel hice la prueba de hacer la carga de datos en memoria mediante vector pero aunque es mas rapido, igual es lento para listados de 10000 registros.
Gracias.

Casimiro Notevi 26-02-2020 16:34:36

Creo entender que deberías usar un dataset del fastreport.

shoulder 26-02-2020 16:40:55

Fastreport
 
Cierto casimiro pero al usar un dataset no me deja escribir mas texto en la linea que no vengan de ese dataset. Es decir solo me deja ver lo que viene de Select apellido.... pero si en la misma linea quiero agregar texto que no tiene nada que ver con ese select no me deja. En cambio con el excel directo mientras me encuentre en la misma linea ejemplo linea 12, puedo agregar en cada celda lo que yo quiera. Puede ser casimito que Ole delphi excel sea lento o me pasa a mi?, hasta 500 lineas va bien pero despues es cada vez mas lento.
Saludos.

mamcx 26-02-2020 17:03:02

FastReport es un reporteador de bandas, asi que su logica es diferente, pero puedes hacer de todo.

Con respecto a Excel, OLE es lento. La forma correcta es generar directamente el archivo. Aqui se mencionan algunas librerias:

https://stackoverflow.com/questions/...t-having-excel

movorack 26-02-2020 23:01:01

Podrías crear un dataset en memoria que representará el contenido que enviarás a excel. Llenarlo como quieras y asociar ese dataset a la banda de FR.

kuan-yiu 27-02-2020 12:44:49

Para informes muy complejos (porque manejan múltiples fuentes de datos formateadas de modos peculiares) he llegado a usar un HyperGrid. Lo rellenas como quieras y puedes guardarlo directamente en un fichero XML (saveToFile) o enlazarlo con casi cualquier herramienta de informes. Lo que no sé es cual es el volumen de datos que maneja.

shoulder 27-02-2020 14:14:48

Fastreport
 
Primero gracias por las respuestas, probe con tablas en memoria, pero cuando asocio al dataset para incorporar los campos en la banda me dice tabla inexistente porque todavia no fue creada y ahi no que hacer.
Porque haciendo un matriz y enviando a excel fuera de fastreport tambien es lento delphi. Hasta 11 columnas y 1000 lineas va bien pero despues se hace lento.
Por eso queria pasar todos los reportes del programa a fastreport ya que lo vi mucho mas rapido. Por ejemplo con OLE actualmente delphi7 y excel 5000 lineas x 50 columnas me tarda 5 minutos. Con vector baja a 3 minutos. Con fasreport 160 hojas en 5 segundos mas 1 minuto que lo transforma en excel.


Saludos.

movorack 27-02-2020 14:17:55

Cita:

Empezado por shoulder (Mensaje 535970)
probe con tablas en memoria, pero cuando asocio al dataset para incorporar los campos en la banda me dice tabla inexistente porque todavia no fue creada

Depende del componente que estés usando. Lo más básico es usar un TClientDataset descoenactado de un servidor remoto y en tiempo de ejecución antes de usarlo usas la función CreateDataSet (También puedes crearlo en tiempo de diseño para hacer el reporte)

shoulder 27-02-2020 15:28:46

Fastreport
 
Gracias pero al estar desconectado no me deja incoporar los campos en la banda del master, cuando conecto como la tabla la creo en tiempo de ejecucion me da error. Perdon sere yo que no me doy cuenta.

movorack 27-02-2020 15:43:31

En tiempo de diseño, hace click derecho del mouse y seleccionas la opción "Create Dataset", esto te permitirá manejar el dataset en tiempo de diseño para agregar campos y/o asociarlo a un reporte.

Si creas el dataset en tiempo de diseño, al iniciar la aplicación, el dataset ya estará abierto y listo para ser alimentado. No lo cierres, en lugar de ello usa la opción Dataset.EmptyDataset esta te permite vaciar el contenido con el que hayas estado diseñando o probando en memoria anteriormente.

Mayor información:
A Guide to Using the TClientDataSet in Delphi Applications
En especial este Defining a ClientDataSet's Structure Using TFields

shoulder 27-02-2020 17:51:27

Fastreport
 
Gracias lo voy a probar

marco3k 06-03-2020 17:38:23

Solución a Excel lento
 
Yo he tenido ese problema del excel lento para exportar un clientdataset de mas de 10,000 filas a excel y lo solucione con ADO.
Uso el clientdataset para las actualizaciones, pero para generar un listado en especifico de mas de 10,000 lineas uso TAdoDataSet, lo que hago es insertar en un modulo de datos un TAdoDataSet y le inserto los datos del clientdataset - lo cual por cierto a pesar la cantidad de filas este proceso es rápido - luego de eso Excel tiene un maravilloso método pero que solo trabaja con tecnologia ADO por eso es la necesidad de usar este componente. Creas un método con el nombre que desees y lo pones mas o menos asi:

Código Delphi [-]
var o_Excel,o_Libro, o_Hoja : OleVariant;
..
..

// Crea el objeto Excel, el objeto workBook y el objeto sheet
o_Excel := CreateOleObject('Excel.Application');
o_Libro := o_Excel.Workbooks.Add;
o_Hoja := o_Libro.Worksheets.Add;
// aca puedes recorrer los encabezados y otras cosas que desees
...

o_Hoja.Range['A2'].CopyFromRecordset(Rs.Recordset); // esta es el método importante del Excel y como parametro tiene un objeto ADO
//y por eso la necesidad de usar este objeto.

o_Excel.Visible := True;
Y listo este proceso es rapidísimo, espero te sirva como ami me sirvió.

Suerte.



Nota: otra solución sería que uses tecnología oledb y los componentes ado, pero en mi caso prefiero firebird y por eso sólo uso un componete TAdoDataSet para compatibilizar con Excel.

luchifer 14-04-2021 04:13:52

Recien me encontre con esta solucion.
Felicidades INGENIERO mas sencilla no podria ser


La franja horaria es GMT +2. Ahora son las 14:53:22.

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