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 nUsers53: 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: Else61: hUsers[i]["USER_?"] := ""
62: EndIF 63: Next i 64: 65: FOR EACH hTmp IN hUsers66: ? 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 := 432179: 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 hUsers89: 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 hUsers102: 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: RETURNAo compilar o código Harbour e …
executá-lo,
obteremos os seguintes resultados:
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
Hehehe.... Lee, esse post ja deu ideia para uma nova ideia... Mais tarde falamos! Abraço
ResponderExcluirNaldo, como funciona o retorno do GetUsers ??
ResponderExcluireu 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
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:
Excluir47: 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;
Um exemplo "hipotético" no delphi (apenas para entendimento)
Excluirvar 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;
Naldo, mais uma pergunta...
ExcluirUsei 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.
Naldo, blz,
ResponderExcluircomo 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
Naldo, blz,
ResponderExcluircomo 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
Carlos, mande o código para mail@blacktdn.com.br. Facilitará o nosso entendimento e a resposta ser-lhe-a enviada.
ExcluirNaldo, 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...
ResponderExcluirag@alexandre-goncalves.com
www.alexandre-goncalves.com
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.
ExcluirEstou usando Delphi e vi acima alguns questinoamentos seus.
Se for possível poderia me enviar um exemplo no delphi?
Obrigado,
Tadeu.
Alexandre, poderia me passar por e-mail o aplicativo?
ExcluirMeu e-mail é tadeu.jitsu50@gmail.com
Obrigado,
Tadeu.