Antonio Silva Magalhaes Posted November 23, 2016 at 10:28 PM Report Share #600805 Posted November 23, 2016 at 10:28 PM 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 More sharing options...
Antonio Silva Magalhaes Posted November 24, 2016 at 10:23 AM Author Report Share #600814 Posted November 24, 2016 at 10:23 AM 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 More sharing options...
Antonio Silva Magalhaes Posted November 24, 2016 at 11:29 AM Author Report Share #600818 Posted November 24, 2016 at 11:29 AM 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 More sharing options...
Recommended Posts
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 accountSign in
Already have an account? Sign in here.
Sign In Now