Dias atrás tive o seguinte problema: Precisava executar uma rotina dentro de uma função mas essa primeira rotina não poderia parar e aguardar a execução desta função. Ai conheci a função StartJob. Está função permite iniciar uma Thread, ou seja, uma conexão separada no monitor, e a função que à chamou continuar rodando normalmente.
Sintaxe da função StartJob:
StartJob(NomeDaRotina,Environment,FinalizaRotina,Empresa,Filial)
StartJob(NomeDaRotina,Environment,FinalizaRotina,Empresa,Filial)
Esta sintaxe é o que o TOTVS disponibiliza.
Até ai tudo bem, mas eu tive mais um problema: Eu precisava passar parametros para esta rotina que eu estava chamando na função StartJob. Fiz vários testes até que descobri que ao invés de passar os parametros Empresa e Filial, eu poderia passar um vetor com os parametros, ou seja, no mesmo vetor poderia passar Empresa, Filial e mais os parametros que precisava. E para receber estes parametros na função destino bastou usar o PARAMIXB. Abaixo segue um exemplo, apenas escrevi este exemplo, nao compilei.
// Funcao principal que dentro dela voce chamará um Job
User Function FUAtualizaDados()
Local _aParametros := {}
_aParametros := {"01","02","000001","04"}
// Inicia o Job
StartJob("U_FUTesteJob()",GetEnvServer(),.F.,_aParametros)
/* A Função GetEnvServer() retorna o environment atual, mas posso definir outro. */
Return
// Esta funcao e a funcao chamada pela funcao StartJob
User Function FUTesteJob()
Local _cEmpresa := paramixb[1] // Usar o paramixb
Local _cFilial := paramixb[2]
Local _cFornece := paramixb[3]
Local _cLoja := paramixb[4]
/* A maioria das funcoes que sao chamadas de Job devem usar o prepare environment */
prepare environment _cEmpresa Filial _cFilial Tables "SA2"
DBSelectArea("SA2")
SA2->(DBSetOrder(1))
if SA2->(DBSeek(xFilial("SA2")+_cFornece+_cLoja))
RecLock("SA2",.F.)
SA2->A2_TESTE := "TESTANDO FUNCAO JOB"
SA2->(MsUnLock())
endif
Return
Pessoal lembre-se que ao iniciar um Job voce estara usando uma licenca e vc pode ter problemas com isso. Daqui uns dias eu posto uma maneira de voce criar jobs sem usar licenças.
Qualquer duvida sobre o conteudo acima é só deixar seu recado.
Um abraço...
Até ai tudo bem, mas eu tive mais um problema: Eu precisava passar parametros para esta rotina que eu estava chamando na função StartJob. Fiz vários testes até que descobri que ao invés de passar os parametros Empresa e Filial, eu poderia passar um vetor com os parametros, ou seja, no mesmo vetor poderia passar Empresa, Filial e mais os parametros que precisava. E para receber estes parametros na função destino bastou usar o PARAMIXB. Abaixo segue um exemplo, apenas escrevi este exemplo, nao compilei.
// Funcao principal que dentro dela voce chamará um Job
User Function FUAtualizaDados()
Local _aParametros := {}
_aParametros := {"01","02","000001","04"}
// Inicia o Job
StartJob("U_FUTesteJob()",GetEnvServer(),.F.,_aParametros)
/* A Função GetEnvServer() retorna o environment atual, mas posso definir outro. */
Return
// Esta funcao e a funcao chamada pela funcao StartJob
User Function FUTesteJob()
Local _cEmpresa := paramixb[1] // Usar o paramixb
Local _cFilial := paramixb[2]
Local _cFornece := paramixb[3]
Local _cLoja := paramixb[4]
/* A maioria das funcoes que sao chamadas de Job devem usar o prepare environment */
prepare environment _cEmpresa Filial _cFilial Tables "SA2"
DBSelectArea("SA2")
SA2->(DBSetOrder(1))
if SA2->(DBSeek(xFilial("SA2")+_cFornece+_cLoja))
RecLock("SA2",.F.)
SA2->A2_TESTE := "TESTANDO FUNCAO JOB"
SA2->(MsUnLock())
endif
Return
Pessoal lembre-se que ao iniciar um Job voce estara usando uma licenca e vc pode ter problemas com isso. Daqui uns dias eu posto uma maneira de voce criar jobs sem usar licenças.
Qualquer duvida sobre o conteudo acima é só deixar seu recado.
Um abraço...
Bom dia...
ResponderExcluirEstamos tentando aplicar o StartJob aqui na empresa, mas não está funcionando.
Anteriomente funcionava, então mudamos para outra linha de programação e agora estamos tentando colocar o StartJob novamente. Porém, a função não é inicializada...
O que você sugere fazer?
Raphael - raphael.rnp@gmail.com
Obrigado!
Rafael, O exemplo acima nao te ajudou? Voce pode me passar o seu fonte. Posta o seu fonte aqui, para que eu possa analisar. Um abraço
ResponderExcluirOla Tadeu, muito obrigado!
ResponderExcluirGostaria da rotina para startar job sem consumir licenca.
Apreciaria a ajuda,
Abraco,
Ola Tadeu
ResponderExcluirComo posso monitorar esses jobs par saber quando terminaram a tarefa ou tarefas. sem mudar a opção lWait, para poder usar varios starjob.
Att
Anderson