Jump to content
Bessa

Ao Editar -> Problema em Adicionar & Remover Items Selecionados

Recommended Posts

Bessa

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.

Share this post


Link to post
Share on other sites
Caça

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

Share this post


Link to post
Share on other sites
Bessa

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. :P

Share this post


Link to post
Share on other sites
bioshock

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.

Share this post


Link to post
Share on other sites
Bessa

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é? :P

        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.

Share this post


Link to post
Share on other sites
bioshock

Novamente, está aí uma grande confusão, mas nada que não se resolva. Já te aconselhei inúmeras vezes a veres este link: http://wiki.portugal-a-programar.org/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?

Share this post


Link to post
Share on other sites
Bessa

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). :P

       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.

Share this post


Link to post
Share on other sites
bioshock

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

Share this post


Link to post
Share on other sites
Bessa

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. :P

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. :P

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. :P

Obrigado. :)

Share this post


Link to post
Share on other sites
bioshock

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")

Share this post


Link to post
Share on other sites
Bessa

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

Share this post


Link to post
Share on other sites
Bessa

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. :)

Share this post


Link to post
Share on other sites
Bessa

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)

Share this post


Link to post
Share on other sites
bioshock
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

Share this post


Link to post
Share on other sites
Bessa

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.

Share this post


Link to post
Share on other sites
bioshock

Primeiro tens de utilizar parâmetros, segundo vais procurar no google sobre queries em SQL. Porque essa resposta existe em milhões de websites.

Share this post


Link to post
Share on other sites
Bessa

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.

Share this post


Link to post
Share on other sites
Bessa

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! :confused:

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.

Share this post


Link to post
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.