Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Impresión (https://www.clubdelphi.com/foros/forumdisplay.php?f=4)
-   -   Cálculo de variables y acumuladores en FastReport 4 (https://www.clubdelphi.com/foros/showthread.php?t=90350)

Arsenio 21-05-2016 19:19:00

Cálculo de variables y acumuladores en FastReport 4
 
Hola gente, estuve bastante investigando sobre el tema y como al final logré hacer lo que necesitaba se los traigo para todos...
si ustedes deciden despues lo pueden poner como truco, pero me parece que la parte de reportes es donde uno buscará antes.

Básicamente necesitaba en un reporte mostrar la diferencia entre dos fechas (en un formato leíble por el cliente) y al final
mostrar el promedio de esas duraciones.

En el FastReport, si sobre una variable vamos a los eventos y damos doble click nos genera el cuerpo del evento en la solapa del código.
Los cuatro eventos que uso son OnBeforePrint y son sobre TfrxMemoView. RestaFechas y TiempoEstimado (este va en el Sumario) son
los únicos que se muestran, los otros estan solo para usar sus eventos.

Código Delphi [-]
const
  MascaraDias = '%d días %2.2d horas %2.2d minutos';
  MascaraHoras = '%2.2d horas %2.2d minutos';
  MascaraMinutos = '%d minutos';

//Variables globales usadas para obtener el promedio
var
  Acumulador:Extended;
  Contador: Integer;

//Función que separa el tiempo en días, horas, y minutos y lo devuelve en un string formateado
function TiempoLeible(valor: Extended): String;
var
  d, h, m, s, ms: Word;
  tiempo: String;    
begin    
 d := Trunc(valor);      
 DecodeTime(valor, h, m, s, ms); 
 Result := '';  

 //Si hay días
 if d > 0 then        
   Result := Format(MascaraDias, [d, h, m])
 else
 //Si hay horas       
 if h > 0 then        
   Result := Format(MascaraHoras, [h, m])
 else
   //Muestra minutos como lo más pequeño             
   Result := Format(MascaraMinutos, [m]);             
end;          

procedure RestaFechasOnBeforePrint(Sender: TfrxComponent);      
var
  valor: Extended;
  tiempo: String;            
begin
  //Obtiene la diferencia entre los dos campos fecha                    
  valor := DetalleRecepciones."HORA_TOMA" - DetalleRecepciones."HORA_LLEGA";
  tiempo := TiempoLeible(valor);      
  RestaFechas.Text := tiempo;         
end;

procedure RestaTiempoFloatOnBeforePrint(Sender: TfrxComponent);
var
  valor: Extended;    
begin
 //Obtiene la diferencia entre los dos campos fecha       
 valor := DetalleRecepciones."HORA_TOMA" - DetalleRecepciones."HORA_LLEGA";
 //Acumula para el promedio      
 Acumulador := Acumulador + valor;
 //Cuenta para despues obtener el promedio            
 Contador := Contador + 1;
 //Esta variable no se muestra, solo para las pruebas...                    
 RestaTiempoFloat.Text := Format('%d: %s', [Contador, FloatToStr(Acumulador)]);     
end;

procedure PromedioOnBeforePrint(Sender: TfrxComponent);
var
  valor: Extended;
  tiempo: String;        
begin
  valor := 0;
  tiempo := '0';             
  //Cálculo del promedio
  if Contador > 0 then
  begin
    valor := Acumulador / Contador;
    tiempo := TiempoLeible(valor);            
  end;

  Promedio.Text := tiempo;      
end;

procedure TiempoEstimadoOnBeforePrint(Sender: TfrxComponent);
begin
  //Muestra el entero como x minutos               
  TiempoEstimado.Text := VarToStr() + ' minutos';         
end;

begin

end.

Donde dice:
Código:

  valor := DetalleRecepciones."HORA_TOMA" - DetalleRecepciones."HORA_LLEGA";
reemplazar con:
Código:

  valor := <DetalleRecepciones."HORA_TOMA">-<DetalleRecepciones."HORA_LLEGA">;
Ya que el editor de estilos si lo dejaba con "<" y ">" se mostraba mal.

Espero les sirva.

ecfisa 22-05-2016 05:14:13

Hola Arsenio.

Muchas gracias por tu aporte ^\||/

Saludos :)

ElKurgan 23-05-2016 07:37:37

Gracias por el aporte

Saludos


La franja horaria es GMT +2. Ahora son las 02:33:25.

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