Como usar o StartJob para atualizar informações

No artigo de hoje, vou mostrar como chamar uma função com StartJob para atualizar registros.

Imagine um cenário, onde o usuário que está usando o sistema, não tem privilégio para alterar o cadastro, e você precisa fazer a alteração naquele momento via ExecAuto, como fazer?

A forma é simples jovens, basta usar a função StartJob, com ela irá ser criado uma nova thread acionando uma User Function, ai nessa função nós podemos fazer a atualização.

Os parâmetros que a StartJob recebe são:

  • 1º Qual é o nome da User Function que será executada (entre aspas)
  • 2º Qual é o ambiente que será criado a Thread
  • 3º Se irá esperar finalizar (.T.) ou não (.F.)
  • 4º em diante, são parâmetros que você pode enviar para sua User Function

Além disso, o Return da função acionada também retorna para o StartJob, então você pode fazer por exemplo um array (no nosso exemplo, será um array de duas posições, a primeira se deu certo ou errado, e a segunda a mensagem).

Uma informação importante, é que não use esse recurso com o SIGAADV, pois ele não irá conseguir acionar o StartJob. Então opte preferencialmente pelo SIGAMDI.

Abaixo o código fonte de exemplo:

//Bibliotecas
#Include 'TOTVS.ch'

/*/{Protheus.doc} User Function zFuncTST
Função que mostra a pergunta se deseja alterar o cadastro
@type  Function
@author Atilio
@since 24/06/2021
@version version
/*/

User Function zFuncTST()
	Local aArea     := GetArea()
	Local dDtVencto := Date()
	Local aRetorno  := {.T., ""}
	
	//Se a pergunta for confirmada
	If MsgYesNo("Deseja atualizar a data de fim do contrato?", "Atenção")
	
		//Aciona a função de alteraçaõ
		aRetorno := StartJob("U_zAltFunc", GetEnvServer(), .T., cEmpAnt, cFilAnt, SRA->RA_FILIAL, SRA->RA_MAT, dDtVencto)
		
		//Se houve erro, será exibido
		If aRetorno[1]
			AutoGrLog(aRetorno[2])
			MostraErro()
		EndIf
	EndIf
	
	RestArea(aArea)
Return

/*/{Protheus.doc} User Function zAltFunc
Função de Execauto para alteração de funcionário
@type  Function
@author Atilio
@since 24/06/2021
@version version
/*/

User Function zAltFunc(cParEmp, cParFil, cParFilMat, cParMatric, dParVencto)
	Local aArea
	Local aRet     := {.T., ""} //[1] Houve Falha (.T. = Sim, .F. = Não); [2] Texto de observação
	Local aDados   := {}
	Local nAux
	Local aLogAuto := {}
	Local cLogTxt  := ""
	
	//Abaixo o usuário e senha que serão usados para realizar a alteração
	//O ideal aqui é encapsular essa senha em um parâmetro ou txt, para não deixar chumbada no fonte
	//Deixar chumbado é uma péssima prática, apenas estamos usando para exemplificar, cuidado, não deixe chumbado essas informações!
	//Aqui poderia ser algo como MemoRead(), GetMV() não daria pois precisa carregar o dicionário primeiro, há não ser que você passe a senha por
	//    parâmetro direto na chamada da user function, por exemplo, cParPass ali após dParVencto
	Local cUsuario := "UsuarioRH"
	Local cPass    := "Senha123"
	
	//Variáveis de controle do ExecAuto
	Private lMSHelpAuto     := .T.
	Private lAutoErrNoFile  := .T.
	Private lMsErroAuto     := .F.

	//Prepara o ambiente da empresa
	If Select("SX2") == 0
		RpcSetEnv(cParEmp, cParFil, cUsuario, cPass, "GPE")
	EndIf
	aArea := GetArea()

	//Monta o array do Execauto
	aAdd(aDados, {"RA_FILIAL",    cParFilMat,   Nil}) //Filial
	aAdd(aDados, {"RA_MAT",       cParMatric,   Nil}) //Matrícula
	aAdd(aDados, {"RA_DTFIMCT",   dParVencto,   Nil}) //Data do fim do contrato
	aAdd(aDados, {"RA_VCTOEXP",   dParVencto,   Nil}) //Data de vencimento de experiência
	aAdd(aDados, {"RA_VCTEXP2",   dParVencto,   Nil}) //2ª Data de vencimento de experiência

	//Executa a alteração do funcionário
	MSExecAuto({|x, y, k, w| GPEA010(x, y, k, w)}, Nil, Nil, aDados, 4)

	//Se houve erro
	If lMsErroAuto
		//Pegando log do ExecAuto
		aLogAuto := GetAutoGRLog()
		
		//Percorrendo o Log e incrementando o texto
		For nAux := 1 To Len(aLogAuto)
			cLogTxt += aLogAuto[nAux] + CRLF
		Next

		aRet[1] := .T.
		aRet[2] := cLogTxt
	Else
		aRet[1] := .F.
		aRet[2] := "Alteração realizada com sucesso!"
	EndIf

	RestArea(aArea)
Return aRet

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.

2 Responses

  1. Súlivan disse:

    Documentação top.
    Exemplo excelente.

Deixe uma resposta para SúlivanCancelar resposta

Terminal de Informação