Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Varios (https://www.clubdelphi.com/foros/forumdisplay.php?f=11)
-   -   Problemas con QReport en OnNeedData (https://www.clubdelphi.com/foros/showthread.php?t=54902)

BlueSteel 02-04-2008 20:47:24

Problemas con QReport en OnNeedData
 
Hola

Tengo un problemilla que me ha estado pasando con el QReport al tratar de imprimir los datos que poseeo en un StringGrid...(Delphi 7)

puse el sgte codigo en la columna del OnNeedData...del QReport

Código Delphi [-]
    if ItemIndex < Abonos.Asientos.RowCount then
    begin
         sFil_1.Caption := Abonos.Asientos.Cells[0, ItemIndex];
         sFil_2.Caption := Abonos.Asientos.Cells[1, ItemIndex];
         sFil_3.Caption := Abonos.Asientos.Cells[2, ItemIndex];
         sFil_4.Caption := Abonos.Asientos.Cells[3, ItemIndex];
         sFil_5.Caption := Abonos.Asientos.Cells[4, ItemIndex];
         sFil_6.Caption := Abonos.Asientos.Cells[5, ItemIndex];
         sFil_7.Caption := Abonos.Asientos.Cells[6, ItemIndex];
         sFil_8.Caption := Abonos.Asientos.Cells[7, ItemIndex];
    end;
    Inc(ItemIndex);
    MoreData := ItemIndex <= Abonos.Asientos.RowCount;

tambien digo que tengo declarado esto
Código Delphi [-]
 
  ItemIndex : Integer;

Vamos al Problema

Si bien el contenido del StringGrid cuando presione Imprimir lo realiza super bien... si despues cambio el contenido del StringGrid y presiono Imprimir nuevamente.. (sin salir del sistema)... me muestra el informe pero sin datos ???

Por que puede pasar esto ???

será que tengo que destruir el QReport y volver a crearlo ??? si es así.. como lo debo realizar ???

Salu2:p:D

Nati1 02-04-2008 21:04:32

Crear y destruir QReport.
Código Delphi [-]
 begin
      try
         QReport1:= TQReport1.Create(self);
         QReport1.Preview; // o Print
      finally
         QReport1.Free;
      end;

BlueSteel 03-04-2008 00:48:03

Cita:

Empezado por Nati1 (Mensaje 277099)
Crear y destruir QReport.

Código Delphi [-]
begin
try
QReport1:= TQReport1.Create(self);
QReport1.Preview; // o Print
finally
QReport1.Free;
end;


que raro.. pero esto no funciona...

lo otro... despues de imprimir los datos.. se me borran todos los datos que tengo en el StringGrid...

se que puede ser que en el evento onactivate del Form...tengo un proceso limpiar, pero no he salido del form.. solo he realizado la sentencia

Código Delphi [-]
 Form13.Reporte.Print;


Salu2:p

Nati1 03-04-2008 01:02:22

¿No cabe la posibilidad de que le evento OnNeedData no sea el adecuado?.
Probando con el evento BeforePrint debería de enviar la información antes de imprimirla.
Tambien se podría hacer este proceso fuera del QReport, asi se controlaría mejor la adquisición de datos.

eduarcol 03-04-2008 01:10:12

a ver creo que ya sabemos del problema, el evento onactivate segun tengo entendido se ejecuta a lo que el formulario pierde el foco y vuelve a entrar, prueba colocando ese codigo en el onshow.

Otra cosa a manera de consejo, me parece mas practico utilizar una tabla de memoria en lugar de llenar los datos de manera manual.

BlueSteel 03-04-2008 01:25:15

Tanks
 
Cita:

Empezado por eduarcol (Mensaje 277156)
a ver creo que ya sabemos del problema, el evento onactivate segun tengo entendido se ejecuta a lo que el formulario pierde el foco y vuelve a entrar, prueba colocando ese codigo en el onshow.

Tanks...

Gracias por lo del OnShow... no lo sabia...

me parece que tengo casi arreglado el problema del Reporte... según yo.. estoy usando un contador...que es ItemIndex .... lo que estoy haciendo en el evento BeforePrint del Reporte... lo estoy dejando en 0... al parecer se ha solucionado....

lo otro.. como se realizaria esto ???
Cita:

Otra cosa a manera de consejo, me parece mas practico utilizar una tabla de memoria en lugar de llenar los datos de manera manual

Nati1 03-04-2008 04:13:33

Se dice que se hace esto:
Cita:

Form13.Reporte.Print;
¿Sera correcto hacer esto en el evento OnShow?
¿No sera mas correcto el evento BeforePrint?
Si se hiciera esto:
Cita:

Form13.Reporte.Preview;
Tal vez seria un poco mas lógico ya que se espera a que se muestre.

Caro 03-04-2008 04:39:48

Nati1, el problema del borrado de los datos del StringGrid era el evento OnActivate del formulario ya que una vez que mostraba el reporte al cerrarlo se volvia a activar dicho evento (OnActivate) y al tener un procedimiento de limpiar, borraba los datos que tenia el StringGrid.

Eduarcol, puedes explicarnos sobre la tabla en memoria por favor.

Saluditos

eduarcol 03-04-2008 14:49:47

Cita:

Empezado por Caro (Mensaje 277193)
Nati1, el problema del borrado de los datos del StringGrid era el evento OnActivate del formulario ya que una vez que mostraba el reporte al cerrarlo se volvia a activar dicho evento (OnActivate) y al tener un procedimiento de limpiar, borraba los datos que tenia el StringGrid.

Eduarcol, puedes explicarnos sobre la tabla en memoria por favor.

Saluditos

Hola Caro,
Como resistirme a tan dulce pedido :o

A ver ahora si en serio, una tabla de memoria es un dataset que no necesita estar vinculado a ningun origen de datos, y funciona como si fuera un dataset normal, de esta manera puedes utilizar un dbgrid asociado a este componente y alli tendrias los registros que deseas imprimir. En el reporte solo asocias los campos a este dataset y listo no tienes que programar nada.

Estos componentes hay varios, ClientDataset, TKBMemTable, TRxMemoryTable... yo utilizo el TKBMmemtable porque en el paquete solo viene el y no tengo que llenar la pestaña de cosas que no necesito, y el clientdataset no lo he utilizado porq tengo mis recelos respecto a ciertos comentarios que he leido en otros hilos...

Caro 03-04-2008 17:16:45

Muchas gracias por responder Eduardo, una pregunta mas cuales son los recelos que tienes con el ClientDataSet, existe algún problema al utilizar dicho componente.

Saluditos

eduarcol 03-04-2008 17:30:16

En parte he leido que hay que redistribuir la libreira midas, y que cuando se trata de grandes cantidades comienza a dar problemas de rendimiento, pero como te digo eso lo lei no lo comprobe :rolleyes:

Caro 03-04-2008 18:10:01

ok, gracias nuevamente ;).

Saluditos

jhonny 03-04-2008 18:18:37

Bueno, en mi caso nunca he tenido problemas al tratar información con el ClientDataSet como si se tratara de un RxMemoryTable, de hecho me parece ventajoso el que no tenga que instalar componentes de terceros para hacer este tipo de cosas.

Es mas, como estaba acostumbrado a usar el metodo LoadFromDataSet del RxMemoryTable para subir los datos de un Query, pues use las caracteristicas del class helper, para hacer del TClientDataSet algo mas parecido.

keyboy 03-04-2008 18:30:00

Cita:

Empezado por jhonny (Mensaje 277333)
pues use las caracteristicas del class helper, para hacer del TClientDataSet algo mas parecido.

¿Qué es el class helper?

Bye

egostar 03-04-2008 18:33:46

Cita:

Empezado por keyboy (Mensaje 277338)
¿Qué es el class helper?

Bye

Hola keyboy

Mira este articulo :)

Salud OS

keyboy 03-04-2008 18:49:36

¡Oh! ¡Vaya! Creo que debo salir de debajo de mi piedra :) Si no fuera por las horas que tarda en abrir el D2007...:rolleyes:

Gracias por la información.

(records con métodos :eek:)

Bye

jhonny 03-04-2008 18:53:11

Cita:

Empezado por keyboy (Mensaje 277348)
¡Oh! ¡Vaya! Creo que debo salir de debajo de mi piedra :) Si no fuera por las horas que tarda en abrir el D2007...:rolleyes:

Gracias por la información.

(records con métodos :eek:)

Bye

Si, D2007 tiene cosas nuevas muy interesantes, por otro lado... trabajo en una maquina Pentium 4 3.GHz, un 1 GB RAM y no se demora en abrir el IDE, en D2006 si era una eternidad, pero en D2007 todo eso mejoro.


La franja horaria es GMT +2. Ahora son las 06:00: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