Pular para o conteúdo principal

Postagem em destaque

BlackTDN :: Social :: Rifa Festival da Arte Capoeira Projeto Eu Sou Ninja

Angariar fundos para cobrir os custos logísticos do "Festival da Arte Capoeira" e apoiar o projeto Eu Sou Ninja em sua missão de promover a integração social e cultural na comunidade de Jacaraípe. Com a criação da rifa, buscamos envolver a comunidade de forma ativa no financiamento do evento, permitindo que todos contribuam para o sucesso do festival e para a continuidade das atividades do projeto. Prêmio: Copia da minha biblioteca pessoal de AdvPL/TLpp ..etc Participe da Rifa Eu já contribui. Só falta você! ```cmd Pasta de C:\GitHub\naldodj-tlpp 13/04/2024 19:17 . 19/03/2024 13:49 .. 05/01/2024 12:22 2.742 .gitattributes 14/11/2023 16:02 83 .gitignore 02/12/2023 20:08 .vscode 05/01/2024 12:05 bin 13/04/2024 19:18 4.121 ChangeLog.txt 27/12/2023 02:05 include 14/11/2023 16:02 27.030 LICENSE.txt 14/11/2023 16:02 0 makepatch.lst 14/11/2

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

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ã