Dúvida na hora de fazer filtro com data

Delphi

08/10/2012

Prezados,

Acredito que realmente essa seja uma dúvida besta, mais não estou conseguindo fazer, vamos lá. Tenho um campo na minha tabela que é TIMESTEMP, quando faço o select de dentro do ibexpert só para teste ele funciona porque eu coloco as aspas ( '' ), mais o filtro tem que vim da minha aplicação, e eu tenho que colocar as aspas também, e não estou conseguindo fazer isso, para ficar assim exemplo: '01.09.2012' and '30.09.2012'. Como eu faço para colocar aspas na hora de concatenar as datas?

Sql := 'select * from TBL_SAIDA_CABECALHO, TBL_SAIDA_PRODUTO '+
'where sai_cabe_dtsaida between = '+DateToStr(DateI.Date) + 'and' +
DateToStr(DateF.Date) + 'order by sai_cabe_dtsaida';
Filipe Campos

Filipe Campos

Curtidas 0

Respostas

Bruno Leandro

Bruno Leandro

08/10/2012

para colocar as aspas utilize o quotedstr, mas talvez ainda nao resolva o filtro, pq dependendo da formatação da data do banco não fique correto e voce precise utilizar o FormatDateTime ao invez de DateToStr e formatar conforme padrao do banco ex: quotedstr(FormatDateTime('dd.mm.yyyy', myDate))

Sql := 'select * from TBL_SAIDA_CABECALHO, TBL_SAIDA_PRODUTO '+
'where sai_cabe_dtsaida between = '+quotedstr(DateToStr(DateI.Date)) + 'and' +
quotedstr(DateToStr(DateF.Date)) + 'order by sai_cabe_dtsaida';
GOSTEI 0
Joel Rodrigues

Joel Rodrigues

08/10/2012

Experimente usar parâmetros:
minhaQuery.SQL.Text := 'select * from TBL_SAIDA_CABECALHO, TBL_SAIDA_PRODUTO where sai_cabe_dtsaida between :dataI and :dataF order by sai_cabe_dtsaida';
minhaQuery.ParamBtName('dataI').AsDateTime := DateI.Date;
minhaQuery.ParamBtName('dataF').AsDateTime := DateF.Date;
//...continuar

GOSTEI 0
Singular Ti

Singular Ti

08/10/2012

Como o amigo acima disse tente parametros é mais simples...


Experimente usar parâmetros:
#Código

minhaQuery.SQL.Text := 'select * from TBL_SAIDA_CABECALHO, TBL_SAIDA_PRODUTO where sai_cabe_dtsaida between :dataI and :dataF order by sai_cabe_dtsaida';
minhaQuery.ParamBtName('dataI').AsDateTime := DateI.Date;
minhaQuery.ParamBtName('dataF').AsDateTime := DateF.Date;
//...continuar


Eu faria uma pequena mudanca:

Experimente usar parâmetros:
#Código

minhaQuery.SQL.Text := 'select * from TBL_SAIDA_CABECALHO, TBL_SAIDA_PRODUTO where sai_cabe_dtsaida between :dataI and :dataF order by sai_cabe_dtsaida';

minhaQuery.Params[0].AsDateTime := DateI.Date;
minhaQuery.Params[1].AsDateTime := DateF.Date;
//...continuar


Abraços!!
GOSTEI 0
Joel Rodrigues

Joel Rodrigues

08/10/2012

Opa, Leandro. Fiquei curioso sobre o motivo pelo qual você prefere acessar os parâmetros pelo índice e não pelo nome.
GOSTEI 0
Filipe Campos

Filipe Campos

08/10/2012

Pessoa, primeiro gostaria de agradecer a atenção de todos...

Eu testei da forma que todos falaram, e da um erro quando clico no botão 'Ok' obs: Ok é para disparar o evento. O erro é Unknown SQL Data type (0).

Segue o meu código...

  Dm_Dados.SqlFiltroSaida2.Close;
        Dm_Dados.SqlFiltroSaida2.SQL.Clear;
        Dm_Dados.SqlFiltroSaida2.SQL.Text:='select * from TBL_SAIDA_CABECALHO, TBL_SAIDA_PRODUTO'+
        'where sai_cabe_dtsaida between = :dataI and :dataF order by sai_cabe_dtsaida';
        Dm_Dados.SqlFiltroSaida2.ParamByName('dataI').AsDateTime := DateI.Date;
        Dm_Dados.SqlFiltroSaida2.ParamByName('dataF').AsDateTime := DateF.Date;
        Dm_Dados.SqlFiltroSaida2.ExecSQL;
        RelMovSaidas := TFrmRelMovSaida.Create(Self);
        RelMovSaidas.QuickRep1.Preview;


Esse código é para fazer um filtro por data qualquer que o cliente vai entrar, e mostrar na tela o relatório que está ligado a está query.
GOSTEI 0
Singular Ti

Singular Ti

08/10/2012

Ola Joel..


Opa, Leandro. Fiquei curioso sobre o motivo pelo qual você prefere acessar os parâmetros pelo índice e não pelo nome.


O fato de acessar pelo índice ou pelo nome eu não vejo nenhuma diferença de funcionalidade, seria apenas um atalho mesmo, no final vai executar o Params.ParamByName do mesmo jeito como vemos na função a seguir

function TCustomSQLQuery.ParamByName(Const AParamName : String) :
TParam;
begin
  Result:=Params.ParamByName(AParamName);
end;


Como te disse.. seria apenas uma forma mais simples de passar um parametro para uma instrucao SQL e tambem ja li relatos de colegas que dizem que usando indice a execucao seria mais rapido ou dinamica... Mas porem nunca parei para testar ou medir essa informação pois como te falei no final sera executado a funcao Params.ParamByName..

Abraços!!!!
GOSTEI 0
Singular Ti

Singular Ti

08/10/2012


Eu testei da forma que todos falaram, e da um erro quando clico no botão 'Ok' obs: Ok é para disparar o evento. O erro é Unknown SQL Data type (0).


Amigo o seu problema, pode estar no dialect 1, pois esse dialect nao suporta o tipo data, vc tera que alterar o dialect 1 para dialect 3, da sua Base de dados.

Da uma olhada nisso....Abraços!!!
GOSTEI 0
Filipe Campos

Filipe Campos

08/10/2012

Já está no 3..Alguma outra sugestão?
GOSTEI 0
Joel Rodrigues

Joel Rodrigues

08/10/2012

Valeu pelo esclarecimento, Leandro.
Um abraço.
GOSTEI 0
Alisson Santos

Alisson Santos

08/10/2012

two conseguiu resolver o seu problema?
GOSTEI 0
Filipe Campos

Filipe Campos

08/10/2012

Ainda não, ainda da o mesmo erro, já vi o dialect e está 3, já mudei as consultas de diversas formas e nada, porém o engraçado é que pelo sgdb eu faço a consulta normal que eu quero, só quando envolvo a apliação em delphi ele da esse erro, quando o usuário é que tem que escolher a data atraves de um componente de date...
GOSTEI 0
Alisson Santos

Alisson Santos

08/10/2012

Estava analisando a sua select e notei que você passou dois parametros mais eu não vi qual é os campos que vai estar passando esses dois parametros. Pois assim, quando utilizamos parametros o que fazemos é deixar o usuário interegir com as datas.
Gostaria de saber qual é o tipo de banco de dados que está utilizando?
Verifique se isso resolve para você a sua duvida.
  
Dm_Dados.SqlFiltroSaida2.Close;
Dm_Dados.SqlFiltroSaida2.SQL.Clear;
Dm_Dados.SqlFiltroSaida2.SQL.Text:='select * from TBL_SAIDA_CABECALHO, TBL_SAIDA_PRODUTO'+
'where sai_cabe_dtsaida between = :dataI and :dataF order by sai_cabe_dtsaida';
Dm_Dados.SqlFiltroSaida2.ParamByName('dataI').AsDateTime := Nesse local colocar o campo que vai passar os valores que são recebidos pelo usuário;
Dm_Dados.SqlFiltroSaida2.ParamByName('dataF').AsDateTime := Nesse local colocar o campo que vai passar os valores que são recebidos pelo usuário;
Dm_Dados.SqlFiltroSaida2.ExecSQL;
RelMovSaidas := TFrmRelMovSaida.Create(Self);
RelMovSaidas.QuickRep1.Preview;
GOSTEI 0
Filipe Campos

Filipe Campos

08/10/2012

Na verdade eu passo o parametro sim...

Segue o código

Dm_Dados.SqlFiltroSaida2.Close;
Dm_Dados.SqlFiltroSaida2.SQL.Clear;
Dm_Dados.SqlFiltroSaida2.SQL.Text:='select * from TBL_SAIDA_CABECALHO, TBL_SAIDA_PRODUTO'+
'where sai_cabe_dtsaida between = :dataI and :dataF order by sai_cabe_dtsaida';
Dm_Dados.SqlFiltroSaida2.ParamByName('dataI').AsDateTime := DateI.Date;
Dm_Dados.SqlFiltroSaida2.ParamByName('dataF').AsDateTime := DateF.Date;
Dm_Dados.SqlFiltroSaida2.ExecSQL;
RelMovSaidas := TFrmRelMovSaida.Create(Self);
RelMovSaidas.QuickRep1.Preview;


O DateF.Date; e o DateI.Date; São componentes de data do proprio Delphi. E o banco que eu utilizo é o firebird, o tipo de dado que está no banco é Timestamp.
GOSTEI 0
Joel Rodrigues

Joel Rodrigues

08/10/2012

Tem um sinal de igualdade depois do between, remova-o, pois isso é um erro de sintaxe.
Abraço.
GOSTEI 0
Filipe Campos

Filipe Campos

08/10/2012

Juro a você que eu fui com toda esperança do mundo pensando que fosse isso porque realmente é um erro de sintax, mais o erro continua rsrsrs

Segue código modificado..

Dm_Dados.SqlFiltroSaida2.Close;
Dm_Dados.SqlFiltroSaida2.SQL.Clear;
Dm_Dados.SqlFiltroSaida2.SQL.Text:='select * from TBL_SAIDA_CABECALHO, TBL_SAIDA_PRODUTO'+
'where sai_cabe_dtsaida between :dataI and :dataF order by sai_cabe_dtsaida';
Dm_Dados.SqlFiltroSaida2.ParamByName('dataI').AsDateTime := DateI.Date;
Dm_Dados.SqlFiltroSaida2.ParamByName('dataF').AsDateTime := DateF.Date;
Dm_Dados.SqlFiltroSaida2.ExecSQL;
RelMovSaidas := TFrmRelMovSaida.Create(Self);
RelMovSaidas.QuickRep1.Preview;
GOSTEI 0
Singular Ti

Singular Ti

08/10/2012

Amigo, tente substituir a linha:
Dm_Dados.SqlFiltroSaida2.ExecSQL;

por 

Dm_Dados.SqlFiltroSaida2.open;

e nos diga se deu certo..
GOSTEI 0
Filipe Campos

Filipe Campos

08/10/2012

Fiz o teste agora...Na verdade já tinha feito, mais antes de retirar o sinal de "=" da consulta, fiz agora depois que retirei e nada ainda... =\
GOSTEI 0
Rafael Ribeiro

Rafael Ribeiro

08/10/2012

Olá...

Tente substituir a linha:

'where sai_cabe_dtsaida between :dataI and :dataF order by sai_cabe_dtsaida';


Por:

'where Cast(sai_cabe_dtsaida as date) between :dataI and :dataF order by sai_cabe_dtsaida';


Espero ter ajudado!

Abçs

Rafael
GOSTEI 0
Filipe Campos

Filipe Campos

08/10/2012

Ainda nada...continua dando o tal erro Unknown SQL Data type (0), eu já cheguei até substituir os componentes, coloquei MaskEdit, e coloquei a mascara igual a da data que é salva no banco e filtrei pelo MaskEdit1.text mesmo assim da o mesmo erro =\

Dm_Dados.SqlFiltroSaida2.Close;
Dm_Dados.SqlFiltroSaida2.SQL.Clear;
Dm_Dados.SqlFiltroSaida2.SQL.Text:='select * from TBL_SAIDA_CABECALHO, TBL_SAIDA_PRODUTO'+
'where Cast(SAI_CABE_DTSAIDA as date) between :dataI and :dataF order by SAI_CABE_DTSAIDA';
Dm_Dados.SqlFiltroSaida2.ParamByName('dataI').AsDateTime := DateI.Date;
Dm_Dados.SqlFiltroSaida2.ParamByName('dataF').AsDateTime := DateF.Date;
Dm_Dados.SqlFiltroSaida2.Open;
RelMovSaidas := TFrmRelMovSaida.Create(Self);
RelMovSaidas.QuickRep1.Preview;
GOSTEI 0
Bruno Leandro

Bruno Leandro

08/10/2012

tente fazer o seguinte, selecione seu componente sql e clique nos ... da propriedade Params selecione os seus parametros e defina DataType como ftDate e ParamType como ptInput
GOSTEI 0
Romulo Contro

Romulo Contro

08/10/2012

Dm_Dados.SqlFiltroSaida2.ParamByName('dataI').AsDateTime := DateI.Date;
Dm_Dados.SqlFiltroSaida2.ParamByName('dataF').AsDateTime := DateF.Date;

tenta assim:

Dm_Dados.SqlFiltroSaida2.ParamByName('dataI').AsDate := DateI.Date;
Dm_Dados.SqlFiltroSaida2.ParamByName('dataF').AsDate := DateF.Date;


ou então:

Dm_Dados.SqlFiltroSaida2.ParamByName('dataI').Value := DateI.Date;
Dm_Dados.SqlFiltroSaida2.ParamByName('dataF').Value := DateF.Date;
GOSTEI 0
Thiago Schnell

Thiago Schnell

08/10/2012

Olá, entendo sua dúvida use para single quote '''exemplo''' e para double quotes '''''exemplo''''';
vc pode usar uma constant '''''exemplo'''' de como usar quotes em delphi!!!';
além de ser elegante vai funcionar perfeitamente!.

att,

Thiago Schnell.
GOSTEI 0
Filipe Campos

Filipe Campos

08/10/2012

Pessoa,
ainda não consegui fazer, sinceramente não estou entendendo esse erro, eu tenho outro projeto com o mesmo filtro, passando as datas por parametros, e usando between sem problemas com COMPONENTE.DATE, e nesse projeto da esse erro, sendo que o tipo do dado do campo no banco é o mesmo usado em um outro projeto, TIMESTAMP...

O Engraçado é que eu agro o ibexpert e coloco 'select * from TBL_SAIDA_CABECALHO, TBL_SAIDA_PRODUTO where sai_cabe_dtsaida between '01.09.2012' and '30.09.2012' order by sai_cabe_dtsaida' e o filtro acontece, então com certeza é alguma coisa na passagem dos parametros..
GOSTEI 0
Filipe Campos

Filipe Campos

08/10/2012

Pessoal, primeiramente me desculpe o flood, depois, funcionou, e vocês não acreditam como..rsrs Eu estava dando um select quebrando a linha, colocando + pra concatenar, só pra não ter que correr a tela para la >> para poder visualizar, então eu peguei e tirei isso, ficando assim..

 Dm_Dados.SqlFiltroSaida2.Close;
        Dm_Dados.SqlFiltroSaida2.SQL.Clear;
        Dm_Dados.SqlFiltroSaida2.SQL.Text:='select * from TBL_SAIDA_CABECALHO, TBL_SAIDA_PRODUTO where sai_cabe_dtsaida between :dataI and :dataF order by sai_cabe_dtsaida';
        Dm_Dados.SqlFiltroSaida2.ParamByName('dataI').AsDate := DateI.Date;
        Dm_Dados.SqlFiltroSaida2.ParamByName('dataF').AsDate := DateF.Date;
        Dm_Dados.SqlFiltroSaida2.Open;
        RelMovSaidas := TFrmRelMovSaida.Create(Self);
        RelMovSaidas.QuickRep1.Preview;


E Funcionou, "incrivilmente"...Agora alguém sabe explicar o porque?
rsrs
GOSTEI 0
Alisson Santos

Alisson Santos

08/10/2012

Então conseguiu resolver o problema.

Pelo que eu notei é como falou mesmo estava colocando o sinal de + e se não me engano na instrução SAL.TEXT que está passando não pode ter.
GOSTEI 0
POSTAR