Consulta com Datas
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
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
Curtidas 0
Respostas
Woinch
04/02/2009
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:
ou
A rotina a seguir coloca uma Data no formato correto para Firebird:
Utilize-a se necessário!
Espero ter ajudado.
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.
GOSTEI 0
Maikel
04/02/2009
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:
Se quiser evitar um pouco mais estes problemas, use parametros e depois atribua valores a eles...
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
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
GOSTEI 0