Цитата:
Сообщение от
Zabr
Вариант 1: сделать редактируемое поле фильтра прямо на форме - не удается сделать, т.к. не ясно какой расширенный тип данных использовать для выбора группы из выпадающего списка. Ведь таблица UserGroupInfo - системная, и в свойстах тип данных не отображается. В списке расширенных типов ничего подходящего не нашел. Косвенное подтверждение невозможности это сделать - отсутствие в интерфейсе каких-либо мест, где бы группа пользователей именно выбиралась в поле из выпадающего списка, а не перетаскивалась мышкой, как в настройке прав.
Если бы даже такого типа и не было, то кто мешает вам создать собственный?
Цитата:
Сообщение от
Zabr
Вариант 2: использовать стандартный расширенный фильтр. Для этого добавляю на форму еще 2 датасорса: sysuserinfo и usergroupinfo, но ничего не выходит. Как их нужно связать, чтобы можно было использовать стандартный фильтр? В фильтре эти датасорсы видны, только если джойнить их по inner-join, но тогда в гриде полная фигня ("размножаются" записи), а если джойнить другими способами - в расширенном фильтре этих таблиц не видно.
Для работы расширенного фильтра с системными таблицами, придется допилить функционал
Связано это с тем, что для определения названия таблиц используется функция tableId2Name(), которая для системных возвращает пустую строку.
Собственно, допиливание заключается в замене вызова этой функции на использование DictTable, т.е.
X++:
DictTable dt;
...
dt = new DictTable(relatedTableId);
xRefTableRelation.relatedTableName = dt.name();
//вместо
//xRefTableRelation.relatedTableName = tableId2Name(relatedTableId);
Заменять надо в методе updateTableId() таблицы xRefTableRelation (где встречается tableId2Name). После этого, необходимо запустить обновление перекрестных ссылок с включенной галкой "Обновить модель данных"
Для корректной работы формы расширенного фильтра, такую же процедуру необходимо проделать в методе tableLabel() таблицы TmpSysTableField
X++:
static public LabelType tableLabel(TableId _tableId)
{
LabelType labelType = tableId2pName(_tableId);
DictTable dt;
;
if (!labelType)
{
dt = new DictTable(_tableId);
labelType = dt.name();
// labelType = tableId2Name(_tableId);
}
return labelType;
}
Вот и все.
Добавлять новые датасорсы на существующие формы не надо. Достаточно будет сделать это стандартным способом: непосредственно в фильтре по правой кнопке мышки