Pragiva — Tecnologia na prática

Campo lógico: o checkbox do dicionário

Campo lógico no Protheus é o sim/não do dicionário: .T. ou .F. no AdvPL, T ou F no banco, numa coluna de uma posição. Como criar e o filtro SQL certo.

Protheus Tutorial 3 min de leitura

Assista o vídeo

Nesta página6 seções

Antes de começar

  • Tabela customizada criada no dicionário (no exemplo, a ZA1 — Cadastro de motoristas)
  • Acesso ao Configurador com permissão de alterar o dicionário de dados

O campo lógico (tipo L) é o sim/não do dicionário. Ele representa verdadeiro (.T.) ou falso (.F.). Todo campo lógico tem tamanho 1 e nenhuma decimal. No banco, fica gravado como a letra T ou F.

Rotinas do padrão que montam campos de tela a partir da SX3 tratam o tipo L como caixa de marcar (CHECK). Daí o apelido de checkbox.

O exemplo da série é o curso MOPP do motorista. Ou o motorista tem o curso, ou não tem.

A ficha do ZA1_MOPP

O campo é criado como os outros, em Base de Dados > Dicionário > Arquivos, editando a tabela e incluindo o campo na pasta Campos.

Propriedade (coluna da SX3)Valor
Tipo (X3_TIPO)L
Tamanho (X3_TAMANHO)1
Decimais (X3_DECIMAL)0
Título (X3_TITULO)Curso MOPP
Inicializador padrão (X3_RELACAO).F.
Obrigatório (pasta Uso)desmarcado
Browse (X3_BROWSE)N
Contexto (X3_CONTEXT)R
Proprietário (X3_PROPRI)U

Motorista novo começa sem o curso marcado. O inicializador .F. segue o que o próprio padrão faz: entre os campos lógicos do dicionário padrão que têm inicializador, .F. é o mais comum, e alguns usam .T. quando o normal é “sim”. Deixar o valor inicial explícito evita dúvida sobre o que um registro novo carrega.

Obrigatoriedade num lógico raramente faz sentido: o desmarcado já é uma resposta (“não tem”). E um sim/não na lista ocupa coluna e diz pouco, por isso o browse fica desligado.

O que o banco grava

A coluna do campo lógico guarda um caractere: T para verdadeiro, F para falso. As queries das rotinas do padrão filtram campo lógico exatamente assim, comparando com 'T' ou 'F'. Na base SQL Server de demonstração que conferimos, a coluna é varchar(1). Veja o tipo no seu banco:

Confira no seu ambienteSQL
SELECT COLUMN_NAME, DATA_TYPE, CHARACTER_MAXIMUM_LENGTH
  FROM INFORMATION_SCHEMA.COLUMNS
 WHERE TABLE_NAME  = 'ZA1010'
   AND COLUMN_NAME = 'ZA1_MOPP'

O 010 do nome da tabela é o sufixo da empresa e muda de ambiente para ambiente. Troque pelo seu.

= 'F' ou <> 'T': o filtro que não perde registro

Pode haver registro com a coluna em branco, nem T nem F. Por isso as duas formas de pedir “motoristas sem o curso” não devolvem a mesma coisa:

Conteúdo gravadoZA1_MOPP = 'F'ZA1_MOPP <> 'T'
Tforafora
Fdentrodentro
brancoforadentro

Para “sem o curso”, use <> 'T':

Confira no seu ambienteSQL
SELECT ZA1_COD, ZA1_NOME, ZA1_MOPP
  FROM ZA1010
 WHERE ZA1_MOPP  <> 'T'
   AND D_E_L_E_T_ = ' '
 ORDER BY ZA1_NOME

Para “com o curso”, = 'T' basta.

Para saber se a sua tabela tem brancos, conte por conteúdo:

Confira no seu ambienteSQL
SELECT ZA1_MOPP, COUNT(*) AS QTD
  FROM ZA1010
 WHERE D_E_L_E_T_ = ' '
 GROUP BY ZA1_MOPP

Em AdvPL

Lido pela tabela, o campo já chega lógico e entra direto numa condição:

ADVPL / TLPP
If ZA1->ZA1_MOPP
    // motorista com o curso
EndIf

Numa query embarcada ele chega como o texto T ou F. O padrão converte com TCSetField antes de usar:

ADVPL / TLPP
TCSetField(cAlias, "ZA1_MOPP", "L")

Sem essa conversão, o valor na área de trabalho da query é o texto "T" ou "F", não um lógico, e não serve direto numa condição. Os tipos e as conversões estão em Tipos de dados em AdvPL, e os operadores lógicos (.And., .Or., !) em Operadores em AdvPL.

Lógico ou combo Sim/Não?

O padrão usa as duas coisas. Os campos de bloqueio (, ) não são lógicos: são caractere de uma posição com combo 1=Sim;2=Não ou 1=Inativo;2=Ativo.

A diferença prática: o lógico só tem dois estados, para sempre. O combo caractere aceita uma terceira opção depois sem mudar o tipo do campo. Se existe chance de a resposta deixar de ser binária (“tem”, “não tem”, “vencido”), comece com combo. O combo está em Campo combo.

Conferir o dicionário

Confira no seu ambienteSQL
SELECT X3_CAMPO, X3_TIPO, X3_TAMANHO, X3_RELACAO, X3_BROWSE
  FROM SX3010
 WHERE X3_ARQUIVO = 'ZA1'
   AND X3_TIPO    = 'L'
   AND D_E_L_E_T_ = ' '

Referências

  1. TDNtdn.totvs.com

    TDN — Tipos de dados (Dicionário de Dados)
  2. TDNtdn.totvs.com

    TDN — Campos (CFGX034 - SIGACFG)

Continue por aqui