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.

10 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!

  5. Henrique Sciascio disse:

    Bom dia Daniel tudo bem?
    não sei se você consegue me ajudar mas estou com um problema para excluir um item na minha tela em MVC, segui todas as dicas do arquivo e até chega a aparecer na tela “Registro excluído com sucesso” porem ele não exclui no Banco. Faz alguma ideia do que pode ser?

    Agradeço desde já a atenção

Deixe uma resposta

Terminal de Informação