Цитата:
Сообщение от
userax2009
Обьясните пожалуйста более подробней как это сделать
Например, так
X++:
public boolean selectControl(FormControl _control)
{
#GRD_sysDataBaseLogFixStack4Button // GRD_sysDataBaseLogfixStack_pkoz // pkoz 19.05.2011
boolean ret;
;
// GRD_sysDataBaseLogfixStack_pkoz // pkoz 19.05.2011 -->
// if (GRD_isPkoz())
{
//mes = strFMT("%1 : %2", Element.name(), _control.name());
//info::messageWinAddLine(mes);
// info::messageWinAddLine( strFMT("%1 : %2 : %3", Element.name(), _control.name(), ret));
/*
info::messageWinAddLine( strFMT("%1 : %2 : %3 : %4",
this ? this.name() : "",
_control ? _control.name() : "",
ret,
classid2Name(_control ? _control.handle() : 0)
));
*/
if (_control)
{
switch (_control.handle())
{
case classNum(FormButtonControl) : // button
case classNum(FormCommandButtonControl) : // commandButton
case classNum(FormFunctionButtonControl) : // menuItem
case classNum(FormMenuButtonControl) : // MenuButton
if (infolog)
{
infolog.globalCache().set(#GRD_FixStack4Button, #GRD_FixStack4ButtonMainKey, [
this ? this.name() : "",
_control ? _control.name() : "",
_control ? _control.id() : 0,
ret
]);
}
break;
}
}
}
// GRD_sysDataBaseLogfixStack_pkoz // pkoz 19.05.2011 <--
ret = super(_control);
return ret;
}
Это цитата из нашего кода. Он проверяет, что тип выбранного контрола - кнопка, запоминаем информацию о нем в глобальном кеше. А затем хитрым образом прокидывает её на сервер в начале транзакции (и при наличии еще ряда оптимизаций, минимизирующих клиент серверный трафик) и там уже использует при записи в SysDatabaseLog - ставит в стек вызовов имя кнопки и формы с которого он начинался. Естественно мы сохраняем стек вызовов в SysDataBaseLog ( в отличие от стандартного приложения)