Fórum Consulta com Datas #368162

04/02/2009

0

Estou utilizando o seguinte codigo para consulta entre datas: E sempre da erro de type mismatch in expression.

if (StrToDate(maskedit2.text)>=StrToDate(maskedit1.text)) then
BEGIN
With SqlContasPagar do
Begin
Close;
Sql.Clear;
sql.add(´select * from Contas_Pagar´);
sql.add(´where vencimento between ´ + MaskEdit1.text + ´ and ´ + MaskEdit2.text);
sql.add(´order by codigo;´);
Prepare;
ExecSql;
end;
end
else
showmessage(´Intervalo de Datas inválida! A Data Inicial é Maior que a Data Final´);

Está me retornando o seguinte erro: Type mismatch in expression
onde devo alterar o codigo para funcionar??

Agradeço a atenção


Douglas

Douglas

Responder

Posts

05/02/2009

Woinch

O problema está no modo que você está passando as datas ao select. Cada banco de dados possui a sua maneira. Se for Oracle você deve utilizar o comando TO_DATE, para MSSQL CAST, quanto a Firebird se não me engano é só passar entre aspas ou deve-se utilizar o comando CAST também.

Exemplo:

    sql.add(´where vencimento between ´ + QuotedStr(MaskEdit1.text) + ´ and ´ + QuotedStr(MaskEdit2.text)); 


ou

    sql.add(´where vencimento between CAST(´ + QuotedStr(MaskEdit1.text) + ´ as DATE) and CAST(´ + QuotedStr(MaskEdit2.text) + ´as DATE)); 


A rotina a seguir coloca uma Data no formato correto para Firebird:

function DataPDtIB(PData: TDateTime) : string; {15/05/96 -> ´CAST(´1996-05-15´ AS DATE)´}
var
  A, M, D       : Word;
  Ano, Mes, Dia : string;

begin
  DecodeDate(PData, A, M, D);

  Ano := IntToStr(A);

  if M < 10 then
    Mes := ´0´ + IntToStr(M)
  else
    Mes := IntToStr(M);

  if D < 10 then
    Dia := ´0´ + IntToStr(D)
  else
    Dia := IntToStr(D);

  Result := ´CAST(´´´ + Ano + ´-´ + Mes + ´-´ + Dia + ´´´ AS DATE)´;
end;


Utilize-a se necessário!
Espero ter ajudado.


Responder

Gostei + 0

05/02/2009

Maikel

Bom, me parece que o problema está no espaçamento e nas aspas. Vou tentar reescrever seu código, faça as modificações ai de acordo:

ql.add(´select * from Contas_Pagar ´);//Coloquei espaço no final
sql.add(´where vencimento between [color=red]´´[/color]´ + MaskEdit1.text + ´[color=red]´´[/color] and ´[color=red]´´[/color] + MaskEdit2.text[color=red]+´´ ´´[/color]);//Coloquei mais aspas e espaço no final
sql.add(´order by codigo;´); 


Se quiser evitar um pouco mais estes problemas, use parametros e depois atribua valores a eles...

sql.add(´where vencimento between :data1 and :data2);
Params[0].value := MaskEdit1.text;
Params[1].value := MaskEdit2.text;


Sempre deixe um espaço no final de cada instrução SQL ao quebrar de linha. Isso é para os códigos não ficarem emendados.

Faça o teste ai... post o resultaado

Att


Responder

Gostei + 0

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

Aceitar