Conversão de Tipo de campo em DBF nativo
Boa tarde,
Estou convertendo um programa que roda em Clipper que possui tabelas em DBF. Estou conseguindo acessar normalmente os DBFs
nativamente utilizando ADO.
O meu problema é o seguinte em uma das tabelas há três campos de data que estão como WideString. Como converter estes campos de data que estão em WideString para Date para que as consultas de datas funcionem corretamente?
Lembrando que estou lendo os DBFs diretamente por isso preciso alterar o tipo de campo via programacao.
Desde já agradeço.
Estou convertendo um programa que roda em Clipper que possui tabelas em DBF. Estou conseguindo acessar normalmente os DBFs
nativamente utilizando ADO.
O meu problema é o seguinte em uma das tabelas há três campos de data que estão como WideString. Como converter estes campos de data que estão em WideString para Date para que as consultas de datas funcionem corretamente?
Lembrando que estou lendo os DBFs diretamente por isso preciso alterar o tipo de campo via programacao.
Desde já agradeço.
Natanael Ferreira
Curtidas 0
Respostas
Joel Rodrigues
22/06/2012
Tente a função StrToDate ou, ainda, usar a propriedade AsDateTime do campo.
GOSTEI 0
Natanael Ferreira
22/06/2012
Tente a função StrToDate ou, ainda, usar a propriedade AsDateTime do campo.
Boa tarde Joel,
Eu estou utilizando uma consulta SQL para demonstrar o dados em um Grid e preciso que estes 3 campos estejam já convertidos para Date antes de fazer a consulta.
Estou utlizando este código:
if (IWEdit1.Text <> ) and (IWEdit2.Text <> ) then
Begin
With QryDebIndividual do
Begin
Close;
SQL.Clear;
SQL.Add(SELECT a.NUMPRE, a.TIPPRE, a.DATVEN, a.PERIOD, a.TOTGUIA, b.NOMCON, c.NOMMOR FROM ASAC0003 AS b);
SQL.Add(INNER JOIN (ASAC0002 AS a INNER JOIN ASAC0001 AS c ON a.NUMCON=c.NUMCON AND a.NUMAPA=c.NUMAPA));
SQL.Add(ON b.NUMCON = a.NUMCON where a.DATPAG is null and a.NUMCON= :NUMCON and );
SQL.Add(a.NUMAPA= :NUMAPA and a.DATVEN < NOW -1 ORDER BY a.NUMPRE);
Parameters.ParamByName(NUMCON).Value:= IWEdit1.Text;
Parameters.ParamByName(NUMAPA).Value:= IWEdit2.Text;
Open;
TFloatField(Fields[4]).Currency := True;
End;
Mas como os campos de datas estão definidos como WideString no DBF, me retorna o seguinte erro:
Error message raised by the application: ཆ/06/11 is not a valid floating point value
Testei os comandos AsDateTime e StrToDate mas dá o erro de Access Violation.
Você conhece algum comando para converter estes campos dentro do SQL?
Obrigado
GOSTEI 0
Natanael Ferreira
22/06/2012
Tente a função StrToDate ou, ainda, usar a propriedade AsDateTime do campo.
Boa tarde Joel,
Eu estou utilizando uma consulta SQL para demonstrar o dados em um Grid e preciso que estes 3 campos estejam já convertidos para Date antes de fazer a consulta.
Estou utlizando este código:
if (IWEdit1.Text <> ) and (IWEdit2.Text <> ) then
Begin
With QryDebIndividual do
Begin
Close;
SQL.Clear;
SQL.Add(SELECT a.NUMPRE, a.TIPPRE, a.DATVEN, a.PERIOD, a.TOTGUIA, b.NOMCON, c.NOMMOR FROM ASAC0003 AS b);
SQL.Add(INNER JOIN (ASAC0002 AS a INNER JOIN ASAC0001 AS c ON a.NUMCON=c.NUMCON AND a.NUMAPA=c.NUMAPA));
SQL.Add(ON b.NUMCON = a.NUMCON where a.DATPAG is null and a.NUMCON= :NUMCON and );
SQL.Add(a.NUMAPA= :NUMAPA and a.DATVEN < NOW -1 ORDER BY a.NUMPRE);
Parameters.ParamByName(NUMCON).Value:= IWEdit1.Text;
Parameters.ParamByName(NUMAPA).Value:= IWEdit2.Text;
Open;
TFloatField(Fields[4]).Currency := True;
End;
Mas como os campos de datas estão definidos como WideString no DBF, me retorna o seguinte erro:
Error message raised by the application: ཆ/06/11 is not a valid floating point value
Testei os comandos AsDateTime e StrToDate mas dá o erro de Access Violation.
Você conhece algum comando para converter estes campos dentro do SQL?
Obrigado
Estou utilizando ADO: ADOConnection, ADOQuery e DataSource.
Obs: Vejo que minha melhor opção seria converter o tipo de campos via
SQL. Tentei a conversão com as funcões CAST e CONVERT mas me retorna o seguinte erro:
- Erro não especificado
Vocês sabem se o ADO suporta estas funções CAST e CONVERT?
Obrigado.
GOSTEI 0
Alvaro Vieira
22/06/2012
Bom dia Natanael.
Trabalhar com data num campo texto é muito perigoso, principalmente se o formato não for do tipo yyyymmdd, mas fiz um pequeno programa e testei o código abaixo e funcionou, se você precisar do código, poste o e-mail aqui, pois não encontrei como anexar os aquivos.
Abraço.
procedure TForm1.DateTimePicker1Change(Sender: TObject);
var
ano, mes,dia: word;
begin
DecodeDate(DateTimePicker1.Date, ano, mes, dia);
ADOQuery1.Close;
ADOQuery1.SQL.Clear;
ADOQuery1.SQL.Add(SELECT DATATXT FROM TESTE WHERE Year(DATATXT) >= :ano AND MONTH(DATATXT) >= :mes AND DAY(DATATXT) >= :dia);
ADOQuery1.SQL.Add(ORDER BY DATATXT);
ADOQuery1.Parameters.ParamByName(ano).Value := ano;
ADOQuery1.Parameters.ParamByName(mes).Value := mes;
ADOQuery1.Parameters.ParamByName(dia).Value := dia;
ADOQuery1.Open;
end;
Trabalhar com data num campo texto é muito perigoso, principalmente se o formato não for do tipo yyyymmdd, mas fiz um pequeno programa e testei o código abaixo e funcionou, se você precisar do código, poste o e-mail aqui, pois não encontrei como anexar os aquivos.
Abraço.
procedure TForm1.DateTimePicker1Change(Sender: TObject);
var
ano, mes,dia: word;
begin
DecodeDate(DateTimePicker1.Date, ano, mes, dia);
ADOQuery1.Close;
ADOQuery1.SQL.Clear;
ADOQuery1.SQL.Add(SELECT DATATXT FROM TESTE WHERE Year(DATATXT) >= :ano AND MONTH(DATATXT) >= :mes AND DAY(DATATXT) >= :dia);
ADOQuery1.SQL.Add(ORDER BY DATATXT);
ADOQuery1.Parameters.ParamByName(ano).Value := ano;
ADOQuery1.Parameters.ParamByName(mes).Value := mes;
ADOQuery1.Parameters.ParamByName(dia).Value := dia;
ADOQuery1.Open;
end;
GOSTEI 0