Ver Mensaje Individual
  #1  
Antiguo 21-05-2016
Avatar de Arsenio
Arsenio Arsenio is offline
Miembro
 
Registrado: oct 2006
Posts: 13
Reputación: 0
Arsenio Va por buen camino
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.
__________________
Arsenio Lupín - howtoarsenio.blogspot.com
Responder Con Cita