Fórum Conversão de Tipo de campo em DBF nativo #418869
22/06/2012
0
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
Curtir tópico
+ 0Posts
22/06/2012
Joel Rodrigues
Gostei + 0
22/06/2012
Natanael Ferreira
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
26/06/2012
Natanael Ferreira
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
17/07/2012
Alvaro Vieira
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
Clique aqui para fazer login e interagir na Comunidade :)