Sql.. selecinar atraves de intervalo de dadas?
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
Obrigado
Ant.neto
Curtidas 0
Respostas
Ericksasse
11/07/2005
Minha dica é gerar o SQL em runtime, incluindo no WHERE somente quando uma data for informada.
GOSTEI 0
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
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
11/07/2005
Posso ta falando bobagem , mas vc ja tentou usar o between ?
´select bla bla bla where data between lala and lele ´
´select bla bla bla where data between lala and lele ´
GOSTEI 0
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
No seu código, faça algo parecido com o código abaixo:
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
11/07/2005
Valeu Galera pela força
GOSTEI 0
Rjun
11/07/2005
Deu certo?
GOSTEI 0
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
11/07/2005
Que banco você esta usando? Qual a tecnologia de acesso?
GOSTEI 0
Ant.neto
11/07/2005
Que banco você esta usando? Qual a tecnologia de acesso?
Paradox - Tbnome.DB (nome da tabele)..
GOSTEI 0
Rjun
11/07/2005
Coloque o código para que possamos ver o erro.
GOSTEI 0
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;
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
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