BlackTDN Search

terça-feira, 10 de janeiro de 2012

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

11 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