Nota (2026-07-11): AdvCfg foi descontinuada, e com ela o schema SX2/SX3/SIX/... "dicionário-de-dicionário" descrito aqui (
pkg/tools/shared/dictionary.go, removido). O AdvEditor cria tabelas comuns diretamente (com colunas de sistemaR_E_C_N_O_/D_E_L_E_T_/R_E_C_D_E_L_no estilo Protheus — verTOOLS_README.md), sem esse catálogo intermediário. Documento mantido como registro histórico.
O AdvCfg utiliza um banco de dados SQLite para armazenar o dicionário de dados AdvPL, seguindo o padrão TOTVS Protheus. O dicionário é criado automaticamente na primeira execução e contém tabelas e dados pré-configurados.
O dicionário é armazenado em:
~/.advpp/ADVPP.db
Armazena informações sobre as tabelas do sistema.
Campos Principais:
X2_CHAVE- Chave primária (ex: "SA1")X2_ALIAS- Alias da tabela (ex: "SA1")X2_NOME- Nome da tabela (ex: "SA1")X2_NOMEUSR- Nome do usuário (ex: "Clientes")X2_MODULO- Módulo (ex: "SIGAFAT")X2_TIPO- Tipo (C=Caracter, N=Numérico, etc.)X2_DESCRIC- Descrição da tabela
Tabelas Pré-Configuradas:
- SA1 - Clientes (SIGAFAT)
- SA2 - Fornecedores (SIGACOM)
- SE1 - Contas a Receber (SIGAFIN)
- SE2 - Contas a Pagar (SIGAFIN)
- SB1 - Produtos (SIGAEST)
- SD1 - Vendas (SIGAFAT)
- SF1 - Notas Fiscais (SIGAFAT)
- SF2 - Itens da Nota Fiscal (SIGAFAT)
- ZZ1 - Usuários (SIGACFG)
- ZZ2 - Grupos de Acesso (SIGACFG)
Armazena informações sobre os campos das tabelas.
Campos Principais:
X3_ARQUIVO- Nome da tabela (ex: "SA1")X3_ORDEM- Ordem do campoX3_CAMPO- Nome do campo (ex: "A1_COD")X3_TIPO- Tipo do campo (C, N, D, L, M)X3_TAMANHO- Tamanho do campoX3_DECIMAL- DecimaisX3_TITULO- Título do campoX3_DESCRIC- Descrição do campoX3_PICTURE- Picture do campoX3_VALID- Validação do campo
Campos Pré-Configurados para SA1:
A1_COD- Código do Cliente (C, 6)A1_LOJA- Loja do Cliente (C, 2)A1_NOME- Nome do Cliente (C, 40)A1_NREDUZ- Nome Reduzido (C, 15)A1_TIPO- Tipo de Cliente (C, 1)A1_CGC- CGC/CPF (C, 14)A1_END- Endereço (C, 40)A1_BAIRRO- Bairro (C, 30)A1_MUN- Município (C, 40)A1_EST- Estado (C, 2)A1_CEP- CEP (C, 8)A1_TEL- Telefone (C, 15)A1_EMAIL- E-mail (C, 60)A1_MSBLQ- Bloqueado (L, 1)A1_VEND- Vendedor (C, 6)
Armazena informações sobre os índices das tabelas.
Campos Principais:
IX_ARQUIVO- Nome da tabela (ex: "SA1")IX_INDICE- Número do índiceIX_ORDEM- Ordem no índiceIX_CHAVE- Expressão do índice (ex: "A1_FILIAL+A1_COD+A1_LOJA")IX_DESCRIC- Descrição do índiceIX_TIPO- Tipo do índiceIX_FILTRO- Filtro do índice
Índices Pré-Configurados para SA1:
A1_FILIAL+A1_COD+A1_LOJA- Chave PrimáriaA1_NOME- Nome do ClienteA1_CGC- CGC/CPF do ClienteA1_VEND- Vendedor do Cliente
Armazena informações sobre triggers das tabelas.
Campos Principais:
X7_ARQUIVO- Nome da tabelaX7_CAMPO- Nome do campoX7_SEQUENC- SequênciaX7_EVENTO- Evento (BeforeInsert, AfterInsert, etc.)X7_ROTINA- Rotina do triggerX7_CONDIC- Condição do trigger
Armazena tabelas genéricas (tabelas de domínio).
Campos Principais:
X5_TABELA- Nome da tabela genérica (ex: "X3_TIPO")X5_CHAVE- Chave (ex: "C")X5_DESCRIC- Descrição (ex: "Caracter")X5_TIPO- Tipo do valorX5_TAMANHO- TamanhoX5_DECIMAL- Decimais
Genéricas Pré-Configuradas:
- X3_TIPO - Tipos de campos (C, N, D, L, M)
- A1_TIPO - Tipos de cliente (F-Física, J-Jurídica)
Armazena parâmetros do sistema.
Campos Principais:
X6_VAR- Nome do parâmetroX6_TIPO- Tipo do parâmetroX6_DESCRIC- Descrição do parâmetroX6_TAMANHO- TamanhoX6_DECIMAL- DecimaisX6_PRESEL- Valor pré-selecionado
Armazera perguntas de consultas (SX1).
Campos Principais:
XB_ALIAS- Alias da perguntaXB_TIPO- Tipo da perguntaXB_DESCRIC- Descrição da perguntaXB_TAMANHO- TamanhoXB_DECIMAL- Decimais
dict, err := shared.NewDictionary(shared.ResolveDatabasePath(""))
if err != nil {
// Tratar erro
}
defer dict.Close()tables, err := dict.GetTables()
for _, table := range tables {
chave := table["X2_CHAVE"].(string)
alias := table["X2_ALIAS"].(string)
nome := table["X2_NOMEUSR"].(string)
}fields, err := dict.GetFields("SA1")
for _, field := range fields {
campo := field["X3_CAMPO"].(string)
tipo := field["X3_TIPO"].(string)
titulo := field["X3_TITULO"].(string)
}indexes, err := dict.GetIndexes("SA1")
for _, idx := range indexes {
chave := idx["IX_CHAVE"].(string)
descric := idx["IX_DESCRIC"].(string)
}genericas, err := dict.GetGenericas("X3_TIPO")
for _, gen := range genericas {
chave := gen["X5_CHAVE"].(string)
descr := gen["X5_DESCRIC"].(string)
}err := dict.AddTable("SB2", "SB2", "SB2", "Produtos", "SIGAEST", "C", "Cadastro de Produtos")err := dict.AddField("SB2", 1, "B2_COD", "C", 6, 0, "Código", "Código do Produto")err := dict.AddIndex("SB2", 1, 1, "B2_FILIAL+B2_COD", "Chave Primária")O dicionário implementa as seguintes regras de validação:
-
SX2
- X2_CHAVE deve ser único
- X2_ALIAS deve ser único
- X2_TIPO deve ser C, N, D, L ou M
-
SX3
- X3_ARQUIVO + X3_ORDEM deve ser único
- X3_TIPO deve ser C, N, D, L ou M
- X3_TAMANHO deve ser positivo
- X3_DECIMAL não pode exceder X3_TAMANHO
-
SIX
- IX_ARQUIVO + IX_INDICE + IX_ORDEM deve ser único
- IX_INDICE deve ser positivo
- IX_ORDEM deve ser positivo
-
SX5
- X5_TABELA + X5_CHAVE deve ser único
- X5_CHAVE não pode ser vazio
-
SX6
- X6_VAR deve ser único
- X6_VAR não pode ser vazio
-
SXB
- XB_ALIAS deve ser único
- XB_ALIAS não pode ser vazio
Para adicionar novas tabelas ao dicionário:
- Adicionar a tabela em SX2
- Adicionar os campos em SX3
- Adicionar os índices em SIX
- Adicionar genéricas relevantes em SX5
- Adicionar triggers em SX7 (se necessário)
O AdvCfg carrega automaticamente o dicionário ao iniciar:
// Carrega dicionário
dict, err := shared.NewDictionary(shared.ResolveDatabasePath(""))
if err != nil {
dialog.ShowError(err, w)
return nil
}
ac.dictionary = dict
// Carrega dados na tree view
ac.loadDictionaryData()cp ~/.advpp/ADVPP.db ~/.advpp/ADVPP_backup.dbcp ~/.advpp/ADVPP_backup.db ~/.advpp/ADVPP.dbPara migrar um dicionário do Protheus:
- Exportar tabelas SX2, SX3, SIX, SX7, SX5, SX6, SXB do Protheus
- Converter para formato SQLite
- Importar no banco de dados do AdvCfg
O dicionário SQLite oferece:
- Acesso rápido aos dados
- Transações ACID
- Índices automáticos
- Compactação automática
- Backup incremental
- O arquivo do dicionário deve ter permissões restritas
- Considerar criptografia para dados sensíveis
- Implementar controle de acesso no AdvCfg
- Logs de alterações do dicionário
- Triggers (SX7) não implementados completamente
- Parâmetros (SX6) não implementados completamente
- Perguntas (SXB) não implementados completamente
- Validação de integridade referencial não implementada
- Geração de código a partir do dicionário não implementada
- Implementar validação completa do dicionário
- Implementar gerador de código AdvPL
- Implementar importação/exportação de dicionário
- Implementar sincronização com Protheus
- Implementar versionamento do dicionário
- Implementar controle de alterações (audit trail)