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:

imagem

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.

imagem 

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.

imagem 

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.

imagem 

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.

imagem 

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.

imagem 

Figura 6.

Escolha Pocket PC e Windows Application e clique em OK.

imagem 

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.

imagem 

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:

imagem 

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:

imagem 

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.

imagem 

Figura 11.

Verificando os Dados Gravados no SQL Server.

Pedido:

 

select * from pedidos where pedido = 3;

imagem 

Figura 12.

Itens do Pedido:

 

select * from itenspedido where pedido = 3;

imagem 

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”

imagem 

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.

imagem 

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.