none
Tela de pesquisa RRS feed

  • 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

    domingo, 22 de junho de 2014 14:00

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!


    domingo, 22 de junho de 2014 15:02
  • 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

    domingo, 22 de junho de 2014 16:24
  • Você poderia fazer da seguinte forma. 

    if(campo2 <> campo1){
    string condicaosql + ComboBox2 + "(" 
    }
    Else 
    {
    string condicaosql + "campo2 = valor2";
    }


    domingo, 22 de junho de 2014 22:42
  • 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,

    terça-feira, 24 de junho de 2014 14:43
  • 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
    quinta-feira, 26 de junho de 2014 18:09
  • 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.

    quinta-feira, 26 de junho de 2014 20:19