Avaliação do Usuário

Estrela ativaEstrela ativaEstrela ativaEstrela ativaEstrela inativa
 


{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

 

Seja social. Compartilhe!