A partir do release 12.1.25 não é possível chamar uma função de usuário (User Function) pelo Lançamento Padronizado, maneira que muitos desenvolvedores ADVPL utilizavam para testarem e validarem suas rotinas desenvolvidas. Dessa forma, o desenvolvedor deve criar o acesso a rotina no menu pelo configurador do Protheus a fim de executá-la.
Uma maneira de agilizar esse processo é criar uma função de usuário que "chame" outras funções conforme for passado por parâmetro.
Exemplo lógico:
- Crie uma função de usuário com o nome por exemplo: ExecFonte()
- Nessa função crie uma tela onde o usuário possa informar no parâmetro a função que ele deseja executar.
- A função ExecFonte() valida se existe no RPO a função digitada e a executa.
Dessa forma você pode criar no menu do Protheus o acesso a função ExecFonte() apenas uma vez e por meio dela pode chamar diversas funções, a qual deseja testar e validar. Isso visa diminuir seu tempo nos testes, visto que não será necessário adicionar no menu do Protheus as novas rotinas a medida que for desenvolvendo.
Segue exemplo da User Function:
#INCLUDE "PROTHEUS.CH"
USER FUNCTION ExecFonte()
LOCAL cNomeFonte := "" //variavel que irá receber o nome do fonte digitado
LOCAL aFonte := {} //Array que irá armazenar os dados da função retornada pelo GetApoInfo()
LOCAL aPergs := {} //Array que armazena as perguntas do ParamBox()
//adiciona elementos no array de perguntas
aAdd( aPergs , {1, "Nome do fonte ", space(10), "", "", "", "", 40, .T.} )
//If que valida o OK do parambox() e passa o conteudo do parametro para a variavel
IF ParamBox(aPergs, "DIGITAR NOME DO ARQUIVO .PRW" )
cNomeFonte := ALLTRIM( MV_PAR01 )
ELSE
RETURN
ENDIF
//Caso o usuário digite o U_ ou () no nome do fonte, retira esses caracteres
cNomeFonte := StrTran( cNomeFonte , "U_" , "" )
cNomeFonte := StrTran( cNomeFonte , "()" , "" )
//Valida se o fonte existe no rpo
aFonte := GETAPOINFO( cNomeFonte + ".prw" )
//Valida se retornou os dados do fonte do rpo
IF !LEN( aFonte )
MsgAlert( DECODEUTF8( "Fonte não encontrado no RPO" ) , "ops!" )
RETURN u_ExecFonte()
ENDIF
//complementa a variavel e executa macro substituição chamando a rotina
cNomeFonte := "U_"+cNomefonte+"()"
&cNomeFonte
RETURN