Jump to content

Carregar Datagridvie atraves de um select com varios parametros que devera retornar todos os registos quando os parametros estao vazios (access)


Antonio Silva Magalhaes

Recommended Posts

Boa noite a todos,

Agradecia a vossa ajuda para o seguinte problema :

- Pretendia carregar uma datagridview através de um select com vários parâmetros cujos valores são dados por textboxs. Inicialmente apenas uma textobox tem valores, todas as restantes aparecem vazias. A base de dados é access. O que pretendia era que nesta situação inicial fossem carregados todos os valores que cumprem o critério dessa única textbox que tem valor, ignorando por completo os paramentos vazios.

O que tenho até agora é isto :

 Private Sub CarregaDgv()
        Using con As OleDbConnection = Getconnection()
            Try
                con.Open()

                Dim sql As String
                Dim PrimeiroCriterio As String
                Dim SegundoCriterio As String
                Dim TerceiroCriterio As String
                Dim QuartoCriterio As String
                Dim QuintoCriterio As String
                Dim SextoCriterio As String
                Dim Query As String

                sql = "Select Tbl_Encomenda.AnoEncomenda,Tbl_Encomenda.NumeroEncomenda,Tbl_Encomenda.ClienteCodigo, "
                sql += " Tbl_Cliente.ClienteNome, Tbl_Encomenda.ReferenciaInterna,Tbl_Encomenda.ReferenciaCliente,"
                sql += " Tbl_Encomenda.DataEncomenda,Tbl_Encomenda.DataPrevista,Tbl_Encomenda.EstadoEncomenda,Tbl_Encomenda.Observaçao "
                sql += " From Tbl_Encomenda Left Join Tbl_Cliente On Tbl_Encomenda.ClienteCodigo= Tbl_Cliente.Codigo"
                sql += " Where Tbl_Encomenda.AnoEncomenda= @AnoEncomenda "
                PrimeiroCriterio = " And Tbl_Encomenda.NumeroEncomenda like  @NumeroEncomenda  "
                SegundoCriterio = " And Tbl_Encomenda.ClienteCodigo like @ClienteCodigo "
                TerceiroCriterio = " And Tbl_Encomenda.ReferenciaInterna like  @ReferenciaInterna "
                QuartoCriterio = " And Tbl_Encomenda.ReferenciaCliente like @ReferenciaCliente "
                QuintoCriterio = " And Tbl_Encomenda.DataEncomenda like @DataEncomenda "
                SextoCriterio = " And Tbl_Encomenda.ClienteNome like @ClienteNome "


                If txtNumeroEncomenda.Text = "" Then
                    PrimeiroCriterio = " "
                End If
                If txtCodigo.Text = "" Then
                    SegundoCriterio = " "

                End If
                If txtReferenciaInterna.Text = "" Then
                    TerceiroCriterio = " "

                End If
                If txtReferenciaCliente.Text = "" Then
                    QuartoCriterio = " "

                End If
                If txtDataEncomenda.Text = "" Then
                    QuintoCriterio = " "

                End If
                If txtNomeCliente.Text = "" Then
                    SextoCriterio = " "

                End If

                Query = sql & PrimeiroCriterio & SegundoCriterio & TerceiroCriterio & QuartoCriterio & QuintoCriterio & SextoCriterio
                Dim cmd As New OleDbCommand(Query, con)

                cmd.Parameters.AddWithValue("@AnoEncomenda", txtAnoEncomenda.Text)

                If txtNumeroEncomenda.Text <> "" Then
                    cmd.Parameters.AddWithValue("@NumeroEncomenda", txtNumeroEncomenda.Text)
                End If
                If txtCodigo.Text <> "" Then

                    cmd.Parameters.AddWithValue("@ClienteCodigo", txtCodigo.Text)
                End If
                If txtReferenciaInterna.Text <> "" Then
                    cmd.Parameters.AddWithValue("@ReferenciaInterna", txtReferenciaInterna.Text)
                End If
                If txtReferenciaCliente.Text <> "" Then
                    cmd.Parameters.AddWithValue("@ReferenciaCliente", txtReferenciaCliente.Text)
                End If
                If txtDataEncomenda.Text <> "" Then
                    cmd.Parameters.AddWithValue("@DataEncomenda", txtDataEncomenda.Text)
                End If
                If txtNomeCliente.Text <> "" Then
                    cmd.Parameters.AddWithValue("@ClienteNome", txtNomeCliente.Text)
                End If

                Dim da As OleDbDataAdapter = New OleDbDataAdapter(cmd)
                Dim dr As OleDbDataReader = cmd.ExecuteReader
                Dim dt As DataTable = New DataTable
                dt.Load(dr)

                DgvRelaçaoEncomendas.DataSource = dt

                PFormataDatagridview()
            Catch ex As Exception

                MsgBox(ex.Message)
            Finally
                con.Close()

            End Try
        End Using
    End Sub

 

O parâmetro AnoEncomenda é aquele que inicialmente aparece carregado na textbox, todos os outros estão vazios.

As minhas duvidas são as seguinte :

1- Estou em crer que deve existir uma forma mais "elegante" de fazer o que pretendo, alguém me pode explicar qual?  ;

2 - Desta forma, apesar de cumprir em parte o que pretendo , tem erros. Quando altero o parâmetro  NomeCliente, não funciona , dá a mensagem "Não foi fornecido nenhum valor para um ou mais parâmetros necessários" , e não sei qual a razão .

3- Com os outros parâmetros, apesar de aparentemente funcionarem , tem um problema que gostaria de resolver, que é o seguinte : vamos supor que tenho uma encomenda cujo numero é  "450" , quando vou a inserir o numero da encomenda na txtNumeroEncomenda, quando insiro o "4", a datagriview fica vazia, só preenchendo quando termino de inserir o "450" , e o que pretendia era que a datagridview fosse sendo preenchida á medida que vou inserindo o "450", primeiro com todas as encomendas que tivessem o "4" no numero, depois o "45" e só no final o "450" . Eu sei fazer isso  com, por exemplo,   :

 sql += "From tbl_Cliente WHERE ClienteNome Like '%" & strNomeCliente & "%'"

No entanto, neste caso especifico , não estou a ver como fazer , já tentei:

 PrimeiroCriterio = " And Tbl_Encomenda.NumeroEncomenda like  @NumeroEncomenda  "
    '            SegundoCriterio = " And Tbl_Encomenda.ClienteCodigo like % @ClienteCodigo % "
    '            TerceiroCriterio = " And Tbl_Encomenda.ReferenciaInterna like % @ReferenciaInterna % "
    '            QuartoCriterio = " And Tbl_Encomenda.ReferenciaCliente like % @ReferenciaCliente % "
    '            QuintoCriterio = " And Tbl_Encomenda.DataEncomenda like % @DataEncomenda %"
    '            SextoCriterio = " And Tbl_Encomenda.ClienteNome like % @ClienteNome % "

mas não funciona. Daí que agradecia a vossa ajuda.

 

Obrigado

Antonio Silva

Link to comment
Share on other sites

Bom dia, 

O segundo problema : 

11 horas atrás, Antonio Silva Magalhaes disse:

 

2 - Desta forma, apesar de cumprir em parte o que pretendo , tem erros. Quando altero o parâmetro  NomeCliente, não funciona , dá a mensagem "Não foi fornecido nenhum valor para um ou mais parâmetros necessários" , e não sei qual a razão .

já corrigi , substituindo :

SextoCriterio = " And Tbl_Encomenda.ClienteNome like @ClienteNome"

Por : 

SextoCriterio = " And Tbl_Cliente.ClienteNome like @ClienteNome"

Tinha a tabela errada, no entanto, o terceiro problema : 

11 horas atrás, Antonio Silva Magalhaes disse:

 

3- Com os outros parâmetros, apesar de aparentemente funcionarem , tem um problema que gostaria de resolver, que é o seguinte : vamos supor que tenho uma encomenda cujo numero é  "450" , quando vou a inserir o numero da encomenda na txtNumeroEncomenda, quando insiro o "4", a datagriview fica vazia, só preenchendo quando termino de inserir o "450" , e o que pretendia era que a datagridview fosse sendo preenchida á medida que vou inserindo o "450", primeiro com todas as encomendas que tivessem o "4" no numero, depois o "45" e só no final o "450" . Eu sei fazer isso  com, por exemplo,   :


 sql += "From tbl_Cliente WHERE ClienteNome Like '%" & strNomeCliente & "%'"

No entanto, neste caso especifico , não estou a ver como fazer , já tentei:


 PrimeiroCriterio = " And Tbl_Encomenda.NumeroEncomenda like  @NumeroEncomenda  "
    '            SegundoCriterio = " And Tbl_Encomenda.ClienteCodigo like % @ClienteCodigo % "
    '            TerceiroCriterio = " And Tbl_Encomenda.ReferenciaInterna like % @ReferenciaInterna % "
    '            QuartoCriterio = " And Tbl_Encomenda.ReferenciaCliente like % @ReferenciaCliente % "
    '            QuintoCriterio = " And Tbl_Encomenda.DataEncomenda like % @DataEncomenda %"
    '            SextoCriterio = " And Tbl_Encomenda.ClienteNome like % @ClienteNome % "

mas não funciona. Daí que agradecia a vossa ajuda.

persiste .

Antonio Silva

Link to comment
Share on other sites

Resolvi 🙂 

Private Sub CarregaDgv(Optional ByVal AnoEncomenda = 0, Optional ByVal NumeroEncomenda = 0, Optional ByVal ClienteCodigo = 0,
                            Optional ByVal ReferenciaInterna = 0, Optional ByVal ReferenciaCliente = 0, Optional ByVal DataEncomenda = 0, Optional ByVal ClienteNome = 0)
        Using con As OleDbConnection = Getconnection()
            Try
                con.Open()

                Dim sql As String
                Dim PrimeiroCriterio As String
                Dim SegundoCriterio As String
                Dim TerceiroCriterio As String
                Dim QuartoCriterio As String
                Dim QuintoCriterio As String
                Dim SextoCriterio As String

                AnoEncomenda = txtAnoEncomenda.Text
                NumeroEncomenda = txtNumeroEncomenda.Text
                ClienteCodigo = txtCodigo.Text
                ReferenciaInterna = txtReferenciaInterna.Text
                ReferenciaCliente = txtReferenciaCliente.Text
                DataEncomenda = txtDataEncomenda.Text
                ClienteNome = txtNomeCliente.Text

                Dim Query As String

                sql = "Select Tbl_Encomenda.AnoEncomenda, Tbl_Encomenda.NumeroEncomenda, Tbl_Encomenda.ClienteCodigo, "
                sql += " Tbl_Cliente.ClienteNome, Tbl_Encomenda.ReferenciaInterna, Tbl_Encomenda.ReferenciaCliente,"
                sql += " Tbl_Encomenda.DataEncomenda, Tbl_Encomenda.DataPrevista, Tbl_Encomenda.EstadoEncomenda, Tbl_Encomenda.Observaçao "
                sql += " From Tbl_Encomenda Left Join Tbl_Cliente On Tbl_Encomenda.ClienteCodigo= Tbl_Cliente.Codigo"
                sql += " Where Tbl_Encomenda.AnoEncomenda= " & AnoEncomenda
                PrimeiroCriterio = " And Tbl_Encomenda.NumeroEncomenda like '%" & NumeroEncomenda & "%'"
                SegundoCriterio = " And Tbl_Encomenda.ClienteCodigo like '%" & ClienteCodigo & "%'"
                TerceiroCriterio = " And Tbl_Encomenda.ReferenciaInterna Like '%" & ReferenciaInterna & "%'"
                QuartoCriterio = " And Tbl_Encomenda.ReferenciaCliente Like '%" & ReferenciaCliente & "%'"
                QuintoCriterio = " And Tbl_Encomenda.DataEncomenda Like '% " & DataEncomenda & " %'"
                SextoCriterio = " And Tbl_Cliente.ClienteNome Like '%" & ClienteNome & "%'"


                If txtNumeroEncomenda.Text = "" Then
                    PrimeiroCriterio = " "
                End If
                If txtCodigo.Text = "" Then
                    SegundoCriterio = " "

                End If
                If txtReferenciaInterna.Text = "" Then
                    TerceiroCriterio = " "

                End If
                If txtReferenciaCliente.Text = "" Then
                    QuartoCriterio = " "

                End If
                If txtDataEncomenda.Text = "" Then
                    QuintoCriterio = " "

                End If
                If txtNomeCliente.Text = "" Then
                    SextoCriterio = " "

                End If

                Query = sql & PrimeiroCriterio & SegundoCriterio & TerceiroCriterio & QuartoCriterio & QuintoCriterio & SextoCriterio

                Dim cmd As New OleDbCommand(Query, con)

                cmd.Parameters.AddWithValue("@AnoEncomenda", txtAnoEncomenda.Text)

                If txtNumeroEncomenda.Text <> "" Then
                    cmd.Parameters.AddWithValue("@NumeroEncomenda", txtNumeroEncomenda.Text)
                End If
                If txtCodigo.Text <> "" Then

                    cmd.Parameters.AddWithValue("@ClienteCodigo", txtCodigo.Text)
                End If
                If txtReferenciaInterna.Text <> "" Then
                    cmd.Parameters.AddWithValue("@ReferenciaInterna", txtReferenciaInterna.Text)
                End If
                If txtReferenciaCliente.Text <> "" Then
                    cmd.Parameters.AddWithValue("@ReferenciaCliente", txtReferenciaCliente.Text)
                End If
                If txtDataEncomenda.Text <> "" Then
                    cmd.Parameters.AddWithValue("@DataEncomenda", txtDataEncomenda.Text)
                End If
                If Not String.IsNullOrEmpty(txtNomeCliente.Text) Then
                    cmd.Parameters.AddWithValue("@ClienteNome", txtNomeCliente.Text)
                End If

                Dim da As OleDbDataAdapter = New OleDbDataAdapter(cmd)
                Dim dr As OleDbDataReader = cmd.ExecuteReader
                Dim dt As DataTable = New DataTable
                dt.Load(dr)

                DgvRelaçaoEncomendas.DataSource = dt

                PFormataDatagridview()
            Catch ex As Exception

                MsgBox(ex.Message)
            Finally
                con.Close()

            End Try
        End Using
    End Sub
Link to comment
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
×
×
  • Create New...

Important Information

By using this site you accept our Terms of Use and Privacy Policy. We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue.