GARANTIR DESCONTO

Fórum Sql.. selecinar atraves de intervalo de dadas? #287601

11/07/2005

0

amigos, com com um pequeno problema, estou fazendo uma consulta atravé de uma qry (sql) onde passo valores através de parametros para selecionar registros no intervalo de data digitato em um TEditdate, porém preciso fazer com que se eu não digitar nada nos edits a consulta entenda que quero selecionar todos os registro... tentei passar o valo ´¬´ para os parametros ms deu erro por se tratar de campo date e não string... Alguem pode me propor uma dica.

Obrigado


Ant.neto

Ant.neto

Responder

Posts

11/07/2005

Ericksasse

Minha dica é gerar o SQL em runtime, incluindo no WHERE somente quando uma data for informada.


Responder

Gostei + 0

11/07/2005

Ericksasse

Talvez dê certo também incluindo a checagem NULL do parametro no WHERE. Algo assim (não testei):

SELECT * FROM TABELA WHERE (DATA >= :PINICIO OR :PINICIO IS NULL) AND (DATA <= :PFIM OR :PFIM IS NULL)



Responder

Gostei + 0

12/07/2005

Ant.neto

Talvez dê certo também incluindo a checagem NULL do parametro no WHERE. Algo assim (não testei):
SELECT * FROM TABELA WHERE (DATA >= :PINICIO OR :PINICIO IS NULL) AND (DATA <= :PFIM OR :PFIM IS NULL)


valeu pela a dica mas esta opção tentei incrementar mas não deu certo.. o sistema travava... tentei usar a sua primeira dica passando o sql em runtime.. Como é a primeira vez que faço.. o sistemas travou tambem...
tem como vc. dar uma olhada neste códigos aí pra ver se existe alguma coisa certa!!

Meu sql normal. sem passar o sql em runtime.

SELECT CodCliente, Nome, Categoria, DDD, TelPrinc, TelLocal, Contato, Pessoa, E_Mail_Princ, Data_cad
FROM ´TbNome.DB´ Tbnome
Where Upper(Tbnome.Nome) Like Upper(:VarNome) and
Tbnome.Data_cad between :VarDataI and :VarDataF and
Upper(Tbnome.Contato) Like Upper(:VarContato)
Order by Tbnome.Nome


Agora passando em runtime que deu pau... (travou)
With QryPesq do
    Begin
      close;
      Sql.clear;
      Sql.Add(´SELECT CodCliente, Nome, Categoria, DDD, TelPrinc, TelLocal, Contato,       Pessoa, E_Mail_Princ, Data_cad FROM "TbNome.DB" Tbnome Where Upper(Tbnome.Nome) Like Upper(:VarNome)´);
      ParamByName(´VarNome´).AsString:=´¬´+BFSEdit1.text+´¬´;
      Prepare;
      Open;
     end;
  // QryPesq.ParamByName(´VarNome´).AsString:=´¬´+BFSEdit1.text+´¬´;


tem alguma coisa certa neste código aí de cima?? Valew + 1 vez..


Responder

Gostei + 0

12/07/2005

Macaquito86

Posso ta falando bobagem , mas vc ja tentou usar o between ?
´select bla bla bla where data between lala and lele ´


Responder

Gostei + 0

12/07/2005

Rjun

Eu evito ao máximo colocar código SQL no meio do código fonte. Por isso, coloque seu código SQL básico no seu componente.

SQL
SELECT 
  CodCliente, 
  Nome,
  Categoria, 
  DDD, 
  TelPrinc, 
  TelLocal, 
  Contato, 
  Pessoa, 
  E_Mail_Princ, 
  Data_cad 
FROM 
  "TbNome.DB" Tbnome 




No seu código, faça algo parecido com o código abaixo:

procedure SQLFiltro;
var
  WhereData,
  WhereSemData: string;
begin
  WhereData := ´Where Upper(Tbnome.Nome) Like Upper(:VarNome) and 
Tbnome.Data_cad between :VarDataI and :VarDataF and 
Upper(Tbnome.Contato) Like Upper(:VarContato) 
Order by Tbnome.Nome ´;

  WhereSemData := ´Where Upper(Tbnome.Nome) Like Upper(:VarNome) and Upper(Tbnome.Contato) Like Upper(:VarContato) 
Order by Tbnome.Nome ´;

  // Verifica se datas são vazias
  if (edtData1.Text = ´´ or edtData2.Text = ´´) then
    Query1.SQL.Add(WhereSemData)
  else
  begin
    Query1.SQL.Add(WhereData);
    Query1.ParambyName(´VarDataI´).Value := StrToDate(edtData1.Text);
    Query1.ParamByName(´VarDataF´).Value := StrToDate(edtData2.Text);
  end;

  try
    Query1.Open;
    // Coloque o que você quer fazer com o resultado da query
  finally
    Query1.Close;
  end;
end;



Responder

Gostei + 0

12/07/2005

Ant.neto

Valeu Galera pela força


Responder

Gostei + 0

12/07/2005

Rjun

Deu certo?


Responder

Gostei + 0

12/07/2005

Ant.neto

Deu certo?


Não deu cara, usei sua instrução mas o sistema trava.... não executa a qry... so roda se eu colocar o sql na prória sql... tá fd resolver isso... mas valeu!!


Responder

Gostei + 0

12/07/2005

Rjun

Que banco você esta usando? Qual a tecnologia de acesso?


Responder

Gostei + 0

12/07/2005

Ant.neto

Que banco você esta usando? Qual a tecnologia de acesso?

Paradox - Tbnome.DB (nome da tabele)..


Responder

Gostei + 0

13/07/2005

Rjun

Coloque o código para que possamos ver o erro.


Responder

Gostei + 0

13/07/2005

Belo

Bom, tomando como o exemplo o código dado por você, fiz algumas alterações, veja:

procedure TForm1.Button1Click(Sender: TObject);
begin
with QryPesq do
begin
Close;
SQL.Clear;
SQL.Add(´SELECT * FROM TbNome´);
SQL.Add(´WHERE UPPER(Nome) LIKE:Nome´);
QryPesq.Params[0].AsString := UpperCase(BFSEdit1.Text) + ´¬´;
ExecSQL;
Open;
end;
end;

Esse exemplo é para a pesquisa do campo NOME.

No caso do campo do tipo data, existe várias formas de se fazer, uma delas é convertendo no proprio SQL usando a função CAST, veja:

procedure TForm1.Button1Click(Sender: TObject);
begin
with QryPesq do
begin
Close;
SQL.Clear;
SQL.Add(´SELECT * FROM TbNome´);
SQL.Add(´WHERE WHERE SUBSTRING(CAST(CAST(Data_cad AS DATE) AS CHAR(10)) FROM 1 FOR 10) LIKE:Data_cad´);
QryPesq.Params[0].AsString := BFSEdit1.Text + ´¬´;
ExecSQL;
Open;
end;
end;


Responder

Gostei + 0

15/07/2005

Ant.neto

com exemplo de vcs. mas umas adaptações consegui fazer.. Brigadão.. depois eu envio o código para vcs..


Responder

Gostei + 0

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

Aceitar