Ajuda - Converter Decimal para Hora
04/02/2019
0
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!!
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
Curtir tópico
+ 0
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)
Espero ter ajudado. Um forte abraço e fique com Deus.
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
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 />
<br />
Espero ter ajudado. Um forte abraço e fique com Deus.
<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 />
Espero ter ajudado. Um forte abraço e fique com Deus.
<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
Clique aqui para fazer login e interagir na Comunidade :)