Desenvolvimento - Mobile
Palm: Controle de Estoque 1.0 (Segunda Parte)
Seguindo nossa lógica de desenvolvimento vamos entrar na nossa segunda fase de desenvolvimento, ou seja, editar nosso código fonte.
por Wellington Pinto de Oliveira- Palm: Controle de Estoque 1.0
- Tutorial: Configurando uma Conexão no Palm
- Palm: Desenvolvendo Aplicativos com NS Basic
- Palm: O Ambiente de Desenvolvimento
Seguindo nossa lógica de desenvolvimento vamos entrar na nossa segunda fase de desenvolvimento, ou seja, editar nosso código fonte.
As telas por si só não executarão o manuseio dos dados, apenas servem para exibir de forma humana opões ao usuário. A partir de agora aprenderemos a criar códigos para manuseio de dados arquivos PDB"s.
Mas o que é PDB? A resposta é simples, sempre utlizaremos arquivos PDB para armazenar dados, estes arquivos possuem um layout simples de tabela onde os registros são as linhas horizontais e os campos são as linhas verticais.
Na imagem abaixo temos de um exemplo de tabela.
Figura 1 Tabela Agenda.
Nesta tabela temos dois registros (1 e 2), cada retgistro possui três campos (ID, Nome e Telefone) que são chamados de "offset".
Campo | Offset |
ID | 0 |
Nome | 1 |
Telefone | 2 |
Por exemplo:
Caso seja necessário capturar o telefone do Wellington vamos acessar o Offset 2 do registro 1.
Ao contrário do que se pensa o ato de criar arquivos PDB"s é simples dês de que tenha-se uma certa preocuação em definir o layout da tabela antes da implementação do software.
Como veremos o NS Basic trabalha com uma tabela nativa do PalmOS sendo assim pode-se haver erros ao informar um tipo incompatível de dados na leitura.
Vamos então definir o Layout de nossa tabela:
Campo | Offset | Tipo |
produto | 0 | String |
preço | 1 | Float |
quantidade | 2 | Integer |
Mas aonde vamos criar uma tabela no NS Basic? O NS Basic não possui uma ferramenta para criação de tabelas por Layout, toda a criação é feita por código fonte, porem antes de editar nosso código fonte vamos entender melhor a teoria de tipos de acesso aos dados.
Tipos de acesso a dados
No NS Basic econtramos dois tipos básicos de acesso:
- Identificado por chave: Todas as funções de manipulação de tabelas que usam esta filosofia necessitam de uma chave para identificar um registro, esta chave se encontra no Offset zero (0).
- Não possui identificação por chave: Este grupo de funções não necessitam de chaves para manuseio de dados na tabela, porem o manuseio de dados utilizando estes grupos de funções necessitam de um pouco mais de atenção e trabalho, porem podemos criar a partir destes nossos próprios mecanismo de manipulação de dados.
Abaixo temos uma tabela com todas as funções relativas a manipulação de PDB"s e suas propriedades:
Função | Descrição | Chave |
dbClose | Fecha uma tabela aberta | Não |
dbCreate | Cria uma tabela | Não |
dbDelete | Deleta um registro em uma tabela | Sim |
dbErase | Remove uma tabela do Palm | Não |
dbFind | Procura em uma tabela um determinado registro | Sim |
dbGet | Lê um registro | Não |
dbGetNoRecs | Retorna um numero de registro em uma tabela | Não |
dbInsert | Insere um novo registro na tabela | Sim |
dbOpen | Abre uma tabela | Não |
dbPosition | Posiciona o cursor em um determinado campo da tabela | Não |
dbPut | Escreve um valor em um registro da tabela | Não |
dbRead | Lê um registro da tabela | Sim |
dbReadNext | Lê o próximo registro da tabela | Sim |
dbReadPrev | Lê o registro anterior | Sim |
dbReset | Posicona o cursor no primeiro registro da tabela | Sim |
dbUpdate | Atualiza um registro da tabela | Sim |
As funções que não necessitam de chave são pouco usadas por grande parte dos programadores, porem o conhecimento destas fuções é de grande ajuda no desenvolviemento de projetos complexos.
Criando variáveis
Antes de continuar a trabalhar com tabelas vamos aprender como se declara uma variável no NS Basic.
Basicamente temos dois tipos de variáveis:
- Variáveis Locais: Que são criadas em uma determinada rotina e ao termino desta todas as variáveis são descartadas;"
- Variáveis Globais: Que são criadas e só são descartadas ao termino da execução dos Software.
Pra criar uma variável Local utilizamos a seguinte sintaxe:
Dim nome_variavel as tipo_variavel
Onde:
Dim: Palavra reservada;
Nome_variavel: nome a qual vamos nos referir a este espaço de memória;
Tipo_variavel: tipo a qual deve ser armazenada no espaço de memória alocado.
No caso de uma variável Global apenas mudaremos a palavra reservada Dim pela palavra Global, veja a sintaxe:
Global nome_variavel as tipo_variavel
Uso da Memória
Cada tipo de variável utiliza uma quantidade específica de bytes para armazenamento da variável. Confira isto na tabela abaixo:
Tipo | Descrição | Tamanho |
String | Cadeia de caracteres (Texto). | Um byte para cada caractere mais um para marcar o fim da string (caractere 0) |
Byte | Um único caractere. | 1 byte |
Integer | Números inteiros. | 4 bytes |
Short | Números inteiros. | 2 bytes |
Float | Números de ponto flutuante, que armazenam números inteiros e fracionários. | 8 bytes |
Double | Idêntico ao Float. | 8 bytes |
Single | Número de ponto flutuante com menor precisão (conseqüentemente ocupando menor quantidade de memória). | 4 bytes |
Date | Usado para armazenar datas. Armazena datas no formato nativo do Palm OS. | 8 bytes |
Time | Usado para armazenar horas. Também utiliza o formato nativo do Palm OS. | 8 bytes |
Database | Armazena referência para Bancos de Dados | 4 bytes |
Nosso código fonte irá começar justamente neste ponto, vamos editar as variáveis globais que armazenarão os dados comuns aos formulários, para isso vá em Project | Startup Code, edite o seguinte código:
"A tabela dbProdutos deve armazernar os seguintes "campos: produto as string,preco as float,quantidade as integer Global dbProdutos as Database "criando um ponteiro que servirá na navegação "da tabela Global ponteiro as Integer
Modularização
Para um mehor desenvolvimento de software é aconselhado o uso da modularização do código, mas o que é modularização? Podemos definir como divisão do código em pequenas rotinas que executam apenas um tipo de ação, ou seja, propósito.
Para criar um arquivo module, siga o seguinte caminho: Project | Add New Module.
Figura 2 Acessando o Code Editor
A este arquivo adicione o seguinte código:
"Abre uma tabela Sub openProduto() Dim resultado as Integer "vamos abrir a tabela resultado = DbOpen(dbProdutos,"dbProdutos",0) If resultado> 0 Then "caso a tabela não exista vamos tentar criar resultado = dbCreate(dbProdutos,"dbProdutos",0,"SOFT") If resultado> 0 Then MsgBox "Erro ao abrir/criar banco de dados, erro: " + str(resultado) Stop End If resultado = dbOpen(dbProdutos,"dbProdutos",0) End If End Sub "fecha uma tabela Sub closeProduto() Dim resultado as Integer "fechando a tabela resultado = dbClose(dbProdutos) End Sub "grava um novo registro na tabela Function gravaProduto(produto as String, preco as Float, quantidade as Integer) as Integer Dim resultado as Integer "abrindo a tabela Call openProduto() "executando a inserção resultado = dbInsert(dbProdutos,produto,preco,quantidade) "caso o NS Basic retorne algum valor diferente de 0 "um erro ocorreu. If resultado> 0 Then MsgBox "Erro ao inserir produto." Else MsgBox "Produto gravado com sucesso." "caso ocorra tudo bem vamos limpar os "fld"s Call limpaNCampos() End If "fechando a tabela Call closeProduto() "retornando o resultado para quem o chamou gravaProduto = resultado End Function "modifica os dados na tabela Function modificaDados(produto as String, preco as Float, quantidade as Integer) as Integer Dim resultado as Integer Call openProduto() "posicionando o ponteiro no meu banco de dados resultado = dbPosition(dbProdutos,ponteiro,0) If resultado = 0 Then "realizando o Update na base de dados resultado = dbPut(dbProdutos,produto,preco,quantidade) "verificando se a atualização foi executada com sucesso "caso ele retorne um valor <> de 0 ocorreu um erro If Not resultado = 0 Then "informando que houve um erro MsgBox "Erro ao realizar update na base de dados." "finalizando a rotina Else End If Else MsgBox "Erro ao posicionar ponteiro." End If Call closeProduto() "retornando o resultado da ação modificaDados = resultado End Function "exclui um registro da tabela Sub excluirRegistro() Dim resultado as Integer Dim resposta as Integer Dim chave as String Call openProduto() resposta = Alert("Excluir", "Deseja Excluir este ítem?",0,"Sim","Não") If resposta = 0 Then "pegando a chave para uso do dbDelete resultado = dbPosition(dbProdutos,ponteiro,0) If resultado = 0 Then resultado = dbGet(dbProdutos,chave) If resultado = 0 Then resultado = dbDelete(dbProdutos,chave) If Not resultado = 0 Then MsgBox "Erro ao excluir dados" Else fldVProduto.Text = "" fldVQuantidade.Text = "" fldVPreco.Text = "" fldVValor.Text = "" Call closeProduto() NextScreen "frmMain" End If Else MsgBox "Erro ao encontrar registro." End If Else MsgBox "Erro ao posicionar ponteiro" End If End If Call closeProduto() End Sub "limpa os campos do formulário frmNProduto Sub limpaNCampos() fldNProduto.text = "" fldNQuantidade.text = "" fldNPreco.text = "" End Sub "limpa os campos do fomrulário frmVProduto Sub limparVCampos() fldVProduto.text = "" fldVQuantidade.text = "" fldVPreco.text = "" fldVValor.text = "" End Sub
Vamos agora detalhar cada rotina acima, é óbvio que vamos começar falando da rotina encarregada de abrir a tabela, esta é chamada de "openProduto()". Logo de inicio estou criando uma variável local que receberá o resultado da execução de cada função que manuseia a tabela.
Dim resultado as Integer
Sempre que uma função retornar zero (0) significa que esta foi executada corretamente e nenhum erro ocorreu. Uma tabela com a relação de números pode ser encontrada no site http://www.softpalm.com.br ou no site http://www.nsbasic.com.br.
Logo após a criação desta variável vamos utilizar a função "dbOpen()", esta função recebe dois parâmetros conforme o exemplo abaixo:
resultado = DbOpen(dbProdutos,"dbProdutos",0)
No primeiro parâmetro estamos passando a variável Global dbProdutos, esta irá armazenar dados da tabela. O segundo parâmetro é o nome da tabela que está armazenada na memória do Palm e o terceiro parâmetro indica a memória relacionada, estamos passando 0 pois estamos nos referindo a memória pricipal do equipamento, caso tenhamos um cartão de memória utilizaríamos 1 como parâmetro.
Neste momento podemos ter dois erros básicos, ou a tabela não existe ou ela existe e está corrompida. Caso a função "dbOpen()" retorne um numero diferente de zero vamos tentar criar a tabela utilizando "dbCreate()". Esta função é semelhante a utilizada para abrir prem estamos passando um parâmetro a mais, ou seja, o quarto parâmetro. Este parâmetro indica qual o Creator ID que a tabela estará sendo vinculada.
resultado = dbCreate(dbProdutos,"dbProdutos",0,"SOFT")
Caso tenha alguma dúvida sobre este assunto recorra aos meus artigos anteriores e faça uma revisão.
Caso esta função retorne um numero diferente de 0 provavelmente nossa tabela já existia e estava corrompida, vamos então informar ao usuário e fechar o aplicativo.
Para fechar a tabela implementei uma rotina chamada "closeProduto()". Dentro desta rotina estamos utlizando a função "dbClose()" que só precisa da variável Database para fechar a tabela.
resultado = dbClose(dbProdutos)Agora vamos entrar em uma parte um pouco mais complicada, a inserção. Esta será feita pela rotina "gravaProduto()".
Após criar a variável retorno estamos ulizando "openProduto()" para abrir a tabela, esta é uma prática que venho implementando nos meus aplicativos para Palm. Vamos abrir a tabela, executar algo e em seguida fechar.
A execução será feita pela fução "dbInsert()", que recebe o numero de parâmetros referente ao numero de colunas mais a variável Database.
resultado = dbInsert(dbProdutos,produto,preco,quantidade)
Tome cuidado ao definir estas variáveis, uma vez este Layout será sempre este Layout. Uma outra observação sobre "dbInsert()" é que se existir um registro com a mesma chave este método retornará um resultado diferente de zero.
No método abaixo teremos outra forma de posicionamento e alteração na tabela, não será utilizado o "dbUpdate()", atravez de funções que não necessitam de chave vou fazer a modificações necessárias.
Primeiro vou posicionar o ponteiro na célula em que quero alterar, para isso estou usando o "dbPosition()".
resultado = dbPosition(dbProdutos,ponteiro,0)
Após posicionar o ponteiro vamos imputar os novos valores na tabela, para isso estarei utilizando o "dbPut()".
resultado = dbPut(dbProdutos,produto,preco,quantidade)Existe outra forma de atualizar uma tabela, utlizei esta para demostrar o uso de funções que não necessitam de chaves e que geralmente são esquecidas.
Agora que inserimos e atualizamos vamos aprender a excluir um registro. Antes de excluir o registro temos que perguntar se o usuário quer realmente excluir o registro, para isso vou exibir um Alert na qual ele irá expressar seu desejo.
resposta = Alert("Excluir", "Deseja Excluir este ítem?",0,"Sim","Não")
Após confirmar a exclusão vou pegar a chave usando "dbPosition()" e "dbGet()". Com a chave na mão vou então excluir o registro utilzando "dbDelete()".
resultado = dbDelete(dbProdutos,chave)
Este foi apenas um resumo do uso do NS Basic para manipulação de dados em PDB"s. Por enquanto vou ficando por aqui e em poucos dias vou postar o ultimo artigo desta série onde estaremos acessando dos formulários todas estas rotinas implementadas aqui.
Wellington Pinto de Oliveira
- Como criar um player de audio para Windows PhoneDisp. móveis
- Windows Phone: Criando e lendo arquivos de textoDisp. móveis
- Inserindo, editando e lendo dados no Windows Phone com IsolatedStorageSettingsDisp. móveis
- Introdução ao jQuery MobileJavascript
- Entendendo a navegação entre páginas no Windows Phone 7Disp. móveis