📘 Como identificar rapidamente, via SQL, quais tabelas são utilizadas por uma rotina do TOTVS Protheus


🎯 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_TABLES

da tabela:

MPMENU_ITEM

Esse 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:

MATA010

basta 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:

MATA010

pelo nome técnico da rotina que deseja pesquisar.


📌 Exemplo

Para pesquisar a rotina:

GPEA250

utilize:

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:

TabelaFinalidade na consulta
MPMENU_MENUIdentifica o menu em que a rotina está cadastrada
MPMENU_ITEMContém as informações do item de menu
MPMENU_FUNCTIONIdentifica o programa/função relacionado ao item
MPMENU_I18NRecupera 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_TABLES

ou, 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:

ColunaDescrição
M_NAMENome do menu
I_ORDEROrdem do item dentro do menu
ROTINADescrição da rotina
PROGRAMANome técnico da função, como MATA010
I_TABLESTabelas declaradas para o item
I_IDIdentificador interno do item de menu
I_FATHERIdentificador do item superior/pai

🔎 Exemplo conceitual

Suponha que a pesquisa seja realizada para:

MATA010

O resultado poderá apresentar algo conceitualmente semelhante a:

MenuRotinaProgramaI_TABLES
EstoqueProdutosMATA010tabelas 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_FUNCTION

Para recuperar a descrição:

MPMENU_ITEM
     │
     │ I_ID
     ▼
MPMENU_I18N

Assim, 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

MATA010

2️⃣ Executar a consulta

AND FUNC.F_FUNCTION = 'MATA010'

3️⃣ Observar

I_TABLES

4️⃣ 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:

SA1

ou:

SB1

o 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_TABLES

apresenta 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:

MATA010

e 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:

MATA010

pela 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 relacionadas

Isso 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_TABLES como 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_TABLES

2. Qual campo contém o nome técnico do programa?

A consulta utiliza:

MPMENU_FUNCTION.F_FUNCTION

Exemplo:

MATA010

3. 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:

SELECT

e 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.”


Atualizado em 28/09/2026
Este artigo foi útil?  
Agradecemos sua avaliação.