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';
var
Acumulador:Extended;
Contador: Integer;
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 := '';
if d > 0 then
Result := Format(MascaraDias, [d, h, m])
else
if h > 0 then
Result := Format(MascaraHoras, [h, m])
else
Result := Format(MascaraMinutos, [m]);
end;
procedure RestaFechasOnBeforePrint(Sender: TfrxComponent);
var
valor: Extended;
tiempo: String;
begin
valor := DetalleRecepciones."HORA_TOMA" - DetalleRecepciones."HORA_LLEGA";
tiempo := TiempoLeible(valor);
RestaFechas.Text := tiempo;
end;
procedure RestaTiempoFloatOnBeforePrint(Sender: TfrxComponent);
var
valor: Extended;
begin
valor := DetalleRecepciones."HORA_TOMA" - DetalleRecepciones."HORA_LLEGA";
Acumulador := Acumulador + valor;
Contador := Contador + 1;
RestaTiempoFloat.Text := Format('%d: %s', [Contador, FloatToStr(Acumulador)]);
end;
procedure PromedioOnBeforePrint(Sender: TfrxComponent);
var
valor: Extended;
tiempo: String;
begin
valor := 0;
tiempo := '0';
if Contador > 0 then
begin
valor := Acumulador / Contador;
tiempo := TiempoLeible(valor);
end;
Promedio.Text := tiempo;
end;
procedure TiempoEstimadoOnBeforePrint(Sender: TfrxComponent);
begin
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.