Formatação Campo Data Access/Delphi
Boa tarde,
Tenho uma aplicação Delphi que funciona com banco de dados Access utilizando a palheta ADO.
Neste banco de dados Access possuo 2 tabelas com datas mas gravada como texto e formato yy/mm/dd.
Ex: 12/04/25
Dentro do Banco de Dados Access(modo estrutura) eu consegui converter o campo para Data/Hora mas
ao converter para Data/Hora o Access converte de maneira errada. Atribuindo da seguinte maneira:
Dia: 12
Mes: 04
Ano: 25
Diante desta conversão, as consultas por data no meu sistema ficam incorretas. O que fazer ?
Tenho uma aplicação Delphi que funciona com banco de dados Access utilizando a palheta ADO.
Neste banco de dados Access possuo 2 tabelas com datas mas gravada como texto e formato yy/mm/dd.
Ex: 12/04/25
Dentro do Banco de Dados Access(modo estrutura) eu consegui converter o campo para Data/Hora mas
ao converter para Data/Hora o Access converte de maneira errada. Atribuindo da seguinte maneira:
Dia: 12
Mes: 04
Ano: 25
Diante desta conversão, as consultas por data no meu sistema ficam incorretas. O que fazer ?
Natanael Ferreira
Curtidas 0
Respostas
Natanael Ferreira
25/04/2012
Boa tarde,
Tenho uma aplicação Delphi que funciona com banco de dados Access utilizando a palheta ADO.
Neste banco de dados Access possuo 2 tabelas com datas mas gravada como texto e formato yy/mm/dd.
Ex: 12/04/25
Dentro do Banco de Dados Access(modo estrutura) eu consegui converter o campo para Data/Hora mas
ao converter para Data/Hora o Access converte de maneira errada. Atribuindo da seguinte maneira:
Dia: 12
Mes: 04
Ano: 25
Diante desta conversão, as consultas por data no meu sistema ficam incorretas. O que fazer ?
Tenho uma aplicação Delphi que funciona com banco de dados Access utilizando a palheta ADO.
Neste banco de dados Access possuo 2 tabelas com datas mas gravada como texto e formato yy/mm/dd.
Ex: 12/04/25
Dentro do Banco de Dados Access(modo estrutura) eu consegui converter o campo para Data/Hora mas
ao converter para Data/Hora o Access converte de maneira errada. Atribuindo da seguinte maneira:
Dia: 12
Mes: 04
Ano: 25
Diante desta conversão, as consultas por data no meu sistema ficam incorretas. O que fazer ?
Faltou dizer que preciso converter os dados para o formato dd/mm/yy
GOSTEI 0
Joel Rodrigues
25/04/2012
Você quer converte no banco?
Antes de tudo faça uma cópia desse banco, não dá trabalho nenhum, já que é Access.
Depois, você pode tentar a seguinte rotina:
Onde ADOTable1 é um dataset ligado à tabela cujo campo você deseja converter.
Observação importante: nesse código, estamos basicamente invertendo a posição do ano e do dia. Caso o ano atualmente seja maior que 31 (30 ou 28/29, dependendo do mês), dará erro.
Antes de tudo faça uma cópia desse banco, não dá trabalho nenhum, já que é Access.
Depois, você pode tentar a seguinte rotina:
var
m, d, a:word;
begin
ADOTable1.Open();
ADOTable1.First();
while not ADOTable1.Eof do
begin
DecodeDate(ADOTable1.FieldByName(DATA).AsDateTime, a, m, d);
ADOTable1.Edit();
ADOTable1.FieldByName(DATA).AsDateTime := EncodeDate(d, m, a);
ADOTable1.Post();
ADOTable1.Next();
end;
ADOTable1.Close();
Onde ADOTable1 é um dataset ligado à tabela cujo campo você deseja converter.
Observação importante: nesse código, estamos basicamente invertendo a posição do ano e do dia. Caso o ano atualmente seja maior que 31 (30 ou 28/29, dependendo do mês), dará erro.
GOSTEI 0
Natanael Ferreira
25/04/2012
Você quer converte no banco?
Antes de tudo faça uma cópia desse banco, não dá trabalho nenhum, já que é Access.
Depois, você pode tentar a seguinte rotina:
Onde ADOTable1 é um dataset ligado à tabela cujo campo você deseja converter.
Observação importante: nesse código, estamos basicamente invertendo a posição do ano e do dia. Caso o ano atualmente seja maior que 31 (30 ou 28/29, dependendo do mês), dará erro.
Antes de tudo faça uma cópia desse banco, não dá trabalho nenhum, já que é Access.
Depois, você pode tentar a seguinte rotina:
var
m, d, a:word;
begin
ADOTable1.Open();
ADOTable1.First();
while not ADOTable1.Eof do
begin
DecodeDate(ADOTable1.FieldByName(DATA).AsDateTime, a, m, d);
ADOTable1.Edit();
ADOTable1.FieldByName(DATA).AsDateTime := EncodeDate(d, m, a);
ADOTable1.Post();
ADOTable1.Next();
end;
ADOTable1.Close();
Onde ADOTable1 é um dataset ligado à tabela cujo campo você deseja converter.
Observação importante: nesse código, estamos basicamente invertendo a posição do ano e do dia. Caso o ano atualmente seja maior que 31 (30 ou 28/29, dependendo do mês), dará erro.
Bom dia Joel,
Obrigado por responder.
Testei o código que você enviou mas está apresentando o seguinte erro: Invalid Argument to Date Encode. Suponho que este problema aparece devido a criação de algumas datas inválidas como relatado por você em alguns casos.
Consegui resolver da seguinte maneira:
1º - Voltei o campo data para o formato Texto novamente.
2º - Fui em Painel de Controle/ Configurações regionais e modifiquei o padrão de Data para yy/MM/dd (formato original da data no Access).
3º - No Access voltei a converter o campo Data de Texto para Data/Hora (Ele converte de acordo com o padrão das configurações regionais do Painel de controle);
4º - Alterei o formato de Datas novamente no nas Configurações regionais do Painel de Controle para dd/MM/yy;
Desta maneira as datas no Access ficaram da maneira que eu precisava no formato dd/mm/yy proporcionando exatidão das consultas na aplicação do Delphi.
Muito obrigado pelo empenho Joel. Um abraço.
GOSTEI 0
Joel Rodrigues
25/04/2012
Perfeito. Você usou a forma mais segura e correta.
Obrigado por compartilhar a solução com a comunidade.
Obrigado por compartilhar a solução com a comunidade.
GOSTEI 0