Fórum Conversão de Tipo de campo em DBF nativo #418869

22/06/2012

0

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

Natanael Ferreira

Responder

Posts

22/06/2012

Joel Rodrigues

Tente a função StrToDate ou, ainda, usar a propriedade AsDateTime do campo.
Responder

Gostei + 0

22/06/2012

Natanael Ferreira

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
Responder

Gostei + 0

26/06/2012

Natanael Ferreira

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.
Responder

Gostei + 0

17/07/2012

Alvaro Vieira

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;
Responder

Gostei + 0

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

Aceitar