PDA

Ver la Versión Completa : Problema con TCrpe


SergioVlc
24-02-2011, 14:06:57
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
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
Para imprimir una unica factura:

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

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 rptInformeFactPto.Tables[0].DataPointer := @(sqlImpresionFacturas.Recordset);

Saludos