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
|