Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Impresión (https://www.clubdelphi.com/foros/forumdisplay.php?f=4)
-   -   Problema con TCrpe (https://www.clubdelphi.com/foros/showthread.php?t=72530)

SergioVlc 24-02-2011 14:06:57

Problema con TCrpe
 
Hola,

Tengo un problema, parece que de refresco, con el componente TCrpe

Para el desarrollo de la aplicación uso Delphi 2007, Crystal 10 y una base de datos Access.

La rutina que da el problema se encarga de imprimir una factura pasandole como parámetro un "IdFactura" y funciona de la siguiente manera:

- Vacío una tabla temporal
- Lleno esta tabla con una serie de registros (las lineas de la factura correspondiente)
- Asigno una serie de parámetros del informe de Crystal
- Ejecuto el informe

La primera vez que llamo a este procedimiento muestra correctamente todos los datos.
La segunda vez que lo llamo actualiza correctamente los parámetros del informe pero
muestra los datos de la llamada anterior.
Si insisto y vuelvo a pedir la misma factura muestra correctamente todo.
A partir de aquí funciona bien aparentemente, por que de vez en cuando vuelve a producirse el mismo fallo.

El informe está guardado con la opción de "Save Data With Report" desactivada.
Además utilizo la función "DiscardSavedData" de la clase del componente.

He buscado este mismo error por internet, incluso he buscado otros componentes pero no encuentro solución, ¿alguna ayuda?

Muchas gracias

SergioVlc 24-02-2011 17:27:25

Solucionado
 
Hola de nuevo,

Finalmente he conseguido solucionar el problema cambiando la forma de pasar los datos al informe, lo comento por si le sirve a alguien:

Hasta ahora pasaba los datos de esta forma:
- La cabecera (Nombre, cif, etc.) y algunos parametros para formatear dinamicamente el informe (Negrita, NoImprimirTotal, etc.) los pasaba mediante paramFields al rpt.
- Las lineas del la factura (articulo, cantidad, precio, etc.) los pasaba mediante una tabla de access.

El problema, además de que no se actualizaba bien, era que cuando ocurría el error teníamos una cabecera de factura con las lineas de la factura anterior. Esto era mas grave que el imprimir una factura anterior o posterior.

La solución:

No utilizar los parametros (paramFields) de crystal para pasar información al report.
Para pasar los datos de cabecera y lineas de la factura he utilizado una consulta.

Parto de las dos tablas de facturas en access: FACTURAS y FACTURAS LINEAS (cabecera y lineas respectivamente)
Creo en access una consulta que relaciona ambas con todos los campos necesarios (si, la podría haber creado directamente en crystal).
Creo otra tabla denominada FACTURAS A IMPRIMIR, con dos únicos campos: un Id y un IdFactura.
El Id es un autonumerico y el IdFactura almacena los numeros de facturas a imprimir.
En crystal agrego esta consulta al informe y se enlazan mediante el campo IdFactura. En las opciones del enlace le indico Enforced Both
De esta forma, tanto si quiero imprimir una factura como lanzar una remesa de facturas, solo tengo que vaciar la tabla FACTURAS A IMPRIMIR y llenarla con los IdFactura correspondientes. Crystal filtrará los datos para que solo se impriman las facturas cuyo IdFactura coincida con los relacionados en la tabla FACTURAS A IMPRIMIR.

Saludos

SergioVlc 25-02-2011 01:00:36

Un poco de código vale mas que mil palabras
 
Para imprimir una unica factura:
Código Delphi [-]
procedure TInformeFacturaForm.ImprimeFactura(IdFactura: Integer);
begin
  rptInformeFactPto.DiscardSavedData;
  sqlImpresionFacturas.SQL.Text := 'SELECT * FROM [IMPRESION FACTURAS] '+
    'WHERE IdFactura = ' + IntToStr(IdFactura);
  sqlImpresionFacturas.Open;
  rptInformeFactPto.Tables[0].DataPointer := @(sqlImpresionFacturas.Recordset);
  rptInformeFactPto.Execute;
end;

Para imprimir todas las facturas indicadas en la tabla FACTURAS A IMPRIMIR
Código Delphi [-]
 
procedure TInformeFacturaForm.ImprimeFacturas;
begin
  // Imprime todas las facturas relacionadas en la tabla FACTURAS A IMPRIMIR
  sqlImpresionFacturas.SQL.Text := 'SELECT * FROM [IMPRESION FACTURAS] WHERE ' +
    'IdFactura IN (SELECT IdFactura FROM [FACTURAS A IMPRIMIR])';
  sqlImpresionFacturas.Open;
  with rptInformeFactPto do
  begin
    Output := toWindow;
    Tables[0].DataPointer := @(sqlImpresionFacturas.Recordset);
    Execute;
  end;
end;

PD: Finalmente el problema inicial era que olvidaba esta línea
Código Delphi [-]
rptInformeFactPto.Tables[0].DataPointer := @(sqlImpresionFacturas.Recordset);

Saludos


La franja horaria es GMT +2. Ahora son las 00:22:54.

Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2026, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi