VB.NET 2008 - Protótipo para Sistema de Vendas com LINQ - II


Na primeira parte deste artigo eu defini o escopo da protótipo de vendas, criei o banco de dados e as tabelas , criei os formulários para cadastrar Clientes e Produtos usando o assistente de configuração do Visual Basic 2008 Express Edition e gerei o mapeamento objeto relacional usando o LINQ. Desta forma temos o ambiente preparado para criar a nossa aplicação de Vendas.

Vamos criar o formulário de menu da aplicação. Selecione no menu Project a opção Add Windows Forms e a seguir marque o template Windows Forms e informe o nome Menu.vb;

Vamos definir o formulário Menu.vb como um container MDI para isso defina sua propriedade IsMDIContainer igual True.

A partir da toolbox , na guia Menus & ToolBars , arraste o componente MenuStrip para o formulário e crie as opções conforme o leiaute da figura abaixo:

Nota: para alterar a cor de fundo de um container MDI não basta definir sua propriedade BackColor além disso devemos usar o seguinte código no evento Load do formulário:
 

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


For Each ctl As Control In Me.Controls

     If TypeOf ctl Is MdiClient Then

             ctl.BackColor = Me.BackColor

      End If

Next ctl

End Sub

Vamos agora definir para cada uma das opções, a abertura do formulário correspondente, usando o evento Click de cada item do menu no controle MenuStrip.

  Private Sub ClientesToolStripMenuItem_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles ClientesToolStripMenuItem.Click
        My.Forms.Clientes.MdiParent = Me
        My.Forms.Clientes.Show()
    End Sub

    Private Sub ProdutosToolStripMenuItem_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles ProdutosToolStripMenuItem.Click
        My.Forms.Produtos.MdiParent = Me
        My.Forms.Produtos.Show()
    End Sub

    Private Sub VendasToolStripMenuItem_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles VendasToolStripMenuItem.Click
        My.Forms.frmVendas.mdiparent = Me
        My.Forms.frmVendas.show()
    End Sub

    Private Sub PedidosToolStripMenuItem_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles PedidosToolStripMenuItem.Click
        My.Forms.Pedidos.MdiParent = Me
        My.Forms.Pedidos.Show()
    End Sub

Veja também o meu artigo: VB.NET  2005  - Tocando arquivos WAV  que fala sobre o recurso My.

O código acima simplesmente abre o respectivo formulário no containter MDI usando o recurso My. Os formulários Clientes e Produtos já foram criados faltam ser criados o formulário frmVendas e Pedidos.

A próxima tarefa será criar dois formulários , um para Produtos e outro para Clientes. Eles serão usados para permitir a busca e seleção de um determinado produto/cliente. Eu poderia usar o recurso de herança visual mas para não complicar resolvi criar dois formulário distintos.

Criando o formulário para seleção Produtos

A partir do menu Project selecione Add Windows Forms e informe o nome frmProdutos. A seguir inclua um controle TextBox, um controle DataGridView e dois Controles Buttons conforme o leiaute da figura abaixo:

Defina também a propriedade StartPosition como sendo igual a CenterParent.

Vejamos agora o código deste formulário:

1- Inicialmente vamos instanciar a classe JcmSoftDataContext para ter acesso aos objetos mapeados para o banco de dados:

'Instanciamos un objeto da clase JcmSoftDataContext
Dim bd As New JcmSoftDataContext
'Declaramos uma variavel codigo como publica
Public codigo As String

2- No evento Load do formulário vou usar uma consulta LINQ para obter uma relação de produtos por ordem de nome e atribuir o resultado ao DataGridView.

Private Sub frmProdutos_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
        'Este codigo usa una consulta LINQ 
        'para obter una sequecia IEnumerable de objetos Produtos
        Dim produtos = From prod In bd.Produtos _
                               Select prod.ProdutoID, prod.Nome, prod.preco, prod.estoque _
                               Order By Nome Ascending

        Me.dgvProdutos.DataSource = produtos.ToList

    End Sub

3-) No evento Click do botão Selecionar temos o código onde obtemos o índice do elemento selecionado e capturamos o código da coluna ClienteID atribuindo-o a variável codigo que foi definida como pública no início do formulário;

  Private Sub btnSelecionar_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnSelecionar.Click
        'Obtemos o índice do elemento selecionado no DataGridView
        Dim row As Integer = Me.dgvProdutos.CurrentRow.Index
        'Obtem o elemento da coluna ClienteID
        codigo = Me.dgvProdutos.Item("ProdutoID", row).Value.ToString
        'Definimos como OK o resultado da janela de diálogo
        Me.DialogResult = System.Windows.Forms.DialogResult.OK
        'fecha o formulário
        Me.Close()
    End Sub

4-) No evento Click do botão Cancelar temos o código que cancela e fecha o formulário;

 Private Sub btnCancelar_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnCancelar.Click
        'define como CANCEL o resultado da janela de diálogo
        Me.DialogResult = System.Windows.Forms.DialogResult.Cancel
        'fecha o formulario
        Me.Close()
    End Sub

5-) No evento TextChanged do TextBox txtNomeProduto incluímos o código abaixo. Com ele a medida que o usuário digita cada caractere na caixa de texto é criada uma consulta LINQ dinâmica que vai filtrando os produtos e exibindo no DataGridView;

 Private Sub txtNomeProduto_TextChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles txtNomeProduto.TextChanged

        'Este codigo usa uma consulta LINQ para obter una sequencia
        'IEnumerable de objetos Clientes com base no criterio informado
        'na caixa de texto txtNomeCliente que é concatenado
        'com o caractere (*) simulando a funcionalidade (%) do SQL 
        'para ser usada na expressão LIKE da consulta LINQ
        Dim criterio As String
        'concatenamos o texto informado no controle com o coringa (*)
        criterio = Me.txtNomeProduto.Text & "*"

        Dim produtos = From prod In bd.Produtos _
                                Where prod.Nome Like criterio _
                                Select prod.ProdutoID, prod.Nome, prod.preco, prod.estoque _
                                Order By Nome Ascending

        'Atribuimos como origem de dados ao DataGridView1 
        'o resultado da consulta LINQ
        Me.dgvProdutos.DataSource = produtos.ToList

    End Sub

Executando o projeto e abrindo o formulário de busca de produtos se digitarmos os caracteres Mo teremos o resultado da figura baixo:

Escolhendo uma linha e clicando no botão Selecionar iremos obter os dados do produto para usar no formulário de vendas.

Criando o formulário para seleção de Clientes

O formulário para busca e seleção de clientes , frmClientes é idêntico ao formulário acima e , como eu já mencionei , poderíamos ter usando a herança visual para criá-lo.

Então de forma resumida a seguir temos o leiaute do formulário frmClientes :

O código do formulário é dado abaixo:

Public Class frmClientes

    'Instanciamos un objeto da clase JcmSoftDataContext
    Dim bd As New JcmSoftDataContext
    'Declaramos uma variavel codigo como publica
    Public codigo As String

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

        'Este codigo usa una consulta LINQ 
        'para obter una sequecia IEnumerable de objetos Clientes
        Dim clientes = From cli In bd.Clientes _
                              Select cli.clienteID, cli.nome, cli.email _
                              Order By nome Ascending

        Me.DataGridView1.DataSource = clientes.ToList

    End Sub

    Private Sub btnCancelar_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnCancelar.Click
        'Se define como CANCEL o resultado da janela de diálogo
        Me.DialogResult = System.Windows.Forms.DialogResult.Cancel
        'fecha o formulario
        Me.Close()
    End Sub

    Private Sub btnSelecionar_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnSelecionar.Click
        'Obtemos o índice do elemento selecionado no DataGridView
        Dim row As Integer = Me.DataGridView1.CurrentRow.Index
        'Obtem o elemento da coluna ClienteID
        codigo = Me.DataGridView1.Item("ClienteID", row).Value.ToString
        'Definimos como OK o resultado da janela de diálogo
        Me.DialogResult = System.Windows.Forms.DialogResult.OK
        'fecha o formulário
        Me.Close()
    End Sub

    Private Sub TextBox1_TextChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles txtNomeCliente.TextChanged
        'Este codigo usa uma consulta LINQ para obter una sequencia
        'IEnumerable de objetos Clientes com base no criterio informado
        'na caixa de texto txtNomeCliente que é concatenado
        'com o caractere (*) simulando a funcionalidade (%) do SQL 
        'para ser usada na expressão LIKE da consulta LINQ
        Dim criterio As String
        'concatenamos o texto informado no controle com o coringa (*)
        criterio = Me.txtNomeCliente.Text & "*"

        Dim clientes = From cli In bd.Clientes _
                              Where cli.nome Like criterio _
                               Select cli.clienteID, cli.nome, cli.email _
                               Order By nome Ascending

        'Atribuimos como origem de dados ao DataGridView1 
        'o resultado da consulta LINQ
        Me.DataGridView1.DataSource = clientes.ToList

    End Sub

Executando o formulário e digitando os caracteres Ma na caixa de texto iremos obter:

Escolhendo uma linha e clicando no botão Selecionar iremos obter os dados do cliente para usar no formulário de vendas.

E com isso acabamos de criar os formulários de menu (Menu.vb) e busca e seleção de clientes (frmClientes.vb) e pedidos (frmProdutos.vb).

Já temos tudo pronto para criar o formulário de vendas (frmVendas.vb) onde poderemos selecionar clientes e produtos, incluir um pedido de venda , calcular o total e dar baixa no estoque dos itens vendidos.

Aguarde a continuação na última parte do artigo : VB.NET 2008 - Protótipo para Sistema de Vendas com LINQ - III

Eu sei , é apenas VB .NET , mas eu gosto...

Referências:


José Carlos Macoratti