[b]Máscara no Access[/b]

22/05/2003

0

[b:d1e2fe5082]Bom, irei direto com o meu problema.[/b:d1e2fe5082]É o seguinte, criei uma base de dados em Access, e dentro desta base de dados criei um banco de dados com dois campos do tipo Data/Hora. Um campo se chama Data e outro HoraInicial. Após criar estes dois campos configurei o formato corretamente, Data abreviada - para o campo Data, e Hora abreviada - para o campo HoraInicial. O problema é o seguinte:
Quando eu salvo no campo Data uma data qualquer, ele me mostra no DBGrid a data + a Hora, o que não deveria aparecer! O que deveria aparecer era somente a Data (sem aparecer a hora junto). Intendeu uma das minhas dúvidas?
Segunda Dúvida...
Quando salvo no campo HoraInicial uma hora do tipo 00:00, o que me aparece no DBGrid é uma data = a 30/12/1899 ... ??? Vai saber o que é esta data sendo que no meu campo quero mostrar apenas a minha Hora(que foi registrada como 00:00, mas não sei o Porque está aparecendo como uma data do tipo 30/12/1984).

Por favor, se vc sabe como realmente resolver este problema, me Ajude Please..

Desde ja, fico muito mais do que Agradecido!!! :shock: [b:d1e2fe5082][/b:d1e2fe5082][b:d1e2fe5082][/b:d1e2fe5082][b:d1e2fe5082][/b:d1e2fe5082]


Netcrusher

Netcrusher

Responder

Posts

22/05/2003

Ildefonso

Olá, NetCrusher.

Antes de mais nada: você não deveria ter dois campos para essa situação. Os ´campos data-hora´ dos bancos de dados atuais já são apropriados para se trabalhar com os dois casos ao mesmo tempo. Justo porque se percebeu que 90¬ das vezes é isso que realmente se quer.

Minha sugestão:
Coloque apenas um campo e grave o valor a partir da função Now(), que envia a data e a hora do momento. se você vai perguntar isso para o usuário, o campo pode aceitar uma digitação como [20/5 9:00]... por sua natureza, o banco de dados fará o registro correto: 20/05/2003 09:00:00

Para mostar os campos no grid, você pode criar campos calculados a partir do campo original. Na propriedade DisplayFormat do [b:c1d7747c0e]TDateTimeField[/b:c1d7747c0e] gerado você informa [b:c1d7747c0e]dd/mm/yy[/b:c1d7747c0e] para um e [b:c1d7747c0e]hh:nn[/b:c1d7747c0e] para o outro... mesmo vindo da mesma origem, o formato definido por você parece estar lidadndo com valores totalmente distintos.

Note que esta solução não consumirá recurso perceptível ao usuário, porque estamos lidando com a tela. Demoras acontecem ali, em geração das interfaces, e não neste simples cálculo para apresentação, apenas.

O grande benefício: imagino que você está fazendo isso para calcular períodos.
Pronto: você já tem em um único lugar um valor que pode ser operado para se obter os dados como quantidade de horas consumidas, dias, etc. Afinal, o que se precisa é a data x menos a data y, incluso ai suas frações em horas.

De modo geral, não há justificativas - nem práticas nem acadêmicas - para usar o modo como você planejou, inicialmente. Infelizmente, há muitos que não usam o modo mais fácil, talvez por ter aprendido com sistemas herdados do Clipper, Cobol, etc.

Espero que aceite a crítica como construtiva. Não poderia dizer diferente se nos meus sistemas não uso daquela forma.

Bom trabalho. 8)


Responder

22/05/2003

Netcrusher

Olá Ildefonso.
Antes de mais nada, gostaria de agradecer por vc ter me ajudado, mesmo não ter resolvido o meu problema, mesmo assim gostaria de agradecer-lhe.
Como vc mesmo imaginou, o campo Data e o campo HoraInicial são totalmente distintos.
O meu problema é o seguinte, eu salvo corretamente o registro de uma data no campo Data.. bom, até aí tudo bem.. ele aparece corretamente no DBGrid, ou seja, 22/05/2003.... agora, o meu problema é com a HoraInicial, pois quando salvo um horário, no MSAccess ele me mostra a hora corretamente(ou seja, 14:45), mas no DBGrid ele me mostra a Data + a hora.. sendo assim, no DBGrid me apresenta 22/05/2003 14:45... não sei se conseguiu intender...

Desdee já, agradeço por quem ler esta mensagem e conseguir me ajudar com este problema.


Atenciosamente, NetCrusher


Responder

22/05/2003

Ildefonso

Oi, Daniel.

Para formatar os dados, simplesmente, crie os campos persistentes e atribua suas propriedades DisplayFormat. Quando forem mostrados no grid o formato determinado nesta propriedade será obedecido.

Para criar os campos persistentes, de um duplo clique no TADOTable ou no TADOQuery.

Novamente, porém, insisto em que você deve repensar sua estutura.
Caso o usuário tenha que entrar com o horário em campo de tela difernte, você poderia somar o valor da hora ao valor da data e atribuir tudo ao campo correto...

O valor mostrado, seja em 22/5 ou a data de 1903 é decorrente do modo como os dados são armazenados.

A base é zero hora de 30/12/1899. Assim, falar que um campo data é 14:30, gera o valor 30/12/1899 14:30, internamente. Fizeram isso para que tudo relacionado com cálculos de datas e horas ficasse mais fácil.

Imagine: se você quer controlar as horas trabalhadas, você precisará saber se a hora final está no mesmo dia da hora inicial. Mesmo porque uma hora final pode ser menor que a inicial... só que de uma data posterior. Neste caso, segundo o seu sistema, você precisará trabalhar com 4 valores distintos, além da própria comparação HoraFinal < HoraInicial.

Se você tiver o Access instalado, leia o help sobre os campos do tipo Data/Hora... deve esclarecer melhor o que tento lhe explicar aqui.

Caso queira mais detalhes, ligue o ICQ.

Bom trabalho, novamente. :wink:


Responder

22/05/2003

Flavio Sanches

Vc pode especificar a máscara pro dbgrid, daí vai aparecer conforme vc quiser.

clique no dataset(table ou query) com o botão direito do mouse e escolha fields editor, clique na tela que vai aparecer e depois tecle <Ctrl>+f. Depois é so vc clicar no campo data_inicial ir no object explorer (F11) e no campo edit mask vc coloca a mascara devida.

ve se assim vc consegue


Responder

Assista grátis a nossa aula inaugural

Assitir aula

Saiba por que programar é uma questão de
sobrevivência e como aprender sem riscos

Assistir agora

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

Aceitar