Litebase 1.3 e SuperWaba – Parte 03

Eliminando uma tabela com DROP TABLE

Quando a tabela não é mais necessária ou ela deve ser carregada com novos dados e os antigos devem ser apagados então executamos um DROP TABLE para remover os arquivos.

 

/**

   * Método que exclui a tabela

   * @param rg

   */

  public void drop(LitebaseConnection conn)

  {

         //Gerando a instrução SQL

         String sql = "DROP TABLE PESSOAS";

        

         conn.executeUpdate(sql);

  }

Listagem 7 - Exemplo de DROP TABLE     

Estudo de caso

Até o momento apenas apresentei o Litebase, a partir de agora vamos implementar um software real que tenha as seguintes características:

-                             Lista de Pessoas;

-                             Permita ao usuário criar um registro na tabela PESSOAS;

-                             Possibilite selecionar e alterar um registro.

 

O desenvolvimento d projeto deve começar pela classe responsável pela persistência, crie no pacote samples uma classe chamada Pessoas e a esta codifique segundo a Listagem 8.

 

//TotalStudio (r)

package samples;

 

import waba.sys.Settings;

import waba.sys.Vm;

import litebase.LitebaseConnection;

/**

 * @author Wellington

 *

 * @date Sun Mar 16 10:35:20 BRT 2008

 *

 */

public class Pessoas {

 

  public static String tableName = "PESSOAS";

  public int rowid = 0;

  /** Unique identifier */

  public String codRg = new String();

  /** Information */

  public String nome = new String();

  /** Comment */

  public waba.util.Date datNascimento = new waba.util.Date();

  /** Comment */

  public waba.sys.Time hourCadastro = new waba.sys.Time();

  private LitebaseConnection conn;

 

  /**

   * Construtor, utilizo ele para iniciar variáveis

   */

  public Pessoas() {

         conn = LitebaseConnection.getInstance(Settings.appCreatorId);

  }

 

  public static void createTable() {

         // Iniciando a conexão

         LitebaseConnection conn = LitebaseConnection.getInstance(Settings.appCreatorId);

 

         // Gerando as SQLs

         String sql_create = "CREATE TABLE PESSOAS(COD_RG CHAR(20),NOME CHAR(50) NOCASE,DAT_NASCIMENTO DATE,HOUR_CADASTRO DATETIME)";

         String sql_key = "ALTER TABLE PESSOAS ADD PRIMARY KEY(COD_RG)";

 

         // Validando se já existe a tabela

         if (!conn.exists("PESSOAS")) {

                   try {

                            // Se não existe podemos criar

                            conn.execute(sql_create);

                            conn.executeUpdate(sql_key);

                   } catch (Exception ex) {

                            Vm.debug("Erro: " + ex.getMessage());

                   }

         } else {

                   Vm.debug("Não foi preciso criar pois a tabela já existe");

         }

  }

 

  /**

   * Método que salva a informação na base de dados

   */

  public boolean save() {

         try {

                   String sql = "";

 

                   litebase.ResultSet rs = conn.executeQuery("SELECT rowid FROM " + tableName + " WHERE COD_RG='" + this.codRg + "'");

 

                   if (rs != null && rs.next()) {

                            rs.close();

                            sql = "UPDATE "       + tableName + " SET COD_RG='"+ this.codRg + "',NOME='"  + this.nome     + "',DAT_NASCIMENTO='" + this.datNascimento.toString(waba.sys.Settings.DATE_YMD)+ "',HOUR_CADASTRO='" + formatTimeForLitebase(this.hourCadastro) + "' WHERE COD_RG='" + this.codRg + "'";

                   } else {

                            this.hourCadastro = new waba.sys.Time();

                            sql += "INSERT INTO "+ tableName + " (COD_RG,NOME,DAT_NASCIMENTO,HOUR_CADASTRO) VALUES('" + this.codRg + "','"       + this.nome  + "','"  + this.datNascimento.toString(waba.sys.Settings.DATE_YMD) + "','" + formatTimeForLitebase(this.hourCadastro) + "')";

                   }

                   conn.executeUpdate(sql);

                   return true;

         } catch (Exception ex) {

                   waba.sys.Vm.debug(tableName + ";" + ex.getMessage());

         }

         return false;

 

  }

 

  /**

   * Método que carrega a entdidade dado uma sql

   * @param sql Sql a ser utilizada pelo mecanismo de busca

   */

  public boolean load(String sql) {

         try {

                   litebase.ResultSet rs = conn.executeQuery(sql);

                   if (rs != null && rs.next()) {

                            this.codRg = rs.getString("COD_RG");

                            this.nome = rs.getString("NOME");

                            this.datNascimento = rs.getDate("DAT_NASCIMENTO");

                            this.hourCadastro = rs.getDateTime("HOUR_CADASTRO");

                            rs.close();

                            return true;

                   }

                   rs.close();

         } catch (Exception ex) {

                   waba.sys.Vm.debug(tableName + ";" + ex.getMessage());

         }

         return false;

  }

 

  /**

   * Método que carrega a entdidade dado um número de RG

   * @param cod_rg RG que estamos procurando

   */

  public boolean loadByRG(String cod_rg) {

         String sql = "SELECT ROWID,COD_RG,NOME,DAT_NASCIMENTO,HOUR_CADASTRO FROM " + tableName + " WHERE COD_RG='" + cod_rg + "'";

         return load(sql);

 

  }

 

  /**

   * Dado um Time este método retorna uma string no formato do Litebase

   * @param datetime DataTime a ser formatada

   * @return String no formato do Litebase

   */

  public String formatTimeForLitebase(waba.sys.Time datetime) {

         return datetime.year + "/" + datetime.month + "/" + datetime.day + " "    + datetime.hour + ":" + datetime.hour + ":" + datetime.minute;

  }

 

  /**

   * Exclui o registro corrente

   * @return True se for excluido

   */

  public boolean delete()

  {

         String sql = "DELETE FROM PESSOAS WHERE COD_RG='"+ this.codRg +"'";

         return (conn.executeUpdate(sql) > 0);

  }

 

  /**

   * Método que consulta a base de dados

   * @param sql SQL utilizada como consulta

   * @return Array de duas dimenções, ou nulo se não houver registros

   */

  public static String[][] getData(String sql)

  {

         LitebaseConnection conn = LitebaseConnection.getInstance(Settings.appCreatorId);

         litebase.ResultSet rs = conn.executeQuery(sql);

        

         String[][] data = null;

         if(rs != null)

         {

                   data = rs.getStrings();

                   //Nunca esqueça de fechar, se isso não fosse preciso não teria criado

                   //a variável data, teria retornado direto

                   rs.close();

         }

         return data;

  }

}

Listagem 8 - Classe Pessoa

Nesta classe não há nada de novo, criamos um método chamado createTable() que valida a existência da classe, este deve ser Static pois não há nenhuma informação relevante nas variáveis não Static que sejam interessantes para este método.

O método formatTimeForLitebase() formata  um objeto de waba.sys.Time() para o formato correto do Litebase, futuras implementações do Litebase esta ação não será necessária. Na Listagem 3 este método não foi preciso, pois o PreparedStatement já prepara a SQL com os formatos necessários.

Agora que temos a entidade responsável pela manipulação dos dados vamos desenvolver a classe inicial que é chamada pela máquina virtual. Crie uma classe chamada FrmMain e edite o código da Listagem 9.

 

package samples;

 

import waba.fx.Color;

import waba.ui.Calendar;

 

public class FrmMain extends waba.ui.MainWindow {

 

  public FrmMain() {

         //Invoque o método static que cria a tabela se for necessário

         Pessoas.createTable();

 

         //Estamos informando a VM que ela deve assumir uma interface

         //com estilo VISTA que no meu ponto de vista é o mais bonito

         waba.sys.Settings.setUIStyle(waba.sys.Settings.Vista);

        

         //Troque a cor de fundo para branco, por padrão a cor de fundo é azul

         this.setBackColor(waba.fx.Color.WHITE);

        

         //A cor padrão do calendário é laranja, estou alterando esta cor para branco

         //e os botões um tom de cinza

         waba.ui.UIColors.calendarAction = Color.getColor(200, 200, 200);

         waba.ui.UIColors.calendarBack = Color.WHITE;

        

         //Nunca acredite que o usuário que vai operar o equipamento é alguem que conheça

         //a lingua inglesa

         Calendar.todayClearCancel = new String[] { "Hoje", "Limpar", "Cancelar" };

         Calendar.weekNames = new String[] { "D", "S", "T", "Q", "Q", "S", "S" };

         waba.util.Date.monthNames = new String[] { "", "Janeiro", "Fevereiro","Março", "Abril", "Maio", "Junho", "Julho", "Agosto", "Setembro", "Outubro", "Novembro", "Dezembro" };

  }

 

  public void onStart() {

         //O método SWAP carrega um Container

         this.swap(new FrmListPessoa());

  }

}

Listagem 9 - Código da classe FrmMain

No SuperWaba é comum encontrarmos variáveis Static com valores padrões, no caso do calendário podemos alterar algumas propriedades de forma que o visual fique mais amigável. Esta opção também é válida para a classe Date.

 

Dicas Rápidas

1 – Nunca carregue objetos de interface no construtor, sempre utilize o onStart() que é chamado pela VM após a execução do construtor;

 

2 – Use a classe que estende de MainWindow apenas para iniciar as variáveis globais e alterar valores Static, a parte gráfica deve ser trabalhada em Container.