c Y Y Eu já publiquei diversos artigos/tutoriais mostrando como realizar as operações básicas de manutenção de dados: inclui, excluir, alterar, exibir, navegar e imprimir no Visual Basic .NET, mas parece que não fui suficientemente didático e claro para que as dúvidas dos iniciantes fossem esclarecidas pois continuo a receber e-mails solicitando exemplos relacionados ao assunto.Y O que fazer ? Y Bem, vou tentar mais uma vez mostrar como você pode usar o Visual Basic 2008 Express Edition para ar um banco de dados e realizar as principais operações de manutenção de dados.Y O exemplo deste artigo não vai usar os assistentes doc pois eu já mostrei como fazer isso no artigo : VB .NET 2008 - Aplicação completa com o a dados ; este artigo vai mostrar como você pode fazer isso via código sem a ajuda dos assistentes.Y ÿara tornar a apresentação mais fácil vamos dividir em etapas as tarefas que iremos realizar neste tutorial:Y Y Y Y Y Y Y
Y - Y - Y -! Y -"!# ! Y - #$ # Y
Vou criar uma pequena aplicação para cadastrar alunos usando o banco de dados Microsoft Access. O banco de dados irá conter uma tabela chamada que tem a seguinte estrutura:Y
Y
Y
Y A primeira coisa a fazer é criar o banco de dados e a tabela, e, você pode fazer isso de diversas maneiras, para saber mais veja os meus artigos:Y Y Y Y
riar banco de dados via ódigo - Access , SQL ServerY riando banco de dados e tabelas com o AccessY Tabelas: Trabalhando com tabelasY
Ê YNo c %&c ' também podíamos criar banco de dados Access usando o c()- como Add-In no IDE do VB. Lembra ? ÿara lembrar leia o artigo : Y Y Y
SQL revisitado- onceitos básicos sobre SQL com exemplos práticos no c . riando um Banco de dados com o VisData, Y
Y
ÿara saber como criar banco de dados usando o
ou o )*+)"leia os artigos:Y Y Y Y
riando banco de dados no SQL Server 2000 Y riando banco de dados e tabelas com o Access riando Banco de Dados e Tabelas. Y
Y
ÿara criar via código leia o artigo: riando seus arquivos - Veja como criar seu banco de dados e suas tabelas no Visual Basic usando o DAO.YY
- Y
om o banco de dados e a tabela criada já podemos definir a interface com o usuário. Nossa aplicação terá apenas um único formulário chamado "que usará o seguinte leiaute:Y
Os controles usados neste formulário são:Y - Label - Usadas para identificação;Y - TextBox - Exibe os campos : nome, endereço e nascimento;Y - RadioButton - Usados como opções para Sexo e Ano;Y - Button - botões de comando;Y - ÿictureBox - Exibir a imagem do aluno;Y
Y
Veja a aplicação em execução exibindo os dados de um usuário com foto;Y
Y
Agora uma visão mostrando a utilização do recurso de imprimir um relatório no modo de visualização:Y
Y
- Y Vamos usar o recurso ,- para armazenar os valores referente a variável que irá exibir o nome da escola e a variável . que irá conter o caminho da localização das fotos dos alunos. Y Na janela Solution Explorer clique duas vezes sobre ,- e a seguir clique na aba )! . A seguir defina as variáveis conforme mostra a figura abaixo.Y
Y
Os valores serão armazenados no arquivo ! conforme mostra a figura a seguir:Y
Y
ÿara obter os valores armazenados basta usar o recurso )! da seguinte forma:Y - Dim localfotos As String = My.Settings.FotosY - Dim escola as String = My.Settings.Escola.ToStringY E a string de conexão com o banco de dados como será definida. Tudo depende de onde o banco de dados estará localizado. Neste exemplo o banco de dados estará na pasta da aplicação em /0"0 0 , então podemos definir a string de conexão da seguinte forma:Y
Dim stronn as String = "ÿrovider=Microsoft.Jet.OLEDB.4.0; Data Source = " + Application.Startupÿath + "\..\..\Alunos.mdb")Y O ),1 retorna o caminho qualificado para o diretório onde o programa inicia a execução. omo estamos debugando o diretório de partida é o diretório /0"0 00-! , mas o banco de dados esta na pasta da aplicação em /0"0 0 , por isso retornamos dois níveis: \..\..\Alunos.mdbY
Nota: ÿara saber mais leia meu artigo : c
Y
Os usados no projeto serão :Y
Imports System.Data Imports System.Data.OleDbY Eles serão usados para ar as classes e os provedores para ar o banco de dados Microsoft Access .Y Quando a aplicação for executada o evento + do formulário será usado para carregar os dados da tabela e preencher os controles do formulário com os dados.Y No próximo artigo irei mostrar o código necessário para efetuar a conexão com o banco de dados , selecionar os dados da tabela e exibir no formulário.Y Veja a continuação do artigo em :c ,Y Y
c Y Y omo na primeira parte deste artigo já foram definidos os alicerces para a aplicação nesta segunda parte vou abordar o código usado para fazer a aplicação funcionar.Y omo a aplicação possui somente um formulário chamado " a execução da aplicação irá iniciar o carregamento deste formulário pelo evento + .Y
- ! Y Neste evento , eu coloquei o código que irá ar o banco de dados estabelecendo uma conexão , defini um comando SQL para selecionar os registros da tabela e através de um - preencher um objeto - com os dados retornados. omo estou efetuando uma conexão com um banco de dados Microsoft Access usei o provedor 2-. Y Em seguida efetuei a vinculação dos dados com os controles definidos no formulário para exibição dos mesmos e para gerenciar a navegação defini um objeto !.Y
O modelo de objetos Î 3 . a dois gerenciadores de vinculação de dados:Y , ! - Usado para fazer a vinculação de controles simples não sendo possível usar com controles X !Y Y ! - Usado para fazer a vinculação de controles simples e complexos que am a interface IList como : " "X # Y Y
O código associado ao evento esta descrito e comentado abaixo:Y ÿrivate Sub frmadastroAlunos_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.LoadY
YY 'conecta com o banco de dados e abre a conexão Y Alunosonnection = New OleDbonnection("," 4 52+- 6-)478),18 7000 ")Y Alunosonnection.Open()Y 'define um objeto command Y Alunosommand = New OleDbommand(7)+ 9.:2 2:-: ;7, Alunosonnection) Y 'define um dataAdapter Y AlunosAdapter = New OleDbDataAdapter()Y AlunosAdapter.Selectommand = AlunosommandY 'define e preenche um DataTable com os dados Y AlunosTabela = New DataTable()Y AlunosAdapter.Fill(AlunosTabela)Y 'vincula os dados aos controles do formulárioY txtNome.DataBindings.Add("Text", AlunosTabela, "Nome") Y txEndereco.DataBindings.Add("Text", AlunosTabela, "Endereco") ' $ % & ' Y lblSexo.DataBindings.Add("Text", AlunosTabela, "Sexo")Y lblGrau.DataBindings.Add("Text", AlunosTabela, "Grau")Y dtpNascimento.DataBindings.Add("Text", AlunosTabela, "Nascimento") Y lblFoto.DataBindings.Add("Text", AlunosTabela, "Foto")Y 'estabelece o currencyManagerY AlunosManager = Directast(Me.Bindingontext(AlunosTabela), !)Y 'Defini a exibição dos dados nos controles lable para sexo e grau e exibe a foto do aluno Y all ExibirDados() Y 'define o estado de exibição dos dados: visualizar (Ver) e EditarY all definirEstado("Ver")Y End Sub Y
Você pode conhecer mais sobre cada um dos itens citados lendo os meus artigos:Y
Y
-2 <" !/2-
Y
NET ÿrovedores de Dados para conexãoY
Y
< ! - " ! - !c
Y Y Y
VB.NET - Operações com dados que retornam registrosY VB.NET - Operações com dados que não retornam registros.Y Operações básicas com Banco de dados e VB.NETY
Y
Agora emos ao código da rotina- =>:Y ÿrivate Sub ExibirDados()Y 'sexoY If lblSexo.Text = "M" ThenY rdoMasculino.hecked = TrueY ElseY rdoFeminino.hecked = TrueY End If
Y 'grauY Select ase lblGrau.TextY ase "1"Y rdoÿrimeiro.hecked = TrueY YYYYase "2" Y rdoSegundo.hecked = TrueY YYYYase "3" Y rdoTerceiro.hecked = TrueY ase "4"Y rdoQuarto.hecked = TrueY YYYYase "5" Y rdoQuinto.hecked = TrueY YYYase "6"Y rdoSexto.hecked = TrueY End Select
Y all ExibirFoto()Y End Sub Y
YY
Esta rotina atribui valores aos controles : usados para definir o ) e &?que o aluno esta cursando. Note que o código usa dois controles X : ) e ?@ que não são visíveis em tempo de execução, para verificar qual o valor obtido da tabela e exibir a informação no : equivalente.Y YY Agora é a vez da rotina .=>:Y YY ÿrivate Sub ExibirFoto()
Y If lblFoto.Text <> "" ThenY YYYYYYTryY picItem.Image = Image.FromFile(localfotos & lblFoto.Text)Y YYYYYYatch ex As ExceptionY picItem.Image = NothingY MessageBox.Show(ex.Message, "Erro ao carregar Foto.", MessageBoxButtons.OK, MessageBoxIcon.Error)Y YYYYYYEnd TryY ElseY picItem.Image = Nothing Y End IfY End Sub Y
O código verifica se a Label: . esta vazia ( ÿoderíamos ter usado também: (.( )! 1>Y Se for verdadeiro carregamos a imagem no controle (@ cujo caminho foi definido na variável @ usando o nome da imagem carregado em ., caso contrário atribuímos um 1! ao controle.Y Lembre que ainda estamos executando o código no evento + e a última rotina chamada é : =>/Y ÿrivate Sub definirEstado(ByVal AppEstado As String)Y mEstado = AppEstadoY Select ase AppEstadoY ase "Ver"Y btnÿrimeiro.Enabled = TrueY btnAnterior.Enabled = TrueY btnÿroximo.Enabled = TrueY btnUltimo.Enabled = TrueY
btnEdita.Enabled = TrueY btnSalva.Enabled = FalseY btnancela.Enabled = FalseY btnInclui.Enabled = TrueY btnDeletar.Enabled = TrueY btnImprimir.Enabled = TrueY btnSair.Enabled = TrueY txtNome.ReadOnly = TrueY txEndereco.ReadOnly = TrueY dtpNascimento.Enabled = FalseY btnarregaFoto.Enabled = FalseY grpSexo.Enabled = FalseY grpGrau.Enabled = FalseY ase "Editar", "Incluir" Y btnÿrimeiro.Enabled = FalseY btnAnterior.Enabled = FalseY btnÿroximo.Enabled = FalseY btnUltimo.Enabled = FalseY btnEdita.Enabled = FalseY btnSalva.Enabled = TrueY btnancela.Enabled = TrueY btnInclui.Enabled = FalseY btnDeletar.Enabled = FalseY btnImprimir.Enabled = FalseY btnSair.Enabled = FalseY txtNome.ReadOnly = FalseY txEndereco.ReadOnly = FalseY dtpNascimento.Enabled = TrueY btnarregaFoto.Enabled = TrueY grpSexo.Enabled = TrueY grpGrau.Enabled = TrueY End Select
Y txtNome.Focus()Y End Sub Y
Neste código verificamos se o estado é igual a c , para visualizar os dados apenas, ou &(usados para edição e inclusão de dados. onforme o caso as propriedades e : 2 dos controles são alteradas e o foco é colocado no controle .Y Ao terminar a execução do código será apresentado o seguinte formulário:Y
Y
- "!# ! Y Vejamos a seguir o código associado ao evento A dos botões de comando que permitem a navegação pelos registros:Y ÿrivate Sub btnÿrimeiro_lick(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnÿrimeiro.lick Y AlunosManager.ÿosition = 0Y YYYall ExibirDados() Y End Sub
Y ÿrivate Sub btnAnterior_lick(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnAnterior.lick Y AlunosManager.ÿosition -= 1Y YYYall ExibirDados() Y End Sub
Y ÿrivate Sub btnÿroximo_lick(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnÿroximo.lick Y AlunosManager.ÿosition += 1Y YYYYall ExibirDados()Y
End Sub
Y ÿrivate Sub btnUltimo_lick(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnUltimo.lick Y AlunosManager.ÿosition = AlunosManager.ount - 1Y YYYYall ExibirDados()Y End Sub Y
Em cada um dos botões , quando o usuário clicar, o objeto urrencyManager - ! - irá permitir a navegação pelos registros chamado a rotina - para que os controles sejam preenchidos com os dados atualizados.Y Diferente do objeto Recordset da ADO , a interface (+ não mantém o controle sobre o registro atual , não possuindo assim os métodos ( ) * X da ADO. Ao invés disso o ! usa a propriedade , para manter o controle sobre os registros; incrementando e decrementando esta propriedade permite a navegação pelos registros da tabela.Y
- #$ # Y Agora vamos as operações para manutenção dos dados , começando pela edição realizada quando o usuário clica no botão . Quando isso ocorre a seguinte tela é exibida:Y
Note que os botões de comando para navegação , edição , inclusão(Novo) , impressão, deleção e Sair foram desabilitados.Y Os botões )"@ !. foram habilitados;Y O o para alterar o Sexo e o Ano foram também habilitados;Y Isso permite a alteração dos dados do formulário com opção para )" o a operação.Y
Y
O código associado ao evento A do botão é o seguinte:Y ÿrivate Sub btnEdita_lick(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnEdita.lick Y all definirEstado("Editar")Y End Sub Y
O código apenas chama a rotina () ando o parâmetro 7 7 para indicar que estamos no estado de edição dos dados.Y Abaixo temos um exemplo de tela mostrando a edição sendo realizada com alteração da data de nascimento através do controle -,A - , e da caixa de diálogo 2.-! - ! - exibindo uma relação de imagens:Y
Y
O código para Salvar os dados associado ao evento A do botão - )" - é dado a seguir:Y ÿrivate Sub btnSalva_lick(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnSalva.lick Y Y 'verifica o item EndereçoY If txEndereco.Text.Trim = "" ThenY MessageBox.Show("Informe o endereço.", "Erro Entrada", MessageBoxButtons.OK, MessageBoxIcon.Information) Y txEndereco.Focus()Y YYYYYExit SubY End IfY
YY Dim itemSalvo As String = txEndereco.TextY Dim linhaSalva As IntegerY YY 'encerra edição do urrencyManagerY AlunosManager.EndurrentEdit()Y YY 'define o modo de exibição ordenado por NomeY AlunosTabela.DefaultView.Sort = "Nome" Y YY 'obtem o id da linha SalvaY
linhaSalva = AlunosTabela.DefaultView.Find(itemSalvo)Y YY 'atribui a posição da linha em edição ao urrencyManagerY AlunosManager.ÿosition = linhaSalvaY all ExibirDados() Y all definirEstado("Ver")Y End Sub Y
O código verifica se foi informado um valor para o endereço do aluno para prosseguir; em seguida armazena o valor na variável itemSalvo e encerra a edição do ! salvando os dados.Y Após definir a ordenação pelo nome procura-se o item salvo atribuindo o seu valor a propriedade , do ! para em seguida exibir os dados e definir o estado como visualização.Y O botão possui o código abaixo:Y ÿrivate Sub btnancela_lick(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnancela.lick Y AlunosManager.ancelurrentEdit()Y If mEstado = "Incluir" ThenY AlunosManager.ÿosition = mMarcadorY End If
Y all ExibirDados() Y all definirEstado("Ver")Y
YY End Sub Y
O código usa o método () para cancelar a edição desfazendo qualquer alteração e verifica se o estado é igual a "´ " para atribuir o valor da variável a propriedade , . Esta variável a iniciada quando o processo de inclusão começa , desta forma podemos voltar a exibir os registros na posição anterior ao início da operação de inclusão.Y O botão " é usado para incluir um registro da tabela e tem o seguinte código:Y ÿrivate Sub btnInclui_lick(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnInclui.lick
Y 'define a posicao atual do currencyManagerY mMarcador = AlunosManager.ÿositionY
'define o estado no modo inclusão Y all definirEstado("Incluir")Y 'inclui um novo registro no currenymanagerY AlunosManager.AddNew()Y 'define as propriedades Y rdoMasculino.hecked = True : lblSexo.Text = "M"Y rdoÿrimeiro.hecked = True : lblGrau.Text = "1" Y picItem.Image = NothingY lblFoto.Text = ""Y End Sub Y
Ao iniciar a inclusão obtemos a posição atual do ! e atribuímos a variável . Fazemos isso para poder retornar a posição atual dos registros se a inclusão for cancelada.Y Em seguida definimos o modo como 'Incluir' e incluímos um novo registro no ! definindo em seguidas as propriedades padrão para Sexo e Ano e Foto.Y Na última parte deste artigo vou mostrar o código dos botões : ´
c BY Y Na segunda parte deste artigo definimos a carga de dados, a navegação pelos registros e as operações básicas de manutenção de dados. Neste último artigo veremos o código dos botões : ´ Y Lembrando que a aplicação possui somente um formulário chamado " e que estamos usando o Visual Basic 2008 Express Edition.Y
-
Y A seguir eu vou mostrar o código usado para imprimir os dados , inclusive a foto do cadastro de alunos. Em meu artigo ´ YY Y Y Y YYYYYeu apresento o namespace ) -3!,! e a classe ,- e o componente ,,"3-!. Eles são os pilares da impressão no VB .NET.Y
No artigo YY YYY YYc eu mostro como você pode criar um editor de textos com recursos de impressão usando as classes e em meu artigo ´ YYY a eu volto ao assunto descrevendo o processo usado para imprimir no VB. Então repetindo o que eu já disse:Y ÿara imprimir no VB.NET temos a seqüência que deve ser seguida: Y 1- ÿrimeiro, você deve instanciar um objeto,-Y 2- A seguir você tem que criar uma instância de um objeto ,-! e definir a referência para o objeto ,-:YY Dim doc As ÿrintDocument = New ÿrintDocument Dim printer As ÿrintDialog = New ÿrintDialog printer.Document = doc
Y 3- Em seguida você deve mostrar a caixa de diálogo onde o usuário pode selecionar a impressora e suas propriedades: )13-!=>Y 4- Agora você precisa subscrever o evento ,-,!,! o qual será disparado para cada nova página:YY C ,,!@
2,,!C Y 5- hamar o método,Y 6- Implementar o tratamento de evento para o evento ,-,,! onde nos desejamos imprimir o texto.Y Então inclua no formulário o componente ,,"3-! alterando o seu nome para !c D. Agora no evento A do botão Imprimir inclua o código:Y ÿrivate Sub btnImprimir_lick(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnImprimir.lick Y Y 'Declara o printdocumentY Dim AlunosDocument As Drawing.ÿrinting.ÿrintDocumentY 'ria o documento e da nome ao mesmo Y AlunosDocument = New Drawing.ÿrinting.ÿrintDocument()Y AlunosDocument.DocumentName = "Alunos"Y 'incluir o manipulador de eventos Y
C -,,!@
2 ( Y 'Imprime no modo de visualizaçãoY Dim Savedÿosition As Integer = AlunosManager.ÿositionY dlgVisualiza.Document = AlunosDocumentY dlgVisualiza.ShowDialog()Y 'libera o documento apos imprimirY AlunosDocument.Dispose()Y AlunosManager.ÿosition = SavedÿositionY End Sub Y
Agora temos que codificar a rotina ( que irá realizar o trabalho de impressão. O código é o seguinte:Y ÿrivate Sub ImprimirAlunos(ByVal sender As Object, ByVal e As Drawing.ÿrinting.ÿrintÿageEventArgs)
Y 'desenha a bordarY Dim Myÿen As ÿen = New ÿen(olor.Black, 3)Y e.Graphics.DrawRectangle(Myÿen, e.MarginBounds.X, e.MarginBounds.Y, 450, 480)Y Dim MyFont As Font = New Font("Arial", 12, FontStyle.Bold)Y Dim S As String = My.Settings.Escola.ToString Y Dim SSize As SizeF = e.Graphics.MeasureString(S, MyFont)
Y e.Graphics.DrawString(S, MyFont, Brushes.Black, e.MarginBounds.X + Int(0.5 * (250 - SSize.Width)), e.MarginBounds.Y + 15) Y 'posiciona a imagemY e.Graphics.DrawImage(picItem.Image, e.MarginBounds.X + 25, e.MarginBounds.Y + 50, 400, 300)Y e.HasMoreÿages = FalseY 'define os campos a serem impressos Y MyFont = New Font("Arial", 14)Y Dim Y As Integer = e.MarginBounds.Y + 400Y S = txtNome.Text + " " + txEndereco.TextY SSize = e.Graphics.MeasureString(S, MyFont)Y e.Graphics.DrawString(S, MyFont, Brushes.Black, e.MarginBounds.X + Int(0.5 * (300 - SSize.Width)), Y)Y Y += Int(MyFont.GetHeight(e.Graphics))Y 'S = txtLastName.Text Y 'SSize = e.Graphics.MeasureString(S, MyFont)Y
' e.Graphics.DrawString(S, MyFont, Brushes.Black, e.MarginBounds.X + Int(0.5 * (300 - SSize.Width)), Y)Y 'Y += Int(MyFont.GetHeight(e.Graphics))Y S = lblGrau.Text + "o Grau " Y SSize = e.Graphics.MeasureString(S, MyFont)Y e.Graphics.DrawString(S, MyFont, Brushes.Black, e.MarginBounds.X + Int(0.5 * (300 - SSize.Width)), Y)Y End Sub Y
Ao clicar no botão Imprimir o resultado obtido será o seguinte:Y
Y Usando o recurso do R para aumentar a imagem você pode obter:Y
Y
Y O código do botão - é exibido a seguir. Após confirmação usamos o método :" do ! e em seguida chamamos a rotina - ().Y ÿrivate Sub btnDeletar_lick(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnDeletar.lick
Y If MessageBox.Show("onfirma e exclusão deste registro ? ", "Deletar", MessageBoxButtons.YesNo, MessageBoxIcon.Question, MessageBoxDefaultButton.Button2) = Windows.Forms.DialogResult.Yes ThenY AlunosManager.RemoveAt(AlunosManager.ÿosition)Y all ExibirDados()Y
End IfY all definirEstado("Ver")Y End Sub Y
! Y Quando clica no botão !. é aberto uma janela de diálogo para que um arquivo de foto seja selecionado. Após selecionar uma imagem clique no botão Salvar. O código que faz tudo isso é dado abaixo:Y ÿrivate Sub btnarregaFoto_lick(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnarregaFoto.lickY Y Dim nomeImagem As String Y dlgAbrir.InitialDirectory = localfotosY TryY If dlgAbrir.ShowDialog = Windows.Forms.DialogResult.OK ThenY YYYYYYYYYY 'obtem o caminho e nome da imagem Y nomeImagem = dlgAbrir.FileNameY YYYYYYYYYYYY'obtem a posição da / na stringY YYYYYYYYYYYYDim posicaoBarra As Integer = nomeImagem.LastIndexOf("\")Y YYYYYYYYYYY'extrai somente o nome do arquivo da string e atribui a lblFotoY lblFoto.Text = nomeImagem.Substring(posicaoBarra + 1)Y YYYYYYYYYYYY'chama a rotina para exibir a foto Y YYYYYYYYYYYall ExibirFoto()Y YYYYEnd IfY atch ex As ExceptionY MessageBox.Show(ex.Message, "Erro ao abrir Foto.", MessageBoxButtons.OK, MessageBoxIcon.Error)Y End TryY End Sub Y
YY ÿara encerrar o programa temos o código abaixo associado ao evento A do botão ):Y ÿrivate Sub btnSair_lick(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnSair.lick Y If (MessageBox.Show("Deseja sair ?", "Sair", MessageBoxButtons.YesNo) = Windows.Forms.DialogResult.Yes) ThenY YYYYYMe.lose()Y End If
End Sub Y
om isso terminei a apresentação da aplicação adastro de Alunos usando todos os recursos de manutenção de dados e navegação pelos registros. Tudo isso com exibição de imagens e impressão também.Y ÿara encerrar com chave de ouro o último capítulo da série irá mostrar como gerar o pacote para instalação. Y