Módulos do guia

Nível 0 · Fundamentos · Módulo 02

Janelas inteligentes: contexto e lógicas

Duração estimada: 1h30 a 2h

Você vai sair sabendo

  • →Entender o que é o contexto e de onde vêm as variáveis @...@
  • →Preencher campos automaticamente com Default Logic
  • →Mostrar, esconder, travar e exigir campos conforme o que o usuário faz
  • →Travar uma aba inteira a partir de um campo da aba pai

Checkpoint: 0 de 6

ver .md

Antes de começar

  • Módulo 01 concluído: a janela Visita Técnica abre e salva uma visita com linhas.
  • Entre como System para mexer no Dicionário e deixe uma segunda aba do navegador logada como GardenAdmin para testar. As mudanças de lógica valem ao reabrir a janela; não precisa reiniciar o servidor.

O que você vai construir

A mesma janela do módulo 01, agora reagindo ao que o usuário faz:

  • Visita nova já vem preenchida: data de hoje, tipo Manutenção e o usuário logado como técnico.
  • Urgente pede justificativa: ao marcar Urgente, aparece o campo Motivo da Urgência, obrigatório.
  • Concluída trava a visita: cabeçalho e linhas deixam de aceitar alterações.

Tudo sem Java. São quatro campos do Dicionário: Default Logic, Display Logic, Mandatory Logic e Read Only Logic.

O contexto, em 1 minuto

Enquanto você usa o iDempiere, ele mantém um conjunto de variáveis na memória da sessão: quem está logado, em qual empresa e organização, que dia é hoje, e o valor de cada campo de cada janela aberta. Esse conjunto é o contexto.

As lógicas do Dicionário leem o contexto com a sintaxe @Nome@. Três formas resolvem quase tudo:

SintaxeLêExemplo
@Campo@Um campo da janela: primeiro na aba atual, depois nas abas acima@C_BPartner_ID@
@#Variavel@Uma variável de login, a mesma em qualquer janela@#AD_User_ID@, @#Date@
@~Campo@Um campo só da aba atual, sem subir para a aba pai@~Description@

A lista completa está na Referência, no fim do módulo.

Passo a passo

1. Dois campos novos

Entre como System. Em Element, crie dois elementos com Entity Type EDU:

DB Column NameName
EDU_MotivoUrgenciaMotivo da Urgência
EDU_IsConcluidaConcluída

Na tabela EDU_Visita (janela Table and Column), crie as colunas e sincronize cada uma:

DB Column NameReferenceDetalhes
EDU_MotivoUrgenciaTextLength: 2000
EDU_IsConcluidaYes-NoDefault Logic: N

Depois, na aba Visita da janela Window, Tab and Field, clique em Create Fields para os campos novos aparecerem, e ajuste a posição deles no Tab Editor.

2. Default Logic: a visita já nasce preenchida

Conceito: a Default Logic define o valor inicial de um campo num registro novo. Pode ser uma constante (MA), uma variável de contexto (@#Date@) ou uma consulta (@SQL=SELECT ...).

Na aba Column da tabela EDU_Visita, preencha:

ColunaDefault LogicO que faz
EDU_TipoVisitaMAToda visita nova começa como Manutenção
SalesRep_ID@#AD_User_ID@O técnico começa como o usuário logado

A data você já configurou no módulo 01 com @#Date@.

Teste como GardenAdmin: abra a janela e crie uma visita nova. Data, tipo e técnico já vêm preenchidos.

3. Display Logic: o campo aparece quando faz sentido

Conceito: a Display Logic é uma expressão verdadeira ou falsa. Quando é falsa, o campo some da tela. Ela fica no Field (aba Field da janela Window, Tab and Field), porque é um comportamento da tela, não do dado.

Abra o campo Motivo da Urgência na aba Field e preencha:

CampoValor
Display Logic@EDU_IsUrgente@=Y

Checkbox no contexto vale Y ou N. Teste: marque e desmarque Urgente e veja o campo aparecer e sumir sem salvar nada.

4. Mandatory Logic: obrigatório só às vezes

Conceito: o Mandatory da coluna torna o campo sempre obrigatório. A Mandatory Logic torna obrigatório só quando a expressão é verdadeira.

Na coluna EDU_MotivoUrgencia (aba Column), preencha:

CampoValor
Mandatory Logic@EDU_IsUrgente@=Y

Teste: marque Urgente, deixe o motivo em branco e tente salvar. O iDempiere recusa.

5. Read Only Logic: travar o que já foi concluído

Conceito: a Read Only Logic deixa o campo visível, mas sem edição, quando a expressão é verdadeira. Ela existe na coluna (vale em todas as janelas) e no campo (vale só naquela aba).

Nas colunas C_BPartner_ID, SalesRep_ID, EDU_DataVisita e EDU_TipoVisita da tabela EDU_Visita, preencha:

CampoValor
Read Only Logic@EDU_IsConcluida@=Y

Teste: marque Concluída e salve. Os quatro campos ficam cinza. Desmarque e eles voltam a ser editáveis.

6. Travar uma aba filha a partir da aba pai

Conceito: a aba também tem Read Only Logic. Como @Campo@ procura na aba atual e depois nas abas acima, a aba Linhas consegue ler um campo do cabeçalho.

Na janela Window, Tab and Field, abra a aba Linhas e preencha:

CampoValor
Read Only Logic@EDU_IsConcluida@=Y

Teste: com a visita concluída, vá para Linhas. O botão de novo registro fica desabilitado e as linhas existentes não aceitam edição.

Checkpoint

0 de 6 itens

Erros comuns

SintomaCausa provávelCorreção
A lógica não faz efeitoA janela já estava abertaFeche e abra a janela de novo
Display Logic nunca mostra o campoNome da coluna errado ou com maiúscula/minúscula diferenteO nome dentro de @...@ é exatamente o DB Column Name, respeitando maiúsculas
@EDU_IsUrgente@=true não funcionaCheckbox vale Y ou N no contextoUse =Y
Campo _ID vazio não bate com =''Campos _ID vazios valem 0 no contextoUse @C_BPartner_ID@=0
A aba filha não travaLógica colocada no campo, e não na abaRead Only Logic da Tab, não do Field
Salvar dá erro de NOT NULL no motivoMandatory marcado na colunaDesmarque Mandatory e sincronize; use só Mandatory Logic

Desafio

Faça o campo Tipo de Visita esconder a opção de urgência: quando o tipo for Orçamento (OR), o checkbox Urgente não deve aparecer, e o Motivo da Urgência também não.

Dica: a Display Logic aceita & (e), | (ou) e parênteses.

Referência

Formas de ler o contexto

SintaxeLê
@Campo@Campo da aba atual; se não achar, das abas acima
@~Campo@Campo só da aba atual
@1|Campo@Campo da aba de número 1 (0 é a primeira aba)
@#Variavel@Variável de login (#AD_Client_ID, #AD_Org_ID, #AD_User_ID, #AD_Role_ID, #Date)
@$Variavel@Variável contábil de login ($C_Currency_ID, $C_AcctSchema_ID)
@P|Variavel@Preferência do usuário
@+Variavel@Variável predefinida no menu, na janela ou no perfil (veja abaixo)
@Campo:valor@Usa valor quando o campo não existe no contexto
@Campo_ID.Coluna@Busca uma coluna do registro referenciado: @C_BPartner_ID.Name@

Operadores das lógicas

OperadorSignificadoExemplo
=igual@EDU_TipoVisita@=MA
! ou ^diferente@EDU_TipoVisita@!OR
> < >= <=comparação@Qty@>=10
~corresponde à expressão regular@Description@~'^URG.*'
&e@EDU_IsUrgente@=Y & @EDU_TipoVisita@=IN
|ou@EDU_TipoVisita@=IN | @EDU_TipoVisita@=MA
( )agrupa(@A@=Y | @B@=Y) & @C@=N
$!negação$!(@EDU_IsConcluida@=Y)
'a','b'igual a qualquer um da lista@EDU_TipoVisita@='IN','MA'

Texto entre aspas simples é comparado literalmente. Sem aspas também funciona para valores simples (Y, MA, 100).

Lógicas com SQL

Onde a lógica espera verdadeiro ou falso, @SQL=SELECT ... é verdadeiro quando a consulta devolve alguma linha. Na Default Logic, a consulta deve devolver um único valor. Use com parcimônia: cada lógica com SQL é uma ida ao banco sempre que a tela é redesenhada.

Onde cada lógica pode ficar

LógicaColumnFieldTab
Default Logicsimsim (sobrescreve a da coluna)não
Display Logicnãosimsim
Read Only Logicsimsimsim
Mandatory Logicsimsimnão

Para ir além: variáveis predefinidas no menu

Uma entrada de menu pode injetar variáveis no contexto quando abre a janela, no campo Predefined Context Variables, uma por linha, no formato NOME=valor. Elas são lidas com @+NOME@. É assim que o mesmo cadastro vira duas entradas de menu com comportamentos diferentes, por exemplo uma que abre já filtrada. Elas não são injetadas quando a janela é aberta por zoom.

Próximo módulo

03 · Levando mudanças para outro ambiente: tudo o que você fez até aqui está só no seu banco. O módulo 03 mostra como empacotar e levar para outro ambiente.