JonatasFn 0 Denunciar post Postado Agosto 24, 2009 Pessoal, como faço para somar e subtrair horas no Delphi. Já consegui usando variáveis do tipo TTimer, mas não é isso que eu preciso. Pq desta forma o resultado de 12:00 + 13:00 é 01:00 Mas eu quero que seja assim: 12:00 + 13:00 = 25:00 E preciso subtrair tbm, não sei se é da mesma forma. Grato Compartilhar este post Link para o post Compartilhar em outros sites
Karlo Uchoa 0 Denunciar post Postado Agosto 24, 2009 você esta trabalhando com qual banco de dados??? Compartilhar este post Link para o post Compartilhar em outros sites
JonatasFn 0 Denunciar post Postado Agosto 24, 2009 você esta trabalhando com qual banco de dados??? MySQL, mas eu preciso somar/subtrair antes de enviar ao banco... É um cadastro de horas extras. Vou precisar tbm somar/subtrair as horas vindas do BD, mas o primordial é antes de enviar ao BD. Compartilhar este post Link para o post Compartilhar em outros sites
Chrnos 30 Denunciar post Postado Agosto 24, 2009 Amigo, existem diversas formas de calcular horas no delphi, além de métodos prontos na unit DateUtils. Veja o exemplo abaixo: procedure TForm1.Button1Click(Sender: TObject); var sTempo : String; dHoraIni, dHoraFim : TDateTime; begin dHoraIni := Now-1; dHoraFim := Now; sTempo := IntToStr(HoursBetween(dHoraFim, dHoraIni)); showmessage('Data/Hora Inicial: ' + DateTimeToStr(dHoraIni) + #13 + 'Data/Hora Final: ' + DateTimeToStr(dHoraFim) + #13 + 'Diferença em Horas entre Data/Hora inicial e final: ' + sTempo); end; Coloque o código acima no seu form num botão e verá que ele lhe retornará 24 horas. Contudo, você perderia o tempo em minutos que poderia existir de diferença entre a data/hora inicial e data/hora final trabalhada... agora, se você grava a hora que o funcionário entrou e a hora que ele saiu diariamente, você pode montar alguma procedure via MySQL mesmo para que ela calcule pra você quantas horas extras o empregado fez no mês, basta você por exemplo somar todas as horas que ele fez no mês e diminuir das horas normais dele... a diferença seria as horas extras, não precisaria assim gravar isso diariamente. []'s Compartilhar este post Link para o post Compartilhar em outros sites
JonatasFn 0 Denunciar post Postado Agosto 25, 2009 Chrnos, eu entendi o seu raciocínio. Só que na verdade este lançamento será mensal, ou seja, em um determinado dia do mês o responsável irá lançar a data, a hora de entrada(início da hora extra) e a hora de saída(fim da hora extra). Só que durante este tempo poderá haver intervalos, como por exemplo para café. Então seria assim: (Intervalo(Início) - Entrada) + (Saída - Intervalo(Fim)) = Resutado para o BD (18:30 - 17:30) + (19:30 - 18:45) = 01:45 A inserção destas, se dará com 4 edits. Andei lendo que o DateUtils tem uma função IncHour, mas além de não conhecer esta função, não sei se ela subtrai. Compartilhar este post Link para o post Compartilhar em outros sites
Chrnos 30 Denunciar post Postado Agosto 25, 2009 Porque não transforma tudo em minutos no BD? Grave os horários de entrada e saída se quiser, mas deixe-os também salvos em minutos... vai facilitar seus cálculos depois. Num sistema de ponto que tinhamos, os tempos eram gravados em minutos onde precisavam ser calculados e depois transformados em horas/minutos nos relatórios. Fica mais fácil pra calcular que usando campos de hora mesmo. Dê uma lida neste post e neste post também.... o problema apresentado ali é semelhante ao seu, talvez possa implementar sua solução com base na sugerida ali. []'s Compartilhar este post Link para o post Compartilhar em outros sites
JonatasFn 0 Denunciar post Postado Agosto 28, 2009 Pessoal, achei uma solução pra subtrair, que ainda não é bem uma solução: Tá aí: a:= StrToTime(Edit1.Text); b:= StrToTime(Edit2.Text); a,b : TTime; H1, H2: Integer; M1, M2, HDiff, MDiff : integer; Result : TTime; H1 := HourOf(A); H2 := HourOf(B); M1 := MinuteOf(A); M2 := MinuteOf(B); if CompareTime(A, B) > 0 then begin H1 := HourOf(A); H2 := HourOf(B); M1 := MinuteOf(A); M2 := MinuteOf(B); end else begin if CompareTime(A, B) < 0 then H1 := HourOf(B); H2 := HourOf(A); M1 := MinuteOf(B); M2 := MinuteOf(A); end; if M1 < M2 then begin H1 := H1 - 1; M1 := M1 + 60; end; HDiff := H1-H2; MDiff := M1-M2; Result := StrToTime(IntToStr(Abs(HDiff))+':'+IntToStr(Abs(MDiff))); // Result := (IntToStr(Abs(HDiff))+':'+IntToStr(Abs(MDiff))); Edit3.Text := TimeToStr(Result); Agora só me falta somar ... Alguém tem alguma idéia... Ou é melhor eu seguir a dica do Crhnos e transformar em minutos? Compartilhar este post Link para o post Compartilhar em outros sites