Atualizando informações através da MsExecAuto – Maratona AdvPL e TL++ 360

Nesse vídeo demonstraremos a utilização da função MsExecAuto, que serve para executar automaticamente alguma rotina do ERP, dessa forma incluindo, alterando ou excluindo informações.

Abaixo o código fonte desenvolvido para o exemplo em vídeo acima:

//Bibliotecas
#Include "TOTVS.ch"

/*/{Protheus.doc} User Function zExe360
Executa uma rotina de forma automática
@type Function
@author Atilio
@since 26/03/2023
@see https://tdn.totvs.com/pages/releaseview.action?pageId=566489232
@obs 
    Função MsExecAuto
    Parâmetros
        + Bloco de código que será executado
        + Parâmetros (1 a 15) que serão passados na rotina
    Retorno
        Função não tem Retorno

    **** Apoie nosso projeto, se inscreva em https://www.youtube.com/TerminalDeInformacao ****
/*/

User Function zExe360()
    Local aArea         := FWGetArea()
    Local aDados        := {}
    Local lAutomatico   := IsBlind()
    Local cPastaErro := '\x_logs\'
	Local cNomeErro  := ''
	Local cTextoErro := ''
	Local aLogErro   := {}
	Local nLinhaErro := 0
    Private lMsErroAuto := .F.

    //Se for automático sem tela, declara outras variáveis para não exibir a tela
    If lAutomatico
        Private lMSHelpAuto     := .T.
        Private lAutoErrNoFile  := .T.
    EndIf

    //Adiciona os campos
    aAdd(aDados, {"B1_COD",    "F0001",   Nil})
    aAdd(aDados, {"B1_DESC",   "Teste",   Nil})
    aAdd(aDados, {"B1_TIPO",   "PA",      Nil})
    aAdd(aDados, {"B1_UM",     "KG",      Nil})
    aAdd(aDados, {"B1_LOCPAD", "01",      Nil})
    aAdd(aDados, {"B1_GRUPO",  "G001",    Nil})

    //Chama a inclusão
    MsExecAuto({|x, y| MATA010(x, y)}, aDados, 3)

    //Se houve erro, mostra a mensagem
    If lMsErroAuto
        //Se for automático, irá gravar o log dentro da Protheus Data
        If lAutomatico
            cPastaErro := '\x_logs\'
            cNomeErro  := 'erro_sb1_' + dToS(Date()) + '_' + StrTran(Time(), ':', '-') + '.txt'

            //Se a pasta de erro não existir, cria ela
            If ! ExistDir(cPastaErro)
                MakeDir(cPastaErro)
            EndIf

            //Pegando log do ExecAuto, percorrendo e incrementando o texto
            aLogErro := GetAutoGRLog()
            For nLinhaErro := 1 To Len(aLogErro)
                cTextoErro += aLogErro[nLinhaErro] + CRLF
            Next

            //Criando o arquivo txt e incrementa o log
            MemoWrite(cPastaErro + cNomeErro, cTextoErro)

        //Senão, exibe a tela de erro
        Else
            MostraErro()
        EndIf

    Else
        FWAlertSuccess("Produto incluido com sucesso", "Sucesso no ExecAuto")
    EndIf

    FWRestArea(aArea)
Return

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.

4 Responses

  1. Eliezer Pereira Cuencas disse:

    Estou tentando gravar um ExecAuto com a GPEA010 mas estou tendo o seguinte erro:
    “Atenção – Usuário sem acesso aos campos necessários ao eSocial, não será possível incluir e alterar funcionários.
    Contate o administrador do Sistema.”

    Já tentei permissões, usei o usuario admin pra tentar executar e nenhum sucesso, quando faço pelo cadastro consigo gravar normal, mas quando faço por execauto não funciona.

    • Bom dia Eliezer, tudo joia?

      No caso dessa customização do ExecAuto, ela está em qual menu?

      Se não estiver no 07 (SIGAGPE), faça um teste adicionando no menu 07 e execute novamente.

      Agora se for via JOB por exemplo, no RPCSetEnv, passe o “GPE”, ou se for caso, tente fazer um teste alterando as variáveis nModulo e cModulo para 7 e “GPE” respectivamente.

      Tenha uma ótima e abençoada terça feira.

      Um forte abraço.

      • Eliezer Cuencas disse:

        Consegui executar o execauto atravez de uma user function, agora vou partir para a API em si ja que sei que o execAuto esta rodando, acredito que para a API também preciso do RPCSetEnv correto? Agradeço tua atenção, Deus te abençoe

        • Bom dia Eliezer, Amém meu irmão, tudo joia?

          Então, se você já usa a API em REST com o prepareIn, não vai precisar do RPCSetEnv. Pois não é recomendado dar um Clear Env e o Set Env dentro de um endpoint.

          Talvez o que você vai precisar, é alterar as variáveis públicas de nModulo (para 7) e cModulo (para “GPE”).

          Tenha uma ótima e abençoada quarta feira.

          Um forte abraço.

Deixe uma resposta

Terminal de Informação