MRProjetos MRUpdate — Manual de Utilização v2.0 · Junho 2026

MRUpdate

Compatibilizador padrão MRProjetos para criação e manutenção de dicionários Protheus.

ADVPL Protheus Dicionário v2.0 Junho 2026

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.ch no topo do arquivo. O include MRPROJETOS.CH é opcional — necessário apenas se o compatibilizador usar as constantes X3USADO, X3NUSA, X3OBRIG ou X3NOBRI diretamente 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
Aviso

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

  1. Instanciar com MRUpdate():New(cMsg)
  2. Declarar itens com Add* / Upd*
  3. Chamar Execute()

Ordem recomendada

  1. SX2 (tabela)
  2. SX3 (campos)
  3. SIX (índices)
  4. SX6 (parâmetros)
  5. SX7 (gatilhos)
  6. SXB (consultas)

2. Como Usar

2.1 Exemplo mínimo

Criação de uma tabela com um campo e um índice:

ADVPL
#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:

updmodelo.prw — trecho principal
#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.

Parâmetros Iniciais do Protheus WebApp — campo Programa Inicial

Informe o nome da User Function no campo Programa Inicial:

Parâmetros Iniciais — campo a preencher
Programa Inicial:  U_UPD001
Nota

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.

Aviso

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

  1. Após o Execute() concluir, acesse novamente os Parâmetros Iniciais e limpe o campo Programa Inicial.
  2. Faça logout e login novamente para confirmar que o sistema inicializa normalmente sem executar o compatibilizador.
  3. Verifique no monitor do Protheus (SIGAADM → Miscelânea → Monitor) que não restaram sessões presas.
  4. 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.
Dica

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().

Assinatura
MRUpdate():New( [ cMsg ] )
ParâmetroTipoDefaultDescrição
cMsgC opcional texto padrão MRProjetos Mensagem HTML exibida no MsgYesNo antes de processar. Suporta tags HTML básicas como <b>. Armazenada em ::cMsg.
Exemplo
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).

Assinatura
oUpd:Execute()
Nota

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.

Assinatura
oUpd:AddSX2( cChave, cNome [, cRotina, cModo, cModuUn, cModEmp,
             nDelet, cUnico, cPyme, nModulo, cDisplay,
             cNomeSpa, cNomeEng ] )
ParâmetroTipoDefaultDescriçãoCampo
cChaveCobrig.—Alias da tabela (3 chars + espaços, ex.: 'SZG')X2_CHAVE
cNomeCobrig.—Nome da tabela em portuguêsX2_NOME
cRotinaCopcional""Rotina vinculadaX2_ROTINA
cModoCopcional"E"Modo de acesso: E=Exclusivo, C=CompartilhadoX2_MODO
cModuUnCopcional"E"Modo por usuárioX2_MODOUN
cModEmpCopcional"E"Modo por empresaX2_MODOEMP
nDeletNopcional0Soft delete: 0=Não, 1=SimX2_DELET
cUnicoCopcional""Chave únicaX2_UNICO
cPymeCopcional"S"PYME: S=Sim, N=NãoX2_PYME
nModuloNopcional0Código do móduloX2_MODULO
cDisplayCopcional""DisplayX2_DISPLAY
cNomeSpaCopcionalcNomeNome em espanholX2_NOMESPA
cNomeEngCopcionalcNomeNome em inglêsX2_NOMEENG
Exemplo
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.

Assinatura (parâmetros obrigatórios + principais opcionais)
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âmetroTipoDescriçãoCampo SX3
cArquivoCAlias da tabela (ex.: 'SZG')X3_ARQUIVO
cCampoCNome do campo com 10 chars (ex.: 'ZG_FILIAL '). Preencher com espaços até 10.X3_CAMPO
cTipoCC=Caracter, N=Numérico, D=Data, L=Lógico, M=MemoX3_TIPO
nTamanhoNTamanho total do campoX3_TAMANHO
nDecimalNCasas decimais (0 para não numérico)X3_DECIMAL
cTituloCTítulo/Label do campo (máx. 25 chars)X3_TITULO

Parâmetros opcionais — Comportamento e validação

ParâmetroTipoDefaultDescriçãoCampo SX3
cRelacaoC""Inicialização (relação) — expressão ADVPL executada para preencher o campo automaticamenteX3_RELACAO
cF3C""Alias da consulta SXB (F3) vinculada ao campoX3_F3
cValidC""Expressão de validação (deve retornar .T. para aceitar)X3_VALID
lUsadoL.T.Visibilidade por módulo (.T.=X3USADO ativo em todos, .F.=X3NUSA inativo em todos)X3_USADO
lObrigatL.F.Obrigatoriedade (.T.=X3OBRIG, .F.=X3NOBRI)X3_OBRIGAT
cBrowseC"N"S=Exibe no browse, N=Não exibeX3_BROWSE
cVisualC"A"A=Todos modos, V=Só visualização, I=Só inclusãoX3_VISUAL
cContextC"R"R=Real (gravado no banco), V=Virtual (só em memória)X3_CONTEXT
cPropriC"U"U=Usuário, S=Sistema, E=ExtensãoX3_PROPRI
cPictureC""Máscara de exibição (ex.: "@!", "@E 9,999.99")X3_PICTURE
cVldUserC""Validação do usuário (complementar ao cValid)X3_VLDUSER
cCboxC""Opções de combo box (ex.: "1=Sim;2=Nao")X3_CBOX
cWhenC""Expressão que habilita/desabilita o campoX3_WHEN
cInibrwC""Inicialização no browseX3_INIBRW
cFolderC""Pasta do formulário (identificador de aba)X3_FOLDER
cTitSpaCcTituloTítulo em espanholX3_TITSPA
cTitEngCcTituloTítulo em inglêsX3_TITENG
cDescricCcTituloDescrição longa (help)X3_DESCRIC
Dica — Omissão de parâmetros intermediários

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.

Exemplos
// 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.

Assinatura
oUpd:UpdSX3( cCampo, cPropriedade, uConteudo )
ParâmetroTipoDescrição
cCampoCobrig.Nome do campo existente (sem espaços, ex.: 'C5_DIRETO')
cPropriedadeCobrig.Nome da coluna SX3 a alterar (ex.: 'X3_VISUAL', 'X3_VLDUSER')
uConteudo*obrig.Novo valor — tipo deve ser compatível com a coluna informada
Exemplo
// 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.

Assinatura
oUpd:AddSX6( cVar, cTipo, cDescric, uConteud
           [, cPropri, cPyme
           ,  cDesc1, cDscSpa1, cDscEng1
           ,  cDesc2, cDscSpa2, cDscEng2
           ,  cContSpa, cContEng, cDscSpa, cDscEng ] )
ParâmetroTipoDefaultDescriçãoCampo
cVarCobrig.—Nome do parâmetro (ex.: 'MV_LIMCRED')X6_VAR
cTipoCobrig.—C=Caracter, N=Numérico, D=Data, L=LógicoX6_TIPO
cDescricCobrig.—Descrição do parâmetroX6_DESCRIC
uConteud*obrig.—Conteúdo padrão — tipo deve ser compatível com cTipoX6_CONTEUD
cPropriCopcional"U"Propriedade: U=Usuário, S=SistemaX6_PROPRI
cPymeCopcional"N"PYME: S=Sim, N=NãoX6_PYME
cDesc1/2Copcional""Descrições complementares (linha 1 e 2)X6_DESC1 / X6_DESC2
cDscSpa/EngCopcional""Descrição em espanhol / inglêsX6_DSCSPA / X6_DSCENG
cContSpa/EngCopcional""Conteúdo em espanhol / inglêsX6_CONTSPA / X6_CONTENG
Exemplo
// 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.

Assinatura
oUpd:UpdSX6( cParametro, cPropriedade, uConteudo )
Exemplo
// 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.

Assinatura
oUpd:AddSX7( cCampo, cSequenc, cRegra, cCdomin, cTipo, cSeek,
            cAlias, nOrdem, cChave [, cCondic, cPropri ] )
ParâmetroTipoDefaultDescriçãoCampo
cCampoCobrig.—Campo de origem que dispara o gatilho (ex.: 'ZG_PRODUTO')X7_CAMPO
cSequencCobrig.—Sequência do gatilho (ex.: '001', '002')X7_SEQUENC
cRegraCobrig.—Expressão ADVPL que resulta no valor a gravar no campo destinoX7_REGRA
cCdominCobrig.—Campo destino que receberá o valor calculado por cRegraX7_CDOMIN
cTipoCobrig.—P=Primário (aciona seek), S=Secundário (não aciona seek)X7_TIPO
cSeekCobrig.—S=Faz seek na tabela alvo, N=Não faz seekX7_SEEK
cAliasCobrig.—Alias da tabela alvo do seek (ex.: 'SB1')X7_ALIAS
nOrdemNobrig.—Índice da tabela alvo a usar no seekX7_ORDEM
cChaveCobrig.—Expressão de chave para o seekX7_CHAVE
cCondicCopcional""Condição para ativar o gatilhoX7_CONDIC
cPropriCopcional"U"PropriedadeX7_PROPRI
Exemplo — copiar descrição do produto
// 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).

Assinatura
oUpd:AddSXB( cAlias, cTipo, cSeq, cColuna, cDescri, cContem
            [, cWcontem, cDescSpa, cDescEng ] )
ParâmetroTipoDescriçãoCampo
cAliasCobrig.Alias da consulta (ex.: 'SZG')XB_ALIAS
cTipoCobrig.1=Cabeçalho, 2=Item/coluna, 3=Retorno, 4=FiltroXB_TIPO
cSeqCobrig.Sequência (ex.: '01', '02')XB_SEQ
cColunaCobrig.Campo ou expressão da colunaXB_COLUNA
cDescriCobrig.Descrição da coluna / consultaXB_DESCRI
cContemCobrig.Expressão "contém" — define o que a coluna exibeXB_CONTEM
cWcontemCopcionalCláusula WHERE adicionalXB_WCONTEM
cDescSpaCopcionalDescrição em espanholXB_DESCSPA
cDescEngCopcionalDescrição em inglêsXB_DESCENG
Exemplo — consulta para SZG
// 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.

Assinatura
oUpd:AddSIX( cIndice, cChave, cDescricao
            [, cPropri, cDescSpa, cDescEng, cF3, cNickname, cShowPesq ] )
ParâmetroTipoDefaultDescriçãoCampo
cIndiceCobrig.—Alias da tabela (ex.: 'SZG')INDICE
cChaveCobrig.—Expressão de chave do índice (ex.: 'ZG_FILIAL+ZG_NUM')CHAVE
cDescricaoCobrig.—Descrição do índiceDESCRICAO
cPropriCopcional"U"Propriedade: U=Usuário, S=SistemaPROPRI
cDescSpaCopcionalcDescricaoDescrição em espanholDESCSPA
cDescEngCopcionalcDescricaoDescrição em inglêsDESCENG
cF3Copcional""Consulta F3 vinculadaF3
cNicknameCopcional""Apelido do índiceNICKNAME
cShowPesqCopcional"S"S=Exibe na pesquisa, N=Não exibeSHOWPESQ
Exemplo
// 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.

Assinatura
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âmetroTipoDefaultDescriçãoCampo
cGrupoCobrig.—Grupo de perguntas (ex.: 'MEUPROG')X1_GRUPO
cOrdemCobrig.—Ordem da pergunta no grupo (ex.: '01')X1_ORDEM
cPerguntCobrig.—Texto da perguntaX1_PERGUNT
cVariavlCobrig.—Variável que receberá a resposta (ex.: 'MV_PAR01')X1_VARIAVL
cTipoCobrig.—C, N, D, LX1_TIPO
nTamanhoNobrig.—Tamanho da respostaX1_TAMANHO
nDecimalNobrig.—Casas decimaisX1_DECIMAL
cPreselCopcional""Pré-seleção padrãoX1_PRESEL
cGSCCopcional"G"G=Geral, S=Supervisor, C=CustomizadoX1_GSC
cHelpCopcional""Texto de ajuda (F1)X1_HELP
cVar01...05Copcional""Variável da opção de resposta NX1_VAR01..05
cDef01...05Copcional""Valor padrão da opção de resposta NX1_DEF01..05
Exemplo
// 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.).

Assinaturas
oUpd:AddSQL( bBloco )   // executa bloco com TCQuery / BeginSql...EndSql
oUpd:AddFun( bBloco )   // executa bloco ADVPL genérico
ParâmetroTipoDescrição
bBlocoBobrig.Codeblock ADVPL. Sem parâmetros: {|| ...código... }
Exemplo — AddFun para migração de dados
oUpd:AddFun({||
  Local cQuery := "UPDATE " + RetSQLName("SZG") + ;
                  " SET ZG_STATUS = '1' WHERE ZG_STATUS = '' "
  TCExec(cQuery)
})
Nota

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.

ConstanteUso em AddSX3Significado
X3USADOlUsado := .T. (default)Campo visível em todos os módulos (máscara x x x...)
X3NUSAlUsado := .F.Campo invisível em todos os módulos — usado em campos de filial e campos ocultos
X3OBRIGlObrigat := .T.Campo obrigatório em todos os módulos (x )
X3NOBRIlObrigat := .F. (default)Campo não obrigatório ( )
X3RESERVinternoMáscara reservada — usada internamente pela classe para novos campos
Nota

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árioDescriçãoMétodoArray interno
SX2Tabelas do sistemaAddSX2::aSX2
SX3Campos das tabelasAddSX3 / UpdSX3::aSX3
SX6Parâmetros (MV_)AddSX6 / UpdSX6::aSX6
SX7GatilhosAddSX7::aSX7
SXBConsultas padrão (F3)AddSXB::aSXB
SIXÍndices das tabelasAddSIX::aSIX
SX1Grupos de perguntasAddSX1::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 aplica Soma1(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.
Dica

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:

  1. _UpdAtuSX2() — Tabelas
  2. _UpdAtuSX3() — Campos
  3. _UpdAtuSIX() — Índices
  4. _UpdAtuSX7() — Gatilhos
  5. _UpdAtuSX6() — Parâmetros
  6. _UpdAtuSX1() — Perguntas
  7. _UpdAtuSXB() — Consultas
  8. Blocos AddSQL e AddFun

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 privadoDescriçã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()