GARANTIR DESCONTO

Fórum Vários filtros(Where) #265020

12/01/2005

0

Bom dia.

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

Douglasf

Responder

Posts

12/01/2005

Vprates

Faz o seguinte

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


Responder

Gostei + 0

12/01/2005

Rhosaka

Query.SQL.Add(´SELECT * FROM PREDIDO´);
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


Responder

Gostei + 0

12/01/2005

Douglasf

Para que serve esse : QuotedStr(´Venda´)


Responder

Gostei + 0

12/01/2005

Paulo_amorim

Olá

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é+


Responder

Gostei + 0

12/01/2005

Douglasf

Muito obridado pela ajuda.


Responder

Gostei + 0

12/01/2005

Douglasf

Outras dúvidas.

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.


Responder

Gostei + 0

12/01/2005

Paulo_amorim

Olá

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é+


Responder

Gostei + 0

13/01/2005

Douglasf

Sim.


Responder

Gostei + 0

13/01/2005

Paulo_amorim

Olá

Então pode-se colocar o código nos if´s já postados anteriormente, concatenando

Espero que ajude
Até+


Responder

Gostei + 0

13/01/2005

Douglasf

Mas da forma que foi explicado nas resposta apartir da segunda filtragem já teremos erro. não?

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?


Responder

Gostei + 0

13/01/2005

Paulo_amorim

Olá

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é+


Responder

Gostei + 0

13/01/2005

Douglasf

Ao clicar na Titulo dos Fields do DBGrid(TwwDBGrid).


Responder

Gostei + 0

13/01/2005

Paulo_amorim

Olá

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é+


Responder

Gostei + 0

13/01/2005

Douglasf

Não sei se fiz certo.

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;



Responder

Gostei + 0

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

Aceitar