Salvar Campo Tipo Horas de uma vez por todas
Olá pessoal, estive pesquisando no fórum e até agora não encontrei uma explicação óbvia de como trabalhar com horas.
Estou utilizando Interbase 6.0, Dialeto 3 e delphi 6.0 e IBX como acesso.
O sistema que estou desenvolvendo é para controle de cartão ponto, na qual eu tenho uma tabela que guarda as ´batidas´ nos seguintes campos:
BATIDA_1, BATIDA_2, BATIDA_3, BATIDA_4 todos declarados do tipo TIME.
Diretamente na tabela, ou utilizando o IBExpert, é possível entrar com os dados referentes às batidas normalmente.
No Delphi, tenho um DBGrid que faz o link diretamente com essa tabela.
No fieldsEditor desta tabela, coloquei a máscara ´Short Time´.
Quando vou ´pular´ de campo, o campo que eu tinha digitado como 07:42 por exemplo, ele se transforma em 30/12/1899 07:42 e ainda exibe a mensagem 0,147066... is not a valid timestamp..
Alguém saberia me explicar como fazer esse trem funcionar??
Abraços
Fabio
Estou utilizando Interbase 6.0, Dialeto 3 e delphi 6.0 e IBX como acesso.
O sistema que estou desenvolvendo é para controle de cartão ponto, na qual eu tenho uma tabela que guarda as ´batidas´ nos seguintes campos:
BATIDA_1, BATIDA_2, BATIDA_3, BATIDA_4 todos declarados do tipo TIME.
Diretamente na tabela, ou utilizando o IBExpert, é possível entrar com os dados referentes às batidas normalmente.
No Delphi, tenho um DBGrid que faz o link diretamente com essa tabela.
No fieldsEditor desta tabela, coloquei a máscara ´Short Time´.
Quando vou ´pular´ de campo, o campo que eu tinha digitado como 07:42 por exemplo, ele se transforma em 30/12/1899 07:42 e ainda exibe a mensagem 0,147066... is not a valid timestamp..
Alguém saberia me explicar como fazer esse trem funcionar??
Abraços
Fabio
Fabboca
Curtidas 0
Respostas
Vinicius2k
18/11/2004
Fábio,
Eu não tenho o IB 6 disponível para testar, mas acabo de simular no FB 1.5.1 e funciona adequadamente.
- Confirme se as colunas são, realmente, do tipo TIME. Se forem TIMESTAMP a situação muda completamente... o tipo TIMESTAMP ´guarda´ Data e Hora e quando vc não informa uma data é assumido a data 1 (30/12/1899).
- Confirme se o tipo do TField é TTimeField.
- Pode não ter nenhuma relação, mas seu IBX está atualizado? Se não, vale a pena atualizar : http://codecentral.borland.com/codecentral/ccweb.exe/author?authorid=102
Espero ter ajudado...
T+
Eu não tenho o IB 6 disponível para testar, mas acabo de simular no FB 1.5.1 e funciona adequadamente.
- Confirme se as colunas são, realmente, do tipo TIME. Se forem TIMESTAMP a situação muda completamente... o tipo TIMESTAMP ´guarda´ Data e Hora e quando vc não informa uma data é assumido a data 1 (30/12/1899).
- Confirme se o tipo do TField é TTimeField.
- Pode não ter nenhuma relação, mas seu IBX está atualizado? Se não, vale a pena atualizar : http://codecentral.borland.com/codecentral/ccweb.exe/author?authorid=102
Espero ter ajudado...
T+
GOSTEI 0
Fabboca
18/11/2004
Vinicius, desculpa a minha falta de experiência, mas ai vai.
Na tabela, os campos estão declarados como TIME.
|- Confirme se o tipo do TField é TTimeField. |
Onde que posso verificar/alterar um TField??
veja bem, na minha aplicacao tenho um IBDatabase, um IBTransaction,
um IBTable, um DataSource e um DBGrid ligado direto na tabela.
se eu inserir no grid o seguinte: ´0742´ ele me retorna um erro de que ´0742´ não é um time valido.
pois bem, se eu inserir ´07:42:00´ ele me retorna que 0.21.... não é um timestamp valido....
Fabio.
Na tabela, os campos estão declarados como TIME.
|- Confirme se o tipo do TField é TTimeField. |
Onde que posso verificar/alterar um TField??
veja bem, na minha aplicacao tenho um IBDatabase, um IBTransaction,
um IBTable, um DataSource e um DBGrid ligado direto na tabela.
se eu inserir no grid o seguinte: ´0742´ ele me retorna um erro de que ´0742´ não é um time valido.
pois bem, se eu inserir ´07:42:00´ ele me retorna que 0.21.... não é um timestamp valido....
Fabio.
GOSTEI 0
Vinicius2k
18/11/2004
Onde que posso verificar/alterar um TField??
No próprio FieldsEditor, quando vc seleciona um TField, o Object Inspector exibe seu tipo na parte superior, por exemplo:
[b:44c2686721]IBQuery1BATIDA_1 TTimeField[/b:44c2686721]
se eu inserir no grid o seguinte: ´0742´ ele me retorna um erro de que ´0742´ não é um time valido.
pois bem, se eu inserir ´07:42:00´ ele me retorna que 0.21.... não é um timestamp valido....
Suspeito que o seu problema seja com a máscara de edição... como vc está editando diretamente no Grid, a conversão ficará a cargo da própria aplicação, então sua máscara deve estar com ´save literal chars´ habilitada :
[b:44c2686721]!90:00;[color=red:44c2686721]1[/color:44c2686721];_[/b:44c2686721]
É isso ?
T+
GOSTEI 0
Fabboca
18/11/2004
Ainda não.... hehehe...
eu já estou quase definindo os campos como varchar...
| No próprio FieldsEditor, quando vc seleciona um TField, o Object
| Inspector exibe seu tipo na parte superior, por exemplo:
| IBQuery1BATIDA_1 T<--->TimeField
Ok, está definido como TimeField.
|Suspeito que o seu problema seja com a máscara de edição... como vc |está editando diretamente no Grid, a conversão ficará a cargo da própria |aplicação, então sua máscara deve estar com ´save literal chars´ |habilitada :
|!90:00;1;_
eu não estou utilizando máscara... seria digitação direta no grid ou então em um dbEdit.... o erro é o mesmo.....
Se ainda tiver alguma dica... eu agradeço....
[/b]
eu já estou quase definindo os campos como varchar...
| No próprio FieldsEditor, quando vc seleciona um TField, o Object
| Inspector exibe seu tipo na parte superior, por exemplo:
| IBQuery1BATIDA_1 T<--->TimeField
Ok, está definido como TimeField.
|Suspeito que o seu problema seja com a máscara de edição... como vc |está editando diretamente no Grid, a conversão ficará a cargo da própria |aplicação, então sua máscara deve estar com ´save literal chars´ |habilitada :
|!90:00;1;_
eu não estou utilizando máscara... seria digitação direta no grid ou então em um dbEdit.... o erro é o mesmo.....
Se ainda tiver alguma dica... eu agradeço....
[/b]
GOSTEI 0
Vinicius2k
18/11/2004
eu não estou utilizando máscara... seria digitação direta no grid ou então em um dbEdit.... o erro é o mesmo.....
humm... é pq vc disse, no primeiro post, que havia ajustado o EditMask do TField para ShortTime...
Bem... fica meio difícl ´chutar´, pq a única vez q eu consegui simular seu erro, foi colocando uma máscara sem salvar a parte literal...
Vc mencionou q está usando o Dialeto 3, o IBDatabase está configurado para o Dialeto 3?
T+
GOSTEI 0
Fabboca
18/11/2004
Bom... perdão ... mas eu já tentei de todas as formas e o erro persiste.
Os dialetos estao configurados como 3 na base e no IBDatabase.
Fabio.
Os dialetos estao configurados como 3 na base e no IBDatabase.
Fabio.
GOSTEI 0
Vinicius2k
18/11/2004
Eu, realmente, não sei o que pode ser, já que não consigo simular seu erro...
Como também não tenho o IB 6 para teste, não posso garantir que o problema seja no seu código e não um bug, até o momento desconhecido para mim, do próprio IB...
Aguarde mais um pouco, talvez algum colega que já tenha passado por isso tenha alguma sugestão... se eu me lembrar de mais alguma coisa, postarei aqui...
T+
Como também não tenho o IB 6 para teste, não posso garantir que o problema seja no seu código e não um bug, até o momento desconhecido para mim, do próprio IB...
Aguarde mais um pouco, talvez algum colega que já tenha passado por isso tenha alguma sugestão... se eu me lembrar de mais alguma coisa, postarei aqui...
T+
GOSTEI 0
Christian_adriano
18/11/2004
Caro ´fabboca´,
Tetei implementar pra chegar no erro mencionado, e consegui, mais só com o TIBDataSet. Agora com um TIBQuery funciona Normal.
Tente utilizar um TIBQuery.
Exemplo com TIBQuery:
with IBQuery1 do begin
Close;
SQL.Text := ´insert into teste values (:ttt)´;
ParamByName(´ttt´).AsString := edit1.Text;
ExecSQL;
IBTransaction1.CommitRetaining;
end;
OBS. Vc pode passar a Hora como uma Parametro do tipo String que o banco vai aceita.
espero ter ajudado.
[]´s.
Christian.
Tetei implementar pra chegar no erro mencionado, e consegui, mais só com o TIBDataSet. Agora com um TIBQuery funciona Normal.
Tente utilizar um TIBQuery.
Exemplo com TIBQuery:
with IBQuery1 do begin
Close;
SQL.Text := ´insert into teste values (:ttt)´;
ParamByName(´ttt´).AsString := edit1.Text;
ExecSQL;
IBTransaction1.CommitRetaining;
end;
OBS. Vc pode passar a Hora como uma Parametro do tipo String que o banco vai aceita.
espero ter ajudado.
[]´s.
Christian.
GOSTEI 0
Fabboca
18/11/2004
Christian... Obrigado pelo help..
acho que o caminho talvez seja por ai mesmo, realmente desta forma funciona.
Agora preciso encontrar um meio disso tudo funcionar num dbGrid.
Abs
Fabio
acho que o caminho talvez seja por ai mesmo, realmente desta forma funciona.
Agora preciso encontrar um meio disso tudo funcionar num dbGrid.
Abs
Fabio
GOSTEI 0