26.03.2012, 08:56 | #1 |
Участник
|
В поле BuildNum таблицы SysUserLog (Журнал работы пользователей) пишется версия не клиента а сервера
На днях понадобилось мне сделать запрос для определения версий клиентов, с которых пользователи заходят в систему. Посмотрел я на таблицу SysUserLog в которой как раз ведётся протоколирование клиентских сессий, увидел там поле BuildNum, и было обрадовался - то что мне и было нужно. Но при более детальном рассмотрении оказалось, что это поле содержит не клиентский номер версии, а северный.
Для определения номера версии используется метод xInfo::buildNo(), но вызывается этот код из табличного метода SysUserLog.insert(), выполняющегося на сервере. Ляп? Для определения номера именно клентской версии необходимо вызвать тот же xInfo::buildNo() но на клиентской стороне. Для этого необходимо использовать директиву client в описании метода. Я сделал так: X++: // KSM client void initClientBuildNum() { this.ClientBuildNum = xInfo::buildNo(); } X++: public void insert() { xSession xSession = new xSession(); this.Computername = xSession.clientComputerName(); this.ClientType = xSession.clientKind(); this.SessionId = xSession.sessionId(); this.BuildNum = xInfo::buildNo(); this.initClientBuildNum(); // KSM new OverwriteSystemfieldsPermission().assert(); this.overwriteSystemfields(true); this.(fieldnum(SysUserLog, CreatedDateTime)) = xSession.loginDateTime(); super(); CodeAccessPermission::revertAssert(); this.overwriteSystemfields(false); } |
|
26.03.2012, 09:46 | #2 |
Участник
|
У нас в Axapta 3 insert на SysUserLog тоже изменен:
X++: public void insert() { xSession xSession = new xSession(); this.computername = xSession.clientComputerName(); this.clientType = xSession.clientKind(); this.sessionId = xSession.sessionId(); //Изменено--> if (xSession.clientKind() == ClientType::Client || xSession.clientKind() == ClientType::COMObject) this.BuildNum = SysUserLog::getClientBuildNo(); else this.BuildNum = xInfo::buildNo(); //Изменено<-- // this.buildNum = xInfo::buildNo(); this.overwriteSystemfields(true); this.(fieldNum(SysUserlog, createdDate)) = xSession.loginDate(); this.(fieldNum(SysUserlog, createdTime)) = xSession.loginTime(); super(); } X++: public client static str getClientBuildNo() { return xInfo::buildNo(); }
__________________
С уважением, Александр. Последний раз редактировалось samolalex; 26.03.2012 в 09:52. |
|
|
За это сообщение автора поблагодарили: S.Kuskov (5). |
28.03.2012, 13:27 | #3 |
Британский учённый
|
В 2009 пофиксили:
\Data Dictionary\Tables\SysUserLog\Methods\insert X++: if(this.ClientType == ClientType::Client ) this.BuildNum = SysUserLog::getClientBuildNo(); else this.BuildNum = xInfo::buildNo();
__________________
Людям физического труда для восстановления своих сил нужен 7-8 часовой ночной сон. Людям умственного труда нужно спать часов 9-10. Ну а программистов будить нельзя вообще. |
|
|
За это сообщение автора поблагодарили: S.Kuskov (2). |