Clique para saber mais...
  Home     Download     Produtos / Cursos     Revista     Vídeo Aulas     Fórum     Contato   Clique aqui para logar | 06 de Outubro de 2026
  Login

Codinome
Senha
Salvar informações

 Esqueci minha senha
 Novo Cadastro

  Usuários
104 Usuários Online

  Revista ActiveDelphi
 Assine Já!
 Edições
 Sobre a Revista

  Conteúdo
 Apostilas
 Artigos
 Componentes
 Dicas
 News
 Programas / Exemplos
 Vídeo Aulas

  Serviços
 Active News
 Fórum
 Produtos / Cursos

  Outros
 Colunistas
 Contato
 Top 10

  Publicidade

  [Artigos]  Campos Lógicos (Boolean) com Delphi e FireBird
Publicado por Detetive99 : Sexta, Junho 23, 2006 - 09:38 GMT-3 (4118 leituras)
Comentários comentar   Enviar esta notícia a um amigo Enviar para um amigo   Versão para Impressão Versão para impressão
Administrador Espero com este artigo definir a melhor maneira de simular o tipo Boolean inexistente até a versão 1.5 do FireBird para ser usado com o Delphi, e principal para resolver o problema daqueles que migram do Paradox para o FireBird.
 As sugestões encontradas na maioria dos artigos sobre este assunto sugestionam para usarmos 0 (zero) para falso e 1 (um) para verdadeiro, em campos Smallint/Integer, ou ainda T para verdadeiro e F para Falso, em Campos CHAR, levando em consideração apenas o objetivo de armazenar um valor (Verdadeiro/Falso) em um campo e consultar o valor armazenado, mas esquecendo do principal, que é a praticidade e compatibilidade com objetos que se destinam a armazenar valores lógicos como o TCheckBox e o TRadioButton, que possui a propriedade Checked.

Obs.: Para quem usa os componentes da palheta DataControls, veja a Nota do Editor, no final do artigo.

Não quero parecer pretensioso mas, a experiência é a mãe de todas as verdades.

Você deve usar o valor 0 (zero) para False/Falso e –1 (menos um) para True ou Verdadeiro, em campo do tipo Smallint, por um simples motivo: não é necessário nenhuma conversão para gravar ou carregar um valor lógico (Falso/Verdadeiro) se for armazenado como 0 / -1 nos componentes acima mencionados (TCheckBox e TRadioButton).

Por exemplo, em um Formulário de entrada de dados com o campo "Bolsa Família" do Tipo TCheckBox, não é necessário efetuar conversões do tipo:

IF CheckBox1.Checked then
  Parambyname('_BOLSAFAM').AsInteger:=1
Else
  Parambyname('_BOLSAFAM').AsInteger:=0;

ou

IF CheckBox1.Checked then
  Parambyname('_BOLSAFAM').AsString:=’T’
Else
  Parambyname('_BOLSAFAM').AsString:=’F’;

Teria que usar esta conversão para cada campo que existir no seu formulário, deixando o seu código gigante, sem falar que na hora da leitura dos dados para exibir em tela, teria que fazer a conversão toda novamente, causando um grande transtorno, que nos leva a perder tempo precioso.

Mesmo o FB/IB não tendo o campo Boolean, o tipo existe no Delphi e ele converte automaticamente em 0 e -1 com perfeição, parece inacreditavelmente simples, mas funciona sim! Exemplo:

Para Gravar:

  Parambyname('_BOF').AsBoolean:=CB_Fam.Checked;

Caso Cheched seja igual a True, será gravado o valor –1. Se estiver Falso, será gravado o valor 0.
Para Carregar :

  CB_Fam.Checked:=Fieldvalues['BolFam'];

Receberá o valor True caso o valor em BolFam seja = -1, ou Falso caso seja 0.

Uso campos do tipo Smallint para armazenar meu valores lógicos, pois ocupam pouco espaço.

Espero que use esta dica no seu próximo sistema, pois reduzirá em muito o seu trabalho.

Antonio Ennio de Jesus é de Ipiaú / Bahia, graduando em Sistemas de Informação (FTC/Jequié-BA), Programador desde 1980.
Contato: eia_99@ig.com.br - http://www.eiainfo.hpg.com.br

Nota do Editor

Para a galera que utiliza componentes DataControls, mais especificamente o DBCheckBox, não se preocupe em fazer conversão alguma! Apenas configure as propriedades ValueChecked e ValueUncheckd respectivamente com -1 e 0, pois essas duas propriedades representam o valor que será gravado no banco de dados quando o componente estiver marcado (checked) ou desmarcado (unchecked).

Um único ajuste é necessário: no momento em que inserir um novo registro, como ainda não há valor para o campo lógico, o DBCheckBox ficará marcado, porém inativo, representando que seu status está indefinido. A solução para isto pode ser feita no evento onNewRecord do DataSet (query/table) que o campo lógico pertence:

  DataSet.FieldByName('NOME_DO_CAMPO_LOGICO').AsInteger := 0;
  //para vir desmarcado. caso queira que venha marcado por padrão, use -1

Ou seja, ao pedir um novo registro (onNewRecord), definimos o valor padrão para o campo.

Kelver Merlotti.
kelver@activedelphi.com.br



Comentários Comentários
   Ordem:  
Comentários pertencem aos seus respectivos autores. Não somos responsáveis pelo seus conteúdos.
  Edição 112

Revista ActiveDelphi

  50 Programas Fontes


  Produtos

Conheça Nossos Produtos

Copyright© 2001-2016 – Active Delphi – Todos os direitos reservados