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


Continuando o desenvolvimento do nosso projeto Locadora de Filmes no Visual Basic 2005 Express Edition este artigo a mostrar a implementação da classe que possui a lógica para efetuar a devolução de um filme e a implementação da interface do usuário via formulário devolucao.vb. 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

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

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

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

Implementando a classe para registrar a devolução de um filme

A lógica para efetuar a devolução de um filme alugado vai estar na classe DevolucaoFilmes presente no arquivo DevolucaoFilmes.vb. As tarefas que deverão ser efetuadas na devolução de um filme são:

Tudo começa quando o cliente apresenta o filme para devolução. O funcionário acessa o sistema e exibe o formulário de devolução de filmes: devolução.vb mostrado abaixo:

- O funcionário informe o código do cliente ou efetua a busca acionando o botão procurar.

- Após selecionar o cliente, o DataGridView é preenchido com a relação dos filmes que o cliente possui alugados.

- O funcionário seleciona um ou todos os filmes e efetua o registro da devolução.

 

 O evento Click do botão procurar possui o seguinte código:

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
lblNomeCliente.Text = My.Forms.SelecionaCliente.nomeCliente

Me.MovimentoTableAdapter.FillByCodigoClienteEdevolucaoNull(MovimentoDS.Movimento, CType(txtCodigoCliente.Text, Integer))

End Sub

O formulário SelecionaCliente é exibido e nele o funcionário informa o nome do cliente para efetuar a seleção.

A seguir o código do cliente é exibido na caixa de texto - txtCodigoCliente- e o seu nome no controle Label - lblNomeCliente.

O DataGridView é então preenchido pela consulta previamente incluída no TableAdapter MovimentoDS chamada FillByCodigoClienteDevoluçãoNull que possui a seguinte estrutura: 

SELECT CodigoLocacao, CodigoCliente, CodigoFilme, Locacao, Devolucao, Valor
FROM Movimento
WHERE (CodigoCliente = @codigoCliente) AND (Devolucao IS NULL)

A consulta irá exibir os dados da tabela Movimento cujo campo CodigoCliente é igual ao código do cliente foi selecionado e cujo campo Devolucao é Null.

A seguir o funcionário seleciona o filme que é objeto da devolução e clica no botão - Registra Devolução - cujo código do evento Click é exibido a seguir:

Private Sub btnDevolucao_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnDevolucao.Click


Dim
fila As DataGridViewRow

Dim selecao As MovimentoDS.MovimentoRow

Dim registraDevolucao As New DevolucaoFilmes


For
Each fila In MovimentoDataGridView.SelectedRows

    selecao = MovimentoDS.Movimento(fila.Index)

    registraDevolucao.calcula(selecao.CodigoFilme, selecao.Locacao, Now)

    registraDevolucao.devolveFilme(selecao.CodigoFilme, selecao.Locacao, Now, registraDevolucao.valorLocacao)

Next
 

Me.Validate()

Me.MovimentoBindingSource.EndEdit()


MsgBox(
"Devolução registrada com sucesso...", MsgBoxStyle.Information)

Me.MovimentoTableAdapter.Update(MovimentoDS.Movimento)


End
Sub

Após declarar uma variável do tipo DataGridView e outra do tipo MovimentoRow estamos instanciando um objeto da classe DevolucaoFilmes:

Dim fila As DataGridViewRow

Dim selecao As MovimentoDS.MovimentoRow

Dim registraDevolucao As New DevolucaoFilmes

A seguir para cada linha do DataGridView selecionada estamos invocando os seguintes métodos da classe DevolucaoFilmes:

  1. registraDevolucao.calcula(selecao.CodigoFilme, selecao.Locacao, Now) - O método calcula utiliza os parâmetros : CodigoFilme, a data de locação (selecao.Locacao) e a data atual (Now) que representa a data da devolução do filme.
  2. registraDevolucao.devolveFilme(selecao.CodigoFilme, selecao.Locacao, Now, registraDevolucao.valorLocacao) :  O método devolveFilme usa os parâmetros : CodigoFilme, data de locação (selecao.Locacao) , a data atual (Now) e o valor da locação calculada (registraDevolucao.valorLocacao)

Estes métodos estão implementados na classe DevolucaoFilmes que você deve incluir no projeto clicando com o botão direito do mouse sobre o nome do projeto e seleciona a opção Add->New Item , e a seguir selecionar o template Class informando o nome da classe.

A seguir temos o código da classe DevolucaoFilmes contendo os dois métodos : calcula e devolveFilme e a propriedade valorLocacao pela qual podemos obter o valor calculado da locação.

Public Class DevolucaoFilmes

'variável de classe valor_

Private Shared valor_ As Double


Public
Sub devolveFilme(ByVal codfilme As Integer, ByVal datalocacao As Date, ByVal dataDevolucao As Date, ByVal valor As Double)


Dim
codLocacao As
Integer


''cria um adatper e um dataset

Dim adapterMovimento As New MovimentoDSTableAdapters.MovimentoTableAdapter

Dim movimento As New MovimentoDS

''filtra os filmes pelo codigo informado
adapterMovimento.FillByCodigoFilme(movimento.Movimento, codfilme)
codLocacao = movimento.Movimento(0).CodigoLocacao

'registrar a devolucao do filme

'cria um adapter e um dataset

Dim adapterDevolucao As New MovimentoDSTableAdapters.MovimentoTableAdapter

Dim movimentoDevolucao As New MovimentoDS.MovimentoDataTable

 

'atualiza a tabela movimento incluindo a data de devolução e o valor a ser pago

adapterDevolucao.UpdateQueryDevolucao(dataDevolucao, valor, codLocacao)

adapterDevolucao.Update(movimentoDevolucao)

 

End Sub

---------------------------------------------------------------Método calcula----------------------------------------------

Public Sub calcula(ByVal codfilme As Integer, ByVal datalocacao As Date, ByVal datadevolucao As Date)

 

Dim classificacao As String

Dim valor As Double

'verificando o estoque da locadora

'cria um adatper e um dataset

Dim adapterFilmes As New FilmesDSTableAdapters.FilmesTableAdapter

Dim filme As New FilmesDS

 

'filtra os filmes pelo codigo informado

adapterFilmes.FillByCodigo(filme.Filmes, codfilme)

'se não encontrou o filme com o codigo informado avisa

If filme.Filmes.Count = 0 Then

   Throw New ArgumentException("Não existe o filme informado no acervo.")

End If

 

'se não tem filme no estoque avisa

If filme.Filmes(0).Estoque = 0 Then

   Throw New ArgumentException("Não existem unidades cadastradas no acervo.")

End If

 

'se houver filme no estoque tenho que aumentar uma unidade que esta sendo devolvida

filme.Filmes(0).Estoque += 1

filme.Filmes(0).Status = "Disponível" ' atualiza o status para codigo 1 - Disponivel

 

classificacao = filme.Filmes(0).Classificacao

'

----verifica o preco do filme para calcular o valor

Dim adapterPrecos As New PrecosDSTableAdapters.PrecosTableAdapter

Dim preco As New PrecosDS

 

adapterPrecos.FillByClassificacao(preco.Precos, classificacao)

valor = preco.Precos(0).Valor

 

Dim dias As Integer = DateDiff("d", datalocacao, datadevolucao)

Dim precoPagar As Double = dias * valor

 

valor_ = precoPagar

End Sub

------------------------------------------Propriedade valorLocacao----------------------------------------------------------

Public Property valorLocacao() As Double

  Get

       Return valor_

  End Get

  Set(ByVal valor As Double)

      valor_ = valor

   End Set

End Property

End Class

 

Perceba que no método calcula estamos incrementando uma unidade, referente ao filme devolvido, ao estoque e alterando o status do filme para "Disponível":

'se houver filme no estoque tenho que aumentar uma unidade que esta sendo devolvida

filme.Filmes(0).Estoque += 1

filme.Filmes(0).Status = "Disponível" ' atualiza o status para codigo 1 - Disponível

 

Abaixo temos a janela exibida pela execução do formulário devolucao.vb:

 

Após efetuar o registro da devolução podemos verificar os valores atualizados na tabela movimento na opção Movimento-> Filmes Alugados do menu principal:

E com isto fechamos o ciclo desta pequena aplicação de exemplo, onde o objetivo foi mostrar alguns dos novos recursos do ADO.NET 2.0 e como você pode criar uma aplicação Windows Forms de forma rápida usando os novos assistentes para auxiliá-lo em tarefas que antes exigiriam muito código.

Não pode ser considerada uma aplicação de produção pois não me preocupei com os requisitos fundamentais que uma locadora real deveria possuir para estar funcionando. Aliás, quero chamar a atenção para o fato de que o levantamento dos requisitos é uma das fases cruciais e que geralmente determinam o sucesso ou o fracasso de um projeto de software. Nossa aplicação não resistiria a uma crítica a começar pela modelagem de dados. No entanto ela serviu aos meus propósitos que foi poder mostrar o desenvolvimento de uma aplicação Windows com alguns recursos no Visual Basic 2005 Express.

Podemos dizer que o nosso sistema de locadora de filmes talvez possa ser implementado como esta em um algum lugar da nossa Via Láctea. Brincadeiras à parte, espero que você tenha aprendido com os novos recursos e a partir deles possa evoluir criando aplicações mais robustas.

Na verdade falta ainda criarmos o pacote de instalação, e este serão o nosso último artigo para a locadora de filmes.

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

Nota: Se você esta tendo problemas com o não salvamento dos dados da aplicação leia o artigo :  VB.NET  2005 -  TableAdapater não atualiza os dados

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