VB.NET 2005  - Criando uma aplicação Windows Completa: Locadora de Filmes - Parte 4


Continuando o desenvolvimento do nosso projeto Locadora de Filmes no Visual Basic 2005 Express Edition este artigo irá continuar a mostrar a implementação da interface do usuário. Se você esta chegando agora recomendo leia os artigos :

  1.  VB.NET  2005 - Criando uma aplicação completa : Locadora de Filmes I

  2.  VB.NET  2005 - Criando uma aplicação completa : Locadora de Filmes II

  3.  VB.NET  2005 - Criando uma aplicação completa : Locadora de Filmes III

Neste artigo vou mostrar como implementar a interface com o usuário através dos formulários com a seguintes funcionalidades:

  1. Cadastrar clientesClientes.vb

  2. Cadastrar Filmes -  Filmes.vb

  3. Cadastrar Categorias -  Categorias.vb

  4. Registrar Locação de Filmes - Movimento.vb.

Implementando o formulário para cadastrar Clientes : Clientes.vb

Apenas para você lembrar: já criamos o dataset ClienteDS que representa a tabela Clientes(criada no primeiro artigo) e já criamos o formulário Clientes.vb que herda do formulário FormularioModelo.vb.

Para implementar o formulário para cadastrar clientes vou usar o recurso do assistente do VB 2005. Acompanhe:

1- Na janela DataSource, expanda o DataSet ClienteDS e a seguir selecione a tabela Cliente

2- Altere a opção de exibição para Details conforme figura ao lado

3- A segui abra o formulário Clientes.vb e  arraste a tabela Clientes da janela DataSource para o formulário. Após os ajustes de tamanho nos campos você deverá obter o formulário conforme a figura a seguir:

Note que o tipo do campo Nascimento usa um controle DateTimePicker.

Pronto ! acabamos de implementar o formulário de cadastramento de clientes usando os novos recursos do VB2005.

Implementando o formulário para cadastrar Filmes : Filmes.vb

A implementação deste formulário é idêntico ao formulário para cadastrar Clientes.

1- Crie o formulário Filmes.vb incluindo um novo formulário no projeto (Add -> New Item) e a seguir , conforme já explicado no segundo artigo , use a identidade visual herdada do formulário modelo FormularioModelo.vb.

2- Na janela DataSource, expanda o DataSet FilmesDS e a seguir selecione a tabela Filmes

2- Altere a opção de exibição para Details

3- Abra o formulário Filmes.vb e arraste a tabela Filmes para o formulário. Após alguns ajustes você deverá obter o resultado exibido na figura abaixo:

 

Implementando o formulário para cadastrar Categorias : Categorias.vb

Tendo sempre em mente que a aplicação Locadora de Filmes, objeto desta série de artigos, tem o propósito de mostrar os novos recursos do VB2005 para desenvolver aplicações Windows Forms, estou fazendo muitas simplificações e adotando algumas estratégias com objetivo didático que não seriam usadas em um aplicação real de produção.

Vamos criar uma tabela chamada Categorias que irá armazenar os dados das categorias dos filmes.(Veja como fazer isto no primeiro artigo desta série). A tabela deverá possuir os seguintes campos e propriedades:

Campos da tabela Categorias:
  1. Código
  2. Descrição da Categoria
  3. Estado (ativo/inativo)

Agora inclua um novo formulário chamado Categorias.vb no seu projeto herdando do formulário base FormularioModelo.vb.

O próximo passo é criar um novo Data Source para a tabela Categorias recém criada. Clique com o botão direito do mouse na janela Data Sources e selecione  Create new Data Source. Na próxima janela selecione DataBase e clique em Next>. Aceite a conexão que já foi criada e clique em Next> . Selecione a tabela Categorias e informe o nome CategoriasDS clicando a seguir em Finish.

Se você seguiu as orientações terá a seguinte visão do seu projeto:

Vamos alterar o modo de visão do Data Source CategoriasDS para Details e arrastá-lo para o formulário Categorias.vb.

Quando fazemos esta operação o Assistente, além de criar os campos no formulário e incluir os objetos : CategoriaBindingSource, CategoriaTableAdpater e CategoriasBindingNavigator, cria também uma barra de navegação que permite, além da navegação pelos registros, realizar as operações CRUD (read, update e delete) na fonte de dados.

Não vamos usar esta barra de navegação, vamos excluí-la do formulário de forma a ficar com o seguinte layout:

Se olharmos, neste momento, o código do formulário iremos ver:        

Public Class Categorias


 Private
Sub CategoriaBindingNavigatorSaveItem_Click(ByVal sender As System.Object, ByVal e As System.EventArgs)

 Me.Validate()

 Me.CategoriaBindingSource.EndEdit()

 Me.CategoriaTableAdapter.Update(Me.CategoriasDS.Categoria)

 End Sub
 

 Private Sub Categorias_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load

 'TODO: This line of code loads data into the 'CategoriasDS.Categoria' table. You can move, or remove it, as needed.

 Me.CategoriaTableAdapter.Fill(Me.CategoriasDS.Categoria)

 End Sub

End Class

 

Acima temos o código do botão Salvar da barra de Navegação e o código que carrega todos as categorias na carga do formulário.

Vamos excluir todo este código do formulário e incluir dois botões de comando : Criar e Cancelar, conforme abaixo:

No evento Load do formulário inclua o seguinte código:

Private Sub Categorias_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load

Me.CategoriaBindingSource.AddNew()

End Sub

Este código inclui um novo registro no Data Source.

No evento Click do botão Criar insira o código abaixo:

Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click


If Me.Validate()
Then

  Me.CategoriaBindingSource.EndEdit()

  Me.CategoriaTableAdapter.Update(Me.CategoriasDS.Categoria)

Else

   System.Windows.Forms.MessageBox.Show(Me, "Erro")

End If


Me
.Close()

End Sub

Este código atualiza a tabela Categorias incluindo os dados digitados.

Como o campo Codigo da tabela Categorias é Identity com incremento automático de 1 em 1 iremos desabilitar este campo no formulário definindo para controle TextBox -  CodigoTextBox a propriedade Enabled=False e TabStop=False.

Além disto vamos validar o campo descrição não permitindo que o mesmo esteja vazio. Para isto inclua o seguinte código no evento Validating do TextBox:

Private Sub DescricaoTextBox_Validating(ByVal sender As Object, ByVal e As System.ComponentModel.CancelEventArgs) Handles DescricaoTextBox.Validating
 

If Me.DescricaoTextBox.Text.Length = 0 Then

   e.Cancel = True

   ErrorProvider1.SetError(DescricaoTextBox, "Informe a descrição da categoria.")

Else

   ErrorProvider1.SetError(DescricaoTextBox, Nothing)

End If

End Sub

 

Para que o código acima funcione corretamente você deve incluir um controle ErrorProvider no seu formulário.

Podemos querer exibir em um Grid todas as categorias cadastradas, para isto vamos criar um formulário chamado TodasCategorias.vb , e, arrastar o data source CategoriasDS no formato GridView para o formulário. O resultado será o exibido na figura abaixo:

Teremos que fazer um ajuste no menu permitindo duas opções para Categorias: Incluir Nova Categoria e Exibir Categorias.

Não esqueça de incluir o código abaixo para exibir os formulários a partir da seleção do usuário via Menu:

Private Sub IncluirNovaCategoriaToolStripMenuItem_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles IncluirNovaCategoriaToolStripMenuItem.Click

My.Forms.Categorias.MdiParent = Me
My
.Forms.Categorias.Show()

End Sub


Private Sub ExibirCategoriasToolStripMenuItem_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles ExibirCategoriasToolStripMenuItem.Click

My.Forms.TodasCategorias.MdiParent = Me
My
.Forms.TodasCategorias.Show()

End Sub

Implementando o formulário para registrar as locações : Movimento.vb

A implementação do formulário de locação deve registrar as locações efetuadas pelos clientes. No nosso caso o processo de locação funciona da seguinte forma:

  1. O cliente escolha o filme que deseja do acervo e se dirige ao funcionário
  2. O funcionário acessa o sistema e informa o código do filme escolhido e o código do cliente que esta efetuando a locação
  3. Como geralmente o cliente não memoriza o seu código devemos implementar uma alternativa para selecionar o cliente pelo nome

Vamos recordar a estrutura da tabela Movimento para ver os dados que devemos registrar:

- O campo CodigoLocacao é um campo autonumerado (Identity) e por este motivo não iremos gravar nada neste campo visto que seu valor é incrementado automaticamente

Devemos registrar valores nos seguintes  campos:

  • CodigoCliente - este dado virá da tabela Clientes
  • CodigoFilme - o valor virá da tabela Filmes
  • Locacao - a data de locação (a data atual do sistema)

- Os campos Devolucao e Valor serão preenchidos quando da devolução do filme pelo cliente (por este motivo aceitam valores Nulls, pois não iremos gravar nada na locação nestes campos)

Abra o formulário Movimento.vb e inclua dois controles Labels , dois controles TextBox e quatro botões de comando(Button) conforme a figura abaixo:

O que pretendendo aqui é que quando o for efetuar a locação o funcionário irá informar o código do filme e o código do cliente. Se por algum motivo estes dados não estiverem disponíveis implementamos uma busca nas tabelas Filmes e Clientes que nos retornarão estes valores.

Para implementar este recurso deveremos criar dois novos formulários : SelecionaFilme.vb e SelecionaCliente.vb que atuarão basicamente de forma idêntica : irão exibir uma caixa de texto, onde o usuário informará o nome do filme ou do cliente, um botão selecionar que deverá extrair os dados da respectiva tabela, e exibir o resultado da consulta em um DataGridview. A seguir os passos para implementar o recurso para o formulário SelecionaFilme.vb.

  1. Inclua um novo formulário chamado SelecioneFilme.vb na sua aplicação herdando a identidade visual do formulário FormularioModelo.vb
  2. Inclua no formulário os seguintes controles : Label, TextBox , Button e DataGridView, conforme abaixo:

   

  1. Quando da inclusão do DataGridView , usando as Smart Tags , selecione o Data Source - FilmesDS - conforme a figura abaixo

   

  1. Como queremos exibir somente o filme correspondente ao nome informado pelo funcionário devemos incluir um filtro na nossa fonte de dados - Data Source - FilmesDS.

  2. Na guia Data Source , selecione FilmesDS e clique com o botão direito selecionando - Edit Data Set with Designer

  3. A seguir selecione o Data Set  Filmes e clique com o botão direito do mouse selecionando  Add -> Query

   

  1. Na janela - TableAdapter Configuration Wizard - vamos usar uma instrução SQL Select , por isto clique no botão Next>

  2. Como vamos obter linhas de retorno, aceite a seleção do wizard e clique no botão Next > novamente

  3. Na janela a seguir vamos montar a nossa consulta , por isto clique no botão - Query Builder.

  4. Estando na janela Query Builder  selecione o campo titulo e na coluna Filter informe o parâmetro : Like @titulo   

   

  1. Podemos testar a consulta clicando no botão Execute Query.
  2. Clique no botão Ok e a seguir informe o nome da consulta criada:

   

  1. A seguir clique em Next> e finalmente em Finished. Pronto criamos uma consulta para selecionar o filme pelo título informado.

Podemos retornar ao formulário SelecionaFilme. Ao clicar no botão Seleciona devemos acionar a consulta criada, para isto inclua o seguinte código no evento Click do botão:

Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click

Me.FilmesTableAdapter.FillByTitulo(FilmesDS.Filmes, "%" & TextBox1.Text & "%")

End Sub

Obs: Você deve remover qualquer outro código gerado pelo assistente no formulário.

Neste código eu estou usando do TableAdapter e a consulta FillByTitulo para extrair dados do dataset Filmes segundo o valor informado na caixa de texto TextBox1.Text. (eu sugiro que você forneça nomes sugestivos aos controles)

Devemos ainda configurar algumas propriedades do DataGridView pois não desejamos que o usuário altere o DataGridView ou inclua, exclua ou efetue uma seleção múltipla no mesmo. Para isto defina como False as seguintes propriedades : MultiSelect , AllowUserAddRows, AllowUserDeleteRows, AllowUserResizeRows e AllowUserResizeColumns.  Vamos definir a propriedade SelecionMode como FullRowSelect para selecionar a linha por inteiro.

Quando o usuário clicar na célula que exibe os dados do título procurado devemos capturar a seleção e os dados do filme escolhido. Fazemos isto tratando o evento Click do botão Aceitar. Abaixo temos o código que deve ser incluído neste evento:

Private Sub btnAceita_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnAceita.Click

codigoFilme = Me.FilmesDS.Filmes(FilmesBindingSource.Position).CodigoFilme
Me.Close()

End Sub

Aqui definimos a variável pública codigoFilme no formulário e obtemos o código do filme pois é este valor que vamos gravar na tabela Movimento.

Agora voltemos ao formulário Movimento.vb , onde tudo começou. Após efetuar a busca e selecionar o filme pelo título deveremos obter o código do filme e exibir na caixa de texto - txtCodigoFilme  - do formulário de Locações - Movimento.vb. Para isto basta acrescentar o código abaixo no evento Click do botão Procurar do formulário:

Private Sub btnProcuraFilme_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnProcuraFilme.Click

My.Forms.SelecionaFilme.ShowDialog()
txtCodigoFilme.Text = My.Forms.SelecionaFilme.codigoFilme

End Sub

Nota: Você pode exibir o nome do titulo do filme incluindo um controle Label no formulário e o seguinte código no botão Procurar: lbltituloFilme.Text = My.Forms.SelecionaFilme.tituloFilme

A primeira linha abre o formulário para selecionar o filme e a segunda obtém o valor da variável codigoFilme declarada como Public no formulário SelecionaFilme.

Todo o procedimento acima deverá ser repetido para o formulário SelecionaCliente. Deixo isto como tarefa para você realizar.

O código final do formulário, antes de efetuar o registro da locação, será o seguinte:

Public Class Movimento


Private
Sub btnProcuraFilme_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnProcuraFilme.Click


My
.Forms.SelecionaFilme.ShowDialog()

txtCodigoFilme.Text = My.Forms.SelecionaFilme.codigoFilme


End
Sub

 

Private Sub btnProcuraCliente_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnProcuraCliente.Click


My
.Forms.SelecionaCliente.ShowDialog()

txtCodigoCliente.Text = My.Forms.SelecionaCliente.codigoCliente


End
Sub


End
Class

Nota: Você pode exibir o nome do cliente incluindo um controle Label no formulário e o seguinte código no botão Procurar: lblNomeCliente.Text = My.Forms.SelecionaCliente.nomeCliente

Para efetuar o registro da locação vou criar uma classe que será responsável por esta tarefa. Mas isto é assunto para o próximo artigo.

Aguarde a continuação no artigo : VB.NET 2005  - Criando uma aplicação Windows Completa: Locadora de Filmes - Parte 5

VB.NET 2005 , é fácil, é simples, é legal. Divirta-se... 

Veja os Destaques e novidades do SUPER DVD Visual Basic (sempre atualizado) : clique e confira !

Quer migrar para o VB .NET ?

Quer aprender C# ??

 

             Gostou ?   Compartilhe no Facebook   Compartilhe no Twitter

Referências:


José Carlos Macoratti