Fórum Erro ao calcular horas entre datas distantes. #409652

23/11/2011

0

Bom dia!! Estou com problemas ao tentar calcular horas entre datas distantes por exemplo:
calcular a quantidade de horas entre 10/11/2011 e 23/11/2011 pois da o erro: 311:29:54 is not a valid time. Mas se eu calcular as horas entre horas dentro de 24 horas o calculo funciona perfeitamente, utilizo uma função para calcular:

function TFrmSeparacao.calculatempo(data1, data2: TDateTime): String;
var
valor, horas, minutos, segundos : Integer;
begin
valor := (SecondsBetween(data1,data2));
horas := valor div 3600;
minutos := valor div 60 - horas * 60;
segundos := (valor - (horas *3600 + minutos * 60));
Result := Format(%0.2d:%0.2d:%0.2d, [horas, minutos, segundos]);
end;

Codigo do botão:

procedure TFrmSeparacao.btnFSepClick(Sender: TObject);
var
MinhaData1, MinhaData2: TDateTime;
SQLQuery1,SQLQuery2 : TSQLQuery;
begin
SQLQuery1 := TSQLQuery.Create(Self);
SQLQuery1.SQLConnection := DMServer.Conexao; // SQLCONNETION1
SQLQuery1.SQL.Add(select current_Date from rdb$database);
SQLQuery1.Open;
data2.Text := SQLQuery1.Fields[0].AsVariant;
SQLQuery1.Free;

SQLQuery2 := TSQLQuery.Create(Self);
SQLQuery2.SQLConnection := DMServer.Conexao; // SQLCONNETION1
SQLQuery2.SQL.Add(select current_time from rdb$database);
SQLQuery2.Open;
dbehfinal.Text := SQLQuery2.Fields[0].AsVariant;
SQLQuery2.Free;

MinhaData1 := StrToDateTime( Data1.Text + dbeHinicial.Text );
MinhaData2 := StrToDateTime( Data2.Text + dbeHfinal.Text );
dbeHtotal.Text := calculatempo( MinhaData1, MinhaData2 );
DBRadioGroup1.ItemIndex := 1;
FSep:=1;
end;

Alguem poderia me ajudar ?
Rogerio Sena

Rogerio Sena

Responder

Posts

23/11/2011

Gustavo Bretas

Roger, vejo que vc usa a função para alimentar o campo dbeHtotal, então se o erro é de hora inválida, é pq o field ligado a esse campo é DateTime, como o dia tem 24 horas, 311:29:54 realmente é uma hora inválida, então o problema não esta na sua função, mas sim no tipo de dados do campo que recebe a informação. Não ocorre o erro quando vc calcula menos de 24 horas pq ele consegue converter para DateTime.

Espero não ter almentado sua dúvida!
Responder

Gostei + 0

23/11/2011

Rogerio Sena

Mas então o que tenho que fazer? seria mudar o tipo no banco ou vc sujere mudanças no codigo?
Eu utilizo o bd firebird com ibexpert.Ainda estou confuso.
Obrigado.
Responder

Gostei + 0

23/11/2011

Leonardo Xavier

não precisa mudar seu banco, se seu campo for data hora...Troque para tipo texto, quanto ao código vou realizar testes aqui e te passo ele certinho a tarde. Abraços
Responder

Gostei + 0

23/11/2011

Rogerio Sena

Ok cara muito obrigado vou aguardar.
Responder

Gostei + 0

23/11/2011

Leonardo Xavier

Seu problema estava no tratamento de suas variáveis, DAtetime, modifiquei seu código e espero que o mesmo resolva sua dúvida. Segue o mesmo. (Não esqueça de finalizar ete tópico quando resolver seu problema para manter o forum organizado. Abraços)

//Na declaração de sua função:
function calculatempo(data1, data2: TDateTime): String;

//Na declaração das variáveis:
MinhaData1,MinhaData2:TDate;
   data1,data2:string;

//Na função:
function TForm1.calculatempo(data1, data2: TDateTime): String;
var
valor, horas, minutos, segundos : Integer;
begin
valor := (SecondsBetween(data1,data2));
horas := valor div 3600;
minutos := valor div 60 - horas * 60;
segundos := (valor - (horas *3600 + minutos * 60));
Result := Format(%0.2d:%0.2d:%0.2d, [horas, minutos, segundos]);
end;


//No botão do cálculo
procedure TForm1.Button1Click(Sender: TObject);
begin

MinhaData1 := DateTimePicker1.date;
MinhaData2 := DateTimePicker2.date;
label4.caption:= calculatempo( MinhaData1, MinhaData2 );

end;



Responder

Gostei + 0

24/11/2011

Rogerio Sena

Leonardo Bom dia!! fiz as modificãções como sugeriu mas nao esta passando a linha:
MinhaData1 := DateTimePicker1.date;

Tenho 5 DBEdits:
dbeHinicial que ao inserir um registro é colocado a hora do bd firebird no campo e
data1 que é colocado a data do bd firebird no campo.
data2 que ao clicar no botao finalizar que seria mesma coisa que um calcular
é colocado a data do bd firebird no campo e dbeHfinal que insere a
hora do bd firebird no campo e entao e feito o calculo e jogado dentro
do 5ºDBEdit dbeHtotal.

O programinha e para controlar separação de notas,um funcionario pega a nota e é
inserido o registro com a data e hora.Quando o funcionário entrega a nota é feita
uma pesquisa trazendo os dados ai clicando em finalizar é adicionado a data final
a hora final e feito o calculo,colocando o total de horas no dbeHtotal.


Responder

Gostei + 0

24/11/2011

Leonardo Xavier

Vou colocar um link com o meu fonte deste sistema, para você ver como ele funciona. Abraços
Responder

Gostei + 0

24/11/2011

Leonardo Xavier

Prontinho aqui esta o meu fonte, espero que lhe ajude. Abraços
http://www.4shared.com/file/Lxc-rT7f/calcdata.html?
Responder

Gostei + 0

24/11/2011

Rogerio Sena

Leonardo seu código funciona mas vc usa componentes de calendario ao contrario de mim
mas obrigado por sua ajuda aprendi mais uma com vc,vou tentar resolver o problema e qd
resolver te passo.
Obrigado tenha um ótimo dia ....
Responder

Gostei + 0

24/11/2011

Rogerio Sena

Amigo leonardo consegui resolver o problema,modifiquei o campo no banco de Time para Varchar
e bimba deu certo e ainda grava no formato de horas sem que eu fizesse alterações pois
erda o codigo do botão.
Obrigado por sua atenção e se tiver alguma duvida sua que eu posso estar ajudando futuramente sera um
prazer ajudalopois uma mao lava a outra rsrsrsrs
Responder

Gostei + 0

24/11/2011

Leonardo Xavier

Que bom cara muito bom, fico feliz que tenha resolvido. não esquece de concluir o chamado. Abraços
Responder

Gostei + 0

24/11/2011

Rogerio Sena

Leonardo com faço para concluir o chamado?
Responder

Gostei + 0

24/11/2011

Leonardo Xavier

Veja na lateral a opção de marcar como respondido, não lembro direito da tela para isso, mas este vou concluir para você. Abraços.
Responder

Gostei + 0

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

Aceitar