Erro ao calcular horas entre datas distantes.
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 ?
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
Curtidas 0
Respostas
Gustavo Bretas
23/11/2011
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!
Espero não ter almentado sua dúvida!
GOSTEI 0
Rogerio Sena
23/11/2011
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.
Eu utilizo o bd firebird com ibexpert.Ainda estou confuso.
Obrigado.
GOSTEI 0
Leonardo Xavier
23/11/2011
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
GOSTEI 0
Rogerio Sena
23/11/2011
Ok cara muito obrigado vou aguardar.
GOSTEI 0
Leonardo Xavier
23/11/2011
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;
GOSTEI 0
Rogerio Sena
23/11/2011
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.
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.
GOSTEI 0
Leonardo Xavier
23/11/2011
Vou colocar um link com o meu fonte deste sistema, para você ver como ele funciona. Abraços
GOSTEI 0
Leonardo Xavier
23/11/2011
Prontinho aqui esta o meu fonte, espero que lhe ajude. Abraços
http://www.4shared.com/file/Lxc-rT7f/calcdata.html?
http://www.4shared.com/file/Lxc-rT7f/calcdata.html?
GOSTEI 0
Rogerio Sena
23/11/2011
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 ....
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 ....
GOSTEI 0
Rogerio Sena
23/11/2011
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
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
GOSTEI 0
Leonardo Xavier
23/11/2011
Que bom cara muito bom, fico feliz que tenha resolvido. não esquece de concluir o chamado. Abraços
GOSTEI 0
Rogerio Sena
23/11/2011
Leonardo com faço para concluir o chamado?
GOSTEI 0
Leonardo Xavier
23/11/2011
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.
GOSTEI 0