Bessa Posted June 15, 2011 at 09:41 AM Report #396245 Posted June 15, 2011 at 09:41 AM Olá Colegas! Esta semana tem sido uma dor de cabeça...Só Bugs que estão ser complicados resolver! Em 8, apenas 4 consegui resolver! Agora restam estes...Que não estão a dar vida fácil! Fiz a navegação de Registos, e quando encontro um registo que quero editar, Carrego no botão Editar (Desbloqueia apenas os campos, um OUTRO Botão Guardar que fiz, é que confirma a edição) e: - Quando clico para Adicionar OUTRO Item à ListBox "As Selecionadas", dá este erro: http://img1.imagilive.com/0611/1e8b.JPG E lembrei-me que quando me deu este erro num outro caso, coloquei o Objecto ".DataSource=Nothing". Só que neste caso, se coloco, ele LIMPA a ListBox "As Seleccionadas (+ Comprimento e Diâmetro que são acessórias)" e adiciona o registo que pedi: http://img1.imagilive.com/0611/4ee4.JPG - Quando clico para Retirar um Item que seleccionei na ListBox "As Seleccionadas", dá este erro: http://img1.imagilive.com/0611/2171.JPG Fiz o mesmo processo do de cima, de colocar ".DataSource=Nothing", ele Limpa as Lists!: http://img1.imagilive.com/0611/372b.JPG Fiz uma outra experiência, não me lembro se for retirar o Aux ou um dos values, mas sei que me deu este erro: InvalidArgument=Valor de '1' inválido para 'index' . Fiz um BreakPoint no "Dim aux As Integer = Ferramentas_corte_selecListBox.SelectedIndex ", e aparece que o SelectedIndex é "-1"! Coisas muito estranhas. Alguém pode dizer o que acha que estarei a fazer mal? Obrigado.
Caça Posted June 15, 2011 at 09:51 AM Report #396249 Posted June 15, 2011 at 09:51 AM Se alimentas-te a Listbox através de um DataSource não podes alimenta-la de outra maneira, tem de ser sempre a mesma. Pedro Martins Não respondo a duvidas por PM
Bessa Posted June 15, 2011 at 09:55 AM Author Report #396251 Posted June 15, 2011 at 09:55 AM E estou a fazer isso. Quando quero adicionar, adiciono a partir da ListBox que tem o DataSource, que é a "Ferramentas Corte" e "Ferramentas Posicionamento". Quanto quero retirar, retiro da que não está ligada a nenhum DataSource (ListBox As Selecionadas, Diamenteo, Comprimento). E o de retirar, quando faço "Adicionar" um novo registo, o adicionar e retirar funcionam bem. 😛
bioshock Posted June 15, 2011 at 02:29 PM Report #396305 Posted June 15, 2011 at 02:29 PM Isso é simples. Se quando estás a adicionar, inseres de imediato na base de dados, então só tens que voltar a chamar o procedimento para carregar novamente os dados na Listbox.
Bessa Posted June 15, 2011 at 02:36 PM Author Report #396307 Posted June 15, 2011 at 02:36 PM Mas para carregar os items que estão na Base de Dados nas devidas ListBoxes, utilizo apenas este simples código (É muito, mas aos vossos olhos, penso que dá para ver que não tem nada complexo ou perto disso): acho que não era isto que estavas à espera, para teres dito para chamar outra vez o método, né? 😛 Ferramentas_corte_selecListBox.DataSource = Nothing Comprimento_ferr_corteListBox.DataSource = Nothing Diametro_ferr_corteListBox.DataSource = Nothing Ferramentas_posic_selecListBox.DataSource = Nothing X_ferr_posListBox.DataSource = Nothing Y_ferr_posListBox.DataSource = Nothing Z_ferr_posListBox.DataSource = Nothing Ferramentas_corte_selecListBox.Enabled = False Comprimento_ferr_corteListBox.Enabled = False Diametro_ferr_corteListBox.Enabled = False Ferramentas_posic_selecListBox.Enabled = False X_ferr_posListBox.Enabled = False Y_ferr_posListBox.Enabled = False Z_ferr_posListBox.Enabled = False Associar_ferramentasBindingSource.MoveNext() Dim cn As New System.Data.OleDb.OleDbConnection Dim cm As New System.Data.OleDb.OleDbCommand cn.ConnectionString = "Provider=Microsoft.ACE.OLEDB.12.0; Data Source=" & Application.StartupPath & "\bdfelino.accdb" cm.Connection = cn cm.CommandText = "Select * From associar_ferramentas Where artigo_escolhido Like '" & Artigo_escolhidoComboBox.Text & "%'" Dim Adp As New OleDbDataAdapter(cm) Dim Dt As New DataTable Adp.Fill(Dt) Ferramentas_corte_selecListBox.DataSource = Dt Ferramentas_corte_selecListBox.DisplayMember = "ferramentas_corte_selec" Ferramentas_corte_selecListBox.Refresh() Comprimento_ferr_corteListBox.DataSource = Dt Comprimento_ferr_corteListBox.DisplayMember = "comprimento_ferr_corte" Comprimento_ferr_corteListBox.Refresh() Diametro_ferr_corteListBox.DataSource = Dt Diametro_ferr_corteListBox.DisplayMember = "diametro_ferr_corte" Diametro_ferr_corteListBox.Refresh() Ferramentas_posic_selecListBox.DataSource = Dt Ferramentas_posic_selecListBox.DisplayMember = "ferramentas_posic_selec" Ferramentas_posic_selecListBox.Refresh() X_ferr_posListBox.DataSource = Dt X_ferr_posListBox.DisplayMember = "x_ferr_pos" X_ferr_posListBox.Refresh() Y_ferr_posListBox.DataSource = Dt Y_ferr_posListBox.DisplayMember = "y_ferr_pos" Y_ferr_posListBox.Refresh() Z_ferr_posListBox.DataSource = Dt Z_ferr_posListBox.DisplayMember = "z_ferr_pos" Z_ferr_posListBox.Refresh() O Problema do Adicionar é que ele apaga tudo o que está na ListBox, nem sequer adiciona +1 registo. O Apagar também me tem estado a moer o juízo...o máximo que consegui chegar com ele foi com o código: "If Me.Ferramentas_corte_selecListBox.SelectedIndex > -1 Then 'Me.Ferramentas_corte_selecListBox.Items.Remove(Me.Ferramentas_corte_selecListBox.SelectedIndex)" Mas nem bem funcionava... ? Obrigado.
bioshock Posted June 15, 2011 at 02:56 PM Report #396312 Posted June 15, 2011 at 02:56 PM Novamente, está aí uma grande confusão, mas nada que não se resolva. Já te aconselhei inúmeras vezes a veres este link: https://wiki.portugal-a-programar.pt/dev_net/vb.net/access/ Por partes: primeiro insere-se na base de dados os items, depois carrega-se a Listbox. Traduzindo isto para código como seria? Private Sub insertInto() Dim query As String = "INSERT INTO Tabela([Nome] VALUES (@Nome)" Dim command As New OleDbCommand(query, connection) command.Parameters.Add("@Nome", OleDbType.VarChar).Value = NomeTextbox.Text ' Isto imaginando que o individuo escreve numa Textbox o valor que vai ser inserido na BD connection.Open() Dim x As Integer = command.ExecuteNonQuery() If x < 1 Then MessageBox.Show("Erro ao inserir", My.Application.Info.Title, MessageBoxButtons.OK, MessageBoxIcon.Error) Else MessageBox.Show("Registo inserido com sucesso!", My.Application.Info.Title, MessageBoxButtons.OK, MessageBoxIcon.Information) loadIt() End If connection.Close() End Sub O primeiro passo está feito, o segundo será recarregar a Listbox, ora se a mesma está com o DataSource activo convém, sempre que há uma query para a mesma, definir como Nothing o DataSource. Private Sub loadIt() Listbox1.DataSource = Nothing Dim query As String = "SELECT Nome FROM Tabela" Dim DataAdapter As New OleDbDataAdapter(query, connection) Dim DSet As New DataSet DataAdapter.Fill(DSet, "Tabela") Listbox1.DataSource = DSet.Tables("Tabela") End Sub Deu para perceber a lógica?
Bessa Posted June 15, 2011 at 03:21 PM Author Report #396318 Posted June 15, 2011 at 03:21 PM Presumo que quando disseste "primeiro insere-se na base de dados os items", estavas a falar de inserir os items todos incluindo os da TextBox na BD. Portanto: Quanto ao Guardar, já tenho feito e a funcionar à muito tempo, porque sigo-me sempre pela mesma (Até me ajudaste a inserir items da ListBox). 😛 Dim connection As New OleDbConnection("Provider=Microsoft.ACE.OLEDB.12.0; Data Source=" & Application.StartupPath & "\bdfelino.accdb") connection.Open() For i As Integer = 0 To Ferramentas_corte_selecListBox.Items.Count - 1 And Ferramentas_posic_selecListBox.Items.Count - 1 Dim query As String = "INSERT INTO associar_ferramentas (artigo_escolhido, operacao_artigo, fase_artigo, programa, gfh, ferramentas_corte_selec, ferramentas_posic_selec, comprimento_ferr_corte, diametro_ferr_corte, x_ferr_pos, y_ferr_pos, z_ferr_pos) VALUES (@artigo_escolhido, @operacao_artigo, @fase_artigo, @programa, @gfh, @Ferramentas_corte_selec, @Ferramentas_posic_selec, @Comprimento_ferr_corte, @Diametro_ferr_corte, @X_ferr_pos, @Y_ferr_pos, @Z_ferr_pos)" Dim command As New OleDbCommand(query, connection) If Ferramentas_corte_selecListBox.Items.Count > Ferramentas_posic_selecListBox.Items.Count Then command.Parameters.Add("@artigo_escolhido", OleDbType.VarChar).Value = Artigo_escolhidoComboBox.Text command.Parameters.Add("@operacao_artigo", OleDbType.VarChar).Value = Operacao_artigoListBox.Text command.Parameters.Add("@fase_artigo", OleDbType.VarChar).Value = fase_artigo.Text command.Parameters.Add("@programa", OleDbType.VarChar).Value = ProgramaTextBox.Text command.Parameters.Add("@gfh", OleDbType.VarChar).Value = GfhListBox.Text command.Parameters.Add("@ferramentas_corte_selec", OleDbType.VarChar).Value = Ferramentas_corte_selecListBox.Items(i).ToString() command.Parameters.Add("@ferramentas_posic_selec", OleDbType.VarChar).Value = TextBox1.Text command.Parameters.Add("@comprimento_ferr_corte", OleDbType.Integer).Value = Comprimento_ferr_corteListBox.Items(i & Environment.NewLine).ToString() command.Parameters.Add("@diametro_ferr_corte", OleDbType.Integer).Value = Diametro_ferr_corteListBox.Items(i).ToString() command.Parameters.Add("@x_ferr_pos", OleDbType.VarChar).Value = TextBox1.Text command.Parameters.Add("@y_ferr_pos", OleDbType.VarChar).Value = TextBox1.Text command.Parameters.Add("@z_ferr_pos", OleDbType.VarChar).Value = TextBox1.Text Else command.Parameters.Add("@artigo_escolhido", OleDbType.VarChar).Value = Artigo_escolhidoComboBox.Text command.Parameters.Add("@operacao_artigo", OleDbType.VarChar).Value = Operacao_artigoListBox.Text command.Parameters.Add("@fase_artigo", OleDbType.VarChar).Value = fase_artigo.Text command.Parameters.Add("@programa", OleDbType.VarChar).Value = ProgramaTextBox.Text command.Parameters.Add("@gfh", OleDbType.VarChar).Value = GfhListBox.Text command.Parameters.Add("@ferramentas_corte_selec", OleDbType.VarChar).Value = Ferramentas_corte_selecListBox.Items(i).ToString() command.Parameters.Add("@ferramentas_posic_selec", OleDbType.VarChar).Value = Ferramentas_posic_selecListBox.Items(i).ToString() command.Parameters.Add("@comprimento_ferr_corte", OleDbType.Integer).Value = Comprimento_ferr_corteListBox.Items(i & Environment.NewLine).ToString() command.Parameters.Add("@diametro_ferr_corte", OleDbType.Integer).Value = Diametro_ferr_corteListBox.Items(i).ToString() command.Parameters.Add("@x_ferr_pos", OleDbType.Integer).Value = X_ferr_posListBox.Items(i).ToString() command.Parameters.Add("@y_ferr_pos", OleDbType.Integer).Value = Y_ferr_posListBox.Items(i).ToString() command.Parameters.Add("@z_ferr_pos", OleDbType.Integer).Value = Z_ferr_posListBox.Items(i).ToString() command.ExecuteNonQuery() End If Next Quanto ao recarregar a ListBox, que ao que parece é onde está um dos problemas: - As ListBox não estão associadas por nenhum DataBound, isto é, elas estão assim: http://img1.imagilive.com/0611/Sem_tlo.jpg Elas são carregadas apenas por código. Quanto ao Código, experimentei esse código num botão seguinte, mas aparece "System.Data.RowView...." (Mesmo que só deixe o " Ferramentas_corte_selecListBox" e apague as outras): Dim conn As New OleDbConnection("Provider=Microsoft.ACE.OLEDB.12.0; Data Source=" & Application.StartupPath & "\bdfelino.accdb") Ferramentas_corte_selecListBox.DataSource = Nothing Dim query As String = "SELECT ferramentas_corte_selec FROM associar_ferramentas" Dim DataAdapter As New OleDbDataAdapter(query, conn) Dim DSet As New DataSet DataAdapter.Fill(DSet, "asssociar_ferramentas") Ferramentas_corte_selecListBox.DataSource = DSet.Tables("asssociar_ferramentas") Comprimento_ferr_corteListBox.DataSource = Nothing query = "SELECT comprimento_ferr_corte FROM associar_ferramentas" DataAdapter.Fill(DSet, "asssociar_ferramentas") Comprimento_ferr_corteListBox.DataSource = DSet.Tables("asssociar_ferramentas") Diametro_ferr_corteListBox.DataSource = Nothing query = "SELECT diametro_ferr_corte FROM associar_ferramentas" DataAdapter.Fill(DSet, "asssociar_ferramentas") Diametro_ferr_corteListBox.DataSource = DSet.Tables("asssociar_ferramentas") Suponho que era lá que deveria colocar...Ou não? Dado que é para carregar a List a cada Seguinte.
bioshock Posted June 15, 2011 at 08:30 PM Report #396399 Posted June 15, 2011 at 08:30 PM Epa, escapou-me por completo isso e existe uma forma de o contornar, mas lembrei-me de outra alternativa: A não utilização de DataSources. Dim query As String = "SELECT ferramentas_corte_selec FROM associar_ferramentas" Dim DataAdapter As New OleDbDataAdapter(query, conn) Dim DSet As New DataSet For i As Integer = 0 To DSet.Tables(0).Rows.Count - 1 Ferramentas_corte_selecListBox.Items.Add(DSet.Tables(0).Rows(i).Item(0).ToString) Next
Bessa Posted June 16, 2011 at 07:50 AM Author Report #396491 Posted June 16, 2011 at 07:50 AM Com essa alternativa, ele diz que "Não é possível localizar a tabela 0" (Experimentei também mudar para outros números). Eu até diria que deveria ter de se criar um GridView, mas não me parece, porque no código apenas se fala do DataSet. Já agora, só uma coisa: - Eu consigo carregar os respetivos para as ListBoxes, com este código: Ferramentas_corte_selecListBox.DataSource = Nothing Comprimento_ferr_corteListBox.DataSource = Nothing Diametro_ferr_corteListBox.DataSource = Nothing Ferramentas_posic_selecListBox.DataSource = Nothing X_ferr_posListBox.DataSource = Nothing Y_ferr_posListBox.DataSource = Nothing Z_ferr_posListBox.DataSource = Nothing Associar_ferramentasBindingSource.MoveNext() Dim cn As New System.Data.OleDb.OleDbConnection Dim cm As New System.Data.OleDb.OleDbCommand cn.ConnectionString = "Provider=Microsoft.ACE.OLEDB.12.0; Data Source=" & Application.StartupPath & "\bdfelino.accdb" cm.Connection = cn cm.CommandText = "Select * From associar_ferramentas Where artigo_escolhido Like '" & Artigo_escolhidoComboBox.Text & "%'" Dim Adp As New OleDbDataAdapter(cm) Dim Dt As New DataTable Adp.Fill(Dt) Ferramentas_corte_selecListBox.DataSource = Dt Ferramentas_corte_selecListBox.DisplayMember = "ferramentas_corte_selec" Ferramentas_corte_selecListBox.Refresh() Comprimento_ferr_corteListBox.DataSource = Dt Comprimento_ferr_corteListBox.DisplayMember = "comprimento_ferr_corte" Comprimento_ferr_corteListBox.Refresh() Diametro_ferr_corteListBox.DataSource = Dt Diametro_ferr_corteListBox.DisplayMember = "diametro_ferr_corte" Diametro_ferr_corteListBox.Refresh() Ferramentas_posic_selecListBox.DataSource = Dt Ferramentas_posic_selecListBox.DisplayMember = "ferramentas_posic_selec" Ferramentas_posic_selecListBox.Refresh() X_ferr_posListBox.DataSource = Dt X_ferr_posListBox.DisplayMember = "x_ferr_pos" X_ferr_posListBox.Refresh() Y_ferr_posListBox.DataSource = Dt Y_ferr_posListBox.DisplayMember = "y_ferr_pos" Y_ferr_posListBox.Refresh() Z_ferr_posListBox.DataSource = Dt Z_ferr_posListBox.DisplayMember = "z_ferr_pos" Z_ferr_posListBox.Refresh() Ele carrega os dados corretos, mediante o artigo que está na BD. Os Problemas todos que obtenho é quando tento editar as ListBoxes 🙂 . Dá os problemas que no 1º Post coloquei. 😛 Agora, não sei é se já detetas-te que o problema está no carregamento das ListBoxes ou se com os filmes que faço (lol) pensaste que ainda não tinha conseguido carregar os dados para as ListBoxes. 😛 Um coisa estúpida é que: - Ao retirar o Item, se coloco apenas o código: "Ferramentas_corte_selecListBox.Items.RemoveAt(Ferramentas_corte_selecListBox.SelectedIndex)", ele deteta que o Index do Item selecionado é 0 e dá o erro de "Não é possível modificar a colecção de itens quando a propriedade DataSource está definida." E basta eu colocar então que o DataSource é Nothing, que ele assume o Index do Item selecionado como -1, e claro, dá este erro: "InvalidArgument=Valor de '-1' inválido para 'index'. Nome do parâmetro: index" E o mai perto que consegui chegar nisto de Remover Items (Porque Adicionar ainda não consegui e remover está em 1º lugar), foi com isto (Adaptei só para a 1ª ListBox): Ferramentas_corte_selecListBox.DataSource = Nothing If Ferramentas_corte_selecListBox.SelectedIndices.Count <> 0 Then For i = Ferramentas_corte_selecListBox.SelectedIndices.Count - 1 To -1 Step -1 Ferramentas_corte_selecListBox.Items.RemoveAt(Ferramentas_corte_selecListBox.SelectedIndices(i)) Next End If Só que ele remove todos os items da ListBox! Por ex: Tenho lá 5, ele remove 5 lol Experimentei colocar "To 0" e "To 1" e é a mesma coisa. 😛 Obrigado. 🙂
bioshock Posted June 16, 2011 at 01:58 PM Report #396632 Posted June 16, 2011 at 01:58 PM Com essa alternativa, ele diz que "Não é possível localizar a tabela 0" (Experimentei também mudar para outros números). Diz isso porque eu me esqueci de colocar antes do ciclo o filtro. DataAdapter.Fill(DSet, "associar_ferramentas")
Bessa Posted June 16, 2011 at 02:06 PM Author Report #396635 Posted June 16, 2011 at 02:06 PM Mas olha que continua a dar o erro. Apaguei o que tinha modificado nesse código (ou inventado ahahah), voltei a colocar como tens e não funciona: Dim conn As New OleDbConnection("Provider=Microsoft.ACE.OLEDB.12.0; Data Source=" & Application.StartupPath & "\bdfelino.accdb") Dim query As String = "SELECT ferramentas_corte_selec FROM associar_ferramentas" Dim DataAdapter As New OleDbDataAdapter(query, conn) Dim DSet As New DataSet For i As Integer = 0 To DSet.Tables(0).Rows.Count - 1 Ferramentas_corte_selecListBox.Items.Add(DSet.Tables(0).Rows(i).Item(0).ToString) Next Supostamente, ao carregar lá ele deveria carregar no mínimo todos os dados para a ListBox "Ferramentas_corte_selec", né?... Tks
bioshock Posted June 16, 2011 at 02:12 PM Report #396637 Posted June 16, 2011 at 02:12 PM Lê novamente o meu último post.
Bessa Posted June 16, 2011 at 02:17 PM Author Report #396640 Posted June 16, 2011 at 02:17 PM Eu li. Mas como apaguei o meu anterior código por dar erro, esqueci-me de copiar esta nova parte do código! 🙂 Desta vez, não foi por não ter lido. Foi por estar distraído! LOL Eheheh My BAD! Vou só tentar adaptar ao resto das ListBox e filtrar mediante o artigo e já cá venho dar Feedback. 🙂 Muito Obrigado. 🙂
Bessa Posted June 16, 2011 at 02:42 PM Author Report #396657 Posted June 16, 2011 at 02:42 PM Coloquei assim, mas ele cola o registo da 1ª ListBox nas outras duas: Dim conn As New OleDbConnection("Provider=Microsoft.ACE.OLEDB.12.0; Data Source=" & Application.StartupPath & "\bdfelino.accdb") Dim query As String = "SELECT ferramentas_corte_selec FROM associar_ferramentas" Dim query2 As String = "SELECT comprimento_ferr_corte FROM associar_ferramentas" Dim query3 As String = "SELECT diametro_ferr_corte FROM associar_ferramentas" Dim DataAdapter As New OleDbDataAdapter(query, conn) Dim DataAdapter2 As New OleDbDataAdapter(query2, conn) Dim DataAdapter3 As New OleDbDataAdapter(query3, conn) Dim DSet As New DataSet DataAdapter.Fill(DSet, "associar_ferramentas") DataAdapter2.Fill(DSet, "associar_ferramentas") DataAdapter3.Fill(DSet, "associar_ferramentas") For i As Integer = 0 To DSet.Tables(0).Rows.Count - 1 Ferramentas_corte_selecListBox.Items.Add(DSet.Tables(0).Rows(i).Item(0).ToString) Next For i As Integer = 0 To DSet.Tables(0).Rows.Count - 1 Comprimento_ferr_corteListBox.Items.Add(DSet.Tables(0).Rows(i).Item(0).ToString) Next For i As Integer = 0 To DSet.Tables(0).Rows.Count - 1 Diametro_ferr_corteListBox.Items.Add(DSet.Tables(0).Rows(i).Item(0).ToString) Next Experimentei também mudar o nr das DSet.Tables e isto: "Select * From associar_ferramentas Where artigo_escolhido Like '" & Artigo_escolhidoComboBox.Text & "%'" Mas nada funcionou. E Já agora, há forma de fazer uma query SQL deste tipo, que era o mais apropriado para a situação (Mas a funcar 🙂 ) "Select * From associar_ferramentas Where artigo_escolhido And fase_artigo Like '" & Artigo_escolhidoComboBox.Text & Fase_artigoComboBox.Text & "%'" ? Isto porque era o mais apropriado para a situação e também porque, como não estou a ver como faço para cada vez que clique ele me mudar todos os dados da Form, pensei em criar algum botão com este código, em que quando o utilizador clica-se, ele carregava os dados devidamente filtrado através do código que deste, para as ListBox, e assim pode ser que já dê para editar. (Isto porque, com o código que eu tinha, dava os problemas que mostrei)
bioshock Posted June 16, 2011 at 02:59 PM Report #396663 Posted June 16, 2011 at 02:59 PM Dim query As String = "SELECT ferramentas_corte_selec, comprimento_ferr_corte, diametro_ferr_corte FROM associar_ferramentas" Dim DataAdapter As New OleDbDataAdapter(query, conn) Dim DSet As New DataSet DataAdapter.Fill(DSet, "associar_ferramentas") For i As Integer = 0 To DSet.Tables(0).Rows.Count - 1 Ferramentas_corte_selecListBox.Items.Add(DSet.Tables(0).Rows(i).Item(0).ToString) Next For i As Integer = 0 To DSet.Tables(0).Rows.Count - 1 Comprimento_ferr_corteListBox.Items.Add(DSet.Tables(0).Rows(i).Item(1).ToString) Next For i As Integer = 0 To DSet.Tables(0).Rows.Count - 1 Diametro_ferr_corteListBox.Items.Add(DSet.Tables(0).Rows(i).Item(2).ToString) Next
Bessa Posted June 16, 2011 at 03:11 PM Author Report #396670 Posted June 16, 2011 at 03:11 PM Muito Obrigado! 🙂 Nunca equacionei a hipótese dos Items... Para aquilo que eu queria, em vez de: Dim query As String = "SELECT ferramentas_corte_selec, comprimento_ferr_corte, diametro_ferr_corte FROM associar_ferramentas" Coloquei: Dim query As String = "Select ferramentas_corte_selec, comprimento_ferr_corte, diametro_ferr_corte From associar_ferramentas Where artigo_escolhido, fase_artigo Like '" & Artigo_escolhidoComboBox.Text & Fase_artigoComboBox.Text & " Mas dá este erro: Erro de sintaxe (vírgula) na expressão de consulta 'artigo_escolhido, fase_artigo Like 'ABT4001301 1'. Então como consigo pedir que ele me selecione os respetivos artigos de cada LisTBox, consoante aquelas 2 "condições", se não me deixa colocar a virgula? Obrigado.
bioshock Posted June 16, 2011 at 03:17 PM Report #396674 Posted June 16, 2011 at 03:17 PM Primeiro tens de utilizar parâmetros, segundo vais procurar no google sobre queries em SQL. Porque essa resposta existe em milhões de websites.
Bessa Posted June 16, 2011 at 03:56 PM Author Report #396699 Posted June 16, 2011 at 03:56 PM Eu sei que sim, o problema é encontrar a resolução...Já experimentei com plicas, sem plicas, "AND", +, &, com virgulas, sem virgulas, e por incrível que pareça, ainda não encontrei ninguém com 2 condições no LIKE. Já consegui pôr aquilo a dar erro sobre isso que falaste, a dizer que faltava "parâmetros", agora já não aparece! 🙂 Ora bem, estive lá a ver isso dos parâmetros, e encontrei isto: http://scriptbrasil.com.br/forum/index.php?showtopic=89988 (Abri com a Cache do Google) Fiz como lá aparece, e pus como achava que ficava neste caso: Dim query As String = "SELECT ferramentas_corte_selec FROM associar_ferramentas WHERE artigo_escolhido = :artesc AND fase_artigo = :fasert LIKE :artes AND :fasert" Mas o 2º passo: query.parambyname('nome').AsString := Editnome.text Não dá! O VB não reconhece a query nem parabyname... Sabes algum Link que tenha informação realmente CREDÍVEL e Explicita? Obrigado.
bioshock Posted June 16, 2011 at 08:28 PM Report #396800 Posted June 16, 2011 at 08:28 PM Mais uma vez, direcciono-te para um link que já te direccionei dezenas de vezes: https://wiki.portugal-a-programar.pt/dev_net/vb.net/access/
Bessa Posted June 17, 2011 at 09:19 AM Author Report #396945 Posted June 17, 2011 at 09:19 AM Mas é que o grande problema estava antes disso. 🙂 Estava em criar a QUERY a FUNCIONAR. B) Mas com um SQL Builder, consegui! 🙂 Dim query As String = "SELECT ferramentas_corte_selec, comprimento_ferr_corte, diametro_ferr_corte FROM associar_ferramentas WHERE artigo_escolhido LIKE Artigo_escolhidoComboBox.Text AND fase_artigo LIKE fase_artigo.Text" Agora o problema é com o raio dos parametros. 🙂 Já tentei TANTA coisa e dá sempre o mesmo erro! 😕 Não foi fornecido nenhum valor para um ou mais parâmetros necessários. Coloquei: command.Parameters.Add("ferramentas_corte_selec", OleDbType.VarChar).Value = Ferramentas_corte_selecListBox.Text command.Parameters.Add("comprimento_ferr_corte", OleDbType.Integer).Value = Comprimento_ferr_corteListBox.Text command.Parameters.Add("diametro_ferr_corte", OleDbType.Integer).Value = Diametro_ferr_corteListBox.Text Nada... Tentei: command.Parameters.Add("ferramentas_corte_selec, comprimento_ferr_corte, diametro_ferr_corte", OleDbType.VarChar).Value = query Nada... Tentei: Dim query As String = "SELECT ferramentas_corte_selec, comprimento_ferr_corte, diametro_ferr_corte FROM associar_ferramentas WHERE artigo_escolhido LIKE Artigo_escolhidoComboBox.Text AND fase_artigo LIKE fase_artigo.Text" Dim query2 As String = "SELECT ferramentas_corte_selec FROM associar_ferramentas WHERE artigo_escolhido LIKE Artigo_escolhidoComboBox.Text AND fase_artigo LIKE fase_artigo.Text" Dim query3 As String = "SELECT comprimento_ferr_corte FROM associar_ferramentas WHERE artigo_escolhido LIKE Artigo_escolhidoComboBox.Text AND fase_artigo LIKE fase_artigo.Text" Dim query4 As String = "SELECT diametro_ferr_corte FROM associar_ferramentas WHERE artigo_escolhido LIKE Artigo_escolhidoComboBox.Text AND fase_artigo LIKE fase_artigo.Text" command.Parameters.Add("ferramentas_corte_selec", OleDbType.VarChar).Value = query2 command.Parameters.Add("comprimento_ferr_corte", OleDbType.Integer).Value = query3 command.Parameters.Add("diametro_ferr_corte", OleDbType.Integer).Value = query4 Nada... Experimentei colocar no DSet: DataAdapter.Fill(DSet, "ferramentas_corte_selec", "comprimento_ferr_corte", "diametro_ferr_corte") Mas a solução é assim tão diferente? Mas o que estou a fazer mal??? :S Experimentei também colocar o Código que carrega todos os dados, independetemente do artigo, na ListBox: Dim conn As New OleDbConnection("Provider=Microsoft.ACE.OLEDB.12.0; Data Source=" & Application.StartupPath & "\bdfelino.accdb") 'Dim query As String = "SELECT ferramentas_corte_selec, comprimento_ferr_corte, diametro_ferr_corte FROM associar_ferramentas WHERE artigo_escolhido LIKE Artigo_escolhidoComboBox.Text AND fase_artigo LIKE fase_artigo.Text" Dim query As String = "SELECT ferramentas_corte_selec, comprimento_ferr_corte, diametro_ferr_corte FROM associar_ferramentas" Dim command As New OleDbCommand(query, conn) Dim DataAdapter As New OleDbDataAdapter(query, conn) Dim DSet As New DataSet DataAdapter.Fill(DSet, "associar_ferramentas") 'DataAdapter.Fill(DSet, "ferramentas_corte_selec, comprimento_ferr_corte, diametro_ferr_corte") For i As Integer = 0 To DSet.Tables(0).Rows.Count - 1 Ferramentas_corte_selecListBox.Items.Add(DSet.Tables(0).Rows(i).Item(0).ToString) Next For i As Integer = 0 To DSet.Tables(0).Rows.Count - 1 Comprimento_ferr_corteListBox.Items.Add(DSet.Tables(0).Rows(i).Item(1).ToString) Next For i As Integer = 0 To DSet.Tables(0).Rows.Count - 1 Diametro_ferr_corteListBox.Items.Add(DSet.Tables(0).Rows(i).Item(2).ToString) Next E colocar o seguinte noutro botão, dado que poderia ser que desse por estar ListBox preenchidas: Dim conn As New OleDbConnection("Provider=Microsoft.ACE.OLEDB.12.0; Data Source=" & Application.StartupPath & "\bdfelino.accdb") Dim query As String = "SELECT ferramentas_corte_selec, comprimento_ferr_corte, diametro_ferr_corte FROM associar_ferramentas WHERE artigo_escolhido LIKE Artigo_escolhidoComboBox.Text AND fase_artigo LIKE fase_artigo.Text" 'Dim query As String = "SELECT ferramentas_corte_selec, comprimento_ferr_corte, diametro_ferr_corte FROM associar_ferramentas" Dim command As New OleDbCommand(query, conn) command.Parameters.Add("ferramentas_corte_selec", OleDbType.VarChar).Value = Ferramentas_corte_selecListBox.Text '"SELECT ferramentas_corte_selec FROM associar_ferramentas WHERE artigo_escolhido LIKE Artigo_escolhidoComboBox.Text AND fase_artigo LIKE fase_artigo.Text" command.Parameters.Add("comprimento_ferr_corte", OleDbType.Integer).Value = Comprimento_ferr_corteListBox.Text '"SELECT comprimento_ferr_corte FROM associar_ferramentas WHERE artigo_escolhido LIKE Artigo_escolhidoComboBox.Text AND fase_artigo LIKE fase_artigo.Text" command.Parameters.Add("diametro_ferr_corte", OleDbType.Integer).Value = Diametro_ferr_corteListBox.Text '"SELECT diametro_ferr_corte FROM associar_ferramentas WHERE artigo_escolhido LIKE Artigo_escolhidoComboBox.Text AND fase_artigo LIKE fase_artigo.Text" Dim DataAdapter As New OleDbDataAdapter(query, conn) Dim DSet As New DataSet 'DataAdapter.Fill(DSet, "associar_ferramentas") DataAdapter.Fill(DSet, "ferramentas_corte_selec, comprimento_ferr_corte, diametro_ferr_corte") For i As Integer = 0 To DSet.Tables(0).Rows.Count - 1 Ferramentas_corte_selecListBox.Items.Add(DSet.Tables(0).Rows(i).Item(0).ToString) Next For i As Integer = 0 To DSet.Tables(0).Rows.Count - 1 Comprimento_ferr_corteListBox.Items.Add(DSet.Tables(0).Rows(i).Item(1).ToString) Next For i As Integer = 0 To DSet.Tables(0).Rows.Count - 1 Diametro_ferr_corteListBox.Items.Add(DSet.Tables(0).Rows(i).Item(2).ToString) Next Mas NADA! Mas é assim tão diferente a solução perante tantas tentativas?! É que ainda experimentei mais algumas, mas que tão estúpidas que nem postei... E outra coisa, para utilizar o "command.Parameters.Add", as ListBox, não têm de conter já dados? É que elas não têm...(A menos que faça SEGUINTE com o Código que postei no 1º Post...) Obrigado desde já por alguma ajuda que possas dar.
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