Usuário com melhor resposta
Pesquisar no front pelo nome mas no back pelo ID

Pergunta
-
Estou com o seguinte problema, possuo uma tela onde tem um campo de pesquisa usando like por nome mas preciso que internamente a pesquisa seja feita buscando pelo Id. Por exemplo, quero pesquisar pelo funcionário andré mas internamente a query deve pesquisar pelo id. é possível fazer isso ?
Respostas
-
Diego,
Então, é justamente neste cenário que entra a maneira que você esta desenvolvendo, bem como, a forma que a linguagem de programação utilizada na sua aplicação vai permitir que isso seja aplicado.
Esta query, que você compartilhou:
select A.NUM_FRE, A.NOME from tb_funcionario a where a.id_supervisor = @idsupervisor
Ela já esta trabalhando com o conceito de uma query parametrizada e dinâmica dentro da aplicação, ao meu ver, basta você mudar a condição no Where para algo similar a este exemplo:
select A.NUM_FRE, A.NOME from tb_funcionario a where a.nome like '%'+@nomefuncionario+'%'
No caso o parâmetro ou variável @nomefuncionario vai armazenar ou receber justamente o que sendo obtido no textbox que você digita o nome do funcionário.
Se a sua linguagem de programação permitir, você pode declarar diretamente na sua query o nome do textbox como parâmetro, algo similar a este exemplo:
select A.NUM_FRE, A.NOME from tb_funcionario a where a.nome like '%'+textbox.text+'%'
Provavelmente esta query será transcrita internamente pelo SQL Server com base na instrução enviada por sua aplicação como uma Ad-hoc query e a mesma será processada e retornada.Pedro Antonio Galvão Junior [MVP | MCC | MSTC | MIE | Microsoft Evangelist | Microsoft Partner | Engenheiro de Softwares | Especialista em Banco de Dados Relacional e Data Warehouse | Professor Universitário | @JuniorGalvaoMVP | http://pedrogalvaojunior.wordpress.com]
- Marcado como Resposta diego.lk sexta-feira, 13 de setembro de 2019 00:18
-
Todas as Respostas
-
Olá Diego.
Não é possível fazer isso, pois se o seu dado de entrada é o nome, a consulta no banco deverá ser feita por esse nome.
Você tem essa demanda de procurar pelo ID por causa de performance?
Se sim, o que ajudaria é você criar um Full Text Index na coluna Nome e ao invés de usar o Like, usar o CONTAINS.
A performance é bem melhor.https://luanmorenodba.com/2011/10/26/entenda-o-full-text-search/
https://docs.microsoft.com/pt-br/sql/t-sql/statements/create-fulltext-index-transact-sql?view=sql-server-2017
Mariana Del Nero /* Se a resposta foi útil, não esqueça de marcá-la */
- Sugerido como Resposta Junior Galvão - MVPMVP terça-feira, 10 de setembro de 2019 18:56
-
-
Diego,
Mas acredito que a pesquisa deverá ser feita pelo nome completo e não somente pelo primeiro nome.
Não é mesmo? Poderia nos descrever como o usuário informa o nome e de que forma deverá ser feita a pesquisa.
Pedro Antonio Galvão Junior [MVP | MCC | MSTC | MIE | Microsoft Evangelist | Microsoft Partner | Engenheiro de Softwares | Especialista em Banco de Dados Relacional e Data Warehouse | Professor Universitário | @JuniorGalvaoMVP | http://pedrogalvaojunior.wordpress.com]
-
Então, existe uma index com um campo de busca que faz o filtro usando o like, ou seja conforme vai digitando o nome vai aparcendo os resultados. se nessa pesquisa a mesma fosse feita pelo id do funcionario, tudo bem. Problema resolvido. Vou explicar melhor a situação.
Existe uma tabela chamada funcionário e nela existem supervisores e vendedores, existe uma coluna chamada id supervisor, e é nela que é feito o vínculo do vendedor com o supervisor. todo vendedor deve possuir algum ID nessa coluna id_supervisor, que corresponde ao id do seu supervisor. Já os supervisores sempre ficam com essa coluna nula.
A questão é, como faço para na index da pagina,pesquisar pelo nome do supervisor e retornar todos os vendedores associados ao dito cujo ?
Obrigado as respostas e ajuda de todos vocês.
-
-
A pesquisa é pelo nome do supervisor. Conforme vai digitando o nome do mesmo vai aparecendo as opções. Digamos que o supervisor Claudio tem como supervisionado os vendedores Bruno, Adriano e Beatriz. Quando digitar no campo de busca o nome Claudio, vai listar o registro do mesmo, após seleciona-lo, deve retornar o nome desses 3 vendedores, cujo supervisor é o que foi digitado na busca. Entendeu ?
- Editado diego.lk quarta-feira, 11 de setembro de 2019 11:36
-
Diego,
Obrigado pelo esclarecimento, vou fazer somente uma observação, com base no que você descreveu:
Todo vendedor possui um supervisor e os supervisores não possuem alguém acima, teoricamente este tipo de implementação não seria a mais indicada, pois temos um campo ID que aceita valores nulos.
Então, não consigo entender em qual parte você esta "teoricamente" com dificuldades, como já existe uma query utilizando o operador Like para realizar a busca aproximada conforme o que esta sendo digitado, você possui esta relação, tem os IDs de cada funcionário sendo este vendedor.
Qual é a dificuldade neste cenário? O que deve ser apresentado em tela, o nome completo, o ID, ambos?
Acredito que você deve estar utilizando algo similar a uma grid ou até mesmo tabela/matrix para apresentar o resultado da pesquisa na sua aplicação.
Eu concord com o José Diz, veja que a questão é definir como a aplicação vai apresentar os dados e não como ela vai buscar.
Pedro Antonio Galvão Junior [MVP | MCC | MSTC | MIE | Microsoft Evangelist | Microsoft Partner | Engenheiro de Softwares | Especialista em Banco de Dados Relacional e Data Warehouse | Professor Universitário | @JuniorGalvaoMVP | http://pedrogalvaojunior.wordpress.com]
-
-
A tela é essa abaixo. Quando digito o nome do supervisor está retornando o próprio, quando eu gostaria que retornasse os seus subordinados (vendedores).
A query usada numa API é essa:
sql.AppendLine("SELECT A.NUM_FRE, A.NOME");
sql.AppendLine("FROM TB_FUNCIONARIO A");
sql.AppendLine("WHERE (UPPER(A.NOME) LIKE @VALOR) AND SUPERVISOR = 'S' ");
parametros.Add("@VALOR", $"%{term.ToUpperInvariant()}%");
A seguinte query faz o que eu gostaria mas teria que se buscar pelo id do supervisor, coisa que não quero. Quero retornar esses mesmos valores porém buscando pelo nome do supervisor.
select A.NUM_FRE, A.NOME from tb_funcionario a where a.id_supervisor = @idsupervisor
- Editado diego.lk quarta-feira, 11 de setembro de 2019 11:52
-
A pesquisa é pelo nome do supervisor. Conforme vai digitando o nome do mesmo vai aparecendo as opções. Digamos que o supervisor Claudio tem como supervisionado os vendedores Bruno, Adriano e Beatriz. Quando digitar no campo de busca o nome Claudio, vai listar o registro do mesmo, após seleciona-lo, deve retornar o nome desses 3 vendedores, cujo supervisor é o que foi digitado na busca. Entendeu ?
Diego,
Sim.
Pedro Antonio Galvão Junior [MVP | MCC | MSTC | MIE | Microsoft Evangelist | Microsoft Partner | Engenheiro de Softwares | Especialista em Banco de Dados Relacional e Data Warehouse | Professor Universitário | @JuniorGalvaoMVP | http://pedrogalvaojunior.wordpress.com]
-
A pesquisa é pelo nome do supervisor. Conforme vai digitando o nome do mesmo vai aparecendo as opções. Digamos que o supervisor Claudio tem como supervisionado os vendedores Bruno, Adriano e Beatriz. Quando digitar no campo de busca o nome Claudio, vai listar o registro do mesmo, após seleciona-lo, deve retornar o nome desses 3 vendedores, cujo supervisor é o que foi digitado na busca. Entendeu ?
Diego,
Sim.
Pedro Antonio Galvão Junior [MVP | MCC | MSTC | MIE | Microsoft Evangelist | Microsoft Partner | Engenheiro de Softwares | Especialista em Banco de Dados Relacional e Data Warehouse | Professor Universitário | @JuniorGalvaoMVP | http://pedrogalvaojunior.wordpress.com]
-
Diego,
Então, é justamente neste cenário que entra a maneira que você esta desenvolvendo, bem como, a forma que a linguagem de programação utilizada na sua aplicação vai permitir que isso seja aplicado.
Esta query, que você compartilhou:
select A.NUM_FRE, A.NOME from tb_funcionario a where a.id_supervisor = @idsupervisor
Ela já esta trabalhando com o conceito de uma query parametrizada e dinâmica dentro da aplicação, ao meu ver, basta você mudar a condição no Where para algo similar a este exemplo:
select A.NUM_FRE, A.NOME from tb_funcionario a where a.nome like '%'+@nomefuncionario+'%'
No caso o parâmetro ou variável @nomefuncionario vai armazenar ou receber justamente o que sendo obtido no textbox que você digita o nome do funcionário.
Se a sua linguagem de programação permitir, você pode declarar diretamente na sua query o nome do textbox como parâmetro, algo similar a este exemplo:
select A.NUM_FRE, A.NOME from tb_funcionario a where a.nome like '%'+textbox.text+'%'
Provavelmente esta query será transcrita internamente pelo SQL Server com base na instrução enviada por sua aplicação como uma Ad-hoc query e a mesma será processada e retornada.Pedro Antonio Galvão Junior [MVP | MCC | MSTC | MIE | Microsoft Evangelist | Microsoft Partner | Engenheiro de Softwares | Especialista em Banco de Dados Relacional e Data Warehouse | Professor Universitário | @JuniorGalvaoMVP | http://pedrogalvaojunior.wordpress.com]
- Marcado como Resposta diego.lk sexta-feira, 13 de setembro de 2019 00:18
-
-
-
Obrigado a ajuda de todos. Consegui resolver !
Diego,
Nós que agradecemos, conte conosco.
Pedro Antonio Galvão Junior [MVP | MCC | MSTC | MIE | Microsoft Evangelist | Microsoft Partner | Engenheiro de Softwares | Especialista em Banco de Dados Relacional e Data Warehouse | Professor Universitário | @JuniorGalvaoMVP | http://pedrogalvaojunior.wordpress.com]