Ajuda com uma função que calcula tarifa de tempo

Delphi

28/08/2003

Estou precisando de uma ajuda referente a uma função que retorna o valor a ser pago... ou seja, eu informa o tempo que um usuário jogou, informo a tarifa usada pelo usuário e a função me retorna o valor a ser cobrado.
Bom, a função é a seguinte:

function CalculaTarifa(Tempo : TTime; Tarifa : String) : Currency;
var
TempoUso : TDateTime;
MenorTempo, MaiorTempo : TDateTime;
VRTempoMenor : Currency;
A, B : String;
begin
//já declaro que o resultado da função recebe 0
Result := 0;
// faço a busca pela base de dados, onde eu listo todos os horários que pertencem a uma determinada tarifa e ordeno
// expl:
MINUTOS VALOR
00:30:00 0,75
01:00:00 1,75
Modulo.QPesqValor.Close;
Modulo.QPesqValor.SQL.Clear;
Modulo.QPesqValor.SQL.Add(´SELECT * FROM HORARIOS´);
Modulo.QPesqValor.SQL.Add(´WHERE TAXA = ´´ + Tarifa + ´´´);
Modulo.QPesqValor.SQL.Add(´ORDER BY Minutos´);
Modulo.QPesqValor.Open;
//mando a base para o início
Modulo.QPesqValor.First;
//VrTempoMenor recebe o valor da menor tarifa(no caso. o ponteiro se encontra no primeiro registro da base de dados, pois foi ordenado pelos minutos(ORDER BY MINUTOS)
VRTempoMenor := Modulo.QPesqValor.FieldByName(´Valor´).AsCurrency;
//TempoUso recebe o tempo de entrada da função
TempoUso := Tempo;
//MenorTempo recebe o menor tempo encontrado na base de dados
MenorTempo := Modulo.QPesqValor.FieldByName(´Minutos´).AsDateTime;
//se o Tempo de uso for menor que o Menor tempo E se o TEmpo uso for maior que 00:00:00 então
// significa que ele deva ter usado pelo menos alguns minutos antes do Menor tempo encontrado na base(que no caso é meia hora)
if (TempoUso <= MenorTempo) AND (TempoUso > StrToTime(´00:00:00´)) then
begin
//result recebe ele mesmo + o valor do menor tempo(menor tempo = 00:30:00, valor = 0,75)
Result := Result + VrTempoMenor;
//já zero o tempo uso
TempoUso := StrToTime(´00:00:00´);
end
else
//agora se o tempo de uso for maior que o menor tempo(na base de dados)
if TempoUso > MenorTempo then
//enquanto o tempo uso for maio que o menor tempo, faça
While (TempoUso >= MenorTempo) do
begin
//enquanto o tempo uso for maior que o registro que se encontra na posição da base de dados, e a base de dados não chegar no final, faça
//OBSERVAÇÃO: existem duas condições de saída aqui... a primeira é se encontrar um registro(na base) que seja maior que o TempoUSo.. e
//se a base de dados chegar no final(END OF FILE - EOF)
while (TempoUso > Modulo.QPesqValor.FieldByName(´Minutos´).AsDateTime) AND NOT (Modulo.QPesqValor.Eof) do
begin
//mando a base para o próximo registro
Modulo.QPesqValor.Next;
Application.ProcessMessages;
end;
//maior tempo recebe o valor do maior registro encontrado na base de dados
MaiorTempo := Modulo.QPesqValor.FieldByName(´Minutos´).AsDateTime;
//o tempo de uso do usuário recebe ele mesmo - o Maior tempo encontrado
TempoUso := TempoUso - MaiorTempo;
// o resultado da função recebe o valor dele mesmo + o valor encontrado da base de dados(referente o maior valor)
Result := Result + Modulo.QPesqValor.FieldByName(´Valor´).AsCurrency;
//mando a base para o início novamente
Modulo.QPesqValor.First;
{faço uma conversão de times para string, e string para times para que a proxima condição abaixo seja aceite)
A := TimeToStr(TempoUso);
B := TimeToStr(MenorTempo);
TempoUso := StrToTime(A);
MenorTempo := StrToTime(B);
//se o tempo uso for menor ou igual a menor tempo(no caso, seria o resto do menor tempo, ou seja se o tempo uso for menor que o menor tempo, então ainda
// restam alguns minutos
if (TempoUso <= MenorTempo) AND (TempoUso > StrToTime(´00:00:00´)) then
begin
//result recebe o valor dele mesmo + o valor do menor tempo
Result := Result + VrTempoMenor;
//tempo uso recebe 00:00:00 para sair da condição do while
TempoUso := StrToTime(´00:00:00´);
end;
Application.ProcessMessages;
end;
end;


Bom professor, se vc for fazer o teste de mesa.... faça com os seguintes valores:
neste caso. temos uma base de tarifas que contém os seguintes valores

MINUTOS VALORES
00:30:00 0,75
01:00:00 1,50

Vamos ter como base em que um usuário vá jogar 01:30:00(usando a tarifa normal), e em seguida um outro usuário vá jogar 01:40:00
Pela lógica se o primeiro usuário jogar 01:30:00, ele deveria pagar o valor da 01:00:00 + o valor da 00:30:00, sendo assim, 1,50 + 0,75 = 2,25

(sem usar a função acima)No segundo caso, onde um usuário queira jogar 01:40:00 o valor correto deveria ser o valor de duas horas... pois ele pega o valor da 01:00:00, retira 01:00:00 sobra
40 minutos... bom os 40 minutos não se encaixam no valor da 00:30:00, porém se encaixa no valor da 01:00:00, então.. o certo seria 3,00 reais...

Agora, se o usarmos a função no segundo caso, onde o usuário queira jogar 01:40:00 a função me retorna 3,75 cents. O problema é que além dele pegar duas vezes o valor das 01:00:00, o resto é somado com o ValorTempoMenor. Intendeu? Ou seja, ele entra na última condição:

if (TempoUso <= MenorTempo) AND (TempoUso > StrToTime(´00:00:00´)) then
begin
//result recebe o valor dele mesmo + o valor do menor tempo
Result := Result + VrTempoMenor;
//tempo uso recebe 00:00:00 para sair da condição do while
TempoUso := StrToTime(´00:00:00´);
end;

Asssim, ele soma o duas vezes o valor da 01:00:00 e ainda entra nesta condição acima somando com + 0,75 cents.. ficando , 3,75

Alguém poderima me ajudarr? :idea:

Atenciosamente, Daniel Vieira Costa


Netcrusher

Netcrusher

Curtidas 0

Respostas

4_olho

4_olho

28/08/2003

Por quê não utiliza a função CASE?

Ela faz justamente o que precisa: associa seu dado ao menor valor de um intervalo.

Experimente fazer os cálculos que precisa usando o Excel, usando a função vlookup (procv em português).


GOSTEI 0
POSTAR