Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Impresión (https://www.clubdelphi.com/foros/forumdisplay.php?f=4)
-   -   QuickReport me recalcula campos al imprimir (https://www.clubdelphi.com/foros/showthread.php?t=46360)

jymy788 30-07-2007 13:59:18

QuickReport me recalcula campos al imprimir
 
Buenas a tod@s los forer@s

Tengo un problema que me ha dejado pillado.

Tengo un Informe con QuickReport y Delphi7 donde varios de los datos los saco de querys y donde tengo etiquetas que se calculan en el evento onPrint.

Cuando previsualizo el informe todos los datos me cuadran pero sin embargo, cuando lo imprimo hay ciertos datos que se "multiplican por 2" (se suman consigo mismo) y me imprime el resultado de esta operación.

Por ejemplo, en la etiqueta donde pongo el subtotal:
Código:

procedure TForm3.QRTotPrint(sender: TObject; var Value: String);
var
  totalAux: double;
begin
  totalAux := subtotal + incrementoTotal - descuentoTotal + ivaTotal;
  Value := Format('%0.2f',[totalAux]);
end;

me pone 215 como su valor al previsualizar el informe y me pone 430 al imprimirlo.

¿Alguien me puede decir por qué?

Gracias de antemano

jhonny 30-07-2007 14:40:47

Porque, al hacer el Preview calcula el valor que necesitas, pero al mandarlo a imprimir no inicializas las variables globales y ellas siguen con valores, los cuales toma en cuenta para seguir calculando, te sugiero que inicialices todas esas variables globales en el BeforePrint del TQuckReport, por ejemplo:

Código Delphi [-]
 
subtotal        := 0; 
incrementoTotal := 0; 
descuentoTotal  := 0; 
ivaTotal        := 0;

jymy788 30-07-2007 14:49:33

Sigue sin funcionar correctamente
 
en el beforePrint del TQuickReport ya lo hice, algo del estilo:

Código:

procedure TForm3.QuickRep1BeforePrint(Sender: TCustomQuickRep;
  var PrintReport: Boolean);
begin
    subtotal        := 0;
    ivaAux          := 0;
    validezAux      := 0;
    descuentoAux    := 0;
    incrementoAux  := 0;
    descuentoTotal  := 0;
    incrementoTotal := 0;
    ivaTotal        := 0;
end;

Sin embargo, ahora, en el preview, no me calcula los valores de dichas etiquetas y tampoco cuando lo imprime.

Todas esas variables las tengo definidas en la parte pública del formulario y las calculo en el onPrint de las etiquetas que toca, supongo que esto no tendrá nada que ver.

Sigo pillado en una estupidez.

Si necesitáis que ponga el fuente completo, os lo paso.

Salu2 y gracias

jhonny 30-07-2007 15:06:36

Cita:

Empezado por jymy788
y las calculo en el onPrint de las etiquetas que toca

Que tal si calculas eso en el BeforePrint de la banda?

jymy788 30-07-2007 15:11:26

voy a probar y te cuento

jymy788 30-07-2007 15:29:28

buenas de nuevo.

Supongo que será porque estoy colapsado pero no puedo hacerlo en el BeforePrint de la banda a menos que haya ido haciendo lo propio en las bandas anteriores y no lo puedo hacer así porque las bandas anteriores tienen TQRDBText de los que no se obtener el valor.

Te pongo el código fuente a ver si se te ocurre qué le está pasando o si tengo que rehacerlo y por qué

Código:

unit impresion;
interface
uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls, ComCtrls, jpeg, ExtCtrls, DB, DBTables, QuickRpt,
  QRCtrls;
type
  TForm3 = class(TForm)
    PrintDialog1: TPrintDialog;
    QUtil: TQuery;
    qClientes: TQuery;
    QuickRep1: TQuickRep;
    qDecoracion: TQuery;
    QRBand1: TQRBand;
    QRSubDetail1: TQRSubDetail;
    QRDBText1: TQRDBText;
    QRDireccion1: TQRLabel;
    QRNombre: TQRLabel;
    QRDireccion2: TQRLabel;
    QRImage2: TQRImage;
    QRDBText2: TQRDBText;
    QRDBText3: TQRDBText;
    QRDBText4: TQRDBText;
    QRLabel7: TQRLabel;
    QRGroup1: TQRGroup;
    QRLabel1: TQRLabel;
    QRLabel3: TQRLabel;
    QRLabel4: TQRLabel;
    QRLabel5: TQRLabel;
    QRLabel6: TQRLabel;
    QRTitle1: TQRLabel;
    QRRef: TQRLabel;
    QRArticulo: TQRLabel;
    QRPrecio1: TQRLabel;
    QRLabel2: TQRLabel;
    qAccesorios: TQuery;
    QRGroup2: TQRGroup;
    QRLabel8: TQRLabel;
    QRSubDetail2: TQRSubDetail;
    QRDBText5: TQRDBText;
    QRDBText6: TQRDBText;
    QRLabel9: TQRLabel;
    QRLabel10: TQRLabel;
    QRLabel11: TQRLabel;
    QRLabel12: TQRLabel;
    QRDBText7: TQRDBText;
    QRBand3: TQRBand;
    QRLabel23: TQRLabel;
    QRLabel28: TQRLabel;
    QRVal: TQRLabel;
    QRLabel29: TQRLabel;
    QRFecha: TQRLabel;
    QRShape3: TQRShape;
    QRShape4: TQRShape;
    QRShape5: TQRShape;
    QRLabel30: TQRLabel;
    QRLabel31: TQRLabel;
    QRLabel32: TQRLabel;
    QRLabel34: TQRLabel;
    QRLabel35: TQRLabel;
    QRNumero: TQRLabel;
    QRBand2: TQRBand;
    QRShape1: TQRShape;
    QRSub: TQRLabel;
    QRLabel13: TQRLabel;
    QRLabel14: TQRLabel;
    QRPrecioMonjate: TQRLabel;
    QRLabel16: TQRLabel;
    QRMontaje: TQRLabel;
    QRDesp: TQRLabel;
    QRLabel17: TQRLabel;
    QRLabel15: TQRLabel;
    QRPrecioD: TQRLabel;
    QRLabel19: TQRLabel;
    QRLabelIva: TQRLabel;
    QRLabel21: TQRLabel;
    QRIncrem: TQRLabel;
    QRLabel22: TQRLabel;
    QRLabel18: TQRLabel;
    QRInc: TQRLabel;
    QRLabel24: TQRLabel;
    Descuento: TQRLabel;
    QRDesc: TQRLabel;
    QRLabel25: TQRLabel;
    QRDescuento: TQRLabel;
    QRLabel27: TQRLabel;
    QRShape2: TQRShape;
    QRLabel20: TQRLabel;
    QRLabel26: TQRLabel;
    QRShape6: TQRShape;
    QRSubto: TQRLabel;
    QRIva: TQRLabel;
    QRTot: TQRLabel;
    procedure FormShow(Sender: TObject);
    procedure rellenarDatosCliente();
    procedure rellenarDatosPresupuesto(refArticulo, desArticulo, tipoAcc,
      decoracion, trabajos, articulo, desplazamiento: string;
      precio1, precio2, precio3, precio4, precio5: double; iva: integer; descuento,
      incremento: double; validez: integer; fecha: string; numPres: integer);
    procedure QRDBText7Print(sender: TObject; var Value: String);
    procedure QRDBText4Print(sender: TObject; var Value: String);
    procedure QRDBText6Print(sender: TObject; var Value: String);
    procedure QRPrecio1Print(sender: TObject; var Value: String);
    procedure QRPrecioMonjatePrint(sender: TObject; var Value: String);
    procedure QRPrecioDPrint(sender: TObject; var Value: String);
    procedure QRIncremPrint(sender: TObject; var Value: String);
    procedure QRDescuentoPrint(sender: TObject; var Value: String);
    procedure QRSubtoPrint(sender: TObject; var Value: String);
    procedure QRIvaPrint(sender: TObject; var Value: String);
    procedure QRTotPrint(sender: TObject; var Value: String);
    procedure QuickRep1BeforePrint(Sender: TCustomQuickRep;
      var PrintReport: Boolean);
    procedure FormClose(Sender: TObject; var Action: TCloseAction);

  private
    { Private declarations }
  public
    { Public declarations }
    subtotal: double;
    ivaAux, validezAux: integer;
    descuentoAux, incrementoAux: double;
    descuentoTotal, incrementoTotal, ivaTotal: double;
  end;
var
  Form3: TForm3;
  subtotal: double;
    ivaAux, validezAux: integer;
    descuentoAux, incrementoAux: double;
    descuentoTotal, incrementoTotal, ivaTotal: double;
implementation
{$R *.dfm}
procedure TForm3.FormShow(Sender: TObject);
begin
  subtotal        := 0;
  ivaAux          := 0;
  validezAux      := 0;
  descuentoAux    := 0;
  incrementoAux  := 0;
  descuentoTotal  := 0;
  incrementoTotal := 0;
  ivaTotal        := 0;
  QuickRep1.Refresh;
  rellenarDatosCliente();
end;
procedure TForm3.rellenarDatosCliente();
var
  nombre, apellido1, apellido2, direccion, codpostal, provincia, localidad,
  telefono1, telefono2, observaciones: string;
begin
  nombre        := qClientes.fieldbyname('nombre').asstring;
  apellido1    := qClientes.fieldbyname('apellido1').asstring;
  apellido2    := qClientes.fieldbyname('apellido2').asstring;
  direccion    := qClientes.fieldbyname('direccion').asstring;
  codpostal    := qClientes.fieldbyname('cp').asstring;
  provincia    := qClientes.fieldbyname('provincia').asstring;
  localidad    := qClientes.fieldbyname('localidad').asstring;
  telefono1    := qClientes.fieldbyname('telefono1').asstring;
  telefono2    := qClientes.fieldbyname('telefono2').asstring;
  observaciones := qClientes.fieldbyname('observaciones').asstring;

  QRNombre.Caption := nombre+' '+apellido1+' '+apellido2;
  QRDireccion1.Caption := direccion;
  QRDireccion2.Caption := codpostal+', '+localidad+' ('+provincia+')';
end;
procedure TForm3.rellenarDatosPresupuesto(refArticulo, desArticulo, tipoAcc,
  decoracion, trabajos, articulo, desplazamiento: string;
  precio1, precio2, precio3, precio4, precio5: double; iva: integer; descuento,
  incremento: double; validez: integer; fecha: string; numPres: integer);
var
  iva2, total : double;
  temp:Real;
begin
  QRRef.Caption        := refArticulo;
  QRArticulo.Caption  := desArticulo;
  QRPrecio1.Caption    := Format('%0.2f',[precio1]);
  QRMontaje.Caption := trabajos;
  QRPrecioMonjate.Caption := Format('%0.2f',[precio4]);
  QRDesp.Caption      :=  desplazamiento;
  QRPrecioD.Caption    := Format('%0.2f',[precio5]);
  QRLabelIva.Caption  := 'IVA ('+intToStr(iva)+' %)';
  ivaAux := iva;
  descuentoAux := descuento;
  incrementoAux := incremento;
  validezAux := validez;
  QRInc.Caption := floatToStr(incremento);
  QRDesc.Caption := floatToStr(descuento);
  QRVal.Caption := intToStr(validez);
  QRFecha.Caption := fecha;
  QRNumero.Caption := intToStr(numPres);
end;

procedure TForm3.QRDBText7Print(sender: TObject; var Value: String);
begin
  if (QAccesorios.FieldByName('accesorio').AsString = 'rbAcc1') then
  begin
    Value := 'Solera Suelo';
  end;
  if (QAccesorios.FieldByName('accesorio').AsString = 'rbAcc2') then
  begin
    Value := 'Rodapies';
  end;
  if (QAccesorios.FieldByName('accesorio').AsString = 'rbAcc3') then
  begin
    Value := 'Zócalo';
  end;
  if (QAccesorios.FieldByName('accesorio').AsString = 'rbAcc4') then
  begin
    Value := 'Solera';
  end;
  if (QAccesorios.FieldByName('accesorio').AsString = 'rbAcc5') then
  begin
    Value := 'Supl. Macizos';
  end;
  if (QAccesorios.FieldByName('accesorio').AsString = 'rbAcc6') then
  begin
    Value := 'Cajón';
  end;
  if (QAccesorios.FieldByName('accesorio').AsString = 'rbAcc7') then
  begin
    Value := 'Tapas Cajón';
  end;
  if (QAccesorios.FieldByName('accesorio').AsString = 'rbAcc8') then
  begin
    Value := 'Tabicas';
  end;
  if (QAccesorios.FieldByName('accesorio').AsString = 'rbAcc9') then
  begin
    Value := 'Lápidas';
  end;
end;
procedure TForm3.QRDBText4Print(sender: TObject; var Value: String);
begin
  subtotal := subtotal + strToFloat(Value);
  Value := Format('%0.2f',[strToFloat(Value)]);
end;
procedure TForm3.QRDBText6Print(sender: TObject; var Value: String);
begin
  subtotal := subtotal + strToFloat(Value);
  Value := Format('%0.2f',[strToFloat(Value)]);
end;
procedure TForm3.QRPrecio1Print(sender: TObject; var Value: String);
begin
  subtotal := subtotal + strToFloat(Value);
  Value := Format('%0.2f',[strToFloat(Value)]);
end;
procedure TForm3.QRPrecioMonjatePrint(sender: TObject; var Value: String);
begin
  subtotal := subtotal + strToFloat(Value);
  Value := Format('%0.2f',[strToFloat(Value)]);
end;
procedure TForm3.QRPrecioDPrint(sender: TObject; var Value: String);
begin
  subtotal := subtotal + strToFloat(Value);
end;
procedure TForm3.QRIncremPrint(sender: TObject; var Value: String);
var
  incremento2 : double;
begin
  incremento2 := (subtotal * incrementoAux) / 100;
  incrementoTotal := incremento2;
  Value := Format('%0.2f',[incremento2]);
end;
procedure TForm3.QRDescuentoPrint(sender: TObject; var Value: String);
var
  descuento2 : double;
begin
  descuento2 := (subtotal * descuentoAux) / 100;
  descuentoTotal := descuento2;
  Value := Format('%0.2f',[descuento2]);
end;
procedure TForm3.QRSubtoPrint(sender: TObject; var Value: String);
begin
  Value := Format('%0.2f',[subtotal]);
end;
procedure TForm3.QRIvaPrint(sender: TObject; var Value: String);
var
  iva2 : double;
begin
  iva2 := ((subtotal + incrementoTotal - descuentoTotal) * ivaAux) / 100;
  ivaTotal := iva2;
  Value := Format('%0.2f',[iva2]);
end;
procedure TForm3.QRTotPrint(sender: TObject; var Value: String);
var
  totalAux: double;
begin
  totalAux := subtotal + incrementoTotal - descuentoTotal + ivaTotal;
  Value := Format('%0.2f',[totalAux]);
end;
procedure TForm3.QuickRep1BeforePrint(Sender: TCustomQuickRep;
  var PrintReport: Boolean);
begin
{
  subtotal        := 0;
  ivaAux          := 0;
  validezAux      := 0;
  descuentoAux    := 0;
  incrementoAux  := 0;
  descuentoTotal  := 0;
  incrementoTotal := 0;
  ivaTotal        := 0;
}
end;
procedure TForm3.FormClose(Sender: TObject; var Action: TCloseAction);
begin
  Form3.Destroy;
end;
end.


jymy788 30-07-2007 15:31:08

Además, si te fijas, el subtotal se va calculando a medida que se va haciendo el onPrint de todos los valores que sumados darán el subtotal y además, así de paso hago el formateo del valor asignándoselo al Value del QRDBText

Estoy pilladísimo y seguro que es una estupidez.

jymy788 30-07-2007 15:44:59

Solucionado !!!!
 
Ya lo he solucionado, o eso creo. (la prueba de impresión funcionó correctamente, ahora haré más)

el subtotal lo calculo en una de las bandas subdetail de la siguiente forma:

Código:

procedure TForm3.QRSubDetail2BeforePrint(Sender: TQRCustomBand;
  var PrintBand: Boolean);
begin
  subtotal := subtotal + (QAccesorios.fieldbyname('precio').asFloat);
end;

y ahora, si solo inicializo en el BeforePrint del quickreport el valor subtotal, me lo calcula correctamente y me imprime lo que me visualiza en el preview.

Vamos, que me estaba haciendo un lío de tres pares de narices en una tontería.

Gracias por tu tiempo y perdona mi "estupidez"

Salu2

jhonny 30-07-2007 15:54:22

Hombre¡¡¡, que bueno que se ha encontrado el problema y que además lo se ha sabido solucionar. :)


La franja horaria es GMT +2. Ahora son las 21:09:59.

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