Multiplicar Horas por $

Delphi

17/03/2007

Olá pessoal meu 1º post neste fórum

Tenho uma tabela Paradox que tem os seguintes campos:

Campo Tipo

HoraSaída Time | O valor neste campo eu carrego assim DM.tblOSHoraSaida.value := time;
HoraChegada Time | Aqui idem
TotalHoras Time |Aqui recebe adiferença dos dois campos anteriores
PrecoHora $ | Aqui vem atráves de outra tabela ´Tabela de preços´
PrecoTotal $

então eu cobro pelo meu serviço R$9,00 a hora mas com um valor minimo de 2 horas ou seja mesmo que o serviço leve 1 hora pra ser executado será computado o valor de duas horas.
o que eu preciso é multiplicar o campo ´TotalHoras´ pelo campo ´PrecoHora´ e mandar o resultado pro Campo ´PrecoTotal´ lembrando que o valor minimo é de duas horas. Será que fui claro?
Talvez seja o caso de usar uma função?

os campos são como descritos acima mas se tiver algum jeito tendo que mudar os tipos de campos também serve

se puderem me ajudar ficaria muito agradecido.

Valeu!!!!!!!!!!!!!


Gameover

Gameover

Curtidas 0

Respostas

Delphijean

Delphijean

17/03/2007

Exatamente um instante após o preenchimento de ´TotalHoras´
Faça:

[b:b57a7f383a]if[/b:b57a7f383a] TotalHoras <= 2 [b:b57a7f383a]then[/b:b57a7f383a]
PrecoTotal := PrecoHora * 2
[b:b57a7f383a]else[/b:b57a7f383a]
PrecoTotal := PrecoHora * TotalHoras;

Bom! Temos que levar em conta que:
1º- Se preenche a Hora de Chagada;
2º- A hora de saída;
2.1º- um instante após Calcula o Total de Horas;
2.2º- outro Instante após Calcula o Preço total;

Obs: A tabela deverá está em modo de edição [color=red:b57a7f383a](isso é óbvio)[/color:b57a7f383a]


GOSTEI 0
Gameover

Gameover

17/03/2007

olá [b:2e9db092a8]delphijean[/b:2e9db092a8] obrigado pela atenção o código que vc me passou
deu os seguintes erros:

if TotalHoras <= 2 then [Error] UOS.pas(108): Incompatible types
else [Error] UOS.pas(110): Operator not applicable to this operand type
PrecoTotal := PrecoHora * TotalHoras; [Error] UOS.pas(111): Operator not applicable to this operand type

[/b]


GOSTEI 0
Gameover

Gameover

17/03/2007

olá [b:d132c1cf3b]delphijean[/b:d132c1cf3b] obrigado pela atenção o código que vc me passou
deu os seguintes erros:

if TotalHoras <= 2 then [Error] UOS.pas(108): Incompatible types
else [Error] UOS.pas(110): Operator not applicable to this operand type
PrecoTotal := PrecoHora * TotalHoras; [Error] UOS.pas(111): Operator not applicable to this operand type

[/b]


será que vc pode me ajudar sou iniciante em delphi.

valeu!!!!!!!!


GOSTEI 0
Marco Salles

Marco Salles

17/03/2007

HoraSaída Time | O valor neste campo eu carrego assim DM.tblOSHoraSaida.value := time;
HoraChegada Time | Aqui idem
TotalHoras Time |Aqui recebe adiferença dos dois campos anteriores
PrecoHora $ | Aqui vem atráves de outra tabela ´Tabela de preços´
PrecoTotal $

var
  TotalHoras:TTime; 
   PrecoTotal:Real;
begin
 TotalHoras:=DM.tblOSHoraSaida.asdatetime -   
                    DM.tblOSHoraEntrada.asdatetime;
if (24*TotalHoras) <= 2 then 
PrecoTotal := DM.SuaOutratablePrecoHora.asdatetime * 2 
else 
PrecoTotal :=DM.SuaOutraRablePrecoHora.asdatetime * 24*TotalHoras; 
Showmessage(floattostr(PrecoTotal ));


P:S1) TotalHoras e ProcoTotal são variáveis e não campos



P:S2) não sei o nome da sua outra tabela , portanto eu usei : DM.SuaOutratablePrecoHora


P:s3) Melhor do que usar os fiels é usar o FiledByName para referencia-los: Assim : DM.tblOSHoraSaida.asdatetime por DM.tblOS.FieldByName(´HoraSaida´).asdatetime


P:S4) e finalmente para não deixar dúvidas , note o fator 24 * (vinte e quatro) multiplicando nas expressãoes



GOSTEI 0
Gameover

Gameover

17/03/2007

olá Marcos Salles deu um o seguinte erro ´cannot access field ´PrecoHora´ as type DateTime.

acho que é pq o campo PrecoHora e tipo $


var
  TotalHoras:TTime;
   PrecoTotal:Real;
begin
 TotalHoras:=DM.tblOSHoraSaida.asdatetime - DM.tblOSHoraChegada.asdatetime;
if (24*TotalHoras) <= 2 then
PrecoTotal := DM.tblOsPrecoHora.asdatetime * 2
else
PrecoTotal :=DM.tblOsPrecoHora.asdatetime * 24*TotalHoras;
Showmessage(floattostr(PrecoTotal ));



GOSTEI 0
Marco Salles

Marco Salles

17/03/2007

olá Marcos Salles deu um o seguinte erro ´cannot access field ´PrecoHora´ as type DateTime


Sim... Troque por ascurrency

PrecoTotal :=DM.SuaOutraRablePrecoHora.ascurrency * 24*TotalHoras;



GOSTEI 0
Gameover

Gameover

17/03/2007

eu troquei mas deu o mesmo erro


Sim... Troque por ascurrency

Citação:
PrecoTotal :=DM.SuaOutraRablePrecoHora.ascurrency * 24*TotalHoras;



GOSTEI 0
Marco Salles

Marco Salles

17/03/2007

olá Marcos Salles deu um o seguinte erro ´cannot access field ´PrecoHora´ as type DateTime

Tem que ver se existe este campo nesta tabela..
Tem que ver se esta tabela esta aberta....
Tem que ver se este field foi definido , usando o editor de fileds

com eu disse , use a propriedade fieldByname


GOSTEI 0
Gameover

Gameover

17/03/2007

Marcos

Tem que ver se existe este campo nesta tabela..
Tem que ver se esta tabela esta aberta....
Tem que ver se este field foi definido , usando o editor de fileds 


Até aqui está tudo certo.

coloquei meu projeto aqui [url]http://br.geocities.com/amacco2002/teste.zip[/url]

se vc puder baixar e dar uma olhada!

obrigado.


GOSTEI 0
Gameover

Gameover

17/03/2007

Marcos
Tem que ver se existe este campo nesta tabela..
Tem que ver se esta tabela esta aberta....
Tem que ver se este field foi definido , usando o editor de fileds 
ainda está dando o erro. coloquei meu projeto aqui [url]http://br.geocities.com/amacco2002/teste.zip[/url] se vc puder baixar e dar uma olhada! obrigado.



GOSTEI 0
Marco Salles

Marco Salles

17/03/2007

Citação: olá Marcos Salles deu um o seguinte erro ´cannot access field ´PrecoHora´ as type DateTime Sim... Troque por ascurrency Citação: PrecoTotal :=DM.SuaOutraRablePrecoHora.ascurrency * 24*TotalHoras;


pelo projeto que voce me passou , voce so trocou uma instrução ..
Voce tem que trocar as duas

procedure TfrmOS.Button3Click(Sender: TObject); var TotalHoras:TTime; PrecoTotal:Real; begin TotalHoras:=DM.tblOSHoraSaida.asdatetime - DM.tblOSHoraChegada.asdatetime; if (24*TotalHoras) <= 2 then //[u:cdccb43253]tem que trocar esta tb[/u:cdccb43253] [b:cdccb43253]PrecoTotal := DM.tblOsPrecoHora.AsCurrency * 2[/b:cdccb43253] else //[u:cdccb43253]voce so trocou esta[/u:cdccb43253] [b:cdccb43253]PrecoTotal :=DM.tblOsPrecoHora.asCurrency * 24*TotalHoras;[/b:cdccb43253] Showmessage(floattostr(PrecoTotal )); end;



GOSTEI 0
Gameover

Gameover

17/03/2007

pelo projeto que voce me passou , voce so trocou uma instrução ..
Voce tem que trocar as duas

Citação:
procedure TfrmOS.Button3Click(Sender: TObject);
var
TotalHoras:TTime;
PrecoTotal:Real;
begin
TotalHoras:=DM.tblOSHoraSaida.asdatetime - DM.tblOSHoraChegada.asdatetime;
if (24*TotalHoras) <= 2 then
//tem que trocar esta tb
PrecoTotal := DM.tblOsPrecoHora.AsCurrency * 2
else
//voce so trocou esta
PrecoTotal :=DM.tblOsPrecoHora.asCurrency * 24*TotalHoras;
Showmessage(floattostr(PrecoTotal ));
end;


É eu já tinha corrigido agora está compilando certinho, mas os cálculos não estão batendo, vc percebeu?



GOSTEI 0
Micheus

Micheus

17/03/2007

Só um pitaco aqui...
É eu já tinha corrigido agora está compilando certinho, mas os cálculos não estão batendo, vc percebeu?
Se está se referindo ao primeiro item exemplo de sua base de dados (ref. José), o problema é que a hora de Saída (18:55:44) é menor que a de Chegada (21:20:00)! Com isso, o resultado é negativo (portanto menor que 2), donde resulta o valor total sempre igual a R$ 22,00.

Voce tem um campo TotalHoras, que por algum motivo armazena o tempo correto :?. Utilize ele - não terá erro e simplificará os cálculos:
procedure TfrmOS.Button3Click(Sender: TObject);
var
  PrecoTotal :Real;
begin
  DM.tblOSHoraChegada.asdatetime;
  if (24*DM.tblOSTotalHoras.AsDateTime) <= 2 then
    PrecoTotal := DM.tblOsPrecoHora.asCurrency * 2
  else
    PrecoTotal :=DM.tblOsPrecoHora.asCurrency * 24*DM.tblOSTotalHoras.AsDateTime;
  Showmessage(floattostr(PrecoTotal ));
end;


De qualquer modo, observe que não parece fazer sentido que a hora de entrada seja posterior a de saída - dê uma olhada nisto. :wink:


GOSTEI 0
Gameover

Gameover

17/03/2007

Só um pitaco aqui... GameOver escreveu: É eu já tinha corrigido agora está compilando certinho, mas os cálculos não estão batendo, vc percebeu? Se está se referindo ao primeiro item exemplo de sua base de dados (ref. José), o problema é que a hora de Saída (18:55:44) é menor que a de Chegada (21:20:00)! Com isso, o resultado é negativo (portanto menor que 2), donde resulta o valor total sempre igual a R$ 22,00. Voce tem um campo TotalHoras, que por algum motivo armazena o tempo correto Confused. Utilize ele - não terá erro e simplificará os cálculos: Código: procedure TfrmOS.Button3Click(Sender: TObject); var PrecoTotal :Real; begin DM.tblOSHoraChegada.asdatetime; if (24*DM.tblOSTotalHoras.AsDateTime) <= 2 then PrecoTotal := DM.tblOsPrecoHora.asCurrency * 2 else PrecoTotal :=DM.tblOsPrecoHora.asCurrency * 24*DM.tblOSTotalHoras.AsDateTime; Showmessage(floattostr(PrecoTotal )); end; De qualquer modo, observe que não parece fazer sentido que a hora de entrada seja posterior a de saída - dê uma olhada nisto. Wink


Desculpe se não ficou claro, e que a hora de saída se refere a hora em que o funcionario saiu para executar o serviço e a hora de chegada se refere a hora em que ele retornou com o serviço executado, e não a entrada e saida do funcionario na empresa


GOSTEI 0
Marco Salles

Marco Salles

17/03/2007

Desculpe se não ficou claro, e que a hora de saída se refere a hora em que o funcionario saiu para executar o serviço e a hora de chegada se refere a hora em que ele retornou com o serviço executado, e não a entrada e saida do funcionario na empresa


então voce tem que inverter pô.. No meu modelo ist foi feito ao contrário

Faça assim e ze finin

var TotalHoras:TTime; PrecoTotal:Real; begin TotalHoras:=DM.tblOSHoraChegada.asdatetime - DM.tblOSHoraSaida.asdatetime; Showmessage(Timetostr(totalHoras)); if (24*TotalHoras) <= 2 then PrecoTotal := DM.tblOsPrecoHora.AsCurrency * 2 else PrecoTotal :=DM.tblOsPrecoHora.asCurrency * 24*TotalHoras; Showmessage(floattostr(PrecoTotal )); end;



GOSTEI 0
Gameover

Gameover

17/03/2007

então voce tem que inverter pô.. No meu modelo ist foi feito ao contrário Faça assim e ze finin


é acabei de perceber ia postar o resultado agora mas vc meu a ´bronca´ primeiro (´:oops:´)

procedure TfrmOS.Button3Click(Sender: TObject);
var
  TotalHoras:TTime;
   PrecoTotal:Real;
begin
 TotalHoras:=DM.tblOSHoraChegada.asdatetime - DM.tblOSHoraSaida.asdatetime;
if (24*TotalHoras) <= 2 then
PrecoTotal := DM.tblOsPrecoHora.asCurrency * 2
else
PrecoTotal :=DM.tblOsPrecoHora.asCurrency * 24*TotalHoras;
Showmessage(floattostr(PrecoTotal ));
    end;


Valeu pessoal, pela paciência.


GOSTEI 0
Marco Salles

Marco Salles

17/03/2007

[b:c66373c79c]marco salles citou[/b:c66373c79c]
então voce tem que inverter pô.. No meu modelo ist foi feito ao contrário Faça assim e ze finin


[b:c66373c79c]GameOver[/b:c66373c79c]
é acabei de perceber ia postar o resultado agora mas vc meu a ´bronca´ primeiro (´´)


Rapâ o pô é brincadeira.. Modo de descontrair ..
[b:c66373c79c]Pô [/b:c66373c79c]´mermo´ eu tô é com a torcida do FlAMENGO que tã [u:c66373c79c]acreditando...... [/u:c66373c79c] Só para me fazer Raiva :twisted: :twisted: :twisted:


GOSTEI 0
Gameover

Gameover

17/03/2007

Rapâ o pô é brincadeira.. Modo de descontrair ..


Tô Ligado.......

Valeu!!!!!!!!!!!!!!


GOSTEI 0
Delphijean

Delphijean

17/03/2007

Olá amigo para que nao ocorra os erros vc deve transformar o total de horas em inteiros.
Tipo:
A cada 60min vc transforma em 1 hora


GOSTEI 0
POSTAR