Como chamar uma função de usuário no Protheus?

 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"

/*/{Protheus.doc} ExecFonte
(Essa função tende a executar uma função de usuario que é informada por parametro
A partir do release 25 do protheus não é mais possível executar funções de usuário pelo 
lançamento padronizado. Sendo assim, criamos essa rotina para que seja colocada no menu do Protheus 12
e por meio dela o desenvolver possa executar suas rotinas sem a necessidade de ficar colocando-as nos menus)
@type  User Function
@author Augusto
@since 04/06/2020
@version version
@param 
@return Return Nil
@example
(examples)
@see (links_or_references)
/*/

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

Atualizado em 27/05/2021
Este artigo foi útil?  
Agradecemos sua avaliação.