Funcionamento
Argow mantém a coluna ARAUSERINFO.USER_LOGGED sincronizada com a atividade no programa. Assim, quando o usuário com ARAUSERINFO.USER_ID loga na aplicação ARAUSERINFO.APPLICATION, a coluna USER_LOGGED e marcada com True (‘T’/1) e desmarcada (‘F’/0) quando termina.
Este procedimento funciona adequadamente quando o usuário não abre a mesma aplicação mais de uma vez simultaneamente e quando a fecha corretamente.
Atualização
Quando estas condições não se comprem, a coluna pode ficar dessincronizada, indicando que um usuário está logado quando em realidade não está. Para atualizar a coluna USER_LOGGED usar o seguinte comando:
Update ARAUSERINFO
Set USER_LOGGED= Case When (
Exists(
Select *
From sys.sysprocesses As Syp
Where ( Convert(varbinary(128), Ara.[USER_ID]) = Syp.[CONTEXT_INFO] ) And ( 'Argow.' + Ara.[APPLICATION] = Syp.[program_name] )
)
)
Then 'T' Else 'F' End
From ARAUSERINFO Ara
Única Instância
Para não permitir a um usuário logar simultaneamente na mesma aplicação mais de uma vez utilizar a coluna USER_LOGGED_COUNT do seguinte dataset em onStart:
Select
(Select Usr.[USER_NAME] From ARAUSER As Usr Where (Usr.[USER_ID] = Ara.[User_ID])) AS [USER_NAME]
,(Select count(*)
From sys.sysprocesses As Syp
Where ( Convert(varbinary(128), Ara.[USER_ID]) = Syp.[CONTEXT_INFO] ) And ( 'Argow.' + Ara.[APPLICATION] = Syp.[program_name])
) As USER_LOGGED_COUNT
,Ara.*
From ARAUSERINFO Ara
Trigger
No caso que deseje conhecer que é o usuário que “disparou” o trigger que esta sendo executado:
Select
(Select Usr.[USER_NAME] From ARAUSER As Usr Where (Usr.[USER_ID] = Ara.[User_ID])) As [USER_NAME]
-- ,Case When ( Syp.spid Is Null ) Then 'F' Else 'T' End As USER_LOGGED_NOW
--, Syp.spid
From ARAUSERINFO Ara
Left Outer Join
sys.sysprocesses As Syp
On
( Convert(varbinary(128), Ara.[USER_ID]) = Syp.[CONTEXT_INFO] )
And
( 'Argow.' + Ara.[APPLICATION] = Syp.[program_name])
Where ( Syp.spid = @@spid )
Requisitos
Estes comandos supõem que não tenham sido alterados os valores das colunas sys.sysprocesses.CONTEXT_INFO e sys.sysprocesses.PROGRAM_NAME atribuídos por Argow no inicio do programa.
No primeiro caso, CONTEXT_INFO, o valor atribuído é o ARAUSER.USER_ID e em PROGRAM_NAME é 'Argow.<application>' .