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
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.