MRUpdate
Compatibilizador padrão MRProjetos para criação e manutenção de dicionários Protheus.
1. Visão Geral
1.1 O que é MRUpdate
MRUpdate é uma classe ADVPL que padroniza a criação e manutenção de itens do dicionário de dados do Protheus (tabelas, campos, parâmetros, gatilhos, consultas e índices) de forma declarativa e segura.
Em vez de escrever código de manutenção de dicionário do zero a cada projeto, o desenvolvedor instancia
MRUpdate, declara o que precisa criar ou alterar por meio dos métodos Add* / Upd*,
e chama Execute() para aplicar tudo de uma vez — com confirmação do usuário e barra de progresso.
O compatibilizador é idempotente: campos, índices e parâmetros já existentes são ignorados na criação;
os métodos Upd* atualizam apenas a propriedade indicada.
1.2 Pré-requisitos
- Protheus com dicionário em banco relacional (SQL Server, Oracle, PostgreSQL etc.)
- Include
protheus.chno topo do arquivo. O includeMRPROJETOS.CHé opcional — necessário apenas se o compatibilizador usar as constantesX3USADO,X3NUSA,X3OBRIGouX3NOBRIdiretamente no código - Compilação via VSCode com a extensão TOTVS Developer Studio for VSCode, com acesso ao repositório de produção ou homologação
- Execução em modo exclusivo — nenhum outro usuário utilizando o sistema — ou acesso controlado pelo monitor do Protheus
Compatibilizadores que criam ou alteram o dicionário devem ser executados com o sistema parado ou com acesso exclusivo garantido via monitor do Protheus. Executar com usuários ativos pode causar inconsistências no dicionário.
1.3 Fluxo de uso
Passos obrigatórios
- Instanciar com
MRUpdate():New(cMsg) - Declarar itens com
Add*/Upd* - Chamar
Execute()
Ordem recomendada
- SX2 (tabela)
- SX3 (campos)
- SIX (índices)
- SX6 (parâmetros)
- SX7 (gatilhos)
- SXB (consultas)
2. Como Usar
2.1 Exemplo mínimo
Criação de uma tabela com um campo e um índice:
#include "MRPROJETOS.CH" User Function MEUPROJUPD() Local oUpd := MRUpdate():New("Deseja aplicar o compatibilizador?") oUpd:AddSX2('SZA', 'Minha Tabela') oUpd:AddSX3('SZA','ZA_FILIAL ','C',2,0,'Filial','xFilial("SZA")',,,X3NUSA,X3NOBRI,'N','V','R') oUpd:AddSX3('SZA','ZA_CODIGO ','C',6,0,'Codigo') oUpd:AddSIX('SZA','ZA_FILIAL+ZA_CODIGO','Filial+Codigo') oUpd:Execute() Return(.T.)
2.2 Exemplo completo
O arquivo updmodelo.prw (distribuído junto com mrupdate.prw) contém um exemplo completo
de compatibilizador para a tabela SZG — Requisição de Materiais, demonstrando todos os recursos da classe.
Abaixo uma versão comentada:
#include "MRPROJETOS.CH" User Function UPD001() Local oUpd := MRUpdate():New( ; "<b>Atencao</b>" + CRLF + CRLF + ; "Este compatibilizador deve ser aplicado em modo exclusivo." + CRLF + ; "Deseja efetuar o processamento?") // Tabela oUpd:AddSX2('SZG', 'Requisicao de Materiais') // Campos oUpd:AddSX3('SZG','ZG_FILIAL ','C',2,0,'Filial','xFilial("SZG")',,,X3NUSA,X3NOBRI,'N','V','R') oUpd:AddSX3('SZG','ZG_NUM ','C',6,0,'Numero','U_MTA02INI()') oUpd:AddSX3('SZG','ZG_EMISSAO','D',8,0,'Emissao','Date()') oUpd:AddSX3('SZG','ZG_PRODUTO','C',15,0,'Produto', ; ,'SB1 ','ExistCpo("SB1")',,,, 'S','A','R','U','@!') oUpd:AddSX3('SZG','ZG_QTDREQ ','N',11,2,'Qt.Requisit.', ; ,,,,X3OBRIG,,'A',,'U','@E 99,999,999.99') // Índices (ORDEM calculada automaticamente) oUpd:AddSIX('SZG','ZG_FILIAL+ZG_NUM+ZG_PRODUTO','Numero+Produto') oUpd:AddSIX('SZG','ZG_FILIAL+ZG_CC','Centro Custo') // Parâmetros oUpd:AddSX6('DL_WFCRDBL','C','Emails bloqueio de credito','') // Alteração de propriedade de campo existente oUpd:UpdSX3('C5_DIRETO', 'X3_VISUAL', 'V') // Gatilho oUpd:AddSX7('ZG_PRODUTO','001','SB1->B1_DESC','ZG_DESC','P','S','SB1',1,"xFilial('SB1')+M->ZG_PRODUTO") oUpd:Execute() Return(.T.)
3. Chamada nos Parâmetros Iniciais do Protheus
Compatibilizadores podem ser executados automaticamente na inicialização do Protheus WebApp, sem que o usuário precise localizar a função manualmente. A configuração é feita no campo Programa Inicial nos Parâmetros Iniciais do WebApp.
3.1 Configuração no WebApp — Programa Inicial
No Protheus WebApp, acesse os Parâmetros Iniciais (ícone de configurações na tela de login ou no menu do usuário) e informe o nome da função no campo Programa Inicial. O Protheus executará a função automaticamente após o login, antes de exibir o menu principal.
Informe o nome da User Function no campo Programa Inicial:
Programa Inicial: U_UPD001
O Protheus chama a função informada em Programa Inicial no contexto do usuário que acabou de logar. Após a execução, o fluxo normal (menu principal) é retomado automaticamente. Limpe o campo após a aplicação do compatibilizador.
Configure o Programa Inicial somente no ambiente de implantação. Deixar o campo preenchido em produção fará com que o compatibilizador seja executado a cada login do usuário, podendo causar lentidão e alertas desnecessários.
3.2 Boas práticas após a aplicação
- Após o
Execute()concluir, acesse novamente os Parâmetros Iniciais e limpe o campo Programa Inicial. - Faça logout e login novamente para confirmar que o sistema inicializa normalmente sem executar o compatibilizador.
- Verifique no monitor do Protheus (SIGAADM → Miscelânea → Monitor) que não restaram sessões presas.
- Confira os campos criados no dicionário via Configurações → Dicionário de Dados (CFGX027) para validar que os campos, índices e parâmetros foram criados corretamente.
Mantenha o compatibilizador compilado no repositório de homologação com um nome fixo (ex.: U_UPD001).
Isso facilita reexecutar em outros ambientes ou após rollback sem precisar recompilar.
4. Referência de Métodos
Todos os métodos Add* e Upd* retornam Self, permitindo encadeamento.
Parâmetros opcionais não precisam ser informados — basta omiti-los ou passar NIL com o separador ;.
4.1 New — Construtor
Inicializa a classe e define a mensagem de confirmação exibida em Execute().
MRUpdate():New( [ cMsg ] )
| Parâmetro | Tipo | Default | Descrição | |
|---|---|---|---|---|
cMsg | C | opcional | texto padrão MRProjetos | Mensagem HTML exibida no MsgYesNo antes de processar. Suporta tags HTML básicas como <b>. Armazenada em ::cMsg. |
Local oUpd := MRUpdate():New( ; "<b>Atencao</b>" + CRLF + CRLF + ; "Este compatibilizador prepara o modulo de Requisicoes." + CRLF + ; "Deseja prosseguir?")
4.2 Execute
Exibe a caixa de confirmação (MsgYesNo) e, se confirmado, processa todos os itens declarados
via Add* / Upd* com barra de progresso (MsNewProcess).
oUpd:Execute()
Execute() deve ser sempre a última chamada do compatibilizador.
Qualquer Add* chamado após Execute() não será processado.
4.3 AddSX2 — Criação de tabela
Registra uma nova tabela no dicionário SX2. Se a tabela já existir, a inclusão é ignorada.
oUpd:AddSX2( cChave, cNome [, cRotina, cModo, cModuUn, cModEmp,
nDelet, cUnico, cPyme, nModulo, cDisplay,
cNomeSpa, cNomeEng ] )
| Parâmetro | Tipo | Default | Descrição | Campo | |
|---|---|---|---|---|---|
cChave | C | obrig. | — | Alias da tabela (3 chars + espaços, ex.: 'SZG') | X2_CHAVE |
cNome | C | obrig. | — | Nome da tabela em português | X2_NOME |
cRotina | C | opcional | "" | Rotina vinculada | X2_ROTINA |
cModo | C | opcional | "E" | Modo de acesso: E=Exclusivo, C=Compartilhado | X2_MODO |
cModuUn | C | opcional | "E" | Modo por usuário | X2_MODOUN |
cModEmp | C | opcional | "E" | Modo por empresa | X2_MODOEMP |
nDelet | N | opcional | 0 | Soft delete: 0=Não, 1=Sim | X2_DELET |
cUnico | C | opcional | "" | Chave única | X2_UNICO |
cPyme | C | opcional | "S" | PYME: S=Sim, N=Não | X2_PYME |
nModulo | N | opcional | 0 | Código do módulo | X2_MODULO |
cDisplay | C | opcional | "" | Display | X2_DISPLAY |
cNomeSpa | C | opcional | cNome | Nome em espanhol | X2_NOMESPA |
cNomeEng | C | opcional | cNome | Nome em inglês | X2_NOMEENG |
oUpd:AddSX2('SZG', 'Requisicao de Materiais') // Com nome traduzido oUpd:AddSX2('SZH', 'Itens de Requisicao', , , , , , , , , , ; 'Articulos de Solicitud', 'Requisition Items')
4.4 AddSX3 — Criação de campo
Registra um novo campo no dicionário SX3. Se o campo já existir (verificado pelo nome do campo),
a criação é ignorada — use UpdSX3 para atualizar propriedades.
O X3_ORDEM é calculado automaticamente com base no último campo da tabela.
oUpd:AddSX3( cArquivo, cCampo, cTipo, nTamanho, nDecimal, cTitulo
[, cRelacao, cF3, cValid, lUsado, lObrigat
, cBrowse, cVisual, cContext, cPropri, cPicture
, cVldUser, cCbox, cWhen, cInibrw, cGrpsxg, cFolder
, cTitSpa, cTitEng, cDescric, cDescSpa, cDescEng
, cPictvar, nNivel, cCheck, cTrigger
, cCboxSpa, cCboxEng, cPyme
, cCondsql, cChksql, cIdxsrv, cOrtogra, cIdxfld, cTela ] )
Parâmetros obrigatórios
| Parâmetro | Tipo | Descrição | Campo SX3 |
|---|---|---|---|
cArquivo | C | Alias da tabela (ex.: 'SZG') | X3_ARQUIVO |
cCampo | C | Nome do campo com 10 chars (ex.: 'ZG_FILIAL '). Preencher com espaços até 10. | X3_CAMPO |
cTipo | C | C=Caracter, N=Numérico, D=Data, L=Lógico, M=Memo | X3_TIPO |
nTamanho | N | Tamanho total do campo | X3_TAMANHO |
nDecimal | N | Casas decimais (0 para não numérico) | X3_DECIMAL |
cTitulo | C | Título/Label do campo (máx. 25 chars) | X3_TITULO |
Parâmetros opcionais — Comportamento e validação
| Parâmetro | Tipo | Default | Descrição | Campo SX3 |
|---|---|---|---|---|
cRelacao | C | "" | Inicialização (relação) — expressão ADVPL executada para preencher o campo automaticamente | X3_RELACAO |
cF3 | C | "" | Alias da consulta SXB (F3) vinculada ao campo | X3_F3 |
cValid | C | "" | Expressão de validação (deve retornar .T. para aceitar) | X3_VALID |
lUsado | L | .T. | Visibilidade por módulo (.T.=X3USADO ativo em todos, .F.=X3NUSA inativo em todos) | X3_USADO |
lObrigat | L | .F. | Obrigatoriedade (.T.=X3OBRIG, .F.=X3NOBRI) | X3_OBRIGAT |
cBrowse | C | "N" | S=Exibe no browse, N=Não exibe | X3_BROWSE |
cVisual | C | "A" | A=Todos modos, V=Só visualização, I=Só inclusão | X3_VISUAL |
cContext | C | "R" | R=Real (gravado no banco), V=Virtual (só em memória) | X3_CONTEXT |
cPropri | C | "U" | U=Usuário, S=Sistema, E=Extensão | X3_PROPRI |
cPicture | C | "" | Máscara de exibição (ex.: "@!", "@E 9,999.99") | X3_PICTURE |
cVldUser | C | "" | Validação do usuário (complementar ao cValid) | X3_VLDUSER |
cCbox | C | "" | Opções de combo box (ex.: "1=Sim;2=Nao") | X3_CBOX |
cWhen | C | "" | Expressão que habilita/desabilita o campo | X3_WHEN |
cInibrw | C | "" | Inicialização no browse | X3_INIBRW |
cFolder | C | "" | Pasta do formulário (identificador de aba) | X3_FOLDER |
cTitSpa | C | cTitulo | Título em espanhol | X3_TITSPA |
cTitEng | C | cTitulo | Título em inglês | X3_TITENG |
cDescric | C | cTitulo | Descrição longa (help) | X3_DESCRIC |
Para pular parâmetros opcionais intermediários, use vírgulas consecutivas ou o separador ;.
Exemplo: AddSX3('SZG','ZG_PROD','C',15,0,'Produto', ,'SB1','ExistCpo("SB1")',,,,'S') —
os três parâmetros após cValid (lUsado, lObrigat, cBrowse)
ficam com seus defaults.
// Campo filial padrão (oculto, virtual, não obrigatório) oUpd:AddSX3('SZG','ZG_FILIAL ','C',2,0,'Filial','xFilial("SZG")',,,X3NUSA,X3NOBRI,'N','V','R') // Campo numérico obrigatório com máscara oUpd:AddSX3('SZG','ZG_QTDREQ ','N',11,2,'Qt.Requisit.', ; ,,,,X3OBRIG,,'A',,'U','@E 99,999,999.99') // Campo com F3, validação e exibição no browse oUpd:AddSX3('SZG','ZG_PRODUTO','C',15,0,'Produto', ; ,'SB1 ','ExistCpo("SB1")',,,, 'S','A','R','U','@!') // Campo com combo box de opções oUpd:AddSX3('SZG','ZG_FINALID','C',1,0,'Finalidade', ; ,,,,X3OBRIG,,,,,,, ; ,,,,,,,,,,,,,,,,,,,,, ; '1=Ajust.Eng.;2=Kanban;3=Projeto')
4.5 UpdSX3 — Alteração de campo existente
Altera uma propriedade específica de um campo já existente no SX3, sem recriar o campo inteiro.
oUpd:UpdSX3( cCampo, cPropriedade, uConteudo )
| Parâmetro | Tipo | Descrição | |
|---|---|---|---|
cCampo | C | obrig. | Nome do campo existente (sem espaços, ex.: 'C5_DIRETO') |
cPropriedade | C | obrig. | Nome da coluna SX3 a alterar (ex.: 'X3_VISUAL', 'X3_VLDUSER') |
uConteudo | * | obrig. | Novo valor — tipo deve ser compatível com a coluna informada |
// Tornar campo existente somente visual oUpd:UpdSX3('C5_DIRETO', 'X3_VISUAL', 'V') // Adicionar validação de usuário oUpd:UpdSX3('C5_CLIENTE', 'X3_VLDUSER', 'U_DLAvalCred()')
4.6 AddSX6 — Criação de parâmetro
Registra um novo parâmetro (MV_) no dicionário SX6. Se o parâmetro já existir, a criação é ignorada.
oUpd:AddSX6( cVar, cTipo, cDescric, uConteud
[, cPropri, cPyme
, cDesc1, cDscSpa1, cDscEng1
, cDesc2, cDscSpa2, cDscEng2
, cContSpa, cContEng, cDscSpa, cDscEng ] )
| Parâmetro | Tipo | Default | Descrição | Campo | |
|---|---|---|---|---|---|
cVar | C | obrig. | — | Nome do parâmetro (ex.: 'MV_LIMCRED') | X6_VAR |
cTipo | C | obrig. | — | C=Caracter, N=Numérico, D=Data, L=Lógico | X6_TIPO |
cDescric | C | obrig. | — | Descrição do parâmetro | X6_DESCRIC |
uConteud | * | obrig. | — | Conteúdo padrão — tipo deve ser compatível com cTipo | X6_CONTEUD |
cPropri | C | opcional | "U" | Propriedade: U=Usuário, S=Sistema | X6_PROPRI |
cPyme | C | opcional | "N" | PYME: S=Sim, N=Não | X6_PYME |
cDesc1/2 | C | opcional | "" | Descrições complementares (linha 1 e 2) | X6_DESC1 / X6_DESC2 |
cDscSpa/Eng | C | opcional | "" | Descrição em espanhol / inglês | X6_DSCSPA / X6_DSCENG |
cContSpa/Eng | C | opcional | "" | Conteúdo em espanhol / inglês | X6_CONTSPA / X6_CONTENG |
// Parâmetro de e-mail (caracter) oUpd:AddSX6('DL_WFCRDBL','C','Emails para bloqueio de credito','') // Parâmetro numérico com valor padrão oUpd:AddSX6('MV_LIMREQ','N','Limite de quantidade por requisicao',100)
4.7 UpdSX6 — Alteração de parâmetro existente
Altera uma propriedade específica de um parâmetro já existente no SX6.
oUpd:UpdSX6( cParametro, cPropriedade, uConteudo )
// Redefinir conteúdo de parâmetros de risco oUpd:UpdSX6('MV_RISCOB','X6_CONTEUD',0) oUpd:UpdSX6('MV_RISCOC','X6_CONTEUD',0)
4.8 AddSX7 — Gatilhos
Registra um gatilho no dicionário SX7. Gatilhos propagam automaticamente valores de um campo de origem para campos de destino quando o valor do campo origem é alterado.
oUpd:AddSX7( cCampo, cSequenc, cRegra, cCdomin, cTipo, cSeek,
cAlias, nOrdem, cChave [, cCondic, cPropri ] )
| Parâmetro | Tipo | Default | Descrição | Campo | |
|---|---|---|---|---|---|
cCampo | C | obrig. | — | Campo de origem que dispara o gatilho (ex.: 'ZG_PRODUTO') | X7_CAMPO |
cSequenc | C | obrig. | — | Sequência do gatilho (ex.: '001', '002') | X7_SEQUENC |
cRegra | C | obrig. | — | Expressão ADVPL que resulta no valor a gravar no campo destino | X7_REGRA |
cCdomin | C | obrig. | — | Campo destino que receberá o valor calculado por cRegra | X7_CDOMIN |
cTipo | C | obrig. | — | P=Primário (aciona seek), S=Secundário (não aciona seek) | X7_TIPO |
cSeek | C | obrig. | — | S=Faz seek na tabela alvo, N=Não faz seek | X7_SEEK |
cAlias | C | obrig. | — | Alias da tabela alvo do seek (ex.: 'SB1') | X7_ALIAS |
nOrdem | N | obrig. | — | Índice da tabela alvo a usar no seek | X7_ORDEM |
cChave | C | obrig. | — | Expressão de chave para o seek | X7_CHAVE |
cCondic | C | opcional | "" | Condição para ativar o gatilho | X7_CONDIC |
cPropri | C | opcional | "U" | Propriedade | X7_PROPRI |
// Quando ZG_PRODUTO muda, busca B1_DESC em SB1 e grava em ZG_DESC oUpd:AddSX7( ; 'ZG_PRODUTO', // campo que dispara '001', // sequência 'SB1->B1_DESC', // valor calculado (regra) 'ZG_DESC', // campo destino 'P','S', // tipo e seek 'SB1',1, // alias e índice "xFilial('SB1')+M->ZG_PRODUTO" // chave )
4.9 AddSXB — Consultas padrão
Registra itens de uma consulta padrão (F3) no dicionário SXB. Uma consulta completa é formada por pelo menos um registro de cabeçalho (tipo 1), itens (tipo 2) e um campo de retorno (tipo 3).
oUpd:AddSXB( cAlias, cTipo, cSeq, cColuna, cDescri, cContem
[, cWcontem, cDescSpa, cDescEng ] )
| Parâmetro | Tipo | Descrição | Campo | |
|---|---|---|---|---|
cAlias | C | obrig. | Alias da consulta (ex.: 'SZG') | XB_ALIAS |
cTipo | C | obrig. | 1=Cabeçalho, 2=Item/coluna, 3=Retorno, 4=Filtro | XB_TIPO |
cSeq | C | obrig. | Sequência (ex.: '01', '02') | XB_SEQ |
cColuna | C | obrig. | Campo ou expressão da coluna | XB_COLUNA |
cDescri | C | obrig. | Descrição da coluna / consulta | XB_DESCRI |
cContem | C | obrig. | Expressão "contém" — define o que a coluna exibe | XB_CONTEM |
cWcontem | C | opcional | Cláusula WHERE adicional | XB_WCONTEM |
cDescSpa | C | opcional | Descrição em espanhol | XB_DESCSPA |
cDescEng | C | opcional | Descrição em inglês | XB_DESCENG |
// Cabeçalho da consulta (tipo 1) oUpd:AddSXB('SZG','1','01','ZG_NUM','Numero','ZG_NUM') // Coluna 2 (tipo 2) oUpd:AddSXB('SZG','2','01','ZG_NUM','Numero','ZG_NUM') oUpd:AddSXB('SZG','2','02','ZG_DESC','Descricao','ZG_DESC') // Retorno (tipo 3) oUpd:AddSXB('SZG','3','01','ZG_NUM','Numero','SZG->ZG_NUM')
4.10 AddSIX — Índices
Registra um índice no dicionário SIX. A ORDEM é calculada automaticamente:
a classe busca o maior valor de ORDEM existente para a tabela e aplica Soma1()
— não é necessário informar a ordem manualmente.
oUpd:AddSIX( cIndice, cChave, cDescricao
[, cPropri, cDescSpa, cDescEng, cF3, cNickname, cShowPesq ] )
| Parâmetro | Tipo | Default | Descrição | Campo | |
|---|---|---|---|---|---|
cIndice | C | obrig. | — | Alias da tabela (ex.: 'SZG') | INDICE |
cChave | C | obrig. | — | Expressão de chave do índice (ex.: 'ZG_FILIAL+ZG_NUM') | CHAVE |
cDescricao | C | obrig. | — | Descrição do índice | DESCRICAO |
cPropri | C | opcional | "U" | Propriedade: U=Usuário, S=Sistema | PROPRI |
cDescSpa | C | opcional | cDescricao | Descrição em espanhol | DESCSPA |
cDescEng | C | opcional | cDescricao | Descrição em inglês | DESCENG |
cF3 | C | opcional | "" | Consulta F3 vinculada | F3 |
cNickname | C | opcional | "" | Apelido do índice | NICKNAME |
cShowPesq | C | opcional | "S" | S=Exibe na pesquisa, N=Não exibe | SHOWPESQ |
// Dois índices para SZG — a ORDEM (1, 2...) é atribuída automaticamente oUpd:AddSIX('SZG', 'ZG_FILIAL+ZG_NUM+ZG_PRODUTO', 'Numero+Produto') oUpd:AddSIX('SZG', 'ZG_FILIAL+ZG_CC', 'Centro Custo')
4.11 AddSX1 — Perguntas (SX1)
Registra perguntas do grupo de perguntas (SX1) — usadas nas telas de parâmetros de relatórios e processos batch. Cada pergunta pertence a um grupo e recebe uma ordem.
oUpd:AddSX1( cGrupo, cOrdem, cPergunt, cVariavl, cTipo, nTamanho, nDecimal
[, cPresel, cGSC, cValid, cF3, cPyme, cGrpsxg, cHelp, cPicture, cIdfil
, cPerspa, cPereng
, cVar01, cDef01, cDefspa1, cDefeng1, cCnt01 <!-- resposta 1 -->
, cVar02, cDef02, cDefspa2, cDefeng2, cCnt02 <!-- resposta 2 -->
, cVar03, cDef03, cDefspa3, cDefeng3, cCnt03 <!-- resposta 3 -->
, cVar04, cDef04, cDefspa4, cDefeng4, cCnt04 <!-- resposta 4 -->
, cVar05, cDef05, cDefspa5, cDefeng5, cCnt05 ] ) <!-- resposta 5 -->
| Parâmetro | Tipo | Default | Descrição | Campo | |
|---|---|---|---|---|---|
cGrupo | C | obrig. | — | Grupo de perguntas (ex.: 'MEUPROG') | X1_GRUPO |
cOrdem | C | obrig. | — | Ordem da pergunta no grupo (ex.: '01') | X1_ORDEM |
cPergunt | C | obrig. | — | Texto da pergunta | X1_PERGUNT |
cVariavl | C | obrig. | — | Variável que receberá a resposta (ex.: 'MV_PAR01') | X1_VARIAVL |
cTipo | C | obrig. | — | C, N, D, L | X1_TIPO |
nTamanho | N | obrig. | — | Tamanho da resposta | X1_TAMANHO |
nDecimal | N | obrig. | — | Casas decimais | X1_DECIMAL |
cPresel | C | opcional | "" | Pré-seleção padrão | X1_PRESEL |
cGSC | C | opcional | "G" | G=Geral, S=Supervisor, C=Customizado | X1_GSC |
cHelp | C | opcional | "" | Texto de ajuda (F1) | X1_HELP |
cVar01...05 | C | opcional | "" | Variável da opção de resposta N | X1_VAR01..05 |
cDef01...05 | C | opcional | "" | Valor padrão da opção de resposta N | X1_DEF01..05 |
// Pergunta de data inicial para relatório oUpd:AddSX1('RELMREQ','01','Data Inicial ?','MV_PAR01','D',8,0) oUpd:AddSX1('RELMREQ','02','Data Final ?', 'MV_PAR02','D',8,0) // Pergunta com opções de seleção oUpd:AddSX1('RELMREQ','03','Situacao ?','MV_PAR03','N',1,0, ; ,,,,,,,,,, ; 'MV_PAR03','1','Todos','All','1', ; 'MV_PAR03','2','Pendentes','Pending','2')
4.12 AddSQL e AddFun — Blocos de execução
Permitem incluir blocos de código ADVPL a serem executados dentro do processo de atualização, para operações que a classe não cobre diretamente (migrações de dados, ajustes específicos etc.).
oUpd:AddSQL( bBloco ) // executa bloco com TCQuery / BeginSql...EndSql oUpd:AddFun( bBloco ) // executa bloco ADVPL genérico
| Parâmetro | Tipo | Descrição | |
|---|---|---|---|
bBloco | B | obrig. | Codeblock ADVPL. Sem parâmetros: {|| ...código... } |
oUpd:AddFun({|| Local cQuery := "UPDATE " + RetSQLName("SZG") + ; " SET ZG_STATUS = '1' WHERE ZG_STATUS = '' " TCExec(cQuery) })
Os blocos de AddSQL são executados após todos os Add* de dicionário.
Use AddFun para lógica ADVPL geral e AddSQL apenas para SQL direto via TCExec.
5. Dados Técnicos
5.1 Constantes de máscara de campo
As constantes abaixo controlam a visibilidade (X3_USADO) e obrigatoriedade
(X3_OBRIGAT) dos campos por módulo do Protheus.
Elas são definidas diretamente no topo de mrupdate.prw via #define
e também estão disponíveis em MRPROJETOS.CH se este for incluído.
Cada posição do string corresponde a um módulo; x=ativo, espaço=inativo.
| Constante | Uso em AddSX3 | Significado |
|---|---|---|
X3USADO | lUsado := .T. (default) | Campo visível em todos os módulos (máscara x x x...) |
X3NUSA | lUsado := .F. | Campo invisível em todos os módulos — usado em campos de filial e campos ocultos |
X3OBRIG | lObrigat := .T. | Campo obrigatório em todos os módulos (x ) |
X3NOBRI | lObrigat := .F. (default) | Campo não obrigatório ( ) |
X3RESERV | interno | Máscara reservada — usada internamente pela classe para novos campos |
Não passe as constantes diretamente aos parâmetros lUsado e lObrigat
usando a string literal — use .T. / .F. ou as constantes X3USADO / X3NUSA
(que são strings). A classe converte internamente para o formato correto de máscara.
5.2 Dicionários gerenciados
| Dicionário | Descrição | Método | Array interno |
|---|---|---|---|
SX2 | Tabelas do sistema | AddSX2 | ::aSX2 |
SX3 | Campos das tabelas | AddSX3 / UpdSX3 | ::aSX3 |
SX6 | Parâmetros (MV_) | AddSX6 / UpdSX6 | ::aSX6 |
SX7 | Gatilhos | AddSX7 | ::aSX7 |
SXB | Consultas padrão (F3) | AddSXB | ::aSXB |
SIX | Índices das tabelas | AddSIX | ::aSIX |
SX1 | Grupos de perguntas | AddSX1 | ::aSX1 |
5.3 Auto-cálculo de X3_ORDEM e ORDEM de índice
Versões anteriores de compatibilizadores exigiam que o desenvolvedor informasse manualmente
o valor de X3_ORDEM (SX3) e ORDEM (SIX). A partir da versão 2.0 da classe,
esses valores são calculados automaticamente:
-
SX3 (X3_ORDEM): antes de criar um campo novo, a engine faz seek no índice 1 do SX3
(
X3_ARQUIVO + X3_ORDEM) para localizar o maior valor de ordem da tabela e aplicaSoma1(cUltOrdem)para obter o próximo. -
SIX (ORDEM): antes de criar um índice novo, a engine varre o SIX pelo alias
da tabela e aplica
Soma1(cUltOrdem)ao maior valor encontrado.
Soma1("01") retorna "02"; Soma1("99") retorna "A0";
e assim por diante em notação alfanumérica incremental. Isso garante que compatibilizadores reaplicados
em ambientes onde os campos já existem não causem conflito de ordem.
5.4 Engine interna
O método Execute() delega o processamento a _UpdProc(), que executa os dicionários
na seguinte sequência interna:
_UpdAtuSX2()— Tabelas_UpdAtuSX3()— Campos_UpdAtuSIX()— Índices_UpdAtuSX7()— Gatilhos_UpdAtuSX6()— Parâmetros_UpdAtuSX1()— Perguntas_UpdAtuSXB()— Consultas- Blocos
AddSQLeAddFun
Todos os métodos privados usam RecLock / MsUnLock para controle de concorrência
e DbCommit() após cada gravação. A abertura exclusiva da tabela de empresas (SM0)
utiliza a API TOTVS OpenSM0Excl() — compatível com ambiente SQL moderno.
| Método privado | Descrição |
|---|---|
_UpdProc() | Orquestrador principal — chamado por Execute() via MsNewProcess |
_UpdAtuSX2() | Atualiza SX2 (tabelas) |
_UpdAtuSX3() | Atualiza SX3 (campos) com auto-cálculo de X3_ORDEM |
_UpdAtuSIX() | Atualiza SIX (índices) com auto-cálculo de ORDEM |
_UpdAtuSX7() | Atualiza SX7 (gatilhos) |
_UpdAtuSX6() | Atualiza SX6 (parâmetros) |
_UpdAtuSX1() | Atualiza SX1 (perguntas) |
_UpdAtuSXB() | Atualiza SXB (consultas padrão) |
_MyOpenSM0Ex() | Abre SM0 em modo exclusivo via OpenSM0Excl() |