Club Delphi  
    FTP   CCD     Buscar   Trucos   Trabajo   Foros

Retroceder   Foros Club Delphi > Principal > Impresión
Registrarse FAQ Miembros Calendario Guía de estilo Temas de Hoy

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 15-11-2007
Avatar de Vlady
Vlady Vlady is offline
Miembro
 
Registrado: ago 2005
Posts: 217
Poder: 19
Vlady Va por buen camino
OnAddReports en tiempo de ejecución

Hola amigos del foro estoy trabajando con QReport y estoy buscando la forma de añadir los reportes en un QRCompositeReport en tiempo de ejecución para esto debo cambiar el codigo del evento OnAddReports del Componente pero no encuentro la forma de hacerlo, pues tengo q imprimir varios informes diferente y no quiero tener la necesidad de por cada informe tener un QRCompositeReport, existe la posibilidad en tiempo de ejecución modificar los reportes q se van a mostrar en el preview.

Gracias
Responder Con Cita
  #2  
Antiguo 16-11-2007
Avatar de Caro
*Caro* Caro is offline
Moderadora
 
Registrado: jul 2004
Ubicación: Cochabamba, Bolivia
Posts: 2.544
Poder: 22
Caro Va por buen camino
Hola Vlady, si te he entendido bien solo tienes que añadir los reportes que necesites, digamos que tenemos dos RadioButton el primero sera para añadir un solo reporte y si el segundo para añadir dos reportes, quedaria mas o menos asi.

Código Delphi [-]
procedure TForm1.QRCompositeReport1AddReports(Sender: TObject);
begin
 With QRCompositeReport1 do
 begin
  if RadioButton1.Checked=true then
   Reports.Add(Form2.QuickRep1)
  else
  begin
   Reports.Add(Form2.QuickRep1);
   Reports.Add(Form2.QuickRep2);
  end;
 end;
end;

Saluditos
__________________
Disfruten cada minuto de su vida a lado de sus seres queridos como si fuese el ultimo, uno nunca sabe lo que puede pasar.
Responder Con Cita
  #3  
Antiguo 16-11-2007
Avatar de Vlady
Vlady Vlady is offline
Miembro
 
Registrado: ago 2005
Posts: 217
Poder: 19
Vlady Va por buen camino
Caro Gracias por responder pero te cuento q yo mis reportes los creo en tiempode ejecución mediante la creación de variables asi:

Código Delphi [-]
var
    //Reporte de prueba
    Titulo : TRContinuaTitulo1;
    Agrupado : TRAgrupado;
    ReporteTotales : TRTotales;
    ReporteIVA : TRIVAS;


estos cuatro reportes me los crea perfecto utilizando el QRCompositeReport cuando utilizo un form, lo que busco es que mediante el mismo QRCompositeReport pueda utilizar el mismo evento OnAddReports Algo asi como esto

Código Delphi [-]
procedure TFCobradas.QRCompositeReport1AddReports(Sender: TObject);
begin
    if Factura = 'Agrupada' then
    Begin
        QRCompositeReport1.Reports.Clear;
        QRCompositeReport1.Reports.Add(Titulo);
        //Aqui es donde cambia el reporte
        QRCompositeReport1.Reports.Add(Agrupado);
        QRCompositeReport1.Reports.Add(ReporteIVA);
        QRCompositeReport1.Reports.Add(ReporteTotales);
    end
    else
    if Factura = 'Detallada' then
    Begin
        QRCompositeReport1.Reports.Clear;
        QRCompositeReport1.Reports.Add(Titulo);
        //Aqui es donde cambia el reporte
        QRCompositeReport1.Reports.Add(Detallado);
        QRCompositeReport1.Reports.Add(ReporteIVA);
        QRCompositeReport1.Reports.Add(ReporteTotales);
    end
end;

Porque como tengo q generar tantos reportes tendria q generar por cada uno un QRCompositeReport.

Creo q voy a utilizar un DataModulo y te cuento a ver q sucede

Gracias
Responder Con Cita
  #4  
Antiguo 16-11-2007
Avatar de Vlady
Vlady Vlady is offline
Miembro
 
Registrado: ago 2005
Posts: 217
Poder: 19
Vlady Va por buen camino
yo imprimo mediante una unidad creada por mi pero el QRCompositeReport lo tengo en un DataModulo creo las variables de los reportes que voy a mostrar pero me aparece un error de memoria voy a poner mi codigo

Código Delphi [-]

Var
 //Reporte de prueba
  Titulo : TRContinuaTitulo1;
  Agrupado : TRAgrupado;
  ReporteTotales : TRTotales;
  ReporteIVA : TRIVAS;
Aqui defino las variables en la unidad creada por mi, no se si al crearlas quedan locales y no las puedo ver en el datamodulo
Código Delphi [-]
if TipoFactura = 'Agrupada' then
  Begin
    try
    Titulo := TRContinuaTitulo1.Create(Nil);
    Agrupado := TRAgrupado.Create(Nil);
    ReporteTotales := TRTotales.Create(Nil);
    ReporteIVA := TRIVAS.Create(Nil);
    with Titulo do
    Begin
      //Consulta de impresion
        Query1.Close;
        Query1.SQL.Clear;
        Query1.SQL.TexT := 'SELECT * FROM FACTURATOTALES(' + inttostr(Factura) + ' )';
        Query1.Active := True;
       End;
    with Agrupado do
    Begin
       ///Agrupo los productos de la Orden de servicio
        Agrupado.Close;
        Agrupado.SQL.Clear;
        Agrupado.SQL.Add('SELECT I.Grupo As Grupo, SUM(I.Valor) AS Valor FROM Servicio S, Orden_Servicio O, ItemServicio I');
        Agrupado.SQL.Add('WHERE N_Factura = '+ inttostr(Factura) +' AND S.Codigo = I.Servicio AND I.Orden = N_Orden AND I.Servicio = S.Codigo GROUP BY I.Grupo');
        Agrupado.Active := True;
     
    End;

    with ReporteTotales do
    Begin
       //Totales de la Factura
        Totales.Close;
        Totales.SQL.Clear;
        Totales.SQL.Text := 'SELECT * FROM TOTALFACTURA ('+ inttostr(Factura) + ')';
        Totales.Active := True;
 
    End;

    with ReporteIVA DO
    bEGIN
       //Totales de la Factura
        IVAS.Close;
        IVAS.SQL.Clear;
        IVAS.SQL.Text := 'SELECT * FROM TOTALFACTURA1 ('+ inttostr(Factura) + ')';
        IVAS.Active := True;
    END;
       //aqui me aparece el error
       DataM.Reporteador.Preview;
     finally
       FreeAndNil(Titulo);
       FreeAndNil(Agrupado);
       FreeAndNil(ReporteTotales);
     end;
   end;

Asi lleno el evento OnAddReports en el QRCompositeReport q se encuentra en el datamodulo


Código Delphi [-]
procedure TDataM.ReporteadorAddReports(Sender: TObject);
begin
   Reporteador.Reports.Add(Titulo);
   Reporteador.Reports.Add(Agrupado);
   Reporteador.Reports.Add(ReporteIVA);
   Reporteador.Reports.Add(ReporteTotales);
end;


Cuando muestro el QRCompositeReport llamado desde mi unidad me aparece un error de memoria e hecho un seguimiento y la secuencia no entra al evento onAddReports.

La otra opcion que pienso es crear el QRCompositeReport en tiempo de ejecución pero como lleno el evento onAddReports.

Si alguien me puede ayudar lo agradeceria ya llevo dos dias con este problema

Gracias

Última edición por Vlady fecha: 16-11-2007 a las 23:06:17.
Responder Con Cita
  #5  
Antiguo 17-11-2007
Avatar de Lepe
[Lepe] Lepe is offline
Miembro Premium
 
Registrado: may 2003
Posts: 7.424
Poder: 29
Lepe Va por buen camino
Uff, vaya lío tienes ¿eh?

He editado este mensaje varias veces, espero que veas el definitivo.
En el datamodule:
Código Delphi [-]
var
    //Reporte de prueba
    Titulo : TRContinuaTitulo1;
    Agrupado : TRAgrupado;
    ReporteTotales : TRTotales;
    ReporteIVA : TRIVAS;

 implementation  // ojo esto es importante, declaramos las variables en la
// parte interface, para que sean visibles desde fuera

// no sé como lo tienes, porque no has dado referencias, no sé donde tenías 
//este código. Así queda claro.

En esa unidad tuya que no dices como se llama ni que hace :
Código Delphi [-]
if TipoFactura = 'Agrupada' then
  Begin
    try
    datam.Titulo := TRContinuaTitulo1.Create(Nil);
    datam.Agrupado := TRAgrupado.Create(Nil);
    datam.ReporteTotales := TRTotales.Create(Nil);
    datam.ReporteIVA := TRIVAS.Create(Nil);
    with datam.Titulo do
    Begin
      //Consulta de impresion
        Query1.Close;
        Query1.SQL.Clear;
        Query1.SQL.TexT := 'SELECT * FROM FACTURATOTALES(' + inttostr(Factura) + ' )';
        Query1.Active := True;
       End;
    with datam.Agrupado do
    Begin
       ///Agrupo los productos de la Orden de servicio
        Agrupado.Close;
        Agrupado.SQL.Clear;
        Agrupado.SQL.Add('SELECT I.Grupo As Grupo, SUM(I.Valor) AS Valor FROM Servicio S, Orden_Servicio O, ItemServicio I');
        Agrupado.SQL.Add('WHERE N_Factura = '+ inttostr(Factura) +' AND S.Codigo = I.Servicio AND I.Orden = N_Orden AND I.Servicio = S.Codigo GROUP BY I.Grupo');
        Agrupado.Active := True;
     
    End;

    with datam.ReporteTotales do
    Begin
       //Totales de la Factura
        Totales.Close;
        Totales.SQL.Clear;
        Totales.SQL.Text := 'SELECT * FROM TOTALFACTURA ('+ inttostr(Factura) + ')';
        Totales.Active := True;
 
    End;

    with datam.ReporteIVA DO
    bEGIN
       //Totales de la Factura
        IVAS.Close;
        IVAS.SQL.Clear;
        IVAS.SQL.Text := 'SELECT * FROM TOTALFACTURA1 ('+ inttostr(Factura) + ')';
        IVAS.Active := True;
    END;
    //ahora añadimos al qrComposite todos los informes (reportes)
   qrCompositeReport1.Reports.Add(datam.Titulo);
   QRCompositeReport1.Reports.Add(datam.Agrupado);
   QRCompositeReport1.Reports.Add(datam.ReporteIVA);
   QRCompositeReport1.Reports.Add(datam.ReporteTotales);

       qrCompositeReport1.PreviewMODAL; // modal por fuerza mayor  
     finally
      QRCompositeReport1.Reports.Clear;
       FreeAndNil(datam.Titulo);
       FreeAndNil(datam.Agrupado);
       FreeAndNil(datam.ReporteTotales);
      ¿el de iva no lo liberas?? ¿por qué?
     end;
   end;

El evento OnAddReport del Qrcomposite reports se ejecuta cuando haces esta línea:
Código Delphi [-]
qrCompositeReport1.Reports.Add(titulo);
pero eso lo haces dentro del mismo evento OnAddReports, así que:
- No se ejecuta nunca (por eso no entra en el evento OnAddReports.
- Si se llega a ejecutar alguna vez, dará recursión (desbordado de pila).

Para lo que quieres, no debes usar el evento OnAddReports para nada.

Saludos
__________________
Si usted entendió mi comentario, contácteme y gustosamente,
se lo volveré a explicar hasta que no lo entienda, Gracias.

Última edición por Lepe fecha: 17-11-2007 a las 15:18:15.
Responder Con Cita
  #6  
Antiguo 19-11-2007
Avatar de Vlady
Vlady Vlady is offline
Miembro
 
Registrado: ago 2005
Posts: 217
Poder: 19
Vlady Va por buen camino
Lepe gracias por tus aportes pero te cuento q me ha surgido un problema me dices que las variables deben estar antes de implementation pero la declaración de los uses se hace despues y por eso no me reconoce el tipo de variable:

Código Delphi [-]

Var
 //Reporte de prueba
  Titulo : TRContinuaTitulo1;
  Agrupado : TRAgrupado;
  ReporteTotales : TRTotales;
  ReporteIVA : TRIVAS;

implementation

uses Funciones, ReporteTituloContinuas1, ReporteAgrupado, ReporteTotales, ReporteIVAS;

entonces no qued mas remedio q ponerlas abajo de implementation.

La otra al llamar la variable desde mi unidad q se llama funciones no me reconoce ninguna variable creada y me apararece un error

Código Delphi [-]
   try
    //Aui me aparece un error Undeclared identifier Titulo
    DataM.Titulo := TRContinuaTitulo1.Create(Nil);
    DataM.Agrupado := TRAgrupado.Create(Nil);
    DataM.ReporteTotales := TRTotales.Create(Nil);
    DataM.ReporteIVA := TRIVAS.Create(Nil);
    with DataM.Titulo do
    Begin

puse las variables en la unidad creada por mi llamada funciones y el QRCompositeReport en el DataModulo pero me aparece un erro de de
Imágenes Adjuntas
Tipo de Archivo: jpg error.jpg (894 Bytes, 4 visitas)

Última edición por Vlady fecha: 19-11-2007 a las 17:29:24.
Responder Con Cita
  #7  
Antiguo 19-11-2007
Avatar de Lepe
[Lepe] Lepe is offline
Miembro Premium
 
Registrado: may 2003
Posts: 7.424
Poder: 29
Lepe Va por buen camino
Intuía lo que estaba pasando, por eso mismo añadí dataM. a todas las instrucciones (de hecho me harté muy mucho ).
Cuando tú haces esto:
Código Delphi [-]
if TipoFactura = 'Agrupada' then
  Begin
    try
    Titulo := TRContinuaTitulo1.Create(Nil);
estás creando el informe "Titulo" que está en el qrCompositeReport. Sin embargo, cuando haces esto:
Código Delphi [-]
procedure TDataM.ReporteadorAddReports(Sender: TObject);
begin
   Reporteador.Reports.Add(Titulo);
Estas añadiendo el Titulo que pertenece al DataM, un informe que todavía no ha sido creado, por eso obtienes una violación de acceso a memoria.

Si tu código compilaba, es que tienes el informe "Titulo" declarado en ¡¡los dos sitios !! en el qrCompositeReport y también en el DataM, y para delphi, son 2 informes distintos, aunque se llamen igual (Titulo) y sean del mismo tipo (TRContinuaTitulo1).



Si declaras Agrupado debajo de implementation, entonces se convierten en variables privadas, es decir, no se pueden ver (ni llamar) desde fuera de ese .pas. Esto implica que al intentar acceder desde tu unidad del qrComposite el compilador no sepa donde está "Agrupado" y al intentar acceder a cualquier propiedad te de una violación de acceso a memoria.

Soluciones hay muchas, pero es difícil adivinar como tienes planteado tu programa y lo que quieres hacer.

Si solo vas a usar titulo, Agrupado, etc en el qrCompositeReport, entonces mueve todo a esa unidad, las variables, los "uses", etc, y hazlo todo allí. Así no tendrás que hacer referencia al DataM para nada.

Otra solución:
Cita:
Lepe gracias por tus aportes pero te cuento q me ha surgido un problema me dices que las variables deben estar antes de implementation pero la declaración de los uses se hace despues y por eso no me reconoce el tipo de variable:
No tiene por qué, arriba del todo, en el apartado "interface" también tienes otra zona de "uses" donde puedes declarar variables que sí se verán (y sí se pueden llamar) desde fuera del archivo. Pero claro, yo no puedo adivinar si te dará referencias circulares (inténtalo, si delphi te muestra un mensaje de error con referencias circulares esta solución no te sirve).

Saludos
__________________
Si usted entendió mi comentario, contácteme y gustosamente,
se lo volveré a explicar hasta que no lo entienda, Gracias.
Responder Con Cita
Respuesta



Normas de Publicación
no Puedes crear nuevos temas
no Puedes responder a temas
no Puedes adjuntar archivos
no Puedes editar tus mensajes

El código vB está habilitado
Las caritas están habilitado
Código [IMG] está habilitado
Código HTML está deshabilitado
Saltar a Foro

Temas Similares
Tema Autor Foro Respuestas Último mensaje
DBAware en tiempo de ejecución Chandra Conexión con bases de datos 3 09-07-2007 16:10:39
Tabla en tiempo de ejecucion noshy SQL 1 24-07-2006 00:39:31
Menús en tiempo de ejecución pepetonic2001 OOP 21 22-06-2006 14:51:54
Componentes en Tiempo de Ejecucion Caro Varios 2 16-05-2005 16:49:01
Tiempo de ejecucion? st7 Varios 3 11-05-2004 22:03:28


La franja horaria es GMT +2. Ahora son las 01:11:52.


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
Copyright 1996-2007 Club Delphi