Avaliação do Usuário

Estrela ativaEstrela ativaEstrela ativaEstrela ativaEstrela inativa
 

 

Frequentemente vemos, nos diversos fóruns e outros sites sobre programação, colegas quebrando a cabeça para aprender as manhas e dominar a arte de relacionar registros, transportando-os entre caixas de listagem.

É bonito e prático criar relações entre itens, selecionando-os em uma caixa de listagem e enviando-os para outra. Desfazer a relação apenas selecionando os itens e movendo-os de volta para a caixa de origem também é muito bacana. Além disso ordenar itens selecionando-os e utilizando os botões “para cima” e “para baixo” deixa tudo parecendo sopinha de neném.

Mas aí vem a questão que, principalmente para os iniciantes, representa a pedra no sapato. Como fazer?

A utilização das caixas de listagem é muito simples, porém sua implementação requer boa base de conhecimento em lógica e algoritmo, o que a princípio parece ser coisa de outro planeta.

Neste artigo o objetivo é demonstrar como criar um  esquema de classificação musical utilizando as caixas de listagem. Nada complexo. A idéia é associar as músicas com o respectivos artistas, além de ordená-las, deixando as melhores em primeiro lugar.

Como a idéia por trás do exemplo é bem simples e com certeza ninguém terá dificuldade em compreender o que o sistema deve ser capaz de fazer, poderemos nos preocupar somente com a implementação.

O MODELO DE DADOS

Para implementar nosso pequeno projeto vamos utilizar apenas duas tabelas, uma para cadastrar os artistas e outra para cadastrar os seus sucessos musicais, permitindo assim a futura relação entre os dois.

Tabelas

Artista

  • nomeArtista – Texto – 50 caracteres – Chave primária

 

SucessoMusical

  • codMusica – Auto Numeração – Chave primária
  • nomeMusica – Texto – 50 caracteres
  • ordem – Número – Inteiro
  • artista – Texto – Chave estrangeira (nomeArtista/Artista)
  • Veja a representação do modelo de dados proposto:

Relacionamentos das tabelas do BD Caixa de Listagem


PREPARANDO O FORMULÁRIO

Para trabalharmos com os dados utilizando as caixas de listagem precisaremos de um formulário contendo todos os objetos necessários. Sendo assim crie um formulário com as seguintes características:

Nome: FClassificacaoMusical
Altura: 13cm
Largura: 20cm
Seletores de Registro: Não
Linhas Divisórias: Não
Botões de Navegação: Não
Barras de Rolagem: Nenhuma
Popup: Sim

O nosso formulário também deverá contar com os objetos que darão vida ao mesmo. Para isso inclua os seguintes itens, com suas respectivas características:

Caixas de Listagem

As nossas caixas de listagem são os principais objetos a serem incorporados na aplicação. O conteúdo de cada uma delas tem origem em consultas baseadas na tabela SucessoMusical, sendo que uma exibirá as músicas não associadas e a outra as músicas já associadas. Além disso a segunda caixa de listagem permitirá a ordenação dos sucessos musicais.

Veja quais as principais características de cada uma delas:

Nome: lstMusica
Origem da Linha: SELECT SucessoMusical.codMusica, SucessoMusical.nomeMusica FROM SucessoMusical WHERE (((SucessoMusical.artista) Is Null));
Tipo de Origem da Linha: Tabela/Consulta
Número de Colunas: 2
Largura das Colunas: 0cm;7cm
Seleções Múltiplas: Estendida

Nome: lstOrdemMusica
Origem da Linha: SELECT SucessoMusical.codMusica, SucessoMusical.ordem, SucessoMusical.nomeMusica FROM SucessoMusical WHERE (((SucessoMusical.artista)=[Formulários]![FClassificacaoMusical]![cbxArtista])) ORDER BY SucessoMusical.ordem;
Tipo de Origem da Linha: Tabela/Consulta
Número de Colunas: 3
Largura das Colunas: 0cm;1cm;4cm
Seleções Múltiplas: Simples

Caixa de Combinação

Nome: cbxArtista
Origem da Linha: Artista
Tipo de Origem da Linha: Tabela/Consulta

Grupo de Opção

Nome: gpoMusica
Valor Padrão: 2

Botões de Opção (dentro do Grupo de Opção)

Nome: btoTodas
Valor de Opção: 1

Nome: btoNaoClassificadas
Valor de Opção: 2

Caixas de Texto

txtIncluirMusica
txtIncluirArtista

Botões

btnOrdemAcima
btnOrdemAbaixo
btnIncluir
btnExcluir
btnIncluirMusica
btnIncluirArtista 

Rótulos

lblClassificacao
lblArtista
lblMusica
lblOrdemMusica
lblIncluirMusica
lblIncluirArtista 

Foram listadas apenas as propriedades mais importantes, com as configurações que mais interessam. Faça os demais ajustes para que tudo fique de acordo.



{ads1} 

O FORMULÁRIO

Veja como deve se parecer o formulário após os objetos estarem incluídos e organizados:

Caixa de Listagem

Perceba que na caixa da esquerda temos uma lista de sucessos musicais sem nenhuma classificação. Já na caixa da esquerda temos os sucessos associados ao respectivo artista, além de estarem ordenados.

A idéia principal é podermos selecionar uma ou mais músicas na caixa da esquerda, escolher um artista na caixa de combinação e associar ao mesmo as músicas selecionadas, tranferindo-as para a caixa da direita utilizando os botões apropriados que contém as setas para esquerda e direita. O processo inverso também será possível. Para ordenar as músicas também utilizaremos botões que contém as setas para cima e para baixo.

VAMOS AOS CÓDIGOS

Compreendido o objetivo da tarefa vamos ao que interessa: como programar as caixas de combinação para movimentar os registros de uma para a outra?

Na verdade os registros não são movimentados de uma para a outra. As caixas da esquerda e da direita, conforme dito anteriormente, apenas exibem os registros não associados e os associados, respectivamente. O que fazemos, via código, é descobrir quais registros estão selecionados em cada caixa, realizando em seguida a associação correspondente via código SQL, e atualizando as caixas para que exibam os registros após a associação ou desassociação.

Antes de começarmos a codificação é necessário incluirmos uma biblioteca nas referências do VBA. Como iremos trabalhar com um Recordset do tipo ADODB, devemos marcar a referência para a biblioteca Microsoft ActiveX Data Objects 2.8 Library. Neste exemplo foi utilizando o Access 2007, então se você trabalha com uma versão diferente marque a referência que estiver presente, mesmo que seja inferior ou superior a esta.

Bibliotecas de referência do BD Caixa de Listagem

Resolvido o problema da referência à biblioteca então mãos à obra.

1 - Executando um Código SQL

Este é um procedimento genérico que fornece aos outros procedimentos a capacidade de executar um código SQL passado como argumento. O código reutilizável evita que os demais tenha que se preocupar com a desabilitação e habilitação das mensagens de aviso do Access, os quais são escritos apenas uma vez e servem para qualquer outro procedimento ou função.

Neste exemplo ele encontra-se no mesmo módulo de formulário que os demais procedimentos, porém em um programa maior, com mais códigos a serem executados ele deveria estar em um módulo padrão separado, para que estivesse acessível diretamente por qualquer um deles.

Sub executaSql(argSql As String)

  'Desabilitando os alertas
  DoCmd.SetWarnings False

  'Executando o sql
  DoCmd.RunSQL argSql

  'Desabilitando os alertas
  DoCmd.SetWarnings False

End Sub

2 - Incluindo uma Música

Para que possamos associar músicas a artistas é imprescindível que as tenhamos para realizar a associação. Então vamos incluir um código que inclui uma música no evento Ao Clicar do botão btnIncluirMusica, utilizando a caixa de texto txtIncluirMusica, utilizando para isto um código SQL.

Depois de incluir a música na tabela devemos atualizar a caixa de listagem para que a mesma seja exibida.

Private Sub btnIncluirMusica_Click()

  'Declarando a variável para o código SQL
  Dim strSql As String

  'Montando o código SQL para inclusão da nova música
  strSql = "Insert Into SucessoMusical(nomeMusica,ordem) " & _
            "Values('" & txtIncluirMusica & "',0)"

  'Executando o código SQL
  executaSql strSql

  'Atualizando a caixa de listagem
  lstMusica.Requery

  'Limpando a caixa de texto
  txtIncluirMusica = Null

End Sub

 



{ads1} 

3 - Incluindo um Artista

Também, para que possamos associar músicas a artistas, é imprescindível que existam artistas para realizar a associação. Então vamos incluir um código que inclui uma música no evento Ao Clicar do botão btnIncluirArtista, utilizando a caixa de texto txtIncluirArtista, utilizando também para isto um código SQL.

Depois de incluir o artista na tabela devemos atualizar a caixa de combinação para que o mesmo esteja disponível.

Private Sub btnIncluirArtista_Click()

  'Declarando a variável para o código SQL
  Dim strSql As String
  
  'Montando o código SQL para inclusão do novo artista
  strSql = "Insert Into Artista(nomeArtista) " & _
            "Values('" & txtIncluirArtista & "')"
  
  'Executando o código SQL
  executaSql strSql
  
  'Atualizando a caixa de combinação
  cbxArtista.Requery
  
  'Exibindo o novo artista na combobox
  cbxArtista = txtIncluirArtista
  
  'Limpando a caixa de texto
  txtIncluirArtista = Null
  
End Sub

4 - Filtrando a Exibição das Músicas

A caixa de listagem lstMusica nos oferece duas opções de exibição: todas as músicas ou somente as músicas ainda não associadas. Isto facilita a classificação, já que nos permite trabalhar sem misturar registros associados com registros não associados.

Quem nos permite controlar estas opções de exibição é o grupo de opção gpoMusica. Ele possui dois botões, btoTodas e btoNaoClassificadas, com os valores 1 e 2, respectivamente.

Clicando em um deles podemos escolher o que será exibido na caixa de listagem verificado qual dos botões foi clicado, através do código inserido no evento Ao Clicar do grupo de opção. O código verifica a opção escolhida e monta um código SQL que será atribuído à propriedade Origem da Linha (RowSource) da caixa de listagem. Um dos códigos busca todos os registros da tabela SucessoMusical e o outro busca apenas os registros em que o campo artista estiver vazio, ou seja, sem nenhuma associação.

Após a atribuição do código de origem da linha a caixa de listagem é atualizada para exibir os registros desejados.

Private Sub gpoMusica_Click()
   
    'Verificando qual botão foi
    'pressionado pelo valor do grupo
    If gpoMusica = 1 Then
       
        'Para o valor 1 o conjunto de registros será
        'composto por todos os registros
        lstMusica.RowSource = "SELECT SucessoMusical.codMusica, " & _
                "SucessoMusical.nomeMusica " & _
                                "FROM SucessoMusical;"
    Else
       
        'Para o valor 2 o conjunto de registros será
        'composto pelos registros sem artista definido
        lstMusica.RowSource = "SELECT SucessoMusical.codMusica, " & _
                "SucessoMusical.nomeMusica " & _
                                "FROM SucessoMusical " & _
                                "WHERE (((SucessoMusical.artista) Is Null));"
    End If
   
    'Atualizando a caixa de listagem
    lstMusica.Requery

End Sub

5 - Escolhendo um Artista

Antes de realizarmos uma associação devemos escolher o artista ao qual a música será associada. Ao escolhermos um artista a caixa de listagem que contém as músicas relacionadas deve ser atualizada. Neste momento qualquer item selecionado na mesma deve ser desmarcado. Isto é muito importante e deve ser feito para evitar conflitos no momento das associações e desassociações.

Os itens selecionados podem ser desmarcados atribuindo o valor False para a propriedade Selected de cada um dos itens da caixa de listagem. Isto é fácil de se fazer utilizando uma instrução For Each na coleção ItemsSelected, a propriedade que contém uma referência aos números de todos os itens selecionados.

Esta tarefa será codificada no evento Após Atualizar da caixa de combinação cbxArtista.

Private Sub cbxArtista_AfterUpdate()
  
  Dim item As Variant
  
  'Desfazendo a seleção dos itens
  For Each item In lstOrdemMusica.ItemsSelected
    lstOrdemMusica.Selected(item) = False
  Next item
  
  'Quando a combobox for alterada a
  'caixa de listagem deve ser atualizada
  lstOrdemMusica.Requery
  
End Sub

 



{ads1} 

6 - Associando uma Música

Para realizar uma associação com os itens selecionados devemos realizar os seguintes passos:

I – Verificar se há um artista selecionado e armazenar o seu valor: podemos fazer isto apenas verificando se o campo cbxArtista não está nulo, já que o artista será obtido no momento da montagem do código SQL;

II – Criar um loop finito para associar cada item selecionado: esta etapa pode ser realizada criando-se um loop For Next, começando de 0 (zero, primeiro item da coleção de selecionados) e o total de itens selecionados menos um. A caixa de listagem possui uma propriedade que  nos fornece o total de itens selecionados:

lstMusica.ItemsSelected.Count

Assim podemos verificar cada um dos itens informando o item atual dentro do loop:

lstMusica.ItemsSelected(i)

A partir da referência ao item buscamos o código da música, o qual se encontra na primeira coluna da caixa de listagem, acessado através da seguinte propriedade:

lstMusica.Column(0, itemLista)

III – Buscamos a última ordem musical para o artista atual: utilizando o DMax, encontramos a maior ordem entre as músicas associadas ao artista, assim obtemos a próxima ordem a ser atribuída.

IV – Montamos e executamos o código SQL para realizar a associação, que consiste em atribuir o nome do artista selecionado ao campo artista e o valor da próxima ordem ao campo ordem;

VI – Atualizamos as duas caixas de listagem.

Veja como fica o código da operação:

Private Sub btnIncluir_Click()
   
    'Declarando as variáveis
    Dim codigoMusica As Integer
    Dim itemLista As Integer
    Dim strSql As String
    Dim i As Integer
    Dim ultimaOrdem As Long
   
    'Verificando se há um artista selecionado
    If IsNull(cbxArtista) Then
        MsgBox "Escolha um artista!", vbExclamation, _
            "Classificação Musical"
        Exit Sub
    End If
   
    'Solicitando confirmação da classificação da música
    If MsgBox("Confirma a classificação da(s) música(s)?", _
        vbYesNo + vbQuestion, "Associação Música/Artista") = vbYes Then
       
        'Para cada item selecionado
        For i = 0 To lstMusica.ItemsSelected.Count - 1
           
            'Armazenando o número do item
            itemLista = lstMusica.ItemsSelected(i)
            'Armazenando o código da música
            codigoMusica = lstMusica.Column(0, itemLista)
           
            'Buscando a última ordem de classificação das músicas
            'do artista atual
            ultimaOrdem = Nz(DMax("ordem", "SucessoMusical", "artista='" & _
                cbxArtista & "'"), 0)
           
            'Montando o sql para a atribuição do artista e a classificação
            'da música na próxima ordem
            strSql = "Update SucessoMusical Set artista='" & cbxArtista & _
                      "', ordem=" & ultimaOrdem + 1 & _
                      " Where codMusica=" & codigoMusica
           
            'Executando o sql
            executaSql strSql
           
        Next i
       
        'Atualizando as caixas de litagem através
        'dos eventos da caixa de combinação do artista
        'e dos botões da caixa de listagem da música
        Call cbxArtista_AfterUpdate
        Call gpoMusica_Click
   
    End If

End Sub

7 - Desassociando uma Música

Para realizar a desassociação de uma música devemos executar passos semelhantes aos da associação. Porém alguns detalhes são diferentes entre as duas operações. Veja como deve ser a sequência:

I – Verificar se há itens selecionados para a desassociação;

II – Criar um loop For Next inverso: a desassociação deve ser feita a partir do último elemento, pois a cada desassociação a ordem dos itens seguintes deve ser reduzida;

III – Obter os valores do item, do código da música e da ordem da música;

IV – Montar e executar o código SQL para realizar a desassociação, que consiste em atribuir Nulo para o campo artista e 0 para a ordem;

VI – Atualizar as duas caixas de listagem, através dos métodos apropriados.

Veja como fica o código da operação:

Private Sub btnExcluir_Click()
   
    'Declarando as variáveis
    Dim codigoMusica As Integer
    Dim ordemMusica As Integer
    Dim itemLista As Integer
    Dim strSql As String
    Dim i As Integer
    Dim musica As String
   
    'Verificando se há itens selecionados para exclusão
    If lstOrdemMusica.ItemsSelected.Count > 0 Then
       
        'Solicitando confirmação do usuário para a exclusão da associação
        If MsgBox("Confirma a desclassificação da(s) música(s)?", _
              vbYesNo + vbQuestion, "Associação Música/Artista") = vbYes Then
       
            'Para cada item selecionado
            For i = lstOrdemMusica.ItemsSelected.Count - 1 To 0 Step -1
               
                'Armazenando o número do item
                itemLista = lstOrdemMusica.ItemsSelected(i)
                'Armazenando o código da música
                codigoMusica = lstOrdemMusica.Column(0, itemLista)
                'Armazenando a ordem da música
                ordemMusica = lstOrdemMusica.Column(1, itemLista)
               
                'Montando o sql para exclusão da classificação da música
                strSql = "Update SucessoMusical Set artista=Null,ordem=0 " & _
            "Where codMusica=" & codigoMusica
               
                'Executando o sql
                executaSql strSql
               
                'Montando o sql para atualização das músicas com ordem
        'superior à excluída
                strSql = "Update SucessoMusical Set ordem=ordem-1 Where artista='" & _
            cbxArtista & "' And ordem > " & ordemMusica
               
                'Executando o sql
                executaSql strSql
               
            Next i
       
        End If
       
        'Atualizando as caixas de litagem através
        'dos eventos da caixa de combinação do artista
        'e dos botões da caixa de listagem da música
        Call cbxArtista_AfterUpdate
        Call gpoMusica_Click
   
    End If
   
End Sub



{ads1} 

8 - Subindo a Ordem da Música

A alteração da ordem das músicas é algo que exige certa atenção, pois é muito fácil incorrermos em erros na manipulação dos itens selecionados, já que utilizaremos um recordset na alteração dos dados. Isto se deve ao fato de o conjunto de registros da caixa de listagem ser somente leitura. Como a posição de um item em uma caixa de listagem ser diferente da posição absoluta em um recordset devemos tomar o cuidado de verificar corretamente as referências de cada uma delas.

A sequência básica da operação de subir a ordem de uma música pode ser definida como:

I – Verificar se não há mais de uma música selecionada: para não dificultar muito o entendimento vamor realizar a operação apenas com um item por vez;

II – Armazenar a posição do item na caixa de listagem: podemos buscar esta posição obtendo o valor do item selecionado na posição 0, que é o primeiro item selecionado;

III – Verificar se o item não é o primeiro da lista:  logicamente o primeiro item não pode ter sua posição alterada para cima;

IV – Criando uma consulta para obter um recordset editável com o mesmo conjunto de registros da caixa de listagem, na mesma ordem;

V – Mover o cursor para a posição do item: a posição no recordset será equivalente à posição na caixa de listagem, mais uma posição;

VI – Armazenar a maior e a menor  ordem: elas serão invertidas, sendo que a maior ordem é a do item selecionado e a menor a do item que será substituído;

VII – Atribuir a menor ordem ao item atual e salvar o recordset;

VIII – Mover o cursor para o item anterior, atribuir a maior ordem ao item atual, que era o anterior, e salvar o recordset, fechando em seguida;

IX – Atualizar a caixa de listagem;

X – Inverter a posição da seleção na caixa de listagem.

Veja como fica o código da operação:

Private Sub btnOrdemAcima_Click()

    'Declarando as variáveis
    Dim rstMusica As New ADODB.Recordset
    Dim ordemMaior As Integer
    Dim ordemMenor As Integer
    Dim itemLista As Integer
    Dim strSql As String
   
    'Verificando se há mais de um item selecionado
    If lstOrdemMusica.ItemsSelected.Count <> 1 Then
        MsgBox "Para alterar a ordem selecione apenas uma música.", _
                vbExclamation, "Classificação Musical"
        Exit Sub
    End If
   
    'Vamos guardar a posição do item selecionado
    'em relação ao conjunto total de itens
    itemLista = lstOrdemMusica.ItemsSelected(0)

    'Verificando se o item não é o primeiro da lista
    If itemLista > 0 Then
       
        'Criando e abrindo uma consulta editável para
        'alterar os valores e posições dos itens
        strSql = "Select * From SucessoMusical Where artista='" & _
        cbxArtista & "' Order By ordem"
        rstMusica.Open strSql, CurrentProject.Connection, _
        adOpenKeyset, adLockOptimistic
       
        'Movendo o cursor da consulta para a
        'posição do item selecionado
        rstMusica.AbsolutePosition = itemLista + 1
       
        'Armazenando a ordem dos dois itens que
        'serão invertidos
        ordemMaior = lstOrdemMusica.Column(1, itemLista)
        ordemMenor = lstOrdemMusica.Column(1, itemLista - 1)
       
        'Atribuindo a nova ordem ao primeiro item
        'Este item ficará com a ordem menor
        rstMusica("ordem") = ordemMenor
        'Salvando a alteração no recordset
        rstMusica.Update
       
        'Movendo para o item anterior
        rstMusica.MovePrevious
        'Atribuindo a nova ordem ao segundo item
        'Este item ficará com a ordem maior
        rstMusica("ordem") = ordemMaior
        'Salvando a alteração no recordset
        rstMusica.Update
       
        'Fechando e destruindo o recordset
        rstMusica.Close
        Set rstMusica = Nothing
       
        'Atualizando a caixa de listagem
        lstOrdemMusica.Requery
       
        'Mudando a seleção dos itens da caixa de listagem
        lstOrdemMusica.Selected(itemLista - 1) = True
        lstOrdemMusica.Selected(itemLista) = False
       
    End If
   
End Sub

 



{ads1} 

9 - Baixando a Ordem da Música

A sequência básica da operação de baixar a ordem de uma música obedece uma sequência praticamente inversa à anterior e pode ser definida como:

I – Verificar se não há mais de uma música selecionada: para não dificultar muito o entendimento vamor realizar a operação apenas com um item por vez;

II – Armazenar a posição do item na caixa de listagem: podemos buscar esta posição obtendo o valor do item selecionado na posição 0, que é o primeiro item selecionado;

III – Verificar se o item não é o último da lista:  logicamente o último item não pode ter sua posição alterada para baixo;

IV – Criando uma consulta para obter um recordset editável com o mesmo conjunto de registros da caixa de listagem, na mesma ordem;

V – Mover o cursor para a posição do item: a posição no recordset será equivalente à posição na caixa de listagem, mais uma posição;

VI – Armazenar a maior e a menor  ordem: elas serão invertidas, sendo que a menor ordem é a do item selecionado e a maior a do item que será substituído;

VII – Atribuir a maior ordem ao item atual e salvar o recordset;

VIII – Mover o cursor para o próximo item, atribuir a menor ordem ao item atual, que era o próximo, e salvar o recordset, fechando em seguida;

IX – Atualizar a caixa de listagem;

X – Inverter a posição da seleção na caixa de listagem.

Veja como fica o código da operação:

Private Sub btnOrdemAbaixo_Click()

    'Declarando as variáveis
    Dim rstMusica As New ADODB.Recordset
    Dim ordemMaior As Integer
    Dim ordemMenor As Integer
    Dim itemLista As Integer
    Dim strSql As String
    
    'Verificando se há mais de um item selecionado
    If lstOrdemMusica.ItemsSelected.Count <> 1 Then
        MsgBox "Para alterar a ordem selecione apenas uma música.", _
                vbExclamation, "Classificação Musical"
        Exit Sub
    End If
    
    'Vamos guardar a posição do item selecionado
    'em relação ao conjunto total de itens
    itemLista = lstOrdemMusica.ItemsSelected(0)

    'Verificando se o item não é o último da lista
    If itemLista < lstOrdemMusica.ListCount - 1 Then
        
        'Criando e abrindo uma consulta editável para
        'alterar os valores e posições dos itens
        strSql = "Select * From SucessoMusical Where artista='" & _
        cbxArtista & "' Order By ordem"
        rstMusica.Open strSql, CurrentProject.Connection, _
            adOpenKeyset, adLockOptimistic
        
        'Movendo o cursor da consulta para a
        'posição do item selecionado
        rstMusica.AbsolutePosition = itemLista + 1
        
        'Armazenando a ordem dos dois itens que
        'serão invertidos
        ordemMaior = lstOrdemMusica.Column(1, itemLista + 1)
        ordemMenor = lstOrdemMusica.Column(1, itemLista)
        
        'Atribuindo a nova ordem ao primeiro item
        'Este item ficará com a ordem maior
        rstMusica("ordem") = ordemMaior
        'Salvando a alteração no recordset
        rstMusica.Update
        
        'Movendo para o próximo item
        rstMusica.MoveNext
        'Atribuindo a nova ordem ao segundo item
        'Este item ficará com a ordem menor
        rstMusica("ordem") = ordemMenor
        'Salvando a alteração no recordset
        rstMusica.Update
        
        'Fechando e destruindo o recordset
        rstMusica.Close
        Set rstMusica = Nothing
        
        'Atualizando a caixa de listagem
        lstOrdemMusica.Requery
        
        'Mudando a seleção dos itens da caixa de listagem
        lstOrdemMusica.Selected(itemLista + 1) = True
        lstOrdemMusica.Selected(itemLista) = False
        
    End If

End Sub

Como podem perceber a manipulação de registros através de caixas de listagem é algo relativamente simples, desde que realizada com atenção e paciência.

Alguns códigos auxiliares foram incluídos para ilustração, como por exemplo a mensagem de confirmação das operações. Estes códigos não são necessários, então fique à vontade para alterar o que desejar.

A partir do exemplo fornecido espero que o leitor seja capaz de aperfeiçoar a técnica e aplicar o conhecimento a seus projetos de maneira satisfatória.

Para facilitar o entendimento, em caso de dúvidas, fique à vontade para consultar o arquivo de exemplo com os códigos implementados.

Exemplo para download: CaixaListagem.zip

Muito obrigado pela atenção e até a próxima!

Seja social. Compartilhe!