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.
Eu tive problema com isso.
Estava tudo certo, mas tinha criado o arquivo como tlpp e não funciona, tem que ser prw.
Ah entendi Renato, é que TL++ não tem suporte para fontes MVC ainda, pois as funções ModelDef e ViewDef são acionadas em camadas internas.
Obrigado pelo comentário jovem.
Grande abraço.
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)
Mestre Atilio !!! Me salvou essa dica ! Obrigado Jovem !!
Opa, nós que agradecemos pelo comentário Manoel.
Forte abraço.
Show demais!! a dica do nome da user function ser diferente do modeldef me salvou aqui!
Bom dia Romulo, tudo joia?
Opa, nós que agradecemos pelo comentário.
Forte abraço.
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
Bom dia Henrique, tudo joia graças a Deus e você?
Que estranho, não me lembro de ter visto algum bug assim.
Mas faz o seguinte, verifica duas coisas:
a. Se a rotina esta diretamente no menu. Se não estiver, faça um teste colocando ela diretamente.
b. Se o bCommit foi informado no ModelDef. Se sim, tente atualizar para o FWModelEvent igual exemplo nesse link – https://terminaldeinformacao.com/2023/03/24/como-utilizar-a-fwmodelevent-no-lugar-do-commit-em-uma-rotina-mvc/ .
Um grande abraço.