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 :: apconnxcontrol.ocx with Harbour

Harbour também nos permite manipular objetos COM através da função WIN_OLECREATEOBJECT. Um Exemplo bem simples seria:

   1: //--------------------------------------------------------------------
   2: PROCEDURE Main()
   3:  
   4:    LOCAL hUsers    
   5:  
   6:    LOCAL cTEnv  := ""
   7:    LOCAL cTSrv  := ""
   8:    LOCAL cTUser := ""
   9:    LOCAL cTPWD  := ""
  10:    LOCAL nTPort := 0
  11:  
  12:    LOCAL oPtObj
  13:    
  14:    oPtObj := WIN_OLECREATEOBJECT( "apconnxcontrol.apconnx" )
  15:  
  16:    LoadConnectionParams(@cTEnv,@cTSrv,@nTPort,@cTUser,@cTPWD)
  17:    
  18:    oPTObj:Environment     := cTEnv
  19:    oPTObj:Password        := cTPWD
  20:    oPTObj:Port            := nTPort
  21:    oPTObj:Server          := cTSrv
  22:    oPTObj:User            := cTUser
  23:    oPTObj:Connect() 
  24:    
  25:    IF ( oPTObj:Connected )
  26:         oPTObj:AboutBOX()
  27:         ? oPTObj:UsersCount()
  28:         hUsers    := GetUsers(oPTObj)
  29:         SendMessage( oPTObj , hUsers )
  30:         KillPTUsers( oPTObj , hUsers , .T. )
  31:    EndIF
  32:  
  33:    oPTObj:Disconnect()
  34:  
  35:    oPTObj := NIL
  36:  
  37: RETURN
  38:  
  39: //--------------------------------------------------------------------
  40: STATIC FUNCTION GetUsers(oPTObj)
  41:  
  42:     LOCAL aTmp
  43:     LOCAL hTmp
  44:  
  45:     LOCAL cUsers     := oPTObj:GetUsers()
  46:     LOCAL hUsers    := {=>}
  47:     LOCAL aUsers    := hb_aTokens( cUsers , ";"+ Chr(1) )
  48:     LOCAL nUsers    := Len( aUsers )
  49:  
  50:     LOCAL i
  51:     
  52:     FOR i := 1 TO nUsers
  53:         aTmp                        := hb_aTokens( aUsers[ i ] , ";" )
  54:         hUsers[i]                    := {=>}
  55:         hUsers[i]["USER_NAME"]         := aTmp[1]
  56:         hUsers[i]["USER_COMPUTER"]     := aTmp[2]
  57:         hUsers[i]["USER_THREAD_ID"]    := aTmp[3]
  58:         IF ( Len( aTmp ) > 3 )
  59:             hUsers[i]["USER_?"]     := aTmp[4]
  60:         Else
  61:             hUsers[i]["USER_?"]     := ""
  62:         EndIF
  63:     Next i
  64:  
  65:     FOR EACH hTmp IN hUsers
  66:         ? hTmp["USER_NAME"]
  67:         ? hTmp["USER_COMPUTER"]
  68:         ? hTmp["USER_THREAD_ID"]
  69:         ? hTmp["USER_?"]
  70:     NEXT EACH
  71:  
  72: RETURN( hUsers )
  73:  
  74: //--------------------------------------------------------------------
  75: STATIC PROCEDURE LoadConnectionParams(cTEnv,cTSrv,nTPort,cTUser,cTPWD)
  76:     cTEnv  := "NDJ_01"
  77:     cTSrv  := "127.0.0.1"
  78:     nTPort := 4321
  79:     cTUser := "TOTVS"
  80:     cTPWD  := "SIGA"
  81: RETURN
  82:  
  83: //--------------------------------------------------------------------
  84: STATIC PROCEDURE SendMessage( oPTObj , hUsers )
  85:  
  86:     LOCAL hTmp
  87:  
  88:     FOR EACH hTmp IN hUsers
  89:         IF ( Val(hTmp["USER_THREAD_ID"]) > 0 )
  90:             oPTObj:SendMessage(hTmp["USER_NAME"],hTmp["USER_COMPUTER"],hTmp["USER_THREAD_ID"],hTmp["USER_?"],"Message From Harbour")
  91:         EndIF    
  92:     NEXT EACH
  93:  
  94: RETURN
  95:  
  96: //--------------------------------------------------------------------
  97: STATIC PROCEDURE KillPTUsers( oPTObj , hUsers , lWait )
  98:  
  99:     LOCAL hTmp
 100:  
 101:     FOR EACH hTmp IN hUsers
 102:         IF ( Val(hTmp["USER_THREAD_ID"]) > 0 )
 103:             oPTObj:DisconnectUser(hTmp["USER_NAME"],hTmp["USER_COMPUTER"],hTmp["USER_THREAD_ID"],hTmp["USER_?"],lWait)
 104:         EndIF    
 105:     NEXT EACH
 106:  
 107: RETURN

Ao compilar o código Harbour e …


image


image


executá-lo,


image 


obteremos os seguintes resultados:


image


image


image


image


image


image


image


Para obter o exemplo siga o link: ..\harbour\samples\ole\apconnxcontrol. hb_apconnx1.prg depende de hbmk.hbm.


Para compilar o código Harbour obtenha o compilador em Harbour Project


[]s
иαldσ dj

Comentários

  1. Hehehe.... Lee, esse post ja deu ideia para uma nova ideia... Mais tarde falamos! Abraço

    ResponderExcluir
  2. Naldo, como funciona o retorno do GetUsers ??

    eu joguei o resultado em um MEMO e veio assim:

    gilberto.silva;SALMOX_002;7120;
    ; 2548;1868656490;.batista
    Wed Jun 06 08:34:41 2012
    ;01:47:42;241128414;
    SRH_006;Π;1230176256;GAADV
    ; 2364;1936290403;tiane.vieira
    Wed Jun 06 08:08:21 2012
    ;02:14:02;3299631;
    SDCO_010;ð ;1230176256;GAADV
    ; 7584;1701869669;dito.vieira
    Wed Jun 06 09:03:24 2012
    ;01:18:59;4821397;

    observei que a primeira linha está correta, agora as outras eu creio que não...
    obs estou usando delphi, vlw

    ResponderExcluir
    Respostas
    1. Alexandre, GetUsers() retorna uma string com os dados dos usuários conectados. Você pode transformar essa string em um array/vertor multidimensional considerando como token para a separação dos dados por usuários ";" + Chr(1) e como token para os dados do usuário ";".Observe no exemplo:

      47: LOCAL aUsers := hb_aTokens( cUsers , ";"+ Chr(1) ) obtenho as informações por usuário e;
      53: aTmp := hb_aTokens( aUsers[ i ] , ";" ) a informação específica do usuário.

      Sendo assim, utilize alguma "Split / Tokenizer functions" do Delphi ou a Classe TStringList para esse fim.

      Ex.:

      var StringList: TStringList;
      example: string;
      begin
      example := 'this,is,an,example';
      StringList := TStringList.Create();
      StringList.Text := StringReplace(example, ',', #13#10, [rfReplaceAll]);
      // now the stringlist is filled
      // like this:
      // StringList[0] = 'this'
      // StringList[1] = 'is'
      // etc
      StringList.Free();
      end;

      Excluir
    2. Um exemplo "hipotético" no delphi (apenas para entendimento)

      var aUsers: TStringList;
      var aUser: TStringList;
      var cUsers: string;
      var I: Integer;
      begin
      cUsers := oPTObj.GetUsers();
      aUsers := TStringList.Create();
      aUsers.Text := StringReplace(cUsers, ';'+Chr(1), #13#10, [rfReplaceAll]);
      For I := 1 To Length(aUsers) do
      begin
      aUser := TStringList.Create();
      aUser.Text := StringReplace(aUsers[i], ';', #13#10, [rfReplaceAll]);
      aUser.Free();
      end;
      aUsers.Free();
      end;

      Excluir
    3. Naldo, mais uma pergunta...

      Usei o comando CallProc para executar uma função no protheus, só que a função retorna um ResultAsArray;

      Tem idéia de como posso ler este retorno no Delphi, já que a criação de array no delphi é diferente do advpl.

      Obrigado.

      Excluir
  3. Naldo, blz,

    como eu faco para pegar todas as permissoes do usuario ? Pergunto pq tenho uma customização de uma tela entre 2 empresas, e quando eu mudo de uma empresa para outra e depois tento voltar para a atual ele perde todas as permissoes e do usuario, fica em branco, e eu precisava que isso não ocorresse.
    Tem alguma função ou comando que nao perde todas as informações do usuario ? (cUsuario, cFilAnt, cEmpAnt, cNumEmp, entre outras ....) vlw

    Carlos Jr
    carlosjunior1983@gmail.com

    ResponderExcluir
  4. Naldo, blz,

    como eu faco para pegar todas as permissoes do usuario ? Pergunto pq tenho uma customização de uma tela entre 2 empresas, e quando eu mudo de uma empresa para outra e depois tento voltar para a atual ele perde todas as permissoes e do usuario, fica em branco, e eu precisava que isso não ocorresse.
    Tem alguma função ou comando que nao perde todas as informações do usuario ? (cUsuario, cFilAnt, cEmpAnt, cNumEmp, entre outras ....) vlw

    Carlos Jr
    carlosjunior1983@gmail.com

    ResponderExcluir
    Respostas
    1. Carlos, mande o código para mail@blacktdn.com.br. Facilitará o nosso entendimento e a resposta ser-lhe-a enviada.

      Excluir
  5. Naldo, consegui terminar meu aplicativo, tem como fazer um post-propaganda aki no site pra nóis? já que o aplicativo é gratuíto e o intuíto é ajudar a todos nós analistas...
    ag@alexandre-goncalves.com
    www.alexandre-goncalves.com

    ResponderExcluir
    Respostas
    1. Alexandre, poderia dar uma ajuda, estou precisando construir algo parecido na verdade preciso listar somente as conexões ativas no protheus gravando em um arquivo.txt.

      Estou usando Delphi e vi acima alguns questinoamentos seus.

      Se for possível poderia me enviar um exemplo no delphi?

      Obrigado,

      Tadeu.

      Excluir
    2. Alexandre, poderia me passar por e-mail o aplicativo?
      Meu e-mail é tadeu.jitsu50@gmail.com

      Obrigado,

      Tadeu.

      Excluir

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" // ---------------

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ã

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