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



Atenção: Antes de iniciar este artigo aconselho ao leitor uma revisão dos seguintes artigos:

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".

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:

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:

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:

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

Wellington Pinto de Oliveira

Wellington Pinto de Oliveira - Autor do livro "Desenvolvendo Aplicações Palm com NS Basic", atualmente trabalha com automação de processos industriais e códigos de barras. http://www.softpalm.com.br.