Exemplo de query que busca rotinas em um Menu do Protheus

No artigo de hoje, vamos demonstrar em como fazer uma query, para consultar informações de uma rotina nos menus do Protheus.

Supondo que você precisa encontrar em que menu está determinada rotina, como podemos fazer isso através de uma query?

Pois bem, as tabelas que vamos usar aqui serão as seguintes:

  • MPMENU_MENU – Cadastro de Menus
  • MPMENU_ITEM – Itens do Menu
  • MPMENU_FUNCTION – Função vinculada ao Item
  • MPMENU_I18N – Opções do Menu e Opções do Item

 

Com isso, por exemplo, vou pesquisar pela função MATA010, e ela vai me trazer uma lista dos módulos onde está esse cadastro, conforme print abaixo:

Exemplo do resultado da query pesquisando por MATA010

 

E abaixo a query montada de exemplo:

SELECT
    M_NAME AS MODULO_NOME,
    M_MODULE AS MODULO_COD,
    I_TABLES AS TABELAS,
    F_FUNCTION AS FUNCAO,
    DADOS_MENU.N_DESC AS SUBMENU_NOME,
    DADOS_ITEM.N_DESC AS ROTINA_NOME
FROM
    MPMENU_MENU MENU
    INNER JOIN MPMENU_ITEM ITEM ON (
        ITEM.I_ID_MENU = MENU.M_ID
        AND ITEM.D_E_L_E_T_ = ' '
    )
    INNER JOIN MPMENU_FUNCTION FUNC ON (
        FUNC.F_ID = ITEM.I_ID_FUNC
        AND FUNC.D_E_L_E_T_ = ' '
    )
    INNER JOIN MPMENU_I18N DADOS_MENU ON (
        DADOS_MENU.N_PAREN_ID = ITEM.I_FATHER
        AND DADOS_MENU.N_LANG = '1'
        AND DADOS_MENU.D_E_L_E_T_ = ' '
    )
    INNER JOIN MPMENU_I18N DADOS_ITEM ON (
        DADOS_ITEM.N_PAREN_ID = ITEM.I_ID
        AND DADOS_ITEM.N_LANG = '1'
        AND DADOS_ITEM.D_E_L_E_T_ = ' '
    )
WHERE
    MENU.D_E_L_E_T_ = ' '
    AND F_FUNCTION LIKE '%MATA010%'
ORDER BY
    MODULO_COD

Bom pessoal, por hoje é só.

Abraços e até a próxima.

Dan (Daniel Atilio)
Cristão de ramificação protestante. Especialista em Engenharia de Software pela FIB, graduado em Banco de Dados pela FATEC Bauru e técnico em informática pelo CTI da Unesp. Entusiasta de soluções Open Source e blogueiro nas horas vagas. Autor e mantenedor do portal Terminal de Informação.

6 Responses

  1. Rafael Strozi disse:

    Acaba de me salvar a pele! Tava ficando maluco tentando relacionar as tabelas de menu!

  2. ROBERTA disse:

    Olá, sabe onde ficam os dados sobre o acesso do usuário por rotina?
    O que a função FWGetMnuAccess trás.
    Gostaria de pegar direto do banco de dados se for possivel.

    • Bom dia Roberta, tudo joia?

      Tenta fazer um teste, cria uma user function, e acione a função FwGetMenuAccess.

      Nisso, coloque um breakpoint na linha que faz o acionamento e comece a depurar o código via VsCode.

      Quando parar na linha do breakpoint, você abre o aplicativo dbMonitor na mesma pasta do dbAccess.

      Nisso vai na sua conexão e dá um rastrear nela. Salve esse log, e depois procure nas queries, em quais tabelas estão sendo acessadas.

      Tenha uma ótima e abençoada sexta feira.

      Um forte abraço.

  3. Danielle Aparecida de Oliveira disse:

    Como extrair um menu da homologação para colocar em produção?

    • Bom dia Danielle, tudo joia?

      Se eu não me engano, a TOTVS estava estudando a criação de alguma ferramenta para exportar informações de um menu e depois importar em outra base.

      Mas não sei se esse projeto seguiu em frente.

      Momentaneamente o que você teria que fazer é ir recriando em produção os menus que estão em homologação.

      Tenha uma ótima e abençoada sexta feira.

      Um grande abraço.

Deixe uma resposta

Terminal de Informação