O que pode ser quando botões não funcionam em MVC?

Hoje vou trazer um tutorial que muitos alunos me perguntam, quando algum botão em MVC não funciona, o que pode ser?

Basicamente jovens, existem 5 principais coisas que podem impactar em uma tela em MVC via AdvPL que fazem com que os botões de Incluir, Alterar, etc não funcionem, e hoje vou falar sobre isso por ser uma dúvida bem comum.

1. Nome da User Function ser igual ao nome do MPFormModel

Ao criar um MPFormModel, o nome que você dá a ele, se torna uma “porta” para a criação de pontos de entrada em MVC. Logo, ele não pode ter o mesmo nome da User Function, senão fica como um “cachorro correndo atrás do rabo” e nunca encontra as opções do Menu.

Então, o que eu recomendo para esse caso é, o nome da User Function usar no máximo 7 caracteres (e ser o mesmo nome do prw), e o nome do MPFormModel ser esse mesmo nome com uma letra no final, por exemplo, a letra m. Então ficaria assim:

Nome do prw: ASFAT01.prw

Nome da User Function (até 7 caracteres): User Function ASFAT01()

Nome dentro do MPFormModel (mesmo nome da User Function com letra m no final): MPFormModel():New(‘ASFAT01M’)

Ah Daniel, mas não funciona com 8 Caracteres? Então jovens, funciona sim, você só tem que se atentar a dar um nome para a function e outro para o Model, eu recomendo deixar com 7 caracteres para que haja 1 a mais que você pode utilizar.

2. Execução em rotina do Fórmulas / Mini Fórmulas / Lanç. Contábil

Para esse cenário, muitos enquanto testam funções, utilizam programas para executar funções, como o nosso famoso Mini Fórmulas (https://terminaldeinformacao.com/2018/02/13/funcao-para-executar-formulas-protheus-12/), isso faz com que o programa em MVC, se não tiver configurações de menu, ele se “embanane” na hora de fazer o carregamento correto das opções.

Para isso, recomendamos colocar diretamente no Menu do Protheus para você realizar os testes (ou também ver o item de número 4).

Obs.: Outro detalhe, é que funções assim que executam outras, geralmente usam Begin Sequence, então se seu fonte tiver algum erro, pode ser que não seja exibido e esse erro esteja impactando em algo, por isso recomendamos colocar no Menu.

3. Nome incorreto no MenuDef das chamadas

Ao adicionar as opções no MenuDef, você deve usar o mesmo nome da sua função / prw. Então supondo que sua função se chame ASFAT01, você não pode colocar outros nomes na chamada do VIEWDEF, se não ele vai tentar carregar outro VIEW, e se ele não existir, não vai mostrar nada.

Então sempre que for dar um ADD OPTION, aponte no VIEWDEF para a sua User Function:

ADD OPTION aRot TITLE 'Visualizar'     ACTION 'VIEWDEF.ASFAT01' OPERATION MODEL_OPERATION_VIEW   ACCESS 0 //OPERATION 1

ADD OPTION aRot TITLE 'Incluir'        ACTION 'VIEWDEF.ASFAT01' OPERATION MODEL_OPERATION_INSERT ACCESS 0 //OPERATION 3

ADD OPTION aRot TITLE 'Alterar'        ACTION 'VIEWDEF.ASFAT01' OPERATION MODEL_OPERATION_UPDATE ACCESS 0 //OPERATION 4

ADD OPTION aRot TITLE 'Excluir'        ACTION 'VIEWDEF.ASFAT01' OPERATION MODEL_OPERATION_DELETE ACCESS 0 //OPERATION 5

4. Utilizar uma rotina MVC, dentro da outra

Se você precisar usar alguma rotina MVC, dentro de outra, supondo que ao clicar em um botão chame a sua função, e você precise carregar ela. Por padrão, o sistema vai tentar encontrar alguma variável aRotina (como private), se ele não encontrar, ele vai fazer a chamada do MenuDef para preencher.

Acontece que, se você está chamando a sua função, e o sistema já está executando outra, como ele vai identificar “qual” MenuDef você quer exibir?

Para isso, quando você cria o seu FWMBrowse, você faz a chamada do método SetMenuDef, e passe o nome da sua função / prw.

//...

oBrowse := FWMBrowse():New()

oBrowse:SetAlias("ZD1")

oBrowse:SetMenuDef("ASFAT01")

//...

5. Usar a extensão TLPP

Essa última,  não estava no artigo original, mas o grande Renato me lembrou disso.

Por enquanto, até o momento que estou redigindo o update desse artigo em 02/07/2021, o TL++ ainda não tem suporte a fontes em MVC, então se você criar um fonte com a extensão .tlpp, não irá funcionar.

Opte por criar com a extensão .prw.


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.

8 Responses

  1. Renato disse:

    Eu tive problema com isso.
    Estava tudo certo, mas tinha criado o arquivo como tlpp e não funciona, tem que ser prw.

  2. Regis disse:

    Danilo, e sobre fazer uma chamado de um cadastro mvc em uma axCadastro?

    • Ai você pode fazer o seguinte procedimento:
      1. Crie um backup do nome da função, por exemplo, cFunBkp := FunName()
      2. Altere o nome da função para a sua MVC, por exemplo, SetFunName(“SUA_FUNCAO_MVC”)
      3. Acione a sua função MVC
      4. Volte o backup do nome da função, por exemplo, SetFunName(cFunBkp)

  3. Manoel Carlos de Oliveira Ramos Junior disse:

    Mestre Atilio !!! Me salvou essa dica ! Obrigado Jovem !!

  4. Romulo disse:

    Show demais!! a dica do nome da user function ser diferente do modeldef me salvou aqui!

Deixe uma resposta

Terminal de Informação