GARANTIR DESCONTO

Fórum Dúvida na hora de fazer filtro com data #425730

08/10/2012

0

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

Responder

Posts

08/10/2012

Bruno Leandro

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';
Responder

Gostei + 0

08/10/2012

Joel Rodrigues

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

Responder

Gostei + 0

08/10/2012

Singular Ti

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!!
Responder

Gostei + 0

08/10/2012

Joel Rodrigues

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

Gostei + 0

08/10/2012

Filipe Campos

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.
Responder

Gostei + 0

08/10/2012

Singular Ti

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!!!!
Responder

Gostei + 0

08/10/2012

Singular Ti


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!!!
Responder

Gostei + 0

08/10/2012

Filipe Campos

Já está no 3..Alguma outra sugestão?
Responder

Gostei + 0

09/10/2012

Joel Rodrigues

Valeu pelo esclarecimento, Leandro.
Um abraço.
Responder

Gostei + 0

09/10/2012

Alisson Santos

two conseguiu resolver o seu problema?
Responder

Gostei + 0

09/10/2012

Filipe Campos

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...
Responder

Gostei + 0

09/10/2012

Alisson Santos

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;
Responder

Gostei + 0

09/10/2012

Filipe Campos

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.
Responder

Gostei + 0

09/10/2012

Joel Rodrigues

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

Gostei + 0

09/10/2012

Filipe Campos

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;
Responder

Gostei + 0

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

Aceitar