Litebase 1.3 e SuperWaba – Parte 03

Dando continuidade ao artigo, veremos como eliminar uma tabela com DROP TABLE e um estudo de caso.

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.

 

Artigos relacionados