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:
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 gravado | ZA1_MOPP = 'F' | ZA1_MOPP <> 'T' |
|---|---|---|
T | fora | fora |
F | dentro | dentro |
| branco | fora | dentro |
Para “sem o curso”, use <> 'T':
SELECT ZA1_COD, ZA1_NOME, ZA1_MOPP
FROM ZA1010
WHERE ZA1_MOPP <> 'T'
AND D_E_L_E_T_ = ' '
ORDER BY ZA1_NOMEPara “com o curso”, = 'T' basta.
Para saber se a sua tabela tem brancos, conte por conteúdo:
SELECT ZA1_MOPP, COUNT(*) AS QTD
FROM ZA1010
WHERE D_E_L_E_T_ = ' '
GROUP BY ZA1_MOPPEm AdvPL
Lido pela tabela, o campo já chega lógico e entra direto numa condição:
If ZA1->ZA1_MOPP
// motorista com o curso
EndIfNuma query embarcada ele chega como o texto T ou F. O padrão converte com
TCSetField antes de usar:
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 (B1_MSBLQL, A1_MSBLQL)
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
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
TDNtdn.totvs.com
TDN — Tipos de dados (Dicionário de Dados)TDNtdn.totvs.com
TDN — Campos (CFGX034 - SIGACFG)
Continue por aqui
- Vídeo
ProtheusTutorial
Campo data: o que a tela mostra e o que o banco grava
Campo data no Protheus: a tela mostra DD/MM/AAAA, o banco grava texto AAAAMMDD sem hora. Como criar, liberar edição só na inclusão e comparar em SQL.