Ajuda - Converter Decimal para Hora

04/02/2019

26

Boa Tarde! Sou extremamente iniciante em Delphi, e neste mês iniciei um estágio, onde me passaram uma tarefa e eu estou sem idéia para resolver rsrs, é o seguinte:
Usamos o Delphi 7 e o Banco de dados Firebird 2.5
Eu tenho que alterar uma tela de banco de horas, onde está toda em números decimais (os usuários do sistema tem bastante confusão ao usar) e passar no formato de time "00:00". Mas pelo que vi no Firebird o campo TIME não acumula mais do que 24horas, onde se um funcionário tiver mais do que isso, reseta como se fosse um dia.
Até aí beleza, eu coloquei pra pessoa preencher no formato "00:00", mas converto para float, e insiro no banco de dados. O meu problema é fazer o caminho oposto: eu teria que pegar esses dados no banco como float, e antes de mostrar no DBGrid, converter para o formato correto.
Como a estrutura do sistema já está toda pronta, eu não sei onde eu devo alterar (não sei se é alguma função, evento procedure, ou se eu mudo a SQL que busca no banco). Eu gostaria de saber qual função eu devo alterar, ou se minha lógica não é a melhor pra resolver esse problema. Obrigado!!
Danilo

Danilo

Responder

Post mais votado

04/02/2019

Danilo, como vai?

Eu quero te ajudar, mas na minha opinião quando se trata de banco de horas tinha que ser em float tanto no banco como no sistema e usando vírgula (formato 999,99) pois estamos falando de um somatório de horas e não da hora do tempo. a hora no formato 00:00 é para hora do tempo e não para somatório de horas.

Mas vamos lá, se no banco está float e você quer mostrar como 00:00 no dbgrid, você precisa criar trazer para o dataset o campo como Float mesmo, mas no dataset criar um novo field como InternalCalc (dando dois cliques no dataset e depois com botão direito no editor que aparece e escolhendo New Field).

Esse campo "virtual" que é gerado na hora, é apenas para fins de visualização no DBGrid.

Eu ainda não entendi se você quer mostrar o valor no tipo TTime, ou mostrar float mascarado como Time (00:00). Assumindo que você quer pegar um campo float e mostrar como Time, você simplesmente vai adicionar o Field acima como InternalCalc e do tipo Time;

Selecione o DataSet e vá no Evento OnCalcFields e escreva o seguinte código (que serve para o Delphi 7)
Var
  s: String;
begin
  if DataSet.State = dsInternalCalc then
  begin
    s:=FormatFloat('#######0.00',CampoHoraFloat.AsFloat);
    s:=StringReplace(s,',',':');
    CampoHoraTime.AsDateTime:=StrToTime(s);
  end;
end;


Espero ter ajudado. Um forte abraço e fique com Deus.

Hélio Devmedia

Hélio Devmedia
Responder

Mais Posts

05/02/2019

Danilo

Danilo, como vai?<br />
<br />
Eu quero te ajudar, mas na minha opinião quando se trata de banco de horas tinha que ser em float tanto no banco como no sistema e usando vírgula (formato 999,99) pois estamos falando de um somatório de horas e não da hora do tempo. a hora no formato 00:00 é para hora do tempo e não para somatório de horas.<br />
<br />
Mas vamos lá, se no banco está float e você quer mostrar como 00:00 no dbgrid, você precisa criar trazer para o dataset o campo como Float mesmo, mas no dataset criar um novo field como InternalCalc (dando dois cliques no dataset e depois com botão direito no editor que aparece e escolhendo New Field).<br />
<br />
Esse campo "virtual" que é gerado na hora, é apenas para fins de visualização no DBGrid.<br />
<br />
Eu ainda não entendi se você quer mostrar o valor no tipo TTime, ou mostrar float mascarado como Time (00:00). Assumindo que você quer pegar um campo float e mostrar como Time, você simplesmente vai adicionar o Field acima como InternalCalc e do tipo Time;<br />
<br />
Selecione o DataSet e vá no Evento OnCalcFields e escreva o seguinte código (que serve para o Delphi 7)<br />
<br />
Var<br />
  s: String;<br />
begin<br />
  if DataSet.State = dsInternalCalc then<br />
  begin<br />
    s:=FormatFloat(''#######0.00'',CampoHoraFloat.AsFloat);<br />
    s:=StringReplace(s,'','','':'');<br />
    CampoHoraTime.AsDateTime:=StrToTime(s);<br />
  end;<br />
end;<br />
<br />
<br />
Espero ter ajudado. Um forte abraço e fique com Deus.
<br />
<br />
Cara, era justamente isto que eu precisava! Não fiz exatamente igual, as usei 90% da sua lógica<br />
Muitíssimo Obrigado!!
Responder

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

Aceitar