VB - Agenda com ListView e TreeView e mais alguns recursos
Neste artigo vou voltar a falar sobre o controle ListView e TreeView do VB6. Na verdade mais do que falar vou mostrar como podemos usar o ListView para criar um simples programa para Agenda de aniversários com alguns recursos interessantes que embora simples dão um certo destaque na aplicação.
Para saber mais sobre estes controles leia os artigos do site:
A tela principal da aplicação é exibida abaixo:
Nela você pode a relação dos amigos cadastrados no ListView , os detalhes no formulário , e no TreeView você tem uma visão resumida do cadastro separado por sexo.
No canto superior direito você tem o botão - Aniversariantes do Mês - que ao ser clicado abre o formulário exibindo os aniversariantes do mês atual . Você pode então enviar um Email para cada um , bastando selecionar e clicar no botão - Email.
Se você clicar com o botão direito do mouse sobre o listView será exibindo um menu suspenso , tipo pop up, que permite , editar dados , excluir dados e alterar a cor do formulário principal.
O projeto é composto por dois
formulários :
E um módulo : Global.bas |
O código do módulo contém as definições das variáveis objeto para conexão ,comando e recordset e as cores; contém também as rotinas para abrir e fechar a conexão com o banco de dados Agenda.mdb usando o provedor OleDb.
Option Explicit Public connection As New ADODB.connection Public command As New ADODB.command Public recordset1 As New ADODB.Recordset Public recordset2 As New ADODB.Recordset Public Genero As String Public Const ColorJes = &HC0FFFF Public Const ColorJan = &HFF8080 Public Const ColorJef = &H80FF80 Public Const ColorOli = &H8080FF Public Const ColorMac = &H808080 Public Const ColorDef = &HD3A067 Public Sub OpenConnection() With connection .Provider = "Microsoft.Jet.OLEDB.4.0" .Open App.Path & "\Agenda.mdb" End With End Sub 'fecha a conexao com um banco de dados Public Sub CloseConnection() connection.Close End Sub
|
Estrutura da tabela Agenda.mdb usada no projeto. |
Para obter os aniversariantes de um mês ou os aniversariantes de um dia e de um mês da base de dados estamos usando stored procedures armazenadas no banco de dados Agenda.mdb, são elas:
Aniversariantes_dia_Mes | SELECT
Amigos.ID, Amigos.Nome, Amigos.Sobrenome, Amigos.Apelido, Amigos.Endereco,
Amigos.Telefone, Amigos.Nascimento, Amigos.Genero FROM Amigos WHERE (((DatePart("d",[Amigos].[Nascimento]))=DatePart("d",Date())) AND ((DatePart("m",[Amigos].[Nascimento]))=DatePart("m",Date()))); |
Aniversariantes_Mes | SELECT Amigos.ID, Amigos.Nome, Amigos.Sobrenome, Amigos.Apelido, Amigos.Endereco, Amigos.Telefone, Amigos.Nascimento, Amigos.Genero FROM Amigos WHERE (((DatePart("m",Date()))=DatePart("m",[Amigos].[Nascimento]))); |
Para incluir , alterar e excluir dados cadastrados usamos instruções SQL parametrizadas :
ApagaAmigo - recebe o ID de identificação do registro e constrói a instrução SQL que será executada contra a tabela Amigos.
ApagaAmigo - excluir um registro da Agenda. |
Private Sub
ApagaAmigo(ID As Integer) Dim SQL As String OpenConnection SQL = "DELETE * FROM Amigos WHERE ID=?" With command .ActiveConnection = connection .CommandType = adCmdText .CommandText = SQL .Execute , Array(ID) End With cmdLimpar_Click CloseConnection End Sub |
IncluiAmigo - Inclui um novo registro na tabela Amigos usando a instrução SQL - INSERT INTO.
'Inclui um amigo na tabela Amigos Private Sub IncluiAmigo() Dim SQL As String 'abre conexao OpenConnection SQL = "INSERT INTO Amigos (Nome,Sobrenome,Apelido,Nascimento,Genero,Endereco,Telefone)" & " VALUES (?,?,?,?,?,?,?)" With command .ActiveConnection = connection .CommandType = adCmdText .CommandText = SQL .Execute , Array(txtNome.Text, txtSobrenome.Text, txtApelido.Text, dtpNascimento.Value, Genero, txtEndereco.Text, txtTelefone.Text) End With 'limpa o texto depois de salvar cmdLimpar_Click 'fecha a conexao CloseConnection End Sub
|
EditaAmigo - Altera os dados de registro na tabela Amigos usando a instrução SQL - UPDATE <tabela> SET.
' 'Edita amigo da tabela Amigos Private Sub EditaAmigo() Dim SQL As String On Error GoTo trataerro 'abre a conexao OpenConnection SQL = "UPDATE Amigos SET (Nome=?,Sobrenome=?,Apelido=?,Nascimento=?,Genero=?,Endereco=?,Telefone=?) _ Where ID=? " & " VALUES (?,?,?,?,?,?,?,?)" With command .ActiveConnection = connection .CommandType = adCmdText .CommandText = SQL .Execute , Array(txtNome.Text, txtSobrenome.Text, txtApelido.Text, Format(dtpNascimento.Value, "dd/mm/yyyy"), _ Genero, txtEndereco.Text, txtTelefone.Text, ID) End With 'Limpa o texto depois de salvar cmdLimpar_Click 'fecha a conexao CloseConnection Exit Sub trataerro: MsgBox "Não foi possível efetuar a atualização dos dados.", vbCritical, "Atualizando dados" 'Limpa o texto depois de salvar cmdLimpar_Click 'fecha a conexao CloseConnection End Sub
|
A rotina PreencheLista() preenche o ListView - lstVw com dados da tabela Amigos.
Private Sub PreencheLista() Dim i As Integer, j As Integer Dim SQL As String OpenConnection SQL = "SELECT * FROM Amigos" With command .ActiveConnection = connection .CommandType = adCmdText .CommandText = SQL Set recordset1 = .Execute End With cmdLimpar_Click With recordset1 If Not .BOF Then lstVw.ListItems.Clear While Not .EOF j = j + 1 lstVw.ListItems.Add j, "K" & Str(![ID]), IIf(![Sobrenome] = vbNull, ![nome] & " " & ![Apelido], ![nome] & " " & ![Sobrenome] _ & " " & ![Apelido]), IIf(![Genero] = "Masculino", 1, 2), IIf(![Genero] = "Masculino", 1, 2) lstVw.ListItems(j).SubItems(1) = Format(![Nascimento], "Ddd dd Mmm,yyyy") lstVw.ListItems(j).SubItems(2) = ![Genero] lstVw.ListItems(j).SubItems(3) = ![Telefone] If DatePart("m", ![Nascimento]) = DatePart("m", Format(Now, "dd/mm/yy")) Then lstVw.ListItems(j).ForeColor = vbRed End If .MoveNext Wend lblAmigos.Caption = Trim(Str(j)) & " Amigos na Lista" End If End With CloseConnection End Sub
|
A rotina PreencheArvore() preenche o TreeView - trVw - agrupando os registros por gênero.
Private Sub PreencheArvore() Dim i As Integer, j As Integer Dim Parent As Node Dim Child As Node Dim SQL1 As String Dim SQL2 As String OpenConnection SQL1 = "SELECT DISTINCT Genero FROM Amigos" SQL2 = "SELECT * From Amigos" With command .ActiveConnection = connection .CommandType = adCmdText .CommandText = SQL1 Set recordset1 = .Execute .CommandText = SQL2 Set recordset2 = .Execute End With cmdLimpar_Click If Not recordset1.BOF Then trVw.Nodes.Clear While Not recordset1.EOF i = 0: j = 0 Set Parent = trVw.Nodes.Add(, , , recordset1![Genero], IIf(recordset1![Genero] = "Masculino", 1, 2), _ IIf(recordset1![Genero] = "Masculino", 1, 2)) Parent.Expanded = True recordset2.MoveFirst While Not recordset2.EOF If recordset1![Genero] = recordset2![Genero] Then Set Child = trVw.Nodes.Add(Parent.Index, tvwChild, "K" + Str(recordset2![ID]), "[" & IIf(recordset2![Sobrenome] = vbNull, _ recordset2![nome] & " " & recordset2![Sobrenome], recordset2![nome] & " " & recordset2![Sobrenome] & " " & _ recordset2![Apelido]) & "] - [" & Format(recordset2![Nascimento], "Ddd dd Mmm,yyyy") & "] - _ [" & recordset2![Telefone] & "]", IIf(recordset2![Genero] = "Masculino", 1, 2), IIf(recordset2![Genero] = _ "Masculino", 1, 2)) If recordset1![Genero] = "Masculino" Then i = i + 1 Else j = j + 1 End If recordset2.MoveNext Wend If recordset1![Genero] = "Masculino" Then Parent.Text = Parent.Text & " [" & Trim(Str(i)) & "]" _ Else Parent.Text = Parent.Text & " [" & Trim(Str(j)) & "]" recordset1.MoveNext Wend End If CloseConnection End Sub
|
Creio que já falei demais . pegue o código completo aqui : agendalsvw.zip
Você pode melhorar o projeto e corrigir alguns bugs que com certeza irão surgir. È assim que se aprende ...
Até o próximo artigo VB
José Carlos Macoratti