Inquiridor
Tela de pesquisa

Pergunta
-
Bom dia pessoal,
Estou com uma duvida, tenho uma de pesquisa de um sistema desktop que estou desenvolvendo em vb net, nessa tela tenho 10 filtros, o unico que fica visivel é o primeiro, os outros filtros, o usuario vai clicando em um botão para ir exibindo, nessa tela tenho para cada filtro, um combo no qual o usuário vai definir se vai ser OR ou AND, se todos os filtros forem AND, não tenho problemas, o problema está se o usuario escolher varios ORs ou um AND, outro OR, pois sendo assim tenho que colocar "( )" ... alguem teria alguma ideia para me ajudar?
No aguardo
Todas as Respostas
-
Bom dia Reginaldo, tudo bem?
Nessa questão é difícil a gente, pelo menos na minha visão, ajudar com algo concreto, porque nessa funcionalidade do sistema a consulta a partir da cláusula 'WHERE' pode ser de combinações diversas, o ideal pra te ajudar e também afins de conhecimento com consultas de múltiplos parâmetros, seria você entender o conceito lógico do 'OR' e do 'AND' ou se já tem skill com eles, aprimorar mais o conceito, vou te mandar alguns sites legais para entender isso, creio eu que te ajudaria mais.
(bem legal esse primeiro)
http://www.w3schools.com/sql/sql_and_or.asp
http://www.sql-tutorial.net/SQL-AND-OR.asp
http://www.devmedia.com.br/introducao-ao-sql-parte-xi-operadores-logicos/16902
Outra coisa que seria bacana, sempre funciona pra mim, abre uma nova consulta no SQL Server cria uma tabela temporária e insere dados nela...faz alguns testes com ajuda dos links que te passei, isso ajuda demais, ver na prática num ambiente mais simples sempre é melhor antes de partir pra sua consulta mais complexa.
Abraço!
- Editado Diego de Oliveira Neves domingo, 22 de junho de 2014 15:07
- Sugerido como Resposta Ricardo Barbosa Cortes segunda-feira, 23 de junho de 2014 12:05
- Não Sugerido como Resposta Ricardo Barbosa Cortes terça-feira, 24 de junho de 2014 18:50
-
Bom dia Diego,
Agradeço pela resposta, mais não tenho duvida sobre consultas com and e or, tanto que se tiver que fazer a consulta no sql server eu consigo fazer, o que nao estou conseguindo é fazer uma logica na qual eu coloque os parenteses aonde tem que ser....
vou te dar um exemplo de pesquisa:
filtro 1: campo1 = valor1
filtro 2: and campo2= valor2
filtro 3: or campo3 = valor3
filtro 4: or campo4 = valor4
no select ficaria assim:
where campo1=valor1 and (campo2=valor2 or campo3=valor3 or campo4=valor4)
esse where estou montando no meu software e passando como parametro para um store procedure, e se o usuario fizesse o filtro assim:
filtro 1: campo1 = valor1
filtro 2: or campo2= valor2
filtro 3: and campo3 = valor3
filtro 4: or campo4 = valor4
no select ficaria assim:
where (campo1=valor1 or campo2=valor2 ) and (campo3=valor3 or campo4=valor4)
preciso montar uma logica que coloque os () de forma correta...
Espero ter conseguido passar o que realmente estou querendo.
abraços,
reginaldo
-
Você poderia fazer da seguinte forma.
if(campo2 <> campo1){
string condicaosql + ComboBox2 + "("
}
Else
{
string condicaosql + "campo2 = valor2";
}
- Editado Supimpa domingo, 22 de junho de 2014 22:43
- Sugerido como Resposta Ricardo Barbosa Cortes segunda-feira, 23 de junho de 2014 12:04
- Não Sugerido como Resposta Ricardo Barbosa Cortes terça-feira, 24 de junho de 2014 18:50
-
Bom dia,
Pelo exemplo que o Supimpa me passou ainda não vai funcionar, o que preciso e que em cima da imagem que enviei acima, todos os filtros estivessem preenchidos com E = AND ou OR = OU, se o usuário selecionar apenas a regra E a pesquisa vai funcionar, mais se o usuário selecionar E e OU tenho problemas pois será necessário montar
uma logica que coloque os () no local certo, veja o exemplo abaixo:
regra filtro 1 campoA = "valor1" 2 or campoB = "valor2" 3 or campoC = "valor3" 4 and campoD = "valor4" 5 and campoE = "valor5" 6 or campoF = "valor6" 7 or campoG = "valor7" 8 or campoH = "valor8" 9 and campoI = "valor9" 10 or campoJ = "valor10" montando o where do select na mão vai ficar assim,
where campoA = "valor1" OR (campoB = "valor2" OR campoC = "valor3") AND campoD = "valor4" AND campoE = "valor5" OR (campoF = "valor6" OR campoG = "valor7" OR campoH = "valor8") AND campoI = "valor9" OR campoJ = "valor10"
A PERGUNTA É, COMO MONTAR ESSE WHERE PELA APLICAÇÃO, ESSE FILTRO VAI SER MONTADO NA TELA DE PESQUISA. SE EU NÃO COLOCAR OS PARENTESES NOS LOCAIS CERTOS, O COMANDO FICA UMA ETERNIDADE PARA SER EXECUTADO E, QUANDO NAO EXIBI ERRO.
NO AGUARDO,
-
Reginaldo, só o que precisa é implementar a lógica.
Verificar quando a chave está aberta ou fechada com uma variável boolean. Veja um exemplo:
string condicao = "where campo A =" + valor1 'Campo A sempre será desta forma, então não precisa de
'condicao. verifica_parenteses_open_close as boolean 'Esta variável será usada para verificar se o parênteses
'está aberto ou fechado. if campoB <> CampoA then 'Como este é o segundo campo. Se o operador lógico for diferente, deve
'abrir o parênteses condicao += condicao + valor2 + "(" campoB = "valor2" verifica_parenteses_open_close = true else condicao += condicao + "campoB="+valor2 end if if campoC <> campoB and verifica_parenteses_open_close = true then 'a partir do terceiro, você
'deve verificar se o parênteses está aberto e se o operador é diferente. Caso sim, coloca ")" condicao += condicao + valor3 + campoC = "valor3" + ")" verifica_parenteses_open_close = false else condicao += condicao + "campoC="+valor3 end if if campoD <> campoC and verifica_parenteses_open_close = false then condicao += condicao + valor4 + "(" campoD = "valor4" verifica_parenteses_open_close = true else condicao += condicao + "campoD="+valor4 end if
Esta é a base da lógica, mas será necessário muitos ifs para saber se o operador lógico é diferente e se o parênteses está aberto ou fechado.
- Sugerido como Resposta SammuelMiranda quinta-feira, 26 de junho de 2014 20:20
-
Reginaldo, é basicamente isso mesmo.
Pense que você tem que verificar o próximo ao construir a String.
Campo X faz a string, ai você verifica o campo (X+1). Se ele for OU então o Campo X constroi a String com E X OU (Y, e assim por diante.
A solução do Supimpa é bem isso.