Formatação Campo Data Access/Delphi

Delphi

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 ?
Natanael Ferreira

Natanael Ferreira

Curtidas 0

Respostas

Natanael Ferreira

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 ?


Faltou dizer que preciso converter os dados para o formato dd/mm/yy
GOSTEI 0
Joel Rodrigues

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:
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

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:
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

Joel Rodrigues

25/04/2012

Perfeito. Você usou a forma mais segura e correta.
Obrigado por compartilhar a solução com a comunidade.
GOSTEI 0
POSTAR