Fórum Vários filtros(Where) #265020
12/01/2005
0
Pessoal só gostaria de saber a melhor forma de fazer isso.
Tenho Uma query com nome de qryPedido nela tennho o senguinte código.
Select * from pedido
O problema vem agora, o usuário pode pedir para exibir por exemplo só Vendas e logo após Suporte e depois ainda Contrato de Atualização.
O problema é:
Dá primeira vez que ele pede o filtro eu adiciono o seguinte código a query:
where Tipo = ´Venda´
ficando desta forma:
Select * from Pedido where tipo = ´Venda´
Dá segunda vez terei que tirar o where antigo e adicionar um novo pois se pedir para adicionar sem remover o antigo vai ficar de forma errada:
Select * from Pedido where tipo = ´Venda´ where tipo = ´Suporte´
Dá terceira tenho que fazer o mesmo.
O pior vem quando ele pede uma ordenação ai teremos um Order By logo abaixo do Where.
A pergunta é. Qual a melhor forma de se trabalhar quando temos que a todo momento alterar o código sql da query? sem causar erro?
Fiz uma gambiarra onde tenho um procedimento com o código base. Ai toda hora dou um clear na query e chamo o procedimento para preencher novamente a query com o código base. Resolveu até certo momento mas quando a código fica um pouco mais complexo passa a não me atender.
Criei também um função onde deleto apenas a Cláusula Where e suas condições.
Mas gostaria de saber se existe uma forma mais otimizada.
Até...
Douglasf
Curtir tópico
+ 0Posts
12/01/2005
Vprates
Query.sql.add(´SELECT * FROM Pedido
WHERE tipo = Venda´)
if suporte = true then // se quiser pesquisar por suporte
Query.sql.add(´ OR tipo = Suporte);
if (outras opcoes) = true then // Suas opções
Query.sql.add(´ OR tipo = Outros´)
Vc pode usar esse exemplo conforme suas necessidades,
por exemplo o ´OR´ pode ser mudado por ´AND´.
Vlw
Espero q te ajude
Gostei + 0
12/01/2005
Rhosaka
Query.SQL.Add(´WHERE CODPEDIDO IS NOT NULL´); // PARA NAUM TER Q FICAR TRATANDO QUANDO INFORMARMOS OS FILTROS
IF VENDA THEN
Query.SQL.Add(´AND TIPO = ´ + QuotedStr(´Venda´));
IF SUPORTE THEN
Query.SQL.Add(´AND TIPO = ´ + QuotedStr(´Suporte´));
Query.Open;
e assim vai indo :D
Gostei + 0
12/01/2005
Douglasf
Gostei + 0
12/01/2005
Paulo_amorim
A função QuotedStr retorna a String com aspas. Isso evita que vc fique trabalhando com várias aspas juntas, que poluem o código.
Pode-se montar a query dinâmica com elas, ou então usando parâmetros.
Até+
Gostei + 0
12/01/2005
Douglasf
Gostei + 0
12/01/2005
Douglasf
E com Order By?
Como faria pois a medida que o usuário for pedindo para ordenar de uma forma diferente vai acumulando código.
Por exemplo se ele pedir para ordenar por Cliente e Depois por Revende e logo após por data.
Final teremos o seguinte.
select * from pedido where tipo = ´Venda´ order by Cliente order by Revenda order by Data
Claro que apartir da segunda ordenação iria dar problema.
Gostei + 0
12/01/2005
Paulo_amorim
Pode-se criar uma variável cumulativa, e à medida que os parâmetros fossem requeridos vc coloca o campo nessa variável. Depois, quando tudo pronto, vc concatena a variável na cláusula ORDER BY.
Quando ele faz filtro (where) ele automaticamente vai pro ORDER BY?
Até+
Gostei + 0
13/01/2005
Douglasf
Gostei + 0
13/01/2005
Paulo_amorim
Então pode-se colocar o código nos if´s já postados anteriormente, concatenando
Espero que ajude
Até+
Gostei + 0
13/01/2005
Douglasf
Eu teria que tirar o filtro que já foi adicionado no SQL para colocar o novo.
quer dizer se eu filtrei só pedidos de Venda na Proxima vez que eu adicionar outro filtro terei venda e suporte - teremos erro.
Da mesma forma a ordenação: Se eu ordernar por data e depois por Cliente, teremos uma ordenação por cliente e data - teremos erro.
Ou estou COMPLETAMENTE errado?
Gostei + 0
13/01/2005
Paulo_amorim
Eu olhei errado, os campos são diferentes...
Mas quando vocÊ fizer sua query dinâmica, vc deve colocar tudo denovo, desdde o ´SELECT ...´ , e não só os filtros e order by!
Onde ele decide quais campos ele quer ordenar?
Até+
Gostei + 0
13/01/2005
Douglasf
Gostei + 0
13/01/2005
Paulo_amorim
Se ele clica no campo1, ele ordena pelo campo1... se ele clicar no campo2, ele vai ordenar pelo campo2 ou pelo campo1 e campo2 ?
Aí que tá ...
Até+
Gostei + 0
13/01/2005
Douglasf
Construi uma função que separa o código SQL em dois, inicio e fim, concatena e retorna o código novamente.
Resolvi meu problema.
só falta fazer para o ORDER BY.
será que foi uma boa?
function DelWhere(s, cod : string) : string; var sF : string; tam : integer; begin tam := Length(s); if pos(´order by´, s) <> 0 then begin sF := copy(s,pos(´order by´, s),tam); delete(s, pos(´order by´, s), tam); end; Delete(s, pos(´where´, s),tam); Result := s + cod + #$D$A + sF; end;
Gostei + 0
Clique aqui para fazer login e interagir na Comunidade :)