Ir para o conteúdo
  • Revista PROGRAMAR: Já está disponível a edição #60 da revista programar. Faz já o download aqui!

mekanis

Pesquisas Avançadas

Mensagens Recomendadas

mekanis

Boas pessoal, falaram-me em pesquisas avançadas com o auxilio de SQL

Podem-me dar umas luzes de como funciona a coisa?

Os básicos, etc.

É que não estou bem a ver como é que ei de fazer tal coisa  :hmm:

Cumpz

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
Tuntankamon

Por esse termo não estou a associar a nada, a não as pesquisas diferentes do normal/básico...

Pesquisas onde tens vário níveis de pesquisas, utilização de cursores, etc.

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
mekanis

Por exemplo, pelo que percebi fazer diversas querys mas com o que o utilizador pretender e não com apenas o que o programador entender  :dontgetit:

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
anagrama

ola

Pesquisas avançadas é o mesmo que pesquisas com mais do que uma condição e/ou utilizando metacaracteres?

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
mekanis

Por exemplo:

O utilizador dár-lhe na cabeça pesquisar clientes que se chamem Manel das Iscas e que tenha sardas, ou só aqueles clientes que têm um carro azul.

A minha dúvida é como por isso num formulário :s

Não estou a ver como posso fazer coisa tão dinamica quanto esta...

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
malainhocf

Olá, boa tarde,

Isso é muito fácil de fazer

Basta colocar um

where 0=0 e depois meteres os ifs se vais pesquisar por uma coisa ou não

Vou te dar um exemplo:

Dim sqlpesquisa As String
        sqlpesquisa = "select me_fornecedores.idfornecedor, me_fornecedores.descricao, me_fornecedores.contacto, me_fornecedores.idutilizador, me_utilizadores.utilizador from me_fornecedores left outer join me_utilizadores on me_fornecedores.idutilizador=me_utilizadores.idutilizador where 0=0 "
        If txtFornecedor.Text <> "" Then
            sqlpesquisa = sqlpesquisa & "and me_fornecedores.descricao like '%" & varFornecedor & "%' "
        End If

        If cbbUtilizadores.SelectedValue <> 0 Then
            sqlpesquisa = sqlpesquisa & "and me_utilizadores.idutilizador=" & varUtilizador & " "
        End If

        sqlpesquisa = sqlpesquisa & " order by me_fornecedores.idfornecedor"

Ai está

De certeza que vais ficar a dominar as pesquisas avançadas


Cumprimentos

Cesar Oliveira

Desenvolvo websites e aplicações web

http://www.profissionalweb.net

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
Tuntankamon

Existem muitos modos de o fazer...

Uma maneira de o fazeres é a tal questão dos if's como foi dito, mas não gosto e nem deve ser feito do modo que foi postado...

Qualquer que seja o provider de dados que se utilize, este suporta parâmetros, e estes devem ser usados.

Exemplo no teu caso:

    Dim sqlCom As New SqlClient.SqlCommand("SELECT * FROM tabela WHERE Campo1 LIKE @1 AND Campo2 LIKE @2 ORDER BY Campo1", tuaConexao)

        'Se forem textboxs basta teres isto que funciona para tudo
        sqlCom.Parameters.AddWithValue("@1", String.Concat("%", txt1.Text, "%"))

        'Caso das combos, depende de como tenham sido preenchidas mas algo semelhante a isto
        If cb2.SelectedIndex > -1 Then
            sqlCom.Parameters.AddWithValue("@2", String.Concat("%", cb2.SelectedItem, "%")) 
        Else
            sqlCom.Parameters.AddWithValue("@2", "%")
        End If

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
anagrama

Em termos de programação VBnet já te responderam. Ao reler a tua questão, fiquei com a dúvida se pretendias em termos de programação ou por exemplo numa Base de  dados monotabela tipo excel ou num formulário de uma base de dados relacional, tipo access.

Por norma, as conjunções ("e") são escritas na mesma linha; as disjunções ("ou") são escritas em linhas separadas. Se quiseres procurar por nome, por exemplo Manuel, colocas exactamente Manuel; se pretenderes os que se iniciam por Manuel, fazes Manuel*.

A maior parte dos programas que permitem a criação de formulários com interrogação a bases de dados, têm a versatilidade de apresentar as diversas opções possiveis ao utilizador; via programação, depende da linguagem que optes, porque nem todas estão habilitadas e são eficientes na interrogação a bases de dados.

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
Tuntankamon

Não é completamente errada, mas não deve ser utilizada...

1º - Difícil leitura quando implica a utilização de muitos campos

2º - Difícil construção, pois o texto tem de ter as ' (plicas), e facilmente te esqueces de uma, e se a própria string tiver uma plica, lá se vai a query

3º - Para enviar datas é terrível, especialmente se a bd não aceitar o mesmo formato que tens no teu pc, por exemplo windows em PT, bd em ENG, logo tens de formatar a data

4º - Os ataques por SQL Injection dão-se normalmente devido à construção de query's desse modo.

Resumindo com parâmetros é tudo muito mais simples, para passares a data basta um simples CDate(Valor), as strings vão directamente, etc.

Acho que já deu para entender...  :biggrin:

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
Xetly

bem vou colocar aqui o exemplo que fiz que tou a utilizar para uma pesquisa para uma biblioteca

 Dim arrLivro As New ArrayList
        Dim cn As New SqlConnection
        Dim cmd As New SqlCommand
        Dim dr As SqlDataReader = Nothing


        Try
            cn = New SqlConnection(_cs)
            cn.Open()


            Dim sbWhere As New StringBuilder

            If Not nome = Nothing Then
                sbWhere.Append("   (Nome like '%").Append(clsTools.normalizarstrings(nome)).Append("%')")

            End If

            If Not autor = Nothing Then
                If sbWhere.ToString.Length > 0 Then
                    sbWhere.Append(" and ")
                End If
                sbWhere.Append(" (Autor = '").Append(clsTools.normalizarstrings(autor)).Append("')")
            End If

            If Not anoPublicacao = Nothing Then
                If sbWhere.ToString.Length > 0 Then
                    sbWhere.Append(" and ")
                End If
                sbWhere.Append(" (AnoPublicacao Like '%").Append(anoPublicacao).Append("%')")
            End If

            If Not editora = Nothing Then
                If sbWhere.ToString.Length > 0 Then
                    sbWhere.Append(" and ")
                End If
                sbWhere.Append(" (Editora Like '%").Append(clsTools.normalizarstrings(editora)).Append("%')")
            End If

            If Not tipolivro = Nothing Then
                If sbWhere.ToString.Length > 0 Then
                    sbWhere.Append(" and ")
                End If
                sbWhere.Append(" (TipodeLivro Like '%").Append(clsTools.normalizarstrings(tipolivro)).Append("%')")
            End If




            cmd.CommandText = "Select ID, Nome, Autor, AnoPublicacao, Editora, TipodeLivro, ISBN from Livro where " & sbWhere.ToString
            cmd.Connection = cn

            dr = cmd.ExecuteReader




            If dr.HasRows Then

                While dr.Read
                    Dim livro As New clsLivro

                    If Not dr.IsDBNull(0) Then
                        livro.id = CInt(dr.Item(0))
                    End If
                    If Not dr.IsDBNull(1) Then
                        livro.nome = CStr(dr.Item(1))
                    End If

                    If Not dr.IsDBNull(2) Then
                        livro.autor = dr.Item(2)
                    End If
                    If Not dr.IsDBNull(3) Then
                        livro.ano = dr.Item(3)
                    End If
                    If Not dr.IsDBNull(4) Then
                        livro.editora = CStr(dr.Item(4))
                    End If
                    If Not dr.IsDBNull(6) Then
                        livro.categoria = CStr(dr.Item(6))
                    End If
                    If Not dr.IsDBNull(5) Then
                        livro.isbn = CStr(dr.Item(5))
                    End If

                    arrLivro.Add(livro)

                End While

            End If
        Catch ex As Exception
            clsTools.sendTolLog(ex.Message.ToString)

        Finally

            If Not dr Is Nothing Then
                dr.Close()
            End If
            If Not cn Is Nothing Then
                cn.Close()
            End If

        End Try
        Return arrLivro

    End Function

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
Tuntankamon

Imagina tens uma aplicação que tens um form de login.

A query era:

"SELECT 1 FROM utilizador WHERE name='" & txtName.text &"' AND password='"&txtPass.text&"'";

Vai um chico esperto e mete na txtName.text algo como:

%' AND 1;

O que meter na pass é indiferente porque nunca irá ser utilizado...

O que vai acontecer:

SELECT 1 FROM utilizador WHERE name='%' AND 1;

Logo irá ter acesso ao sistema...  :)

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
malainhocf

Já vi, optimo, vou testar isso no meu programa

 'Se forem textboxs basta teres isto que funciona para tudo
        sqlCom.Parameters.AddWithValue("@1", String.Concat("%", txt1.Text, "%"))

E se for do tipo datetime ? Ou só para horas ?

Obrigado


Cumprimentos

Cesar Oliveira

Desenvolvo websites e aplicações web

http://www.profissionalweb.net

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
Tuntankamon

Para começar deves abrir um tópico especifico para a tua dúvida...

Segundo essa é uma situação particular para o caso, a utilização habitual não é essa, e existem várias maneiras de utilizar parâmetros...  :)

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites

Crie uma conta ou ligue-se para comentar

Só membros podem comentar

Criar nova conta

Registe para ter uma conta na nossa comunidade. É fácil!

Registar nova conta

Entra

Já tem conta? Inicie sessão aqui.

Entrar Agora

×

Aviso Sobre Cookies

Ao usar este site você aceita os nossos Termos de Uso e Política de Privacidade. Este site usa cookies para disponibilizar funcionalidades personalizadas. Para mais informações visite esta página.