Pular para o conteúdo principal

Postagem em destaque

🚀 Oferecendo Serviços Remotos de Desenvolvedor AdvPL e Mais 🖥️

🚀 Oferecendo Serviços Remotos de Desenvolvedor AdvPL e Mais 🖥️ Olá pessoal, Espero que este post encontre todos vocês bem! É com grande entusiasmo que compartilho que estou expandindo meus serviços como Desenvolvedor AdvPL para novos desafios e colaborações. Com mais de duas décadas de experiência sólida, minha jornada profissional tem sido enriquecedora, com a oportunidade de participar de projetos empolgantes ao longo dos anos. Agora, estou ansioso para trazer minha experiência e habilidades para novas equipes e projetos, trabalhando de forma remota. Minha expertise abrange não apenas AdvPL, mas também outras tecnologias-chave, incluindo JS, SQL, Infraestrutura e Otimização de Processos. Acredito que essa combinação de conhecimentos me permite oferecer soluções abrangentes e eficazes para uma variedade de necessidades de desenvolvimento. Acredito que a tecnologia tem o poder de transformar negócios e impulsionar o sucesso, e estou comprometido em ajudar meus clientes a alcançar seu

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

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
  9. Bom dia Naldo

    Fiz 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

    ResponderExcluir

Postar um comentário

Postagens mais visitadas deste blog

BlackTDN :: RLeg ~ Desvendando a Função ParamBox

Para quem precisar desenvolver uma interface de entrada de dados, coisa rápida, e não quer ter aquele trabalhão danado que todos já sabemos, o Protheus tem uma função que ajuda muito, é uma interface semelhante a função Pergunte, porém com muito mais opção de objeto de entrada de dados, alias até colocar o scrollbox desta interface com todos os objetos em outra MsDialog ou Wizard é simples. Vejam o exemplo abaixo, boa sorte! Rleg. //---------------------------------------------------------- // Função exemplo utilizando a função ParamBox() //---------------------------------------------------------- User Function xParamBox() Local aRet := {} Local aParamBox := {} Local aCombo := {"Janeiro","Fevereiro","Março","Abril","Maio","Junho","Julho","Agosto","Setembro","Outubro","Novembro","Dezembro"} Local i := 0 Private cCadastro := "xParambox" // ---------------

Protheus :: Chamando Funções do Menu Diretamente e sem a Necessidade de Login

Ferne$ perguntou: "...é possível abrir alguma rotina do sistema sem solicitar login ao usuário, como por exemplo a rotina MATA010..." Sim Ferne$, é possível sim. Abaixo um Exemplo para a Chamada à função MATA010 sem a necessidade de Login no sistema. #INCLUDE "PROTHEUS.CH" #INCLUDE "TBICONN.CH" /*/ Funcao: MATA010Ex Data: 30/04/2011 Autor: Marinaldo de Jesus Descricao: Executar a Funcao MATA010 diretamente sem a necessidade de LOGIN no Protheus Sintaxe: 1 ) U_MATA010Ex ( Chamada diretamente na Tela de Entrada do Sistema ) ; ou 2 ) totvsclient.exe -q -p=u_MATA010Ex -a=01;01 -c=rnp_local -e=rnp -m -l ( Chamada Via Linha de Comando ) /*/ User Function MATA010Ex( cEmpFil ) Local aEmpFil Local bWindowInit := { || __Execute( "MATA010()" , "xxxxxxxxxxxxxxxxxxxx" , "MATA010" , "SIGAFAT" , "SIGAFAT", 1 , .T. ) } Local cEmp Local cFil Local cMod Local cModName := "SIGAFAT" DEFA

BlackTDN :: Customizando a interface de Login no Protheus e by You

A publicação “ BlackTDN :: By You e sua nova tela de login ”  de nosso amigo OBona deu o que falar e, em função disso, esse que a muito não vos escreve resolveu criar uma versão onde será possível personalizar, “por completo”, a tela de login no Protheus/by You. Considerando que OBona já havia “mapeado, identificado e customizado” as imagens peguei-as emprestadas para o exemplo que se segue: O primeiro passo para a customização “total” da interface de login do Protheus/by You será implementar o “Ponto de Entrada” ChgPrDir (Diretório de impressão) . Usaremos esse PE juntamente como programa U_FindMsObject.prg (apresentado pela primeira vez em: Protheus :: ADVPL : The Container : Presents Pandora's box ). Diferente do exemplo proposto por OBona, que substitui, durante o processo de compilação, as imagens padrões do sistema (excluindo-as) por imagens customizadas (com o mesmo nome) este novo exemplo mantém, no RPO, as imagens padrões adicionando novas imagens customizadas que serã