BlackTDN Search

sexta-feira, 29 de abril de 2011

Protheus :: Executando aplicações externas no "Server" utilizando WaitRunSrv

WaitRunSrv() é uma função da "biblioteca" de funções do Protheus que tem a finalidade de executar uma aplicação externa no "Server. Sua sintaxe é:

WaitRunSrv( cCommandLine , lWaitRun , cPath ) : lSuccess

Onde: 

cCommandLine : Instrução a ser executada
lWaitRun     : Se deve aguardar o término da Execução
Path         : Onde, no server, a função deverá ser executada
Retorna      : .T. Se conseguiu executar o Comando, caso contrário, .F.


Poderíamos utilizá-la, por exemplo, para chamar uma aplicação em java no servidor do Protheus para a geração de um relatório pelo IReport exportando o conteúdo para .pdf ou .xls e depois trazer o conteúdo ao "client" do Protheus para apresentá-lo ao usuário, ou ainda para a execução de um script em "PowerShell", ou a chamada a qualquer outro aplicativo que se encontra no server.

Um exemplo de uso (apenas didático, pois de fato não têm sentido usá-la para essa finalidade) seria:

WaitRunSrv( "attrib d:\svn\*.* +r /s"  , .F. , "c:\WINDOWS\system32\" )

ou 

WaitRunSrv( "attrib d:\svn\*.* +r /s"  , .T. , "c:\WINDOWS\system32\" )

Para alterar o atributo dos arquivos abaixo de d:\svn\ para somente leitura.

Na primeira chamada solicitamos a execução do comando e retornamos imediatamente para a aplicação do Protheus.

Já na segunda chamada, aguardamos até que a execução do comando seja finalizado.

No caso do comando a ser executado emitir alguma mensagem, essa será apresentada no Console do server Protheus. Observe que passei apenas "attrib d:\svn\*.* +r /s" para  cCommandLine e não"c:\windows\system32\attrib d:\svn\*.* +r /s". Isso porque Attrib está mapeada no SO. Então, recomendo que cCommandLine sempre  seja montado conforme exemplo abaixo.

Um problema com a WaitRunSrv() é que ela apenas executa algo no servidor, não retorna nada para a aplicação Protheus. Caso necessite que algo seja executado no servidor e que retorne um conteúdo para o protheus, faríamos algo como:

Local cCommand := "D:\totvs\p10\appclient\totvsclient.exe -q -p=u_ExecMyDll -c=TCP -e=MyEnvironment -m -l"
Local lWait  := .F.
Local cPath     := "D:\totvs\p10\appclient\"

WaitRunSrv( @cCommand , @lWait , @cPath )

No exemplo acima, executaríamos o "client" do Protheus no Servidor passando para ele uma função customizada que chamará a execução de uma dll e o retorno da execução será tratado pela nossa própria função em advpl.

Dependendo da criatividade do implementador, o uso da WaitRunSrv poderá ter diversas finalidades.

Bem, não encontrei documentação da WaiRunSrv no tdn e, em função disso, não posso postar o link. Descobri o seu uso através do método de "Tentativa e Erro" e baseando-me no exemplo da WaitRun().


[]s

иαldσ dj

10 comentários:

  1. Muito bacana isto Naldo, obrigado por compartilhar.
    Tenho uma duvida, eh possivel abrir alguma rotina do sistema sem solicitar login ao usuario, como por exemplo a rotina MATA010... Algo como quando atualizamos o RPO "on the fly" que o client eh "reiniciado" e volta aonde estava...

    Obrigado

    ResponderExcluir
  2. Ferne$,

    Possível é sim, mas dada a característica da implementação de várias funções do Protheus, NÃO RECOMENDO. Neste caso use ExecAuto. Mas, se o desejo for apenas a chamada da Função MATA010 sem a necessidade de Login no Protheus, "encapsule" a chamada em uma User Function e chame-a diretamente na tela de Entrada do sistema. Vou "postar" um exemplo.

    []s

    иαldσ dj

    ResponderExcluir
  3. Muito obrigado pela dica!!! Se tivesse esta informação antes, teria economizado muito tempo no desenvolvimento de web services.

    ResponderExcluir
  4. Sabe me dizer quando se trata de um servidor linux como ficariam os comandos?

    ResponderExcluir
  5. Boa Tarde Naldo.

    Executei esse comando para chamar uma .bat no servidor que faz criptografa de arquivos e não funcionou. Porem o retorno da função é .T.

    Se eu chamo a mesma .bat via PSEXEC do windows funciona. O problema é mesmo a função WaitRunSrv

    Se puder ajudar agradeço.

    Thiago Nascimento

    ResponderExcluir
    Respostas
    1. Thiago, "poste" aqui como a sintaxe está sendo montada para WaitRunSrv... Preciso de: cCommandLine e de cPath

      Excluir
  6. Local cCommand := "F:\FAT_SAT\Protheus_Data\TEMP\enc.bat"
    Local lWait := .F.
    Local cPath := "F:\FAT_SAT\Protheus_Data\TEMP\"

    if WaitRunSrv( @cCommand , @lWait , @cPath )
    msginfo("ok")
    else
    msginfo("n")
    endif


    A função retorna verdadeiro, como se tivesse executado o meu .bat no servidor

    Fiz um teste colocando um arquivo que não existe ele retorna .f. corretamente.

    Obrigado

    ResponderExcluir
  7. Boa tarde, precisava rodar um relatorio iReport integrado com o protheus.....porem necessito configurar um WebService sendo que o mesmo precisa de licença Totvs I.

    Tem como rodar essa relatório sem essa licença??

    Obrigado.

    ResponderExcluir
  8. Naldo, Boa Tarde.

    Utilizei este comando para reiniciar o TSS de um server linux chamando um scrip. O problema que a seção fica presa. Conhece algum comando que posso chamar para que não fique preso.

    Ex: Tenho um serviço do appserver do protheus e um do tss. Quando os dois são startados direto no server, consigo compilar normalmente no ambiente do protheus.

    Porem se compilo esta chamada no appserver do protheus e inicio o serviço do tss com essa chamada. Não consigo mais compilar no ambiente protheus. Sendo necessario parar o servico manualmente no server para depois compilar.

    Poderia me ajudar por favor?

    Muito Obrigado desde já.
    Bruno

    ResponderExcluir