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
Muito bacana isto Naldo, obrigado por compartilhar.
ResponderExcluirTenho 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
Ferne$,
ResponderExcluirPossí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
Muito obrigado pela dica!!! Se tivesse esta informação antes, teria economizado muito tempo no desenvolvimento de web services.
ResponderExcluirSabe me dizer quando se trata de um servidor linux como ficariam os comandos?
ResponderExcluirBoa Tarde Naldo.
ResponderExcluirExecutei 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
Thiago, "poste" aqui como a sintaxe está sendo montada para WaitRunSrv... Preciso de: cCommandLine e de cPath
ExcluirLocal cCommand := "F:\FAT_SAT\Protheus_Data\TEMP\enc.bat"
ResponderExcluirLocal 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
Thiago, vc conseguiu resolver ?
ExcluirBoa 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.
ResponderExcluirTem como rodar essa relatório sem essa licença??
Obrigado.
Naldo, Boa Tarde.
ResponderExcluirUtilizei 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
Bom dia Naldo
ResponderExcluirFiz o teste para executar um .bat, usando tanto a WaitRunSrv quanto WaitRun. Ambas retornam como se tivesse sido executado corretamente, mas não funciona. A WaitRunSrv retorna .T. e a WaitRun retorna 0.
Sabe o que pode ser? Segue abaixo o teste:
User Function OUTM013C()
cCommand := "D:\MP12-TST\protheus_data\webservice\TesteImp.bat"
//cCommand := "LPR -S 10.100.53.11 -P z -o l D:\MP12-TST\protheus_data\webservice\thyago_20190115_080739.pdf"
cPath := "D:\MP12-TST\protheus_data\webservice"
lWait := .F.
lRet := WaitRunSrv( @cCommand , @lWait , @cPath )
nRet := WaitRun(cCommand, 1 )
Return