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 MoraesNos 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.
- Entity Framework 4: Repositório GenéricoVisual Basic .NET
- As edições 14 da Easy .net Magazine e 88 da .net Magazine já estão disponíveis.ADO.NET
- Postando no Twiiter com .NET e Migre.meC#
- Setup ApplicationsVisual Basic .NET
- Problemas na manipulação de arquivos do MS Excel com .NETVisual Basic .NET