segunda-feira, 16 de agosto de 2010

Como usar a função StartJob

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)
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...

4 comentários:

  1. Bom dia...

    Estamos 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!

    ResponderExcluir
  2. 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

    ResponderExcluir
  3. Ola Tadeu, muito obrigado!

    Gostaria da rotina para startar job sem consumir licenca.

    Apreciaria a ajuda,
    Abraco,

    ResponderExcluir
  4. Ola Tadeu
    Como 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

    ResponderExcluir