Dúvida na hora de fazer filtro com data
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';
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
Curtidas 0
Respostas
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';
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
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
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:
Abraços!!
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
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
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...
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.
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
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
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!!!!
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
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
08/10/2012
Já está no 3..Alguma outra sugestão?
GOSTEI 0
Joel Rodrigues
08/10/2012
Valeu pelo esclarecimento, Leandro.
Um abraço.
Um abraço.
GOSTEI 0
Alisson Santos
08/10/2012
two conseguiu resolver o seu problema?
GOSTEI 0
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
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.
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
08/10/2012
Na verdade eu passo o parametro sim...
Segue o código
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.
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;
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
08/10/2012
Tem um sinal de igualdade depois do between, remova-o, pois isso é um erro de sintaxe.
Abraço.
Abraço.
GOSTEI 0
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..
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;
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
08/10/2012
Amigo, tente substituir a linha:
e nos diga se deu certo..
Dm_Dados.SqlFiltroSaida2.ExecSQL; por Dm_Dados.SqlFiltroSaida2.open;
e nos diga se deu certo..
GOSTEI 0
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
08/10/2012
Olá...
Tente substituir a linha:
Por:
Espero ter ajudado!
Abçs
Rafael
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
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;
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
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
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;
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
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.
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
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..
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
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..
E Funcionou, "incrivilmente"...Agora alguém sabe explicar o porque?
rsrs
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
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.
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