PDA

Ver la Versión Completa : Cálculo de variables y acumuladores en FastReport 4


Arsenio
21-05-2016, 19:19:00
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.

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(<DetalleRecepciones."TIEMPO_ESTIMADO">) + ' minutos';
end;

begin

end.


Donde dice:
valor := DetalleRecepciones."HORA_TOMA" - DetalleRecepciones."HORA_LLEGA";

reemplazar con:
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