BUSCA EXATA COM VÁRIOS CRITÉRIOS

 Tópico anterior Próximo tópico Novo tópico

BUSCA EXATA COM VÁRIOS CRITÉRIOS

SQL / DATABASE

 Compartilhe  Compartilhe  Compartilhe
#490840 - 18/10/2019 17:45:09

WELISSON
CACHOEIRO DE ITAPEMIRIM
Cadast. em:Junho/2017


Boa tarde!

Tenho esse código SQL, que me permite buscar por vários critérios:

SELECT TBProduto .*, TBEstoque .* FROM TBEstoque INNER JOIN TBProduto On TBEstoque.IdProduto = TBProduto.Id WHERE (Quantidade < EstoqueMin AND Codigo Like '%' + ?  AND Tamanho  Like '%' + ? AND Referencia Like '%' + ?  AND Descricao LIKE '%' + ? + '%' ) Order By Codigo,Tamanho, Referencia Asc  


Ao usar o operador
  Like '%'
, o sistema não me retorna valores exatos em algumas buscas. Sei que isso é devido a
'%'
. Porem ao remove-lo,
é necessário digitar todos os campos para retornar os registros. Eu preciso que essa busca seja exata, mas porem que ele filtre os registros
caso apenas um campo for informado, ou retorne tudo se nada for informado.

Existe uma forma de fazer isso, usando o  = ou apenas o LIKE sem % ?



#490842 - 18/10/2019 18:03:23

KERPLUNK
RIO GRANDE DO SUL
Cadast. em:Junho/2009


Membro da equipe
1 - LIKE é um operador para strings, não deveria ser usado com numéricos. É como dizer "parecido com" ou "que contenha". Algo assim:

SELECT * FROM Clientes WHERE Nome LIKE '%fernando%'

Traduzindo seria: Selecione todos os registros de Clientes onde o Nome contenha "Fernando"
2 - Por ser mais genérico e trazer valores "parecidos" como o seu critério, obviamente a busca não será exata. Para isso existe o operador "=". Mais ou menos assim:

SELECT TBProduto .*, TBEstoque .* FROM TBEstoque INNER JOIN TBProduto On TBEstoque.IdProduto = TBProduto.Id WHERE (Quantidade < EstoqueMin AND Codigo = ?  AND Tamanho  = ? AND Referencia = ?  AND Descricao = ?) Order By Codigo,Tamanho, Referencia Asc  



_______________________________________________________________________
Virei Oráculo!
The end is nigh, be ready for the nukes!


#490843 - 18/10/2019 18:39:50

WELISSON
CACHOEIRO DE ITAPEMIRIM
Cadast. em:Junho/2017


Citação:
:
1 - LIKE é um operador para strings, não deveria ser usado com numéricos. É como dizer "parecido com" ou "que contenha". Algo assim:

SELECT * FROM Clientes WHERE Nome LIKE '%fernando%'

Traduzindo seria: Selecione todos os registros de Clientes onde o Nome contenha "Fernando"
2 - Por ser mais genérico e trazer valores "parecidos" como o seu critério, obviamente a busca não será exata. Para isso existe o operador "=". Mais ou menos assim:

SELECT TBProduto .*, TBEstoque .* FROM TBEstoque INNER JOIN TBProduto On TBEstoque.IdProduto = TBProduto.Id WHERE (Quantidade < EstoqueMin AND Codigo = ?  AND Tamanho  = ? AND Referencia = ?  AND Descricao = ?) Order By Codigo,Tamanho, Referencia Asc  



KERPLUNK assim funciona perfeitamente! Mas é necessário informar todos os campos, preciso
que ele filtre se o usuário não informar outros critérios.




#490845 - 18/10/2019 19:45:32

KERPLUNK
RIO GRANDE DO SUL
Cadast. em:Junho/2009


Membro da equipe
Ah bom, daí você vai ter que ir montando sua query conforme os campos preenchidos, uma cláusula WHERE dinâmica. Aí é que um ORM bom brilha. Ao invés de usar assim tão artesanal, experimente algo como Entity Framework ou mesmo Dapper

_______________________________________________________________________
Virei Oráculo!
The end is nigh, be ready for the nukes!


#490846 - 18/10/2019 20:01:51

WELISSON
CACHOEIRO DE ITAPEMIRIM
Cadast. em:Junho/2017


Citação:
:
Ah bom, daí você vai ter que ir montando sua query conforme os campos preenchidos, uma cláusula WHERE dinâmica. Aí é que um ORM bom brilha. Ao invés de usar assim tão artesanal, experimente algo como Entity Framework ou mesmo Dapper

kkkkkkkkkk Que tristeza :(

Estou estudando ORM, mas a frente estarei aplicando!



#490854 - 20/10/2019 07:22:24

NICKOSOFT
SANTO ANDRE
Cadast. em:Maio/2009


muitas vezes monto a query pelo preenchimento de campos como foi dito, não morre fazendo isso e vai resolver......



#490882 - 22/10/2019 02:32:43

WELISSON
CACHOEIRO DE ITAPEMIRIM
Cadast. em:Junho/2017


Citação:
:
muitas vezes monto a query pelo preenchimento de campos como foi dito, não morre fazendo isso e vai resolver......


Então, criei algumas condições no código mesmo. Dessa forma concateno o sql
de acordo com a busca do usuário, tipo isso:


  var criterio = "";

                if (numeroAtividade != "")
                    criterio += " And Id Like @Id";

                if (tipo != "")
                    criterio += " And Tipo LIKE @Tipo";

                if (operacao != "")
                    criterio += " And Situacao LIKE @Situacao";

                commandSQL += criterio;


Não é a forma mais elegante, mas é só por enquanto. Só que agora me deparei com outro problema, pois
esse mesmo filtro deve ser feito para gerar o relatório no reportvier. Porem os comandos sql faço direto no
TableAdapter do dataset.

Você sabe me dizer como posso passar o código sql para o TableAdapter a parti de uma classe? Sem digitar
diretamente no objeto?




#490885 - 22/10/2019 10:35:23

NICKOSOFT
SANTO ANDRE
Cadast. em:Maio/2009


se na criação/preenchimento do dataset vc chamar uma função q monta pra vc a query conforme os campos preenchidos, exatamente com o código q postou acima, passe esse código pra uma função e chame sempre q precisar, ele retorna a query e vc aplica......



#490894 - 22/10/2019 16:28:35

WELISSON
CACHOEIRO DE ITAPEMIRIM
Cadast. em:Junho/2017


 Anexos estao visíveis somente para usuários registrados

Citação:
:
se na criação/preenchimento do dataset vc chamar uma função q monta pra vc a query conforme os campos preenchidos, exatamente com o código q postou acima, passe esse código pra uma função e chame sempre q precisar, ele retorna a query e vc aplica......


Não entendi muito bem, eu faço a consulta direto pois são relatórios simples. Dessa vez que preciso de
um filtro mais dinâmico, da uma olhada no anexo:

Não to sabendo como fazer isso, to a dias já nesse relatório :(



#490901 - 22/10/2019 20:01:02

NICKOSOFT
SANTO ANDRE
Cadast. em:Maio/2009


vc faz a query direto contra o relatorio?
nao usa pra preencher um dataset? e passa esse dataset para o relatorio?



#490904 - 22/10/2019 22:20:53

WELISSON
CACHOEIRO DE ITAPEMIRIM
Cadast. em:Junho/2017


Citação:
:
vc faz a query direto contra o relatorio?
nao usa pra preencher um dataset? e passa esse dataset para o relatorio?


Então, estou aprendo c# e comprei um curso para fazer relatórios. E o cara só ensina fazer dessa forma, é muito complicado
porque o código fica muito difícil para manter. Pois qualquer modificação, causa problemas. Fora que "Não tenho o controle",
se perde o arquivo perco tudo!

Assim, não sei como fazer mesmo da forma que disse. Cara se você pude me ajuda, até pago se for preciso. Pois eu estou a dias
nisso, e ta brabo o negócio!



 Tópico anterior Próximo tópico Novo tópico


Para responder este tópico o login é requerido
Se você já possui uma conta de usuário por favor faça seu login
Se você não possui uma conta de usuário use a opção Criar usuário