Empresa/Filial na execução de tarefas do Schedule

Bom dia!

Estou com uma dúvida quanto ao funcionamento do Schedule. No cadastro de tarefas existe um campo para informar a empresa e filial onde o programa será executado.

schedule_empresa.jpeg

Como posso fazer para identificar em qual empresa a tarefa está sendo executada no momento, sendo que o ambiente ainda não foi aberto para popular as variáveis cFilAnt e cEmpAnt?

Por exemplo: Possuo esse job que será executado para empresa/filial 01/01 e 01/02. Como posso fazer para que o job execute um RpcSetEnv/Prepare Environment de forma dinâmica com as empresas cadastradas? Existe alguma variável onde eu posso obter essas informações?

Grato.

:warning: Atenção: Esta publicação foi transferida automaticamente do fórum antigo, mas os anexos não foram incluídos.

Giordano,

Na verdade o proprio schedule já executa dois jobs, ele abre uma execução para cada filial, e executa isso separadamente.

Abraço,

Faz assim no código:
User Function xpto(aParam)
Local lAuto := IsBlind()

//Se for por Schedule, abre o ambiente
If lAuto
RpcSetType(3)
RpcSetEnv(aParam[1], aParam[2])
EndIf

//… seu código

If lAuto
RpcClearEnv()
aParam := ASize(aParam, 0)
aParam := Nil
EndIf

Return

Depois, no Schedule, vc cadastra a rotina para quais filiais quer que ela rode. Ou pode chamar a rotina pelo menu, daí ela executa normal para a filial que o usuário está logado.
Sempre uso esse recurso para rotinas que quero usar tanto no Schedule quanto no menu.
Espero ter ajudado! Boa sorte.

Bom dia Giordano,

Olha acho que funciona da seguinte maneira, na função que será executa, indique para receber como parâmetro o array aParam emexmplo:(Funcao(aParam)), senão me engano aParam[1] - empresa - aParam[2] Filial!

Atenciosamente,

No seu fonte do schedule fica:


User Function fonte(aParam)
    //aParam[1] == Empresa
       //aParam[2] == Filial

Giordano,

Existem tipos de tarefas diferentes no schedule e isso normalmente deixa a galera meio confusa.

O antigo schedule, você recebia os dados sobre a execução via parâmetro, porém já há muito tempo, foi criado um novo tipo de tarefa, onde a thread que executa sua rotina já está com o ambiente preparado, ou seja, você já tem o ambiente Protheus aberto com a conexão no banco de dados etc.

As tarefas antigas são chamadas de processo especial, já as novas, você precisa fazer algumas configurações no código fonte via uma função chamada SchedDef.

Caso sua tarefa seja uma processo especial (que é a maneira antiga), você vai receber os dados do ambiente como parâmetro como já citei, caso seja uma rotina já com SchedDef (novo tipo, mas já velho também, acredito que exista desde o P11) configurado, sua rotina será disparada em uma thread com o ambiente preparado, logo essa responsabilidade fica totalmente na camada da LIB.


Essa documentação tem exemplos e explica sobre ambos os tipos de tarefas:

https://tdn.totvs.com/pages/releaseview.action?pageId=271167961

Obrigado Daniel, não tinha notado a existência da scheldDef.

Obrigado pela explicação, Daniel. Estarei realizando alguns testes.

Bom dia, Daniel! Me tira uma dúvida: ao usar SchedDef em um programa e chamá-lo via StartJob, o mesmo também iniciará em uma thread preparada ou isso só tem efeito no Schedule?

Desculpe a demora, não havia visto, somente o schedule efetua a leitura dessa função.