Sql.. selecinar atraves de intervalo de dadas?

Delphi

11/07/2005

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

Curtidas 0

Respostas

Ericksasse

Ericksasse

11/07/2005

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


GOSTEI 0
Ericksasse

Ericksasse

11/07/2005

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)



GOSTEI 0
Ant.neto

Ant.neto

11/07/2005

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


GOSTEI 0
Macaquito86

Macaquito86

11/07/2005

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


GOSTEI 0
Rjun

Rjun

11/07/2005

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;



GOSTEI 0
Ant.neto

Ant.neto

11/07/2005

Valeu Galera pela força


GOSTEI 0
Rjun

Rjun

11/07/2005

Deu certo?


GOSTEI 0
Ant.neto

Ant.neto

11/07/2005

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


GOSTEI 0
Rjun

Rjun

11/07/2005

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


GOSTEI 0
Ant.neto

Ant.neto

11/07/2005

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

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


GOSTEI 0
Rjun

Rjun

11/07/2005

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


GOSTEI 0
Belo

Belo

11/07/2005

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;


GOSTEI 0
Ant.neto

Ant.neto

11/07/2005

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


GOSTEI 0
POSTAR