Office中国论坛/Access中国论坛

标题: 如何根据登录/退出日志,提炼出用户在线状态? [打印本页]

作者: zww3008    时间: 2011-7-6 00:39
标题: 如何根据登录/退出日志,提炼出用户在线状态?
本帖最后由 zww3008 于 2011-7-6 11:39 编辑

判断局域网上当前有哪些用户在线,一种做法是登录的用户前台使用计时器触发方式不断向后台数据库写数据标志状态来判断。但我想通过操作日志来实现。
我的系统有登录操作日志(下图),根据“用户登录”、“退出系统”(正常按退出按钮)或“关闭系统”(直接点右上角红叉退出),可以人工判断出某电脑上的某用户是否在线。但我想根据此表建立一个查询或通过代码直接反映出来,不知如何实现?
[attach]46025[/attach]

[attach]46024[/attach]



作者: zww3008    时间: 2011-7-6 11:39
补上附件。
作者: fine88888888    时间: 2011-7-6 11:40
问红尘大师吧,这个登陆系统是他做的。
作者: zww3008    时间: 2011-7-6 13:37
想到了一个方法:建一个“在线用户”表,写登录日志的同时向“在线用户”表内写入信息,退出或关闭系统时再删除该条信息,则表内保存的就是当前的在线用户。晚上试试看。
作者: aslxt    时间: 2011-7-6 21:46
查询:某个用户的最后登录时间和最后退出时间比较,最后登录时间>最后退出时间,表示在线,反之则不在线
当然得拿用户表和登录日志连接起来查询
作者: aslxt    时间: 2011-7-6 21:49
或者如果没有冗余数据的话,统计某个用户的登录次数是否等于退出次数,如果登录次数=退出次数,则不在线,否则表示该用户为在线
作者: aslxt    时间: 2011-7-6 21:53
也可以在用户表中增加一个表示用户的在线状态的字段(是/否类型就可以),用户登录的时候把该字段更新为“是”,用户退出系统的时候,把该字段更新为“否”,你要查询用户在线情况,直接查询用户表就可以了
作者: aslxt    时间: 2011-7-6 21:56
建一个在线表也可以。不建议增加一个表专门记录在线状态,特殊需要可自便。
作者: zww3008    时间: 2011-7-7 00:38
aslxt 发表于 2011-7-6 21:53
也可以在用户表中增加一个表示用户的在线状态的字段(是/否类型就可以),用户登录的时候把该字段更新为“是 ...

谢谢你的回复。不过用户表不带电脑名称信息。
新建一个在线用户表,已经实现了:
    strSQL = " INSERT INTO [在线用户](FComputerName,FUserName)" & _
                 " SELECT '" & Environ$("ComputerName") & "','" & strCurrentUserName & "'"
        CurrentDb.Execute strSQL

不过,删除该用户的代码不如如何写。下面SQL查询语句测试是可以的
DELETE 在线用户.FComputerName, 在线用户.FUserName
FROM 在线用户
WHERE (((在线用户.FComputerName)=Environ$("ComputerName")) AND ((在线用户.FUserName)=UserName()));
但不知如何以VBA代码表示,以下代码无效:
  strSQL = "DELETE  * FROM 在线用户 WHERE (((在线用户.FComputerName)=" & _
    Environ$("ComputerName") & ") AND ((在线用户.FUserName)=" & UserName() & "))"
    CurrentDb.Execute strSQL


作者: zww3008    时间: 2011-7-7 00:39
aslxt 发表于 2011-7-6 21:49
或者如果没有冗余数据的话,统计某个用户的登录次数是否等于退出次数,如果登录次数=退出次数,则不在线,否 ...

肯定有冗余数据,如网线被意外断开时...
作者: zww3008    时间: 2011-7-7 00:49
搞锭了,删除代代码:
strSQL = "DELETE  * FROM 在线用户"
strSQL = strSQL & " WHERE (((在线用户.FComputerName)=Environ$('ComputerName')) AND ((在线用户.FUserName)=UserName()));"
CurrentDb.Execute strSQL

作者: fine88888888    时间: 2011-7-7 11:40
谢谢你的回复。不过用户表不带电脑名称信息。
新建一个在线用户表,已经实现了:

如果用户在一台机已登陆,然后在另外一台机再次登陆后退出;请问该用户是在线还是不在线呢,答案是在线,但系统已显示为离线了。因为在线用户表的记录在用户退出时已删除了。所以,你这种方法不是更好的方法。
作者: zww3008    时间: 2011-7-7 23:12
本帖最后由 zww3008 于 2011-7-7 23:14 编辑
fine88888888 发表于 2011-7-7 11:40
如果用户在一台机已登陆,然后在另外一台机再次登陆后退出;请问该用户是在线还是不在线呢,答案是在线,但 ...


我删除的条件是电脑名与用户名两者都相同。你提出的要求我的方法洽洽能满足。
作者: fine88888888    时间: 2011-7-8 13:48
能发个实例参考下吗?我现在用的是更新用户在线,所以出现上面我提出的困扰。
作者: 轻风    时间: 2011-7-8 14:27
如果网线意外断线了,岂不是永远都在线了?
作者: aslxt    时间: 2011-7-8 18:37
可以在登陆时判断是否已经登陆过,如果已经登陆过还没有退出的,就让他先(强制)退出,然后再登陆
作者: zww3008    时间: 2011-7-8 23:47
轻风 发表于 2011-7-8 14:27
如果网线意外断线了,岂不是永远都在线了?

是的,这种情况如果不通过计时器写信息验证,就没办法了,不过,这不是什么大不了的事,等下次再登录/退出时,就删除了。或者增加一个删除按钮,删除自己知道的在线记录就可以了。
作者: zww3008    时间: 2011-7-8 23:51
本帖最后由 zww3008 于 2011-7-8 23:51 编辑
aslxt 发表于 2011-7-8 18:37
可以在登陆时判断是否已经登陆过,如果已经登陆过还没有退出的,就让他先(强制)退出,然后再登陆


没必要,如果登录记录还在,再次登录时重写一相同信息,也没关系啊,可以采用防止重复追加的方式写信息,最简单的方法是组合框的行来源采用分组总计,删除时是依据电脑名+登录用户名比较的方式 ,只要对上,不管多少条相同记录都一同删除。
作者: fine88888888    时间: 2011-7-9 08:46
没必要,如果登录记录还在,再次登录时重写一相同信息,也没关系啊,可以采用防止重复追加的方式写信息,最简单的方法是组合框的行来源采用分组总计,删除时是依据电脑名+登录用户名比较的方式 ,只要对上,不管多少条相同记录都一同删除。

问题是,用户在其他电脑上偶尔登陆然后掉线了,如果要显示正常的话,他还要再来那台掉线的机子上再登陆一次才行,是不是??因为你删除条件还有机器名。他在他本人的机子上永远也删除不了那条在线记录。




欢迎光临 Office中国论坛/Access中国论坛 (http://www.office-cn.net/) Powered by Discuz! X3.3