Показать сообщение отдельно
Старый 26.03.2012, 08:56   #1  
S.Kuskov is offline
S.Kuskov
Участник
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
 
3,443 / 1781 (66) ++++++++
Регистрация: 28.04.2007
Адрес: Калуга
В поле 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);
}