🎯 Objetivo
Orientar analistas, consultores e administradores do TOTVS Protheus sobre uma forma simples e rápida de identificar, diretamente pelo banco de dados, quais tabelas estão declaradas no menu para uma determinada rotina.
Essa consulta é especialmente útil quando é necessário investigar uma rotina e o profissional ainda não conhece todas as tabelas relacionadas ao programa.
Em vez de navegar manualmente pelo menu, analisar fontes ou pesquisar rotina por rotina, é possível consultar as tabelas internas responsáveis pela estrutura do menu do Protheus e localizar essa informação por SQL.
O ponto principal da consulta é o campo:
I_TABLESda tabela:
MPMENU_ITEMEsse campo apresenta as tabelas relacionadas ao item de menu cadastrado para determinada rotina.
🧩 Quando utilizar
Essa consulta pode ajudar em situações como:
🔎 análise de uma rotina desconhecida;
🛠️ diagnóstico de incidentes;
🗃️ identificação inicial das tabelas envolvidas;
📊 elaboração de consultas SQL;
🔄 análise de integrações;
🧪 preparação de testes;
📚 documentação técnica;
🔍 investigação de dados gravados por uma rotina;
🧠 entendimento funcional e técnico do Protheus;
⚙️ levantamento preliminar antes de uma customização.
Por exemplo, caso seja necessário descobrir quais tabelas estão associadas à rotina:
MATA010basta executar a consulta apresentada neste artigo.
🔎 Consulta SQL
Utilize o comando abaixo:
/* Identificar todas as ocorrências da rotina no menu do Protheus */
SELECT
MENU.M_NAME,
ITEM.I_ORDER,
ROTINA.N_DESC AS ROTINA,
FUNC.F_FUNCTION AS PROGRAMA,
ITEM.I_TABLES,
ITEM.I_ID,
ITEM.I_FATHER
FROM MPMENU_MENU MENU
JOIN MPMENU_ITEM ITEM
ON ITEM.I_ID_MENU = MENU.M_ID
AND ITEM.D_E_L_E_T_ = ' '
LEFT JOIN MPMENU_FUNCTION FUNC
ON FUNC.F_ID = ITEM.I_ID_FUNC
AND FUNC.D_E_L_E_T_ = ' '
LEFT JOIN MPMENU_I18N ROTINA
ON ROTINA.N_PAREN_ID = ITEM.I_ID
AND ROTINA.D_E_L_E_T_ = ' '
WHERE MENU.D_E_L_E_T_ = ' '
AND FUNC.F_FUNCTION = 'MATA010'
ORDER BY MENU.M_NAME, ITEM.I_ORDER;⚙️ Como utilizar
O ponto que deve ser alterado é:
AND FUNC.F_FUNCTION = 'MATA010'Substitua:
MATA010pelo nome técnico da rotina que deseja pesquisar.
📌 Exemplo
Para pesquisar a rotina:
GPEA250utilize:
AND FUNC.F_FUNCTION = 'GPEA250'A consulta completa ficaria:
/* Identificar todas as ocorrências da GPEA250 no menu */
SELECT
MENU.M_NAME,
ITEM.I_ORDER,
ROTINA.N_DESC AS ROTINA,
FUNC.F_FUNCTION AS PROGRAMA,
ITEM.I_TABLES,
ITEM.I_ID,
ITEM.I_FATHER
FROM MPMENU_MENU MENU
JOIN MPMENU_ITEM ITEM
ON ITEM.I_ID_MENU = MENU.M_ID
AND ITEM.D_E_L_E_T_ = ' '
LEFT JOIN MPMENU_FUNCTION FUNC
ON FUNC.F_ID = ITEM.I_ID_FUNC
AND FUNC.D_E_L_E_T_ = ' '
LEFT JOIN MPMENU_I18N ROTINA
ON ROTINA.N_PAREN_ID = ITEM.I_ID
AND ROTINA.D_E_L_E_T_ = ' '
WHERE MENU.D_E_L_E_T_ = ' '
AND FUNC.F_FUNCTION = 'GPEA250'
ORDER BY MENU.M_NAME, ITEM.I_ORDER;🧠 Como a consulta funciona
A consulta combina quatro estruturas internas do menu do Protheus:
| Tabela | Finalidade na consulta |
|---|---|
MPMENU_MENU | Identifica o menu em que a rotina está cadastrada |
MPMENU_ITEM | Contém as informações do item de menu |
MPMENU_FUNCTION | Identifica o programa/função relacionado ao item |
MPMENU_I18N | Recupera a descrição apresentada para a rotina |
O relacionamento permite localizar a função desejada e consultar as propriedades cadastradas para aquele item.
🗃️ Campo principal: I_TABLES
O campo mais importante para esse levantamento é:
ITEM.I_TABLESou, tecnicamente:
MPMENU_ITEM.I_TABLESÉ nesse campo que ficam relacionadas as tabelas declaradas para o item de menu.
Portanto, quando o objetivo for simplesmente descobrir rapidamente quais tabelas estão associadas à rotina, a coluna:
I_TABLESé a informação principal a ser observada no resultado.
📊 Entendendo o resultado
A consulta retorna as seguintes informações:
| Coluna | Descrição |
|---|---|
M_NAME | Nome do menu |
I_ORDER | Ordem do item dentro do menu |
ROTINA | Descrição da rotina |
PROGRAMA | Nome técnico da função, como MATA010 |
I_TABLES | Tabelas declaradas para o item |
I_ID | Identificador interno do item de menu |
I_FATHER | Identificador do item superior/pai |
🔎 Exemplo conceitual
Suponha que a pesquisa seja realizada para:
MATA010O resultado poderá apresentar algo conceitualmente semelhante a:
| Menu | Rotina | Programa | I_TABLES |
|---|---|---|---|
| Estoque | Produtos | MATA010 | tabelas relacionadas cadastradas no menu |
O conteúdo exato de I_TABLES dependerá da configuração existente no ambiente consultado.
🧭 Por que consultar todas as ocorrências no menu
Uma mesma rotina pode aparecer:
em mais de um módulo;
em mais de um menu;
em diferentes posições;
com descrições distintas;
em menus customizados;
em estruturas diferentes conforme o ambiente.
Por esse motivo, a consulta não procura apenas uma descrição de menu.
Ela localiza todas as ocorrências cuja função seja:
FUNC.F_FUNCTION = 'MATA010'e apresenta os respectivos itens.
Isso ajuda a identificar diferenças entre cadastros de menu.
🔗 Relacionamento das tabelas utilizadas na consulta
O relacionamento principal acontece da seguinte maneira:
MPMENU_MENU
│
│ M_ID
▼
MPMENU_ITEM
│
│ I_ID_FUNC
▼
MPMENU_FUNCTIONPara recuperar a descrição:
MPMENU_ITEM
│
│ I_ID
▼
MPMENU_I18NAssim, conseguimos reunir em uma única consulta:
Menu
+
Descrição
+
Programa
+
Tabelas🛠️ Consulta simplificada apenas para descobrir as tabelas
Caso o objetivo seja exclusivamente visualizar as tabelas cadastradas para determinada rotina, também é possível reduzir o retorno:
SELECT DISTINCT
FUNC.F_FUNCTION AS PROGRAMA,
ITEM.I_TABLES
FROM MPMENU_ITEM ITEM
JOIN MPMENU_FUNCTION FUNC
ON FUNC.F_ID = ITEM.I_ID_FUNC
AND FUNC.D_E_L_E_T_ = ' '
WHERE ITEM.D_E_L_E_T_ = ' '
AND FUNC.F_FUNCTION = 'MATA010';Essa versão é interessante para uma pesquisa rápida.
Entretanto, para análise técnica, a consulta completa é mais útil porque informa também onde a função está cadastrada no menu.
🔍 Localizar mais de uma rotina
Também é possível consultar várias rotinas de uma vez.
Exemplo:
SELECT
MENU.M_NAME,
ITEM.I_ORDER,
ROTINA.N_DESC AS ROTINA,
FUNC.F_FUNCTION AS PROGRAMA,
ITEM.I_TABLES,
ITEM.I_ID,
ITEM.I_FATHER
FROM MPMENU_MENU MENU
JOIN MPMENU_ITEM ITEM
ON ITEM.I_ID_MENU = MENU.M_ID
AND ITEM.D_E_L_E_T_ = ' '
LEFT JOIN MPMENU_FUNCTION FUNC
ON FUNC.F_ID = ITEM.I_ID_FUNC
AND FUNC.D_E_L_E_T_ = ' '
LEFT JOIN MPMENU_I18N ROTINA
ON ROTINA.N_PAREN_ID = ITEM.I_ID
AND ROTINA.D_E_L_E_T_ = ' '
WHERE MENU.D_E_L_E_T_ = ' '
AND FUNC.F_FUNCTION IN (
'MATA010',
'MATA030',
'MATA080'
)
ORDER BY
FUNC.F_FUNCTION,
MENU.M_NAME,
ITEM.I_ORDER;Esse formato é bastante útil durante levantamentos técnicos.
🔎 Pesquisa parcial pelo nome da função
Se o profissional conhece apenas parte do nome técnico, pode utilizar:
AND FUNC.F_FUNCTION LIKE 'MATA%'Exemplo:
SELECT
MENU.M_NAME,
ROTINA.N_DESC AS ROTINA,
FUNC.F_FUNCTION AS PROGRAMA,
ITEM.I_TABLES
FROM MPMENU_MENU MENU
JOIN MPMENU_ITEM ITEM
ON ITEM.I_ID_MENU = MENU.M_ID
AND ITEM.D_E_L_E_T_ = ' '
LEFT JOIN MPMENU_FUNCTION FUNC
ON FUNC.F_ID = ITEM.I_ID_FUNC
AND FUNC.D_E_L_E_T_ = ' '
LEFT JOIN MPMENU_I18N ROTINA
ON ROTINA.N_PAREN_ID = ITEM.I_ID
AND ROTINA.D_E_L_E_T_ = ' '
WHERE MENU.D_E_L_E_T_ = ' '
AND FUNC.F_FUNCTION LIKE 'MATA%'
ORDER BY FUNC.F_FUNCTION;⚠️ Essa pesquisa poderá retornar muitas funções, dependendo do ambiente.
🧰 Uso prático durante um atendimento
Imagine que um consultor recebe a seguinte solicitação:
Precisamos descobrir onde são armazenados os dados utilizados pela rotina MATA010.
Uma abordagem rápida pode ser:
1️⃣ Identificar a função
MATA0102️⃣ Executar a consulta
AND FUNC.F_FUNCTION = 'MATA010'3️⃣ Observar
I_TABLES4️⃣ Identificar as tabelas declaradas
Com os aliases identificados, o analista já possui um ponto inicial para:
pesquisar os dicionários;
consultar SX2/SX3;
analisar os registros;
identificar campos;
construir uma consulta de diagnóstico;
acompanhar a operação diretamente no banco.
📚 Próximo passo: consultar o dicionário
Depois de identificar um alias, por exemplo:
SA1ou:
SB1o próximo passo em uma investigação pode ser analisar sua estrutura no dicionário de dados.
Com isso, é possível determinar:
nome físico;
descrição;
campos;
tipos;
tamanhos;
índices;
relacionamentos.
Assim, o fluxo de investigação fica muito mais rápido:
Rotina
↓
Menu
↓
I_TABLES
↓
Alias
↓
Dicionário
↓
Campos
↓
Dados⚠️ Atenção: I_TABLES é um ponto de partida
É importante interpretar corretamente o resultado.
O campo:
I_TABLESapresenta as tabelas declaradas na configuração do item de menu.
Isso não significa necessariamente que ele represente 100% de todas as tabelas acessadas em tempo de execução pela rotina.
Uma rotina pode, por exemplo:
chamar outras funções;
executar processos internos;
acessar tabelas dinamicamente;
chamar pontos de entrada;
executar consultas SQL;
utilizar tabelas temporárias;
acessar tabelas por meio de outras rotinas;
possuir customizações.
Portanto:
A consulta é excelente para descobrir rapidamente as tabelas principais associadas à rotina, mas não substitui uma análise completa do código quando for necessário mapear todos os acessos realizados em runtime.
Esse é um ponto especialmente importante em análises de impacto e customizações.
🚨 A rotina não aparece na consulta
Caso nenhuma linha seja retornada, verifique inicialmente:
🔹 Nome da função
Confirme se está sendo pesquisado o nome técnico correto:
MATA010e não apenas a descrição:
Cadastro de Produtos🔹 Rotina disponível no menu
A função pode:
não estar cadastrada no menu atual;
estar em um menu customizado;
ser chamada por outra função;
ser executada indiretamente;
possuir outro nome técnico.
🔹 Exclusão lógica
A consulta considera somente registros:
D_E_L_E_T_ = ' 'ou seja, registros ativos.
💡 Consulta parametrizada para uso diário
Para facilitar o trabalho, o analista pode manter a consulta abaixo salva como modelo:
/* ============================================================
CONSULTA DE ROTINA X TABELAS DO MENU
Alterar somente o valor de @ROTINA / função pesquisada
============================================================ */
SELECT
MENU.M_NAME,
ITEM.I_ORDER,
ROTINA.N_DESC AS ROTINA,
FUNC.F_FUNCTION AS PROGRAMA,
ITEM.I_TABLES,
ITEM.I_ID,
ITEM.I_FATHER
FROM MPMENU_MENU MENU
JOIN MPMENU_ITEM ITEM
ON ITEM.I_ID_MENU = MENU.M_ID
AND ITEM.D_E_L_E_T_ = ' '
LEFT JOIN MPMENU_FUNCTION FUNC
ON FUNC.F_ID = ITEM.I_ID_FUNC
AND FUNC.D_E_L_E_T_ = ' '
LEFT JOIN MPMENU_I18N ROTINA
ON ROTINA.N_PAREN_ID = ITEM.I_ID
AND ROTINA.D_E_L_E_T_ = ' '
WHERE MENU.D_E_L_E_T_ = ' '
AND FUNC.F_FUNCTION = 'MATA010'
ORDER BY
MENU.M_NAME,
ITEM.I_ORDER;Na prática, basta substituir:
MATA010pela rotina desejada.
✅ Checklist rápido
Antes de iniciar uma análise:
identificar o nome técnico da rotina;
substituir o programa na cláusula
FUNC.F_FUNCTION;executar a consulta;
verificar todas as ocorrências retornadas;
analisar o campo
I_TABLES;identificar os aliases relacionados;
consultar o dicionário quando necessário;
validar se existem customizações;
considerar que podem existir tabelas adicionais utilizadas em runtime.
🎯 Resultado esperado
Com uma única consulta, o analista consegue sair de:
Qual tabela essa rotina utiliza?para um levantamento inicial como:
Rotina
↓
Programa
↓
Menu
↓
I_TABLES
↓
Tabelas relacionadasIsso reduz significativamente o tempo gasto no levantamento inicial de uma rotina e fornece um caminho objetivo para continuidade da investigação.
💡 Boas práticas
mantenha essa consulta em sua biblioteca de SQLs técnicos;
pesquise sempre pelo nome técnico da função;
analise todas as ocorrências retornadas;
não considere
I_TABLEScomo inventário absoluto dos acessos em runtime;utilize a consulta como primeiro nível de diagnóstico;
em análises críticas, complemente o levantamento com fonte, rastreamento ou monitoramento de banco;
evite qualquer alteração nas tabelas
MPMENU_*diretamente pelo banco;utilize acesso ao banco apenas com usuário autorizado;
em produção, prefira consultas exclusivamente de leitura.
❓ FAQ
1. Qual campo mostra as tabelas relacionadas à rotina?
O campo:
MPMENU_ITEM.I_TABLES2. Qual campo contém o nome técnico do programa?
A consulta utiliza:
MPMENU_FUNCTION.F_FUNCTIONExemplo:
MATA0103. Preciso saber em qual menu a rotina está?
Não.
A consulta localiza todas as ocorrências da função nos menus retornados pela estrutura consultada.
4. Posso pesquisar qualquer rotina?
Sim, desde que ela esteja representada na estrutura de menu consultada e o nome técnico utilizado esteja correto.
5. Posso pesquisar mais de uma rotina?
Sim.
Utilize:
AND FUNC.F_FUNCTION IN ('MATA010', 'MATA030', 'MATA080')6. Posso pesquisar apenas parte do nome?
Sim.
Exemplo:
AND FUNC.F_FUNCTION LIKE 'MATA%'7. O I_TABLES mostra absolutamente todas as tabelas acessadas pela rotina?
Não necessariamente.
Ele é uma ótima referência para as tabelas declaradas no item de menu, porém uma rotina pode acessar estruturas adicionais durante sua execução.
8. Preciso alterar alguma informação no banco?
Não.
O procedimento apresentado neste artigo é exclusivamente de consulta.
O comando utiliza:
SELECTe não realiza alterações nos registros.
9. É seguro executar em produção?
Por ser uma consulta de leitura, o risco é significativamente menor que comandos de alteração. Mesmo assim, devem ser respeitadas as políticas de acesso e administração do banco de dados da empresa.
10. Qual parte do SQL normalmente preciso alterar?
Somente:
FUNC.F_FUNCTION = 'MATA010'Substituindo MATA010 pela rotina desejada.
👤 Autor
Fabrizio Augusto Ventavolo
Consultor Especialista TOTVS — Mastersiga Consultoria
“Conectamos tecnologia, processos e pessoas para acelerar resultados com excelência em sistemas TOTVS.”