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)