Convidado 29/12/2012, 20:40
Vamos la...
ListView é totalente diferente de listBox.. e todos seus comandos são feitos viaVba e até alguns eventos não estão listado nas propriedades em eventos, por exemplo o DblClick...
Nas declarações do Módulo do form deve declarar os controles active x, lembrando que como é possível inserir imagens na listView, para isso deves colocar tambem o controle imagem
'**********************************************************************************************
' Este controle requere a referência Microsoft Windows Common Controls 6.0 (SP6) MSCOMCTL.ocx
'**********************************************************************************************
' Declara o controle ActiveX
Private lvxObj As MSComctlLib.ListView
Private lstItem As MSComctlLib.ListItem
'**********************************************************************************************
Ao carregar o form deve especifica o nome do objeto
'~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
' Configura o OBjeto List View object
'~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
'Define o objeto listview , observe que faz referencia a lista apropriada, no caso o nome da lista aqui é lstMensalidade
Set lvxObj = Me.lstMensalidade.Object
'Inicializa o controle imagem para icones pequenos lvxObj.SmallIcons = Me.axImageList.Object
'Seta os checkBoxe como false lvxObj.CheckBoxes = Not lvxObj.CheckBoxes
'Chama a função que carrega a lista Call fLoadList
Para as colunas a listView trabalha com Item e subItens... a primeira coluna será entendida como ìtem e o restante como subÍtens
A primeira coluna da lista >>>>>>>>> lvxObj.SelectedItem
Demais colunas >>>>>>>>>>>>>>> lvxObj.SelectedItem.ListSubItems.Item(5)
Onde o numero 5 representa a coluna.
Abaixo segue um código completo de DblClick de uma listView
- Código:
'Duplo click da lista
Private Sub lstMensalidade_DblClick()
On Error GoTo Trataerro
Dim MSG, Msg1 As String
Dim StrValor As Double
Dim StrNumDoc As String
PlaySound fLocalBd & "\div\sons\click.wav", 1, 1
'Carrega na variável a ID da coluna Id_Salario
StrID = lvxObj.SelectedItem
StrNumDoc = lvxObj.SelectedItem.ListSubItems.Item(2)
If XExcluir = False Then
PlaySound fLocalBd & "\div\sons\msg_err.wav", 1, 1
MsgBox "Você não tem permissão para realizar este procedimento", vbCritical, "NEGADO"
Exit Sub
Else
Classifica = True
'----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
'Esta parte é executada caso a mensalidade esteja marcada como paga
If lvxObj.SelectedItem.ListSubItems.Item(9) = "PAGO" Then
'Menssagem direcionada quando o registro encontra-se marcado como pago
'Caso positivo pode estornar ou encerrar a sub
Msg1 = MsgBox("Esta mensalidade ja está marcada como Paga." _
& vbNewLine & "Deseja Estonar este Pagamento?", vbYesNo + vbQuestion, "MENSALIDADE QUITADA")
'Encerra a sub
If Msg1 = vbNo Then
Exit Sub
Else
'Vai para a lina EstornarMensalidade
GoTo EstornarMensalidade
End If
Else
'----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
'Esta parte é executada caso já tenha sido recebido algum valor da mensalidade
'Este comando pega o texto contido dentro de uma determinada coluna da lista no registro clicado
If lvxObj.SelectedItem.ListSubItems.Item(11) <> "" Then
Dim StrValorRes As Double, StrValorPago As Double, StrValorTotal As Double
StrValorRes = CDbl(lvxObj.SelectedItem.ListSubItems.Item(11))
'Mensagem para o recebimento do residual da mensalidade quando ja fora recebido parte da mesma
Msg1 = MsgBox("Receber o Residual da Mensalidade?." _
& vbNewLine & "" _
& vbNewLine & "Caso recebimento parcial, tecle >> NÂO <<" _
& vbNewLine & "" _
& vbNewLine & "Caso deseje estornar o valor" _
& vbNewLine & "já recebido Tecle >> CANCELA <<", vbYesNoCancel + vbQuestion, "ATENÇÃO")
If Msg1 = vbNo Then
StrValor = CDbl(InputBox("Informe o valor Recebido:", "Atenção!"))
'Checa se valor digitado na imputbox é maior que o valor residual da parcela
'Caso positivo emite mensagem e encerra a sub
If StrValor > lvxObj.SelectedItem.ListSubItems.Item(11) Then MsgBox "O Valor digitado é maior que" _
& vbNewLine & "o valor residual do débito." _
& vbNewLine & "Esta operação será cancelada", vbCritical, "CANCELADO": Exit Sub
DoCmd.SetWarnings False
'Atualiza a tblMensalidade
CurrentDb.Execute "UPDATE tblMensalidade SET tblMensalidade.CpValorPago = " & Str(StrValor) & " + CpValorPago, CpDataPagto = #" & Format(Date, "dd/mm/yyyy") & "#" _
& " WHERE tblMensalidade.ID_Mens = " & StrID & ";"
'Lança o recebimento da mensalidade no caixa
DoCmd.RunSQL ("INSERT INTO Lancamento (Data,DataVenc, Conta, NumDoc, Historico,Entrada, TipoDoc, cpUsuario,CpIdMens)" _
& " Values(""" & Format(Date, "dd/mm/yyyy") & """,""" & Format(lvxObj.SelectedItem.ListSubItems.Item(6), "dd/mm/yyyy") & """,'RECEITAS',""" & StrNumDoc & """," _
& "'Rec.Parcial Mensalidade - " & tx1 & "',""" & Str(StrValor) & """," _
& "'1',""" & Usuario & """,""" & StrID & """)")
DoCmd.SetWarnings True
Call fLoadList
Classifica = False
PlaySound fLocalBd & "\div\sons\msg_afi.wav", 1, 1
ElseIf Msg1 = vbYes Then
'Menssagem de confirmação para o pagamento da mensalidade
'Caso positivo exdecuta consulta de atualização para sim e executa atualização na tabela no registro específico
DoCmd.SetWarnings False
'Essa consulta atualiza o registro salario para pago
StrValorPago = CDbl(DLookup("CpValorPago", "tblMensalidade", "ID_Mens = " & StrID & ""))
StrValorTotal = StrValorPago + StrValorRes
'Atualiza a tblMensalidade
CurrentDb.Execute "UPDATE tblMensalidade SET tblMensalidade.CpSituaçao = 1, tblMensalidade.CpValorPago = """ & Str(StrValorTotal) & """," _
& " CpDataPagto = #" & Format(Date, "dd/mm/yyyy") & "# WHERE tblMensalidade.ID_Mens = " & StrID & ";"
'Essa consulta lança o valor da mensalidade no caixa
DoCmd.RunSQL ("INSERT INTO Lancamento (Data,DataVenc, Conta, NumDoc, Historico,Entrada, TipoDoc, cpUsuario,CpIdMens)" _
& " Values(""" & Format(Date, "dd/mm/yyyy") & """,""" & Format(lvxObj.SelectedItem.ListSubItems.Item(6), "dd/mm/yyyy") & """,'RECEITAS',""" & StrNumDoc & """," _
& "'Rec. Mensalidade - " & tx1 & "',""" & lvxObj.SelectedItem.ListSubItems.Item(11) & """," _
& "'1',""" & Usuario & """,""" & StrID & """)")
DoCmd.SetWarnings True
'Som
PlaySound fLocalBd & "\div\sons\msg_afi.wav", 1, 1
'Carrega a listView
Call fLoadList
Classifica = False
ElseIf Msg1 = vbCancel Then GoTo EstornarMensalidade
End If
Exit Sub
Else
'----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
'Esta parte é executada para o recebimento total da mensalidade
Dim StrValorTotal1
If DCount("*", "CNR1", "Id_Mensalidade = " & StrID & "") = 0 Then GoTo Continuar
If DCount("*", "CNR1", "Id_Mensalidade = " & StrID & "") = 1 Then
Msg1 = MsgBox("Existe Boleto emitido para esta Mensalidade." _
& vbNewLine & "Caso o Boleto tenha sido quitado no Banco," _
& vbNewLine & "De a quitação na aba <<BOLETOS EMITIDOS>>" _
& vbNewLine & " " _
& vbNewLine & "Boleto pago no Banco?", vbYesNo, "BOLETO EMITIDO PARA MENSALIDADE")
If Msg1 = vbYes Then: Exit Sub
If Msg1 = vbNo Then
Continuar:
Msg1 = MsgBox("Receber a totalidade da Mensalidade?." _
& vbNewLine & "Caso recebimento parcial, tecle >> NÂO <<", vbYesNo + vbQuestion, "ATENÇÃO")
If Msg1 = vbNo Then
StrValor = CDbl(InputBox("Informe o valor Recebido:", "Atenção!"))
'Checa se valor digitado na imputbox é maior que o valor da mensalidade + lanche
'Caso positivo emite mensagem e encerra a sub
StrValorTotal1 = CDbl(lvxObj.SelectedItem.ListSubItems.Item(4)) + CDbl(lvxObj.SelectedItem.ListSubItems.Item(5))
If StrValor > StrValorTotal1 Then PlaySound fLocalBd & "\div\sons\msg_err.wav", 1, 1: MsgBox "O Valor digitado é maior que" _
& vbNewLine & "o valor do débito, esta" _
& vbNewLine & "operação será cancelada", vbCritical, "CANCELADO": Exit Sub
DoCmd.SetWarnings False
'Atualiza a tblMensalidade para paga
CurrentDb.Execute "UPDATE tblMensalidade SET tblMensalidade.CpValorPago = " & Str(StrValor) & ", CpDataPagto = #" & Format(Date, "dd/mm/yyyy") & "#" _
& " WHERE tblMensalidade.ID_Mens = " & StrID & ";"
Call fLoadList
'Lança o rcebimento no caixa
DoCmd.RunSQL ("INSERT INTO Lancamento (Data,DataVenc, Conta, NumDoc, Historico,Entrada, TipoDoc, cpUsuario,CPIdMens)" _
& " Values(""" & Format(Date, "dd/mm/yyyy") & """,""" & Format(lvxObj.SelectedItem.ListSubItems.Item(6), "dd/mm/yyyy") & """,'RECEITAS',""" & StrNumDoc & """," _
& "'Rec.Parcial Mensalidade - " & tx1 & "',""" & StrValor & """," _
& "'1',""" & Usuario & """,""" & StrID & """)")
DoCmd.SetWarnings True
PlaySound fLocalBd & "\div\sons\msg_afi.wav", 1, 1
Exit Sub
Else
'Menssagem de confirmação para o pagamento da mensalidade
'Caso positivo exdecuta consulta de atualização para sim
MSG = MsgBox("Confirma pagamento desta Mensalidade?" & Chr(10) & Chr(10) & "Mês Ref.: " & lvxObj.SelectedItem.ListSubItems.Item(3) & "" _
& vbNewLine & "Valor ....: " & lvxObj.SelectedItem.ListSubItems.Item(4) & "" _
& vbNewLine & "Lanche ....: " & lvxObj.SelectedItem.ListSubItems.Item(5), vbExclamation + vbYesNo + vbDefaultButton2, "PAGAMENTO")
'Caso negativa a resposta encerra a sub
If MSG = vbNo Then Exit Sub
'Caso positiva executa atualização na tabela no registro específico
DoCmd.SetWarnings False
'Essa consulta atualiza o registro salario para pago
CurrentDb.Execute "UPDATE tblMensalidade SET tblMensalidade.CpSituaçao = 1, CpDataPagto = #" & Format(Date, "dd/mm/yyyy") & "#, CpValorPago = CpValor + CpLanche" _
& " WHERE tblMensalidade.ID_Mens = " & StrID & ";"
'Essa consulta lança o valor da mensalidade no caixa
StrValorTotal1 = CDbl(lvxObj.SelectedItem.ListSubItems.Item(4)) + CDbl(lvxObj.SelectedItem.ListSubItems.Item(5))
DoCmd.RunSQL ("INSERT INTO Lancamento (Data,DataVenc, Conta, NumDoc, Historico,Entrada, TipoDoc, cpUsuario, CpIdMens)" _
& " Values(""" & Format(Date, "dd/mm/yyyy") & """,""" & Format(lvxObj.SelectedItem.ListSubItems.Item(6), "dd/mm/yyyy") & """,'RECEITAS',""" & StrNumDoc & """," _
& "'Rec. Mensalidade - " & tx1 & "',""" & StrValorTotal1 & """," _
& "'1',""" & Usuario & """,""" & StrID & """)")
'Esta consulta marca o boleto como pago, caso seja efetuado o recebimento na escola
CurrentDb.Execute "UPDATE CNR1 SET CpQuitado = 1, CpDtaPag = Format(Date(),'mm/dd/yyyy') WHERE Id_Mensalidade = " & StrID & ";"
'Faz um requery na lstBoletos
Me.lstBoletos.Requery
DoCmd.SetWarnings True
'Som
PlaySound fLocalBd & "\div\sons\msg_afi.wav", 1, 1
'Carrega a listView
Call fLoadList
Classifica = False
Exit Sub
'Estorna o pagamento fazendo atualização do registro clicado para não
EstornarMensalidade:
'Atualiza a tblMensalidade para o estorno
CurrentDb.Execute "UPDATE tblMensalidade SET tblMensalidade.CpSituaçao = 0, CpDataPagto = Null, CpValorPago = Null" _
& " WHERE tblMensalidade.ID_Mens = " & StrID & ";"
'Atualiza a CNR1 para o estorno
CurrentDb.Execute "UPDATE CNR1 SET CpQuitado = 0, CpDtaPag = Null WHERE Id_Mensalidade = " & StrID & ";"
'Exclui o lançamento do Caixa
CurrentDb.Execute " DELETE * From Lancamento WHERE CpIDMens = " & StrID & ";"
'Carrega a listView
Call fLoadList
Me.lstBoletos.Requery
'Atualiza a lista
'Menssagem de confirmação
MsgBox "Mensalidade Estornada", vbInformation, "ESTORNADA"
End If
End If
End If
End If
End If
End If
Exit Sub
'Tratamento de erros
Exit_TrataErro:
DoCmd.Hourglass False
DoCmd.Echo True
Exit Sub
Trataerro:
If err.Number = 91 Then
Exit Sub
ElseIf err.Number = 13 Then
Exit Sub
Else
DoCmd.Hourglass False
DoCmd.Echo True
MSG = "Erro # " & Str(err.Number) & " gerado na: lstMensalidade_DblClick()" _
& vbNewLine & vbNewLine & "Descrição: " & err.Description _
& vbNewLine & vbNewLine & "Por favor contate o Administrador de Sistema."
MsgBox MSG, vbMsgBoxHelpButton + vbCritical, "Erro", err.Helpfile, err.HelpContext
Resume Exit_TrataErro
End If
End Sub
Bons Estudos.