Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Impresión (https://www.clubdelphi.com/foros/forumdisplay.php?f=4)
-   -   QRComposite de QRComposites (https://www.clubdelphi.com/foros/showthread.php?t=83310)

santiago14 02-06-2013 18:27:37

QRComposite de QRComposites
 
Buenas, tengo un dilema.

Tengo una lista de animales, digamos: a1, a2, a3, ... an
Cada uno de esos animales tiene una serie de informes particulares, tienen un informe de pesajes, otro de vacunas, otro de enfermedades. Todos ellos en QReport's diferentes.

En un momento dado tengo que mostrar una lista con "el informe completo" (historia clínica completa) que consiste en la unión de los informes particulares. Hasta aquí la cosa va bien. El informe combinado lo hago con un QRComposite. Muestro la vista previa e imprimo sin problemas.

Resulta que ahora necesito que me salga (aquí quiero hacer una vista previa también) una unión de los informes completos de una sola vez, esto es: a1 (pesajes, vacunas, enfermedades), a continuación a2 (pesajes, vacunas, enfermedades), a continuación a3 (pesajes, vacunas, enfermedades), ... . En la vista previa debo ver un solo informe con estos informes uno abajo del otro y que tengan la numeración de hojas de manera continua.

Esto es particularmente importante puesto que la cantidad de animales es muy elevada y no es operativo imprimir la "historia clínica completa" de a una por vez.

Lo primero que se me ocurre es hacer una composición de composiciones o como se lo llame, pero no he dado con la forma correcta. ¿Cómo puede resolverse este tema?

Espero que se haya entendido, gracias.

Santiago.

santiago14 02-06-2013 22:28:01

Si no es posible hacerlo con una composición de QRComposite's. ¿Alguna otra opción?

santiago14 04-06-2013 01:26:11

Con algo de tozudez he podido avanzar algo, lo cuento:
Pude mandar cada "historia clínica" seleccionada a un archivo .qrp, eso lo he logrado de la siguiente manera:

Código Delphi [-]
  for i:=0 to (nros_caravana.Count - 1) do
  begin
 //.... código que no viene al caso

    QRCompositeReport1.Prepare; //Esto ejecuta el OnAdd que levanta los informes particulares, anda bien.
    TQuickRep(QRCompositeReport1.Reports.Items[0]).Printer.Save('reportes\Reporte' +   IntToStr(i) + '.QRP');
  end;
  qrcmpstrprtJuegosCompletos.Preview;

Con esto puedo guardar masivamente todas las "historias", lo que no he podido hacer ha sido levantarlas y mostrarlas en el preview, que es la última línea del código.

En el OnAdd de qrcmpstrprtJuegosCompletos:

Código Delphi [-]
procedure TFrmBuscarPesajes.qrcmpstrprtJuegosCompletosAddReports(
  Sender: TObject);
var
  i:Integer;
  r:TQuickRep;
begin
  r:=TQuickRep.Create(nil);
  r.QRPrinter:=TQRPrinter.Create(r);
  with qrcmpstrprtJuegosCompletos.Reports do
  begin
  //Tenemos que recuperar los archivos .qrp que guardamos por ahí
    for i:=0 to (nros_caravana.Count - 1) do
    begin
      r.QRPrinter.Load('reportes\Reporte' + IntToStr(i) + '.QRP');
      Add(r);
    end;
  end;
end;

El código anterior no me da error pero al aparecer la ventana de vista previa no se ve nada, aparece vacía. Para colmo si lo intento nuevamente me dice que el "último .qrp está siendo usado por otro procedimiento y no se puede tocar"

Los avances han sido buenos pero me falta la frutilla del postre que sería poder levantar los .qrp y armar el informe completo.

¿Alguien tiene sugerencias?

Gracias.

santiago14 07-06-2013 02:26:30

1 Archivos Adjunto(s)
Después de tanto luchar, ¡llegamos a buen puerto!
Encontré la manera de hacerlo, lo cuento:

1) Generamos los .qrp, uno por cada informe independiente que tengo
2) Los guardamos en disco, cada uno con nombre. reporte0.qrp, reporte1.qrp, ... reporteN.qrp
3) Los levantamos y juntamos en un solo .qrp
4) Lo mostramos usando TQRPHandler de la unit QRExtra

¿Cómo hacemos el paso 3?
Resulta que hace algún tiempo la gente de qusoft armó una pequeña unidad llamada "QRQRP", que no es mas que un .pas común y lo puso en un archivo llamado QR3RNGD4.ZIP, lo podemos encontrar en: http://www.quickreport.co.uk/webinfo...?WebInfoID=620
Este .zip tiene, entre otras cosas, un .pas (qrqrp.pas) donde encontramos un procedimiento llamado "combineQRP" que hace el trabajo. De igual manera, analizando un poco el procedimiento no lo hace de la manera convencional, usa TStream y otras cositas... pero eso es tema de debate posterior.
Para facilitar la cosa, subí a este post el .zip: QR3RNGD4.ZIP

En definitiva, el código quedaría así:

Código Delphi [-]
procedure TFrmBuscarPesajes.componer_informe_completo(una_pagina_por_animal:Boolean);
var
  i:Integer;
  caravana_particular:TStringList;
  reportes_previosQRP:TStringList;
  //directorio_actual:string;
  h:TQRPHandler;
begin
  with Application, DataModule1 do
  begin
 //Código que no viene al caso, son las llamadas a sql's y voy armando los informes particulares
 
  end;
//Caravanas particulares para los informes particulares de los animales
  caravana_particular:=TStringList.Create;
  caravana_particular.Add('');
//Creamos el espacio para guardar las direcciones donde se guardan los .qrp
  reportes_previosQRP:=TStringList.Create;
//Creamos la estructura del directorio para guardar los archivos
  Crear_directorio('reportes');
  for i:=0 to (nros_caravana.Count - 1) do
  begin
  //Más sql's   

  //Me manda el reporte combinado a un archivo .qrp
    QRCompositeReport1.Prepare;
    TQuickRep(QRCompositeReport1.Reports.Items[0]).Printer.Save('reportes\Reporte' + IntToStr(i) + '.QRP');

    reportes_previosQRP.Add('reportes\Reporte' + IntToStr(i) + '.QRP');
  end;
//¡¡Aquí el gran truco!!
//El primer parámetro es donde se guarda el .qrp consolidado
  CombineQRP('reportes\Historia_clinica.qrp', reportes_previosQRP);
//Lo vemos en el preview
  h:=TQRPHandler.Create;
  with h do
  begin
    FQuickrep.PreviewHeight:=700;
    FQuickrep.PreviewWidth:=1050;
    FQuickrep.PrevInitialZoom:=qrZoom100;
    Filename:='reportes\Historia_clinica.qrp';
    Preview;
    Free;
  end;
end;

Con esto resolví el dilema, mi cliente contento y las vaquitas preocupadas porque las probabilidades de ir al asador aumentan.

Saludos.

Al González 07-06-2013 06:23:47

Cita:

Empezado por santiago14 (Mensaje 461904)
Con esto resolví el dilema, mi cliente contento y las vaquitas preocupadas porque las probabilidades de ir al asador aumentan.

Muchas gracias, Santiago. ^\||/

No siempre se tiene la fortuna de que algún colega esté en el lugar indicado, en el momento indicado y con la respuesta indicada para ayudar a otro. Y es cuando toca esforzar la investigación hasta llegar a un buen puerto.

Pero darse tiempo de compartir la solución encontrada con el resto de la comunidad es algo que pocas veces ocurre, y por ello mi agradecimiento. Has puesto un gran ejemplo. :)

Saludos.

santiago14 07-06-2013 14:16:55

Por favor, gracias a todos Uds. y al foro, que tantas veces me ha ayudado.

Santiago.

Al González 07-06-2013 16:41:18

Podrían hacerse muchas sugerencias para tu código, pero creo que una de las más importantes sería no olvidarse de destruir los objetos que creas. Y hacer esto usando bloques Try..Finally (con el Create justo antes del Try y el Free dentro de Finally).

Saludos.

Al.

santiago14 08-06-2013 03:04:23

Cita:

Empezado por Al González (Mensaje 461924)
Podrían hacerse muchas sugerencias para tu código, pero creo que una de las más importantes sería no olvidarse de destruir los objetos que creas. Y hacer esto usando bloques Try..Finally (con el Create justo antes del Try y el Free dentro de Finally).

Saludos.

Al.

Es verdad. Ahora que ya tengo la cosa resuelta, le he hecho esa y varias otras cosas que optimizaron un poco el código final.
Gracias Al por las recomendaciones.

Santiago.


La franja horaria es GMT +2. Ahora son las 12:32:39.

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