Desenvolvimento - Visual Basic .NET

Pequeno projeto de controle de pedidos de uma pizzaria em Visual Basic .Net - Parte 4

Quarto artigo. Ao final, teremos um pequeno, porém importante projeto que servirá como base para o desenvolvimento de projetos maiores. É importante que você acompanhe as explicações de todas as partes do código. O objetivo desse material é ser uma referência básica para seus futuros projetos. O modelo de programação está bem baseado no VB6. Existem outros orientados a objeto. Não foi o intuito neste artigo explorá-lo.

por Marcos Roberto de Moraes



Nos artigos anteriores codificamos o formulário de clientes e um formulário genérico de pesquisa, que podemos reutilizar para a pesquisa das demais tabelas do nosso projeto, como foi o caso dos dados dos produtos que vocês codificaram.  Neste artigo iremos codificar o formulário de pedidos de pizza, o primeiro que irá lidar com a abertura de conexão ao banco com quatro tabelas diferentes, ou seja, clientes, produtos, pedidos e pedidositens.

Formulário de Pedidos:

1) Inicialmente vamos adicione um novo formulário ao seu projeto e mude a propriedade name para FrmPedidos.vb

2) Deixe o formulário com a aparência abaixo, modificando a propriedade name dos componentes com os nomes em vermelho. Detalhes do formulário (03 GroupBox, o último “Detalhes do Pedido” contém um componente DataGridView, altere o nome dele para DgvItens).

3) Acrescente as trê linhas abaixo na seção geral de declarações do Formulário de pedidos. E Não de esqueça da linha de conexão na área pública.

Imports System.Data

Imports System.Data.SqlClient

Imports System.Text

4) Coloque o caminho correto, que aponta para o seu banco de dados.

    Dim conexao As String = "Data Source=.\SQLEXPRESS;AttachDbFilename=C:\PrjPizzaria\Pizzaria.mdf;Integrated Security=True;Connect Timeout=30;User Instance=True"

5) Antes de continuarmos precisamos fazer uma pequena modificação nas permissões da tabela Pedidos. Os campos IdCliente e ValorTotal, devem permitir nulos (Allow Nulls) no momento da abertura do pedido. Pois registraremos um novo pedido (sem os dados do cliente e o valor total) inicialmente. Para tanto abra tabela e altere a definição dos dois campos mencionados para Allow Null. Conforme figura abaixo:

6) Acrescente o código abaixo no evento Load do formulário (FrmPedidos_Load).

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

        "Libera o Primeiro GroupBox e Desabilita o segundo.

        GroupBox1.Enabled = True

        GroupBox2.Enabled = False

        "Buscando um novo número de pedido.

        Dim BuscaIdPedido As New Integer

        Dim cSql As String

        cSql = "Select Top 1 (IdPedido) From Pedidos order by IdPedido desc"

        "Abrir o banco de dados e passar os

        "parametros da consulta cSQL, parametros

        "e ordem de execução, retorna o número do pedido último +1

        "e fecha a conexão.

        Dim cn As New SqlConnection(conexao)

        cn.Open()

        Dim cmdCommand As New SqlCommand

        With cmdCommand

            .CommandText = cSql

            .CommandType = CommandType.Text

            .Connection = cn

        End With

        Dim dtReader As SqlDataReader

        dtReader = cmdCommand.ExecuteReader()

        If dtReader.Read() Then

            BuscaIdPedido = dtReader(0) + 1

        Else

            BuscaIdPedido = 1

        End If

        dtReader.Close()

        cn.Close()

        "Nesse momento já registro o pedido para não ocorrer

        "problemas em um ambiente de rede, ou seja, outro ponto

        "adicionar um novo pedido antes de fechar o corrente

        "(aconteceria erro de chave primária).

        txtIdPedido.Text = BuscaIdPedido

        txtData.Text = Date.Today.ToShortDateString

        txtHora.Text = Date.Now.ToShortTimeString

        txtIdPedido.Enabled = False

        txtData.Enabled = False

        txtHora.Enabled = False

        "Gravando os dados desse momento

        "isto é, o IdCliente (0) e o valorTotal (0)

        "depois graveremos o cliente e o valor correto

        Dim strQuery As New StringBuilder

        Dim Data As Date = txtData.Text

        Dim Hora As Date = txtHora.Text

        strQuery.Append("Insert into Pedidos ")

        strQuery.Append(" (")

        strQuery.Append("IdPedido,")

        strQuery.Append("Data,")

        strQuery.Append("Hora")

        strQuery.Append(") ")

        strQuery.Append(" VALUES (")

        strQuery.Append(txtIdPedido.Text)

        strQuery.Append(", "" & Data.ToShortDateString() & """)

        strQuery.Append(", "" & Hora.ToShortTimeString() & """)

        strQuery.Append(");")

        "abre a conexão com o banco

        cn.Open()

        "executa o insert na tabela pedidos

        Dim cmdCommand1 As New SqlCommand

        With cmdCommand1

            .CommandText = strQuery.ToString

            .CommandType = CommandType.Text

            .Connection = cn

            .ExecuteNonQuery()

        End With

        cn.Close()

    End Sub

7) Neste ponto, no momento em que é chamado o formulário de pedidos ele já o abre com o número, data e hora e posiciona o foco no código do cliente. Colocaremos o código do cliente e no evento (TxtIdCliente_TextChanged) ele apresentará nos respectivos Labels os dados do cliente.

    Private Sub TxtIdCliente_TextChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles TxtIdCliente.TextChanged

        "Define a String de Busca pelo IdCliente

        Dim cSql As String

        cSql = "Select * From Clientes Where IdCliente=" & Val(txtIdCliente.Text)

        "Abrir o banco de dados e passar os

        "parametros da consulta SQL, parametros

        "e ordem de execução.

        Dim cn As New SqlConnection(conexao)

        cn.Open()

        Dim cmdCommand As New SqlCommand

        With cmdCommand

            .CommandText = cSql

            .CommandType = CommandType.Text

            .Connection = cn

            .ExecuteNonQuery()

        End With

        "Declarado um dataadapter e um dataset

        "passar o comando para o dtAdapter e

        "carregar o dataset com resultado da busca

        Dim dtAdapter As New SqlDataAdapter

        Dim dsDataSet As New DataSet

        With dtAdapter

            .SelectCommand = cmdCommand

            .Fill(dsDataSet)

        End With

        "Abaixo observo se o retorno de linhas de pesquisa é maior que zero

        "como busquei pelo código ou é zero (vazio) ou um (contém o registro)

        "se tem o registro do cliente, exibo nos labels, se não

        "defino os labels (text) como nothing.

        If dsDataSet.Tables(0).Rows.Count > 0 Then

            lblNomeRazao.Text = dsDataSet.Tables(0).Rows(0).Item("NomeRazao")

            lblEndereco.Text = dsDataSet.Tables(0).Rows(0).Item("Endereco")

            lblTelefone.Text = dsDataSet.Tables(0).Rows(0).Item("Telefone")

            lblCidade.Text = dsDataSet.Tables(0).Rows(0).Item("Cidade")

            lblEstado.Text = dsDataSet.Tables(0).Rows(0).Item("Estado")

        Else

            lblNomeRazao.Text = Nothing

            lblEndereco.Text = Nothing

            lblTelefone.Text = Nothing

            lblCidade.Text = Nothing

            lblEstado.Text = Nothing

        End If

    End Sub

8) Agora, vamos ao código do evento clique no botão cmdLancar. Nele habilitaremos o GroupBox2 e desabilitaremos o GroupBox1. Porém só ocorrerá isso, se o cliente existir, caso contrário não poderá prosseguir.

    Private Sub cmdLancar_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles cmdLancar.Click

        If lblNomeRazao.Text = Nothing Then

            MsgBox("Cliente não cadastrado, gentileza cadastrar", 16, "Aviso")

            Exit Sub

        End If

        Dim data As Date = txtData.Text

        Dim hora As Date = txtHora.Text

        Dim valortotal As Decimal = 0.0

        Dim strQuery As New StringBuilder

        strQuery.Append("Update Pedidos ")

        strQuery.Append("set ")

        strQuery.Append("IdPedido=")

        strQuery.Append(txtIdPedido.Text)

        strQuery.Append(", Data="")

        strQuery.Append(data.ToShortDateString())

        strQuery.Append("", Hora="")

        strQuery.Append(hora.ToShortTimeString())

        strQuery.Append("", IdCliente=")

        strQuery.Append(txtIdCliente.Text)

        strQuery.Append(", ValorTotal=")

        strQuery.Append(valortotal)

        strQuery.Append(" where IdPedido=")

        strQuery.Append(txtIdPedido.Text & ";")

        "Abrir o banco de dados e passar os

        "parametros da consulta strQuery, parametros

        "e ordem de execução, retorna o número do pedido último +1

        "e fecha a conexão.

        Dim cn As New SqlConnection(conexao)

        cn.Open()

        Dim cmdCommand As New SqlCommand

        With cmdCommand

            .CommandText = strQuery.ToString

            .CommandType = CommandType.Text

            .Connection = cn

            .ExecuteNonQuery()

        End With

        cn.Close()

        "Bloqueia o GroupBox1 para evitar alterações

        "Até o fechamento do pedido

        GroupBox1.Enabled = False

        GroupBox2.Enabled = True

        txtIdProduto.Focus()

    End Sub

9) Agora iremos colocar o código a seguir em (TxtIdProduto_TextChanged). Funcionará de forma semelhante o TxtIdCliente_TextChanged. Existindo o produto o programa exibirá nos labels os respectivos dados, caso contrário deixará a descrição e demais campos como nothing.

Private Sub TxtIdProduto_TextChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles TxtIdProduto.TextChanged

"Define a String de Busca pelo IdProduto

Dim cSql As String

cSql = "Select * From Produtos Where IdProduto=" & Val(txtIdProduto.Text)

"Abrir o banco de dados e passar os

"parametros da consulta SQL, parametros

"e ordem de execução.

Dim cn As New SqlConnection(conexao)

cn.Open()

Dim cmdCommand As New SqlCommand

With cmdCommand

.CommandText = cSql

.CommandType = CommandType.Text

.Connection = cn

.ExecuteNonQuery()

End With

"Declarado um dataadapter e um dataset

"passar o comando para o dtAdapter e

"carregar o dataset com resultado da busca

Dim dtAdapter As New SqlDataAdapter

Dim dsDataSet As New DataSet

With dtAdapter

.SelectCommand = cmdCommand

.Fill(dsDataSet)

End With

"Abaixo observo se o retorno de linhas de pesquisa é maior que zero

"como busquei pelo código ou é zero (vazio) ou um (contém o registro)

"se tem o registro do PRODUTO, exibo nos labels, se não

"defino os labels (text) como nothing.

If dsDataSet.Tables(0).Rows.Count > 0 Then

lblDescricao.Text = dsDataSet.Tables(0).Rows(0).Item("Descricao")

txtValorProduto.Text = Format(dsDataSet.Tables(0).Rows(0).Item("Preco"), "#,##0.00")

Else

lblDescricao.Text = Nothing

txtValorProduto.Text = Nothing

End If

End Sub

10) Adicione o código para o evento ao perder o foco (leave ou lostfocus) do controle TxtQuantidade.

Private Sub txtQuantidade_Leave(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles txtQuantidade.Leave

Dim Qtd As Decimal = txtQuantidade.Text

Dim Preco As Decimal = txtValorProduto.Text

Dim Total As Decimal = Qtd * Preco

TxtTotalItem.Text = FormatCurrency(Total)

End Sub

11) Vamos repetir o código anterior agora no evento ao perder o foco do controle TxtValorProduto.

Private Sub txtValorProduto_Leave(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles txtValorProduto.Leave

Dim Qtd As Decimal = txtQuantidade.Text

Dim Preco As Decimal = txtValorProduto.Text

Dim Total As Decimal = Qtd * Preco

txtTotalItem.Text = FormatCurrency(Total)

End Sub

12) Agora abaixo o código do botão adicionar já comentado.

Private Sub cmdAdicionar_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles cmdAdicionar.Click

"Antes de gravar os itens, verificamos se o código

"do produto digitado é válido, vendo se a descrição para o

"mesmo

If lblDescricao.Text = Nothing Then

MsgBox("Produto não cadastrado", 16, "Erro")

Exit Sub

End If

"Gravando os itens e mostrando no grid.

"tratando o campo ValorProduto (trocando "," por "."

Dim sValorProduto As String = txtValorProduto.Text

sValorProduto = sValorProduto.Replace(",", ".")

Dim strQuery As New StringBuilder

strQuery.Append("Insert into PedidosItens ")

strQuery.Append(" (")

strQuery.Append("IdPedido,")

strQuery.Append("IdProduto,")

strQuery.Append("Quantidade,")

strQuery.Append("ValorProduto")

strQuery.Append(") ")

strQuery.Append(" VALUES (")

strQuery.Append(txtIdPedido.Text)

strQuery.Append("," & txtIdProduto.Text)

strQuery.Append("," & txtQuantidade.Text)

strQuery.Append("," & sValorProduto)

strQuery.Append(");")

"Abrir o banco de dados e passar os

"parametros da consulta strQuery, parametros

"e ordem de execução, retorna o número do pedido último +1

"e fecha a conexão.

Dim cn As New SqlConnection(conexao)

cn.Open()

Dim cmdCommand As New SqlCommand

With cmdCommand

.CommandText = strQuery.ToString

.CommandType = CommandType.Text

.Connection = cn

.ExecuteNonQuery()

End With

cn.Close()

"limpando as caixas de Texto do GroupBox2

For Each ctl As Control In GroupBox2.Controls

If TypeOf ctl Is TextBox Then

ctl.Text = Nothing

End If

Next

"Exibindo os dados gravados no DgvItens.

Dim Csql As New StringBuilder

Csql.Append("Select *,(Quantidade * ValorProduto)As Total From PedidosItens")

Csql.Append(" where IdPedido=" & txtIdPedido.Text)

cn.Open()

Dim cmdCommand1 As New SqlCommand

With cmdCommand1

.CommandText = Csql.ToString

.CommandType = CommandType.Text

.Connection = cn

.ExecuteNonQuery()

End With

"Declarado um dataadapter e um dataset

"passar o comando para o dtAdapter e

"carregar o dataset com resultado da busca

Dim dtAdapter As New SqlDataAdapter

Dim dsDataSet As New DataSet

With dtAdapter

.SelectCommand = cmdCommand1

.Fill(dsDataSet)

End With

Me.DgvItens.AutoGenerateColumns = True

Me.DgvItens.DataSource = dsDataSet.Tables(0)

cn.Close()

txtIdProduto.Focus()

End Sub

13) Para finalizar, código do botão fechar comentado.

Private Sub cmdFechar_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles cmdFechar.Click

Dim data As Date = txtData.Text

Dim hora As Date = txtHora.Text

"Buscando o valor total do pedido no campo calculado

Dim cSql As String

cSql = "Select Sum(Quantidade * ValorProduto)as Total From PedidosItens Where IdPedido=" & Val(txtIdPedido.Text)

"Abrir o banco de dados e passar os

"parametros da consulta SQL, parametros

"e ordem de execução.

Dim cn As New SqlConnection(conexao)

cn.Open()

Dim cmdCommand As New SqlCommand

With cmdCommand

.CommandText = cSql

.CommandType = CommandType.Text

.Connection = cn

End With

Dim drReader As SqlDataReader = cmdCommand.ExecuteReader()

Dim valortotal As Decimal

If drReader.Read() Then

valortotal = drReader.Item("Total")

txtValorTotal.Text = FormatCurrency(valortotal)

End If

cn.Close()

Dim sValorTotal As String = Replace(valortotal, ",", ".")

Dim strQuery As New StringBuilder

strQuery.Append("Update Pedidos ")

strQuery.Append("set ")

strQuery.Append("IdPedido=")

strQuery.Append(txtIdPedido.Text)

strQuery.Append(", Data="")

strQuery.Append(data.ToShortDateString())

strQuery.Append("", Hora="")

strQuery.Append(hora.ToShortTimeString())

strQuery.Append("", IdCliente=")

strQuery.Append(txtIdCliente.Text)

strQuery.Append(", ValorTotal=")

strQuery.Append(sValorTotal)

strQuery.Append(" where IdPedido=")

strQuery.Append(txtIdPedido.Text & ";")

"Abrir o banco de dados e passar os

"parametros da consulta strQuery, parametros

"e ordem de execução, retorna o número do pedido último +1

"e fecha a conexão.

cn.Open()

Dim cmdCommand1 As New SqlCommand

With cmdCommand1

.CommandText = strQuery.ToString

.CommandType = CommandType.Text

.Connection = cn

.ExecuteNonQuery()

End With

cn.Close()

"exibe mensagem de sucesso

MessageBox.Show("Pedido efetuado com sucesso", "Sucesso", MessageBoxButtons.OK, MessageBoxIcon.Information)

MessageBox.Show("Próxima aula, nesse local, colocaremos " _

& " rotina para exibir o relatório do pedido criado", "Aviso", MessageBoxButtons.OK)

Me.Close()

End Sub

Nota do autor: Esse foi o quarto artigo do projeto “Disk-Pizza”, no próximo artigo aprenderemos a criar relatórios no crystal reports para nossa aplicação. Incluindo o relatório de pedidos.

Obrigado,

Maromo.

Marcos Roberto de Moraes

Marcos Roberto de Moraes - Mestrando em Educação (UNISAL)
Especialista em Administração de Sist. Informação (UFLA)
Licenciado Pleno em Informática (UNIMEP)
Professor das Faculdades Santa Lúcia de SI, FATEC e ETEC de Mogi Mirim-SP