Mobilidade em um Restaurante
Veja neste artigo de Jefferson Luis Junglaus, como criar um aplicativo para PDA.
Mobilidade em um Restaurante
Demonstrarei como criar um Aplicativo para PDA que otimizará o atendimento aos clientes e o processo de comunicação entre Garçom e Cozinha de um Restaurante.
“Imagine, você e sua namorada numa bela noite vão a um Restaurante, se acomodam na mesa já reservada, logo vem o garçom munido de um PDA e um cardápio, vocês escolhem uma deliciosa Pizza Portuguesa - Média e dois sucos um de Laranja e outro de Coco, o garçom insere no PDA o número da mesa, seleciona a Pizza e os sucos, cliqua em finalizar pedido automaticamente é mostrado em um PC Desktop que fica na cozinha o novo Pedido pendente, e o garçom vai a próxima mesa.
Vamos desenvolver um Aplicativo para Pocket PC usando a Linguagem VB.net, lembre-se que o sistema necessita do .Net Compact Framework.
Então como vamos fazer a comunicão entre o Pocket PC e o PC Desktop, simples vamos usar um WebService para inserir os dados no Banco de Dados SQL Server 2000.
O Pocket PC acessará o nosso WebService através da rede sem fio (WireLess).
Mas você deve estar se perguntando o que é uma rede WireLess, a rede Wireless (sem fio) é um sistema de transmissão de dados flexível que pode ser utilizada como alternativa para as redes cabeadas. É uma tecnologia que permite a conexão entre equipamentos sem uma conexão física direta, O princípio de funcionamento das Wireless se baseia na transmissão de dados através da camada atmosférica utilizando a propagação das ondas eletromagnéticas, entretando o wireless engloba o uso de raios de luz infra-vermelha, apesar das ondas de rádio serem o meio mais difundido.
O que é um WebService, um WebService é um conjunto de métodos WebMethods logicamente associados e chamados através de SOAP.
Modelo de Comunicação:
Figura 1.
Nota: PC Desktop é o computador que ficará na cozinha.
1º Devemos criar o Banco de Dados, usaremos o SQL Server 2000.
Criaremos o DataBase:
create database mobile;
Criaremos a tabela de Produtos com os Campos Código, Nome e Preço:
create table produtos(
codigo int,
nome varchar(30),
preco decimal(9,2),
primary key(codigo));
Agora devemos adicionar os Produtos que iram compor o nosso cardápio:
insert into produtos values(1, 'PIZZA PORTUGUESA - MÉDIA', 18.50);
insert into produtos values(2, 'PIZZA CALABREZA - MÉDIA', 19.00);
insert into produtos values(3, 'PIZZA MISTA - MÉDIA', 20);
insert into produtos values(4, 'PIZZA DA CASA - MÉDIA', 17.50);
insert into produtos values(5, 'PIZZA CALIFÓRNIA - GRANDE', 22.50);
insert into produtos values(6, 'PIZZA MORANGO - GRANDE', 23.00);
insert into produtos values(7, 'REFRIGERANTE COLA', 2);
insert into produtos values(8, 'REFRIGERANTE LARANJA', 1.75);
insert into produtos values(9, 'REFRIGERANTE LIMÃO', 1.75);
insert into produtos values(10, 'SUCO LARANJA', 1.75);
insert into produtos values(11, 'SUCO COCO', 1.75);
Criaremos a tabela Pedidos com os campos Pedido o qual é um número seqüencial do pedido, pendente recebe “1” quando e feito o pedido pelo garçom e “0” quando o pedido está pronto no nosso caso quando a Pizza e os sucos estiverem pronto.
create table pedidos(
pedido int ,
mesa int,
pendente bit,
primary key(pedido));
Criaremos a tabela ItensPedido com os campos Pedido e Produto o qual foi pedido pelo cliente, vamos manter integridade referência com FOREIGN KEY.
create table itenspedido(
pedido int not null,
produto int not null,
foreign key(pedido) references pedidos(pedido),
foreign key(produto) references produtos(codigo));
2º Criar o WebService responsável pela comunicação entre Pocket PC e o Banco de dados SQL Server 2000.
Inicie o Microsoft Visual Studio 2003 .Net clique no menu File|New->Project, clique em Visual Basic Projects e em ASP.net WebService especifique Location http://localhost/Restaurante e para finalizar clique em OK, pronto você acaba de criar o WebService.
Figura 2.
Serão criados 5 arquivos, AssemblyInfo.vb, Global.asax, Service1.asmx, Service1.asmx.vb e Web.config, abra o arquivo Service1.asmx.vb, na paleta ToolBox na aba Data selecione e araste os componentes SqlConnection, SqlCommand e SQL DataAdapter para o Design do Service1.asmx.vb.
Figura 3.
Clique no Componente SqlConnection1 localize a propriedade ConnectionString e clique em &lf;NEW Connection...&gf;será aberto uma Janela de Propriedades de Vinculação de Dados, na aba Provedor selecione Microsoft OLE DB Provider for SQL Server, na aba Conexão selecione o Nome do Servidor do Banco de Dados SQL Server no meu caso será JEFFERSON e o tipo de Logon no servidor no meu caso Usar nome de usuário e senha especificos, usuários sa e senha 123, selecione o banco de dados no servidor o qual já criamos que demos o nome de mobile, após tudo configurado clique em OK.
Figura 4.
O ConnectionString ficará assim:
workstation id=JEFFERSON;packet size=4096;user id=sa;password=123;data source=JEFFERSON;persist security info=False;initial catalog=mobile;password=123
Clique no Componente SqlDataAdapter1, localize a Propriedade SelectCommand ligue-a ao SqlCommand1, SqlDataAdapter será o nosso adaptador entre o Comando SQL e o DataSet que trafegará em formato XML.
Clique no Componente SqlCommand1, localize a propriedade Connection e ligue-o ao SqlConnection1, o SqlCommand serve para executarmos comandos SQL em nosso Banco de Dados.
Tecle F7 para irmos ao código do Service1.asmx.vb logo acima de End Class insira os WebMethod.
WEBMETHOD()_
Public Function ExecuteSQL(ByVal aStr As String) As Integer
SqlConnection1.Open() 'Abre a conexão com o Banco de Dados
SqlCommand1.CommandText = aStr 'Atribui o comando SQL ao SqlCommand
Return SqlCommand1.ExecuteNonQuery() 'Executa o comando SQL
SqlConnection1.Close() 'Fecha a Conexão com o Banco de Dados
End Function
WEBMETHOD()_
Public Function ExecuteQuery(ByVal aStr As String) As DataSet
Dim ds As DataSet = New DataSet
SqlConnection1.Open() 'Abre a conexão com o Banco de Dados
SqlCommand1.CommandText = aStr 'Atribui o comando SQL ao SqlCommand
SqlDataAdapter1.Fill(ds) 'Populaciona o DataSet
Return ds 'Retorno o DataSet em formato XML
SqlConnection1.Close() 'Fecha a Conexão com o Banco de Dados
End Function
No WebMethod ExecuteSQL se o comando SQL for executado com sucesso será retornado 1 caso contrario será retornado 0.
No WebMethod ExecuteQuery será retornado um XML conteúdo o conteúdo de um Comando SQL “Select” em formato XML o qual é utilizado pelos dataset, legal não podemos trabalhar transmitir dados a traves dos WebService via XML e DataSet com poucas linhas de código.
Tecle F5 para compilar e Executar nosso WebService note que o WebMethod já está disponível no navegador, é possível executar comandos SQL a partir do navegador.
O endereço do nosso WebService é http://localhost/Restaurante/Service1.asmx.
Figura 5.
3º Criar o Aplicativo para o Pocket PC “Smart Device Application“, o qual o garçom utilizará.
Agora vamos criar o Aplicativo para o Pocket PC, clique em File|New->Project, clique em Visual Basic Projects escolha o Template Smart Device Application informe o Name Restaurante e a Location c:\mobile\ e clique em OK.
Figura 6.
Escolha Pocket PC e Windows Application e clique em OK.
Figura 7.
Como iremos usar o Emulador do Pocket PC então devemos adicionar um Adaptador de Rede Microsoft LoopBack Adapter para adicionar vá em Iniciar->Configurações->Painel de Controle->Adicionar Hardware|Adaptadores de Rede|Microsoft LoopBack Adapter, defina um IP para esse adaptador no meu caso define 192.168.1.2.
Agora vamos adicionar uma referência ao nosso WebService para termos acesso aos métodos do WebService no caso o ExecuteQuery e ExecuteSQL,
clique em Project|Add Web Reference será exibido uma Janela aonde informaremos o WSDL do nosso WebService, após informarmos o endereço do WSDL e o nome da nossa referência “Web reference name” clique em GO e em Add Reference, o Visual Studio.NET criará uma classe “proxy” no projeto. Esta classe tem a mesma sintaxe de uma classe .NET, mas na verdade está invocando um WebService.
Figura 8.
O IP 192.168.1.2 é referente ao Adaptador Microsoft LoopBack Adapter.
Note que no Solution Explorer é adicionado uma Web Reference “wbrestaurante”.
O que é WSDL
É um Padrão que descreve perfeitamente os objetos e métodos disponíveis, através de páginas XML acessíveis através da Web. Altere o nome do Form1 para frmPedidos e o Text para Efetuar Pedido, insira no frmPedidos 4 Labels, 1 TextBox, 1 ComboBox, 4 Buttons e 1 ListBox altere as seguintes propriedades:
Labels:
Name |
Text |
lbMesa |
Mesa |
lbPedido |
Pedido |
lbCodigoProduto |
Código do Produto |
lbStatus |
Status |
TextBox:
Name |
Text |
txtMesa |
0 |
ComboBox:
Name |
cbxProdutos |
Buttons:
Name |
Text |
btAdicionar |
+ |
btDeletar |
- |
btFinalizarPedido |
Finalizar Pedido |
btCancelarPedido |
Cancelar Pedido |
ListBox:
Name |
lstProdutos |
O seu formulário deve ficar parecido com esse:
Figura 9.
Agora vamos ao código:
Procedimento responsável para retornar as propriedades dos componentes como estavam inicialmente.
Private Sub Limpa()
txtMesa.Text = "0"
cbxProdutos.SelectedIndex = -1
lstPedido.Items.Clear()
txtMesa.Focus()
End Sub
No evento OnLoad do Formulário será carregado os dados da Tabela Produto no ComboBox cbxProdutos.
Private Sub frmPedidos_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
Dim I As Integer
wb = New wbrestaurante.Service1 'Cria uma instancia do WebService
dsProdutos = New DataSet 'Cria o Dataset Produtos
dsProdutos = wb.ExecuteQuery("Select * from Produtos") 'Seleciona a Tabela de Produtos
For I = 0 To dsProdutos.Tables(0).Rows.Count - 1 'Varre a Tabela
cbxProdutos.Items.Add(dsProdutos.Tables(0).Rows(I).Item("CODIGO").ToString + " - " _
+ dsProdutos.Tables(0).Rows(I).Item("NOME").ToString) 'Adciona no Combobox Produtos o Codigo + o Nome do Produto
Next
End Sub
Evento OnClick do Botão btAdcionar “+”, adiciona o Produto Selecionado do ComboBox cbxProdutos “Produto” ao ListBox lstPedido “Pedido”.
Private Sub btAdicionar_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btAdicionar.Click
lstPedido.Items.Add(cbxProdutos.Items.Item(cbxProdutos.SelectedIndex)) 'Adiciona no ListBox Pedido o Produto selecionado no ComboBox
cbxProdutos.SelectedIndex = -1
cbxProdutos.Focus()
End Sub
Evento OnClick do Botão btDeletar “-”, responsável por deletar o Produto selecionado do ListBox lstPedido “Pedido”.
Private Sub btDeletar_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btDeletar.Click
lstPedido.Items.RemoveAt(lstPedido.SelectedIndex) 'Remove o Pedido Selecionado
End Sub
Evento OnClick do Botão btCancelarPedido “Cancelar Pedido”, responsável por cancelar o Pedido atual.
Private Sub btCancelarPedido_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btCancelarPedido.Click
Limpa() 'Retorna ao estado inicial
lbStatus.Text = "Pedido Cancelado!!!"
End Sub
Evento OnClick do Botão btFinalizarPedido “Finalizar Pedido”, responsável por adicionar na Tabela Pedidos e ItensPedidos do banco Dados SQL Server vai WebService os dados Informados pelo Garçom.
Private Sub btFinalizarPedido_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btFinalizarPedido.Click
Dim ds As DataSet = New DataSet 'Cria o DataSet no qual iremos verificar o código do próximo pedido
Dim ProximoPedido As String 'Código do próximo pedido
Dim I As Integer
Dim aStr As String
ds = wb.ExecuteQuery("select max(pedido) +1 as ProximoPedido from pedidos") 'Retorno o Maior Pedido +1 existente na Tabela Pedidos
ProximoPedido = ds.Tables(0).Rows(0).Item("ProximoPedido").ToString 'Pega o valor retornado pelo SELECT
If Trim(ProximoPedido) = "" Then 'Se o ProximoPedido for embranco não existe dados na Tabela Pedido entao o Proximo Pedido é 1
ProximoPedido = "1"
End If
If wb.ExecuteSQL("insert into pedidos values(" + ProximoPedido _
+ ", " + txtMesa.Text + ", 1);") = 1 Then 'Insere as informações do Pedido se o retorno for True "1" insere os itens do Pedido
For I = 0 To lstPedido.Items.Count - 1
aStr = lstPedido.Items(I) 'Pega o Item
aStr = aStr.Substring(0, 2).Trim() 'Pega somente o Codigo do Produto
wb.ExecuteSQL("insert into itenspedido values(" + ProximoPedido _
+ ", " + aStr + ");") 'Itens do Pedido
Next
lbStatus.Text = "Pedido (" + ProximoPedido.ToString + ") inserido com Sucesso!!!" 'Se tudo ocorrer corretamente mensagem
End If
Limpa() 'retorna ao estado inicial
End Sub
Compile e execute o Aplicativo, selecione alguns produtos e clique em finalizar pedido o resultado Final será esse:
Figura 10.
Tive por base os Produtos mencionados no Pedido do inicio desse artigo.
Será Exibida a seguinte mensagem no caso meu foi o 3 pedido.
Figura 11.
Verificando os Dados Gravados no SQL Server.
Pedido:
select * from pedidos where pedido = 3;
Figura 12.
Itens do Pedido:
select * from itenspedido where pedido = 3;
Figura 13.
Ufa! Todos os dados estão gravados, para fazer o sistema PC Desktop será simples basta criar um novo projeto fazer a conexão com o Banco de Dados e ficar selecionado os Pedidos cada 10s por exemplo isso pode ser feito usando o componente Timer.
Vamos lá falta pouco.
Crie um novo Aplicativo VB Windows Forms Application, em File|New->Project, agora vamos fazer a conexão com o banco de dados, na toolbox na aba Data usaremos os componentes OleDbConnection e OleDbDataAdapter araste-os para o nosso projeto, configure o ConnectionString do componente OleDbConnection para acessar o Banco de Dados SQL Server.
O ConnectionString ficará assim
“Integrated Security=SSPI;Packet Size=4096;Data Source=JEFFERSON;Tag with column collation when possible=False;Initial Catalog=mobile;Use Procedure for Prepare=1;Auto Translate=True;Persist Security Info=False;Provider="SQLOLEDB.1";Workstation ID=JEFFERSON;Use Encryption for Data=False”
Figura 14.
Na propriedade Connection do OleDbDataAdapter coloque seu OleDbConnection, coloque um GRID que iremos visualizar os Pedidos Pendentes, um Timer que será responsável por verificar novas Pedidos e mostra no DBGrid, altere a propriedade Interval para 10000 e Enabled para True.
Código Fonte do Sistema:
Public Class Form1
Inherits System.Windows.Forms.Form
#Region " Windows Form Designer generated code "
Public Sub New()
MyBase.New()
'This call is required by the Windows Form Designer.
InitializeComponent()
'Add any initialization after the InitializeComponent() call
End Sub
'Form overrides dispose to clean up the component list.
Protected Overloads Overrides Sub Dispose(ByVal disposing As Boolean)
If disposing Then
If Not (components Is Nothing) Then
components.Dispose()
End If
End If
MyBase.Dispose(disposing)
End Sub
'Required by the Windows Form Designer
Private components As System.ComponentModel.IContainer
'NOTE: The following procedure is required by the Windows Form Designer
'It can be modified using the Windows Form Designer.
'Do not modify it using the code editor.
Friend WithEvents OleDbConnection1 As System.Data.OleDb.OleDbConnection
Friend WithEvents DataGrid1 As System.Windows.Forms.DataGrid
Friend WithEvents Timer1 As System.Windows.Forms.Timer
Friend WithEvents OleDbSelectCommand1 As System.Data.OleDb.OleDbCommand
Friend WithEvents OleDbInsertCommand1 As System.Data.OleDb.OleDbCommand
Friend WithEvents OleDbUpdateCommand1 As System.Data.OleDb.OleDbCommand
Friend WithEvents OleDbDeleteCommand1 As System.Data.OleDb.OleDbCommand
Friend WithEvents OleDbDataAdapter1 As System.Data.OleDb.OleDbDataAdapter
SYSTEM.DIAGNOSTICS.DEBUGGERSTEPTHROUGH()Private Sub InitializeComponent()
Me.components = New System.ComponentModel.Container
Me.OleDbConnection1 = New System.Data.OleDb.OleDbConnection
Me.DataGrid1 = New System.Windows.Forms.DataGrid
Me.Timer1 = New System.Windows.Forms.Timer(Me.components)
Me.OleDbSelectCommand1 = New System.Data.OleDb.OleDbCommand
Me.OleDbInsertCommand1 = New System.Data.OleDb.OleDbCommand
Me.OleDbUpdateCommand1 = New System.Data.OleDb.OleDbCommand
Me.OleDbDeleteCommand1 = New System.Data.OleDb.OleDbCommand
Me.OleDbDataAdapter1 = New System.Data.OleDb.OleDbDataAdapter
CType(Me.DataGrid1, System.ComponentModel.ISupportInitialize).BeginInit()
Me.SuspendLayout()
'
'OleDbConnection1
'
Me.OleDbConnection1.ConnectionString = "Integrated Security=SSPI;Packet Size=4096;Data Source=JEFFERSON;Tag with column c" & _
"ollation when possible=False;Initial Catalog=mobile;Use Procedure for Prepare=1;" & _
"Auto Translate=True;Persist Security Info=False;Provider=""SQLOLEDB.1"";Workstatio" & _
"n ID=JEFFERSON;Use Encryption for Data=False"
'
'DataGrid1
'
Me.DataGrid1.DataMember = ""
Me.DataGrid1.HeaderForeColor = System.Drawing.SystemColors.ControlText
Me.DataGrid1.Location = New System.Drawing.Point(8, 8)
Me.DataGrid1.Name = "DataGrid1"
Me.DataGrid1.Size = New System.Drawing.Size(272, 208)
Me.DataGrid1.TabIndex = 0
'
'Timer1
'
Me.Timer1.Enabled = True
Me.Timer1.Interval = 1000
'
'OleDbSelectCommand1
'
Me.OleDbSelectCommand1.Connection = Me.OleDbConnection1
'
'OleDbDataAdapter1
'
Me.OleDbDataAdapter1.DeleteCommand = Me.OleDbDeleteCommand1
Me.OleDbDataAdapter1.InsertCommand = Me.OleDbInsertCommand1
Me.OleDbDataAdapter1.SelectCommand = Me.OleDbSelectCommand1
Me.OleDbDataAdapter1.UpdateCommand = Me.OleDbUpdateCommand1
'
'Form1
'
Me.AutoScaleBaseSize = New System.Drawing.Size(5, 13)
Me.ClientSize = New System.Drawing.Size(292, 266)
Me.Controls.Add(Me.DataGrid1)
Me.Name = "Form1"
Me.Text = "Pedidos Pendentes"
CType(Me.DataGrid1, System.ComponentModel.ISupportInitialize).EndInit()
Me.ResumeLayout(False)
End Sub
#End Region
Private Sub Seleciona()
Dim ds As DataSet
ds = New DataSet 'Cria o DataSte
OleDbConnection1.Open() 'Abre a Conexao
OleDbDataAdapter1.SelectCommand.CommandText = "select it.Pedido, it.Produto, P.Nome from itenspedido it, produtos P " & _
"where P.Codigo = it.Produto order by it.Pedido" 'Comando SQL
OleDbDataAdapter1.Fill(ds, "PEDIDOS") 'Carrega os dados para o DataSet
DataGrid1.DataSource = ds
DataGrid1.DataMember = "PEDIDOS"
OleDbConnection1.Close() 'Fecha Conexao
End Sub
Private Sub Timer1_Tick(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Timer1.Tick
Seleciona()
End Sub
Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
Seleciona()
End Sub
End Class
Nosso Programa em Execução cada 10 segundo ele buscará novos pedidos feitos pelos garçons.
Figura 15.
Note que o Pedido três foi aquele efetuado nesse exemplo, no próximo artigo mostrarei uma forma simples de como marcar os pedidos prontos.
Artigos relacionados
-
Artigo
-
Artigo
-
Artigo
-
Artigo
-
Artigo