|  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). | |
|  | 
| Опции темы | Поиск в этой теме | 
| Опции просмотра | |
| 
 |