Filtro por data (erro:conversion error for string 0)

13/03/2013

6

Bom dia,

Estou precisando de uma força se alguem tiver conhecimento, utilizo ibtable e ibquerye o banco de dados firebird 2.5
Estou tentando fazer um filtro por um de terminado período de data selecionado pelo usuário atraves de 2 TSDATEEDIT, porém esstá dando o seguinte ERRO: conversion error for string 0)
Vou postar os códigos abaixo:

DM.ibtblEntPai.Filtered:= False;
DM.QrySQL.Close;
DM.QrySQL.SQL.Clear;
DM.QrySQL.SQL.Add('select CA.ENTPAI_NOTA, CA.ENTPAI_ID_FORNECEDOR, CA.ENTPAI_DATA_ENTRADA,CO.NOME_FORN,CA.entpai_vencimento');
DM.QrySQL.SQL.Add('FROM ent_pai CA LEFT JOIN FORNECEDOR CO ON (CA.ENTPAI_ID_FORNECEDOR = CO.ID_FORN)');
DM.QrySQL.SQL.Add('WHERE CA.ENTPAI_DATA_ENTRADA BETWEEN :DE and :ATE' );
DM.QrySQL.ParamByName('DE').AsString:=Formatdatetime('dd/mm/yyyy',sDateinicial.date);
DM.QrySQL.ParamByName('ATE').AsString:= Formatdatetime('dd/mm/yyyy',sDateFinal.Date);
dataini:= DM.QrySQL.ParamByName('DE').AsString;
datafim := DM.QrySQL.ParamByName('ATE').AsString;
DM.QrySQL.Open;
if not DM.QrySQL.IsEmpty then
begin
DM.ibtblEntPai.Filter:= ('ENTPAI_DATA_ENTRADA BETWEEN ' + dataini + ' AND ' + datafim);
DM.ibtblEntPai.Filtered:= True;
end;
else
begin
Application.MessageBox('Não foi encontrado nenhuma nota fiscal para esse Período!','Mensagem do Sistema',MB_ICONINFORMATION + MB_OK);
DM.ibtblEntPai.Filtered:= False;
end;

O campo data ENTPAI_DATA_ENTRADA está com formato DATE no banco.

Obrigado.

Responder

Posts

13/03/2013

Felipe Ribeiro

Boa tarde.
Não estou acostumado a usar o Filter.

Mas eu tentaria alterar isso:


DM.ibtblEntPai.Filter := ('ENTPAI_DATA_ENTRADA BETWEEN ' + dataini + ' AND ' + datafim);


Por isso:


DM.ibtblEntPai.Filter := ('ENTPAI_DATA_ENTRADA BETWEEN ' + QuotedStr(dataini) + ' AND ' + QuotedStr(datafim));



Espero que te ajude.
Responder

13/03/2013

Evandro Sanz

Espero que te ajude.

Boa tarde Felipe,

Executei a sua sugestão porém deu outro Erro: conversion erro for String "13/03/2013"

Alguma sugestão para o tratamento do mesmo?

Obrigado.
Responder
Teste como desse jeito.
var
DataIni, DataFim: TDate;
...

DM.QrySQL.Close;
DM.QrySQL.SQL.Clear;
DM.QrySQL.SQL.Add('select CA.ENTPAI_NOTA, CA.ENTPAI_ID_FORNECEDOR, CA.ENTPAI_DATA_ENTRADA,CO.NOME_FORN,CA.entpai_vencimento');
DM.QrySQL.SQL.Add('FROM ent_pai CA LEFT JOIN FORNECEDOR CO ON (CA.ENTPAI_ID_FORNECEDOR = CO.ID_FORN)');
DM.QrySQL.SQL.Add('WHERE CA.ENTPAI_DATA_ENTRADA BETWEEN :DE and :ATE' );
DM.QrySQL.ParamByName('DE').AsDate := sDateinicial.Date;
DM.QrySQL.ParamByName('ATE').AsDate := sDateFinal.Date;
dataini:= DM.QrySQL.ParamByName('DE').AsDate;
datafim := DM.QrySQL.ParamByName('ATE').AsDate;
DM.QrySQL.Open;


Após os teste retorne ao fórum para informar se funcionou ou se ainda precisa de algum auxilio.

Boa sorte e bons códigos!
Responder

13/03/2013

Evandro Sanz

Boa tarde Martins

Executei a sua sugestão porém deu o seguinte Erro: conversion error for String "13/03/2013"

Eu utilizo o firebird 2.5 com o ibexpert

O SQL De busca por data ficou assim





select CA.ENTPAI_NOTA, CA.ENTPAI_ID_FORNECEDOR, CA.ENTPAI_DATA_ENTRADA, CO.NOME_FORN,CA.entpai_vencimento
FROM ent_pai CA LEFT JOIN FORNECEDOR CO ON (CA.ENTPAI_ID_FORNECEDOR = CO.ID_FORN)
WHERE CA.ENTPAI_DATA_ENTRADA = '2013.03.14'




a data do firebird tem que ser yyyy.mm.dd se não me engano o problema está no filtro ou nessa conversão!


segue código que utilizei abaixo:

DM.ibtblEntPai.Filtered:= False;
DM.QrySQL.Close;
DM.QrySQL.SQL.Clear;
DM.QrySQL.SQL.Add('select CA.ENTPAI_NOTA, CA.ENTPAI_ID_FORNECEDOR, CA.ENTPAI_DATA_ENTRADA, CO.NOME_FORN,CA.entpai_vencimento');
DM.QrySQL.SQL.Add('FROM ent_pai CA LEFT JOIN FORNECEDOR CO ON (CA.ENTPAI_ID_FORNECEDOR = CO.ID_FORN)');
DM.QrySQL.SQL.Add('WHERE CA.ENTPAI_DATA_ENTRADA BETWEEN :DE and :ATE' );
DM.QrySQL.ParamByName('DE').AsDate := sDateinicial.Date;
DM.QrySQL.ParamByName('ATE').AsDate := sDateFinal.Date;
dataini:= DM.QrySQL.ParamByName('DE').AsDate;
datafim := DM.QrySQL.ParamByName('ATE').AsDate;
DM.QrySQL.Open;

if not DM.QrySQL.IsEmpty then
begin
DM.ibtblEntPai.Filter:= ('ENTPAI_DATA_ENTRADA BETWEEN ' + QuotedStr(DateToStr(dataini)) + ' AND ' + QuotedStr(DateToStr(datafim)));
DM.ibtblEntPai.Filtered:= True;
end
else
begin
Application.MessageBox('Não foi encontrado nenhuma nota fiscal para esse Período!','Mensagem do Sistema',MB_ICONINFORMATION + MB_OK);
DM.ibtblEntPai.Filtered:= False;
end;
end;



Obrigado se tiver alguma idéia!
Responder

13/03/2013

Evandro Sanz

Pessoal,

Fiz algumas modificações no código e agora o eero parece ser de sql, porém não consigo enchergar o mesmo.
Mensagem do erro

DYNAMIC SQL ERROR
SQL ERRORCODE = -104 TOKEN UNKNOWN -LINE 2, COLUMN32 2

O Código com as sugestões dos amigos axima ficou da seguinte forma:

DM.ibtblEntPai.Filtered:= False;
DM.QrySQL.Close;
DM.QrySQL.SQL.Clear;
DM.QrySQL.SQL.Add('select CA.ENTPAI_NOTA, CA.ENTPAI_ID_FORNECEDOR, CA.ENTPAI_DATA_ENTRADA, CO.NOME_FORN,CA.entpai_vencimento');
DM.QrySQL.SQL.Add('FROM ent_pai CA LEFT JOIN FORNECEDOR CO ON (CA.ENTPAI_ID_FORNECEDOR = CO.ID_FORN)');
DM.QrySQL.SQL.Add('WHERE CA.ENTPAI_DATA_ENTRADA BETWEEN :DE and :ATE' );
DM.QrySQL.ParamByName('DE').AsDate := sDateinicial.Date;
DM.QrySQL.ParamByName('ATE').AsDate := sDateFinal.Date;
dataini:= DM.QrySQL.ParamByName('DE').AsDate;
datafim := DM.QrySQL.ParamByName('ATE').AsDate;
DM.QrySQL.Open;
if not DM.QrySQL.IsEmpty then
begin
DM.ibtblEntPai.Filter:= ('ENTPAI_DATA_ENTRADA BETWEEN ' + Formatdatetime('yyyy.mm.dd',dataini) + ' AND ' + Formatdatetime('yyyy.mm.dd',datafim));
DM.ibtblEntPai.Filtered:= True;
end
else
begin
Application.MessageBox('Não foi encontrado nenhuma nota fiscal para esse Período!','Mensagem do Sistema',MB_ICONINFORMATION + MB_OK);
DM.ibtblEntPai.Filtered:= False;
end;
end;

Acho que falta pouco pra resolver alguma sugestão????

Obrigado.
Responder
Pessoal,

Fiz algumas modificações no código e agora o eero parece ser de sql, porém não consigo enchergar o mesmo.
Mensagem do erro

DYNAMIC SQL ERROR
SQL ERRORCODE = -104 TOKEN UNKNOWN -LINE 2, COLUMN32 2

O Código com as sugestões dos amigos axima ficou da seguinte forma:

DM.ibtblEntPai.Filtered:= False;
DM.QrySQL.Close;
DM.QrySQL.SQL.Clear;
DM.QrySQL.SQL.Add('select CA.ENTPAI_NOTA, CA.ENTPAI_ID_FORNECEDOR, CA.ENTPAI_DATA_ENTRADA, CO.NOME_FORN,CA.entpai_vencimento ');
DM.QrySQL.SQL.Add('FROM ent_pai CA LEFT JOIN FORNECEDOR CO ON (CA.ENTPAI_ID_FORNECEDOR = CO.ID_FORN)');
DM.QrySQL.SQL.Add('WHERE CA.ENTPAI_DATA_ENTRADA BETWEEN :DE and :ATE' );
DM.QrySQL.ParamByName('DE').AsDate := sDateinicial.Date;
DM.QrySQL.ParamByName('ATE').AsDate := sDateFinal.Date;
dataini:= DM.QrySQL.ParamByName('DE').AsDate;
datafim := DM.QrySQL.ParamByName('ATE').AsDate;
DM.QrySQL.Open;
if not DM.QrySQL.IsEmpty then
begin
DM.ibtblEntPai.Filter:= ('ENTPAI_DATA_ENTRADA BETWEEN ' + Formatdatetime('yyyy.mm.dd',dataini) + ' AND ' + Formatdatetime('yyyy.mm.dd',datafim));
DM.ibtblEntPai.Filtered:= True;
end
else
begin
Application.MessageBox('Não foi encontrado nenhuma nota fiscal para esse Período!','Mensagem do Sistema',MB_ICONINFORMATION + MB_OK);
DM.ibtblEntPai.Filtered:= False;
end;
end;

Acho que falta pouco pra resolver alguma sugestão????

Obrigado.



DM.QrySQL.ParamByName('DE').AsDate := sDateinicial.Date;
DM.QrySQL.ParamByName('ATE').AsDate := sDateFinal.Date;
sDateinicial é um DateTimePicker?

Execute só o Script SQL no IBExpert e veja se está filtrando certo.


DM.ibtblEntPai.Filter:= ('ENTPAI_DATA_ENTRADA BETWEEN ' + Formatdatetime('yyyy.mm.dd',dataini) + ' AND ' + Formatdatetime('yyyy.mm.dd',datafim));


Mude para:
 DM.ibtblEntPai.Filter:= 'ENTPAI_DATA_ENTRADA >=' + QuotedStr(DateToStr(dataini)) + ' AND ENTPAI_DATA_ENTRADA <=' + QuotedStr(DateToStr(datafim));


Estou as cegas aqui, sem ter como testar o código.

Boa sorte e bons códigos!
Responder

13/03/2013

Evandro Sanz

Martins,

Então meu amigo, o Script SQL no Ibexpert está rodando certinho mas tem que ser no formato de data yyyy.mm.dd




DM.QrySQL.ParamByName('DE').AsDate := sDateinicial.Date;
DM.QrySQL.ParamByName('ATE').AsDate := sDateFinal.Date;

O componetnte que uso é do alphacontrols da aba AlphaAdditional e chama sDateEdit : TsDateEdit
fiz o teste com o Tdatetimepiker para ver se rodava mas deu o mesmo problema que dá com o TsDateEdit

Quando filtro com:
DM.ibtblEntPai.Filter:= ('ENTPAI_DATA_ENTRADA BETWEEN ' + Formatdatetime('yyyy.mm.dd',dataini) + ' AND ' + Formatdatetime('yyyy.mm.dd',datafim));

O erro é: DYNAMIC SQL ERROR
SQL ERRORCODE = -104 TOKEN UNKNOWN -LINE 2, COLUMN32 2

Quando filtro com:
DM.ibtblEntPai.Filter:= 'ENTPAI_DATA_ENTRADA >=' + QuotedStr(DateToStr(dataini)) + ' AND ENTPAI_DATA_ENTRADA <=' + QuotedStr(DateToStr(datafim));

O Erro é: conversion error for String "13/03/2013"

Obrigado.
Responder

13/03/2013

Evandro Sanz

Resolvido o problema meu brother!

DM.ibtblEntPai.Filtered:= False;
DM.QrySQL.Close;
DM.QrySQL.SQL.Clear;
DM.QrySQL.SQL.Add('select CA.ENTPAI_NOTA, CA.ENTPAI_ID_FORNECEDOR, CA.ENTPAI_DATA_ENTRADA, CO.NOME_FORN,CA.entpai_vencimento');
DM.QrySQL.SQL.Add('FROM ent_pai CA LEFT JOIN FORNECEDOR CO ON (CA.ENTPAI_ID_FORNECEDOR = CO.ID_FORN)');
DM.QrySQL.SQL.Add('WHERE CA.ENTPAI_DATA_ENTRADA BETWEEN :DE and :ATE' );
DM.QrySQL.ParamByName('DE').AsDate := sDateinicial.Date;
DM.QrySQL.ParamByName('ATE').AsDate := sDateFinal.Date;
dataini:= DM.QrySQL.ParamByName('DE').AsDate;
datafim := DM.QrySQL.ParamByName('ATE').AsDate;
DM.QrySQL.Open;
if not DM.QrySQL.IsEmpty then
begin

DM.ibtblEntPai.Filter:= ('ENTPAI_DATA_ENTRADA BETWEEN ' + QuotedStr(Formatdatetime('yyyy.mm.dd',dataini)) + ' AND ' + QuotedStr(Formatdatetime('yyyy.mm.dd',datafim)));
DM.ibtblEntPai.Filtered:= True;
end
else
begin
Application.MessageBox('Não foi encontrado nenhuma nota fiscal para esse Período!','Mensagem do Sistema',MB_ICONINFORMATION + MB_OK);
DM.ibtblEntPai.Filtered:= False;
end;
end;


Obrigado pela força Martins.

-------------------------------------------------Resolvido------------------------------------------------------------
Responder
Tranquilo, o importante é que foi resolvido.

Boa sorte e bons códigos!
Responder

02/04/2013

José

obrigado pelo retorno.
Sendo assim, estou marcando este tópico como resolvido.
Responder