Fórum Ajuda com Calculo de Horas #420784

31/07/2012

0

Olá Amigos. também estou tentando um sistema para estacionamento e preciso que ele calcule
a hora a cada 30 minutos, tem que ser a cada 30 minutos, tipo preço da hora R$ 4,00
o veiculo entrou as 12:00 e saiu as 12:28 valor a ser cobrado R$ 2,00, caso entrou 12:00
e saiu as 12:32 valor a ser cobrado R$ 4,00 e assim por diante.

bem sou iniciante em delphi, bem iniciante mesmo, este programinha peguei na net, só que ele calcula
de hora em hora não importa se o veiculo entrou as 12:00 e saiu as 12:20 ele cobra R$ 4,00, porém eu não sei
modificar o codigo que esta nele calculando as horas, gostaria se vcs puderem deem uma olhada
nele e se possivel passo a passo me ensinen, o que alterar ou modificar, ate mesmo fazer outro.


no banco de dados tenhos os campos :
HoraEntrada Tipo (time)
HoraSaida tipo (Time )
PlacaVeiculo tipo (A)
Dataentrada tipo date
DataSaida tipo (date)
QtdHora tipo (N)
VrHora tipo ($) Money
Tipo (A) 1
Quando o veiculo entra é digitado a placa dele, o modelo e em DbRadioGroup é selecionado Hora, em seguida clico em botão Gravar, apos clicar em gravar no banco de dados já fica os dados, placa, modelo, dataentrada, Horaentrada, Tipo,ficando as horas do sistema sendo exibida em Edit.

quando o veiculo vai sair clico em botão fechar, e no banco grava o restante dos dados : DataSaida, HoraSaida e VrHora.

Ao Clicar no Botão Fechar o Aplicativo passa a executar este procedimento Abaixo:


Gilvanio Gonçalves

Gilvanio Gonçalves

Responder

Posts

31/07/2012

Gilvanio Gonçalves

desculpem cliquei em eviar anter de terminar, abaixo o codigo que esta no programinha.


Ao Clicar no Botão Fechar o Aplicativo passa a executar este procedimento Abaixo:

procedure TFservico.BtnFecharClick(Sender: TObject);
begin
if btncancelar.Enabled then
BtnGravarClick(self);

if Modulo.TBServico[Tipo]=G then
begin
FechaPagoExecute(Self);
Abort;
end;

if Application.MessageBox(Deseja registrar Fechamento?,Fechamento,0+4+32)=6 then
begin
Modulo.TBServico.Edit;
if (Modulo.TBServico[Tipo]=P) or (Modulo.TBServico[Tipo]=C)then
begin
Modulo.TBServico[horasaida]:= timetostr(now);
Modulo.TBServico[datasaida]:= datetostr(now);
Modulo.TBServicoqtddias.Clear;
Modulo.TBServicoqtdhora.Clear;
end;

if Modulo.TBServico[Especie] = H then
FechaHoraexecute(Self); ( Chama Esta FunÇão)
if Modulo.TBServico[Especie] = D then
FechaDiaExecute(Self);


Modulo.TBServicoSubTotal.Value:=Modulo.TBServicoVrDiaria.Value +
Modulo.TBServicoVrHora.Value + Modulo.TBServicoVrItens.Value +
Modulo.TBServicoVrCera.Value + Modulo.TBServicoVrMotor.Value +
Modulo.TBServicoVrTerceiro.Value ;

Modulo.TBServicoTotal.Value:= Modulo.TBServicoSubTotal.Value -
Modulo.TBServicoDesconto.Value;
Modulo.TBServico.Post;

if Modulo.TBServico[Tipo]= P then
FechaParticularExecute(self);
if Modulo.TBServico[Tipo]= C then
FechaConvenioExecute(self);

try
Modulo.TBServico.Filter :=EntradaN=+EditEntradaN.text+;
Modulo.TBServico.Filtered := True;
Application.CreateForm(TFDialogoImp,FDialogoImp);
FDialogoImp.ShowModal;
FDialogoImp.Release;
finally
FDialogoImp.Free;
Modulo.TBServico.Filtered := false;
end;

BtnCancelar.Enabled:=False;
BtnGravar.Enabled:=False;
end
else
Abort;
EditDinheiro.SetFocus;
end;

Codigo da Função Abaixo:

procedure TFservico.FechaHoraExecute(Sender: TObject);
var
HoraEnt,HoraSaida:TDateTime;
Horas:Integer;
FracaoHora,FracaoDia:Double;
begin
FracaoHora:=0;
FracaoDia:=0;
Horas:=0;
// codigo que exibe o preço da hora e fraciona
if (Modulo.TBServico[Tipo]=P) or (Modulo.TBServico[Tipo]=C)then
begin
HoraEnt:=StrToDateTime(DatetoStr(Modulo.TBServico[DataEntrada])+ +
TimeToStr(Modulo.TBServico[HoraEntrada]));
HoraSaida:=StrToDateTime(DateToStr(Modulo.TBServico[DataSaida])+ +
TimeToStr(Modulo.TBServico[HoraSaida]));
FracaoDia:=HoraSaida-HoraEnt;
FracaoHora:=FracaoDia*24;
while FracaoHora>Horas do
Inc(Horas);
FracaoHora:=FracaoHora-Horas;
if FracaoHora<0>1/6 then
Inc(Horas);

if Horas<1 then
Inc(Horas);

Modulo.TBServico[QtdHora]:=Horas;
end;

if Modulo.TbServico[VrHora]=null then
Modulo.TbServico[VrHora]:=(Modulo.TBServico[QtdHora])*
(Modulo.TbValores[VrHora])
else
Modulo.TbServico[VrHora]:=(Modulo.TBServico[QtdHora])*
(Modulo.TbServico[VrHora]);

if Modulo.TBServico[Itens]<>null then
LavacaoExecute(Self);

end;


Peço a vcs pro favro me ajudem pois eu não entendi nada desta função, Nào sou apto ainda em delphi para isto, para modificar ou fazer uma função correta para atender no que preciso, peço ajuda se puderam me de o exemplo do codigo que devo usar, ou este meu codigo alterado para funcionar no que preciso, desde ja agradeço a quem me ajudar.
Responder

Gostei + 0

01/08/2012

Bruno Leandro

Ola, rapaz é um calculo meio complicado, mas a solução me parece ser neste trecho, o motivo da diferença que aqui está sendo tratado sempre como 1 hr, e voce quer alterar para que seja considerado de meia em meia hora, tente alterar conforme sugestão a baixo e verifique qual o resultado, talvez precise de mais alterações, mas acredito que ja seja um começo



while FracaoHora>Horas do
Inc(Horas);

FracaoHora:=FracaoHora-Horas;

if FracaoHora<0>1/2 then
Inc(Horas);

if Horas<1 then
Horas:=0;

Modulo.TBServico[QtdHora]:=Horas;
end;

if Modulo.TbServico[VrHora]=null then
Modulo.TbServico[VrHora]:=(Modulo.TBServico[QtdHora])*(Modulo.TbValores[VrHora]) + ((0,5)*(Modulo.TbValores[VrHora]))
else
Modulo.TbServico[VrHora]:=(Modulo.TBServico[QtdHora])*(Modulo.TbServico[VrHora]) + ((0,5)*(Modulo.TbValores[VrHora]));
Responder

Gostei + 0

01/08/2012

Gilvanio Gonçalves

Ola, rapaz é um calculo meio complicado, mas a solução me parece ser neste trecho, o motivo da diferença que aqui está sendo tratado sempre como 1 hr, e voce quer alterar para que seja considerado de meia em meia hora, tente alterar conforme sugestão a baixo e verifique qual o resultado, talvez precise de mais alterações, mas acredito que ja seja um começo



while FracaoHora>Horas do
Inc(Horas);

FracaoHora:=FracaoHora-Horas;

if FracaoHora<0>1/2 then
Inc(Horas);

if Horas<1 then
Horas:=0;

Modulo.TBServico[QtdHora]:=Horas;
end;

if Modulo.TbServico[VrHora]=null then
Modulo.TbServico[VrHora]:=(Modulo.TBServico[QtdHora])*(Modulo.TbValores[VrHora]) + ((0,5)*(Modulo.TbValores[VrHora]))
else
Modulo.TbServico[VrHora]:=(Modulo.TBServico[QtdHora])*(Modulo.TbServico[VrHora]) + ((0,5)*(Modulo.TbValores[VrHora]));




Não consegui adaptar o seu codigo ao meu, da erro nesta linha: if FracaoHora<0>1/2 then

e também nestes campos esta faltando '' [QtdHora])*
(Modulo.TbServico[VrHora]) // sào campos do banco de dados.


Abaixo esta o codigo que esta no programa tem vc adaptar o seu codigo nele por favor.



procedure TFservico.FechaHoraExecute(Sender: TObject);
var
HoraEnt,HoraSaida:TDateTime;
Horas:Integer;
FracaoHora,FracaoDia:Double;
begin
FracaoHora:=0;
FracaoDia:=0;
Horas:=0;
if (Modulo.TBServico['Tipo']='P') or (Modulo.TBServico['Tipo']='C')then
begin
HoraEnt:=StrToDateTime(DatetoStr(Modulo.TBServico['DataEntrada'])+' '+
TimeToStr(Modulo.TBServico['HoraEntrada']));
HoraSaida:=StrToDateTime(DateToStr(Modulo.TBServico['DataSaida'])+' '+
TimeToStr(Modulo.TBServico['HoraSaida']));
FracaoDia:=HoraSaida-HoraEnt;
FracaoHora:=FracaoDia*24;
while FracaoHora>Horas do
Inc(Horas);
FracaoHora:=FracaoHora-Horas;

if FracaoHora<0>1/2 then
Inc(Horas);


if Horas<1 then
Inc(Horas);

Modulo.TBServico['QtdHora']:=Horas;
end;

if Modulo.TbServico['VrHora']=null then
Modulo.TbServico['VrHora']:=(Modulo.TBServico['QtdHora'])*
(Modulo.TbValores['VrHora'])
else
Modulo.TbServico['VrHora']:=(Modulo.TBServico['QtdHora'])*
(Modulo.TbServico['VrHora']);

if Modulo.TBServico['Itens']<>null then
LavacaoExecute(Self);


end;

conto com sua ajuda ainda, desde já agradeço pela a sua atenção.
Responder

Gostei + 0

03/08/2012

Bruno Leandro

Ola Gilvanio tente da seguinte forma

cria um nova variavel MeiaHora do tipo real




MeiaHora := 0;
while FracaoHoraHoras do
Inc(Horas);

FracaoHora:=FracaoHora-Horas;

if FracaoHora0.5 then
Inc(Horas)
else
MeiaHora := 0.5;


if Horas1 then
Horas:=0;

Modulo.TBServico[QtdHora]:=Horas;
end;

if Modulo.TbServico[VrHora]=null then
Modulo.TbServico[VrHora]:=(Modulo.TBServico[QtdHora])*(Modulo.TbValores[VrHora]) + ((MeiaHora)*(Modulo.TbValores[VrHora]))
else
Modulo.TbServico[VrHora]:=(Modulo.TBServico[QtdHora])*(Modulo.TbServico[VrHora]) + ((MeiaHora)*(Modulo.TbValores[VrHora]));
Responder

Gostei + 0

Utilizamos cookies para fornecer uma melhor experiência para nossos usuários, consulte nossa política de privacidade.

Aceitar