07.04.2009, 20:43 | #1 |
Участник
|
Как сделать фильтр по группе пользователей?
Есть: табличка с полем "код пользователя" и форма с гридом по ней. для простоты предположим, что кроме кода там еще всего одно строковое поле.
Нужно: сделать возможность фильтрации записей по группе пользователей. Вариант 1: сделать редактируемое поле фильтра прямо на форме - не удается сделать, т.к. не ясно какой расширенный тип данных использовать для выбора группы из выпадающего списка. Ведь таблица UserGroupInfo - системная, и в свойстах тип данных не отображается. В списке расширенных типов ничего подходящего не нашел. Косвенное подтверждение невозможности это сделать - отсутствие в интерфейсе каких-либо мест, где бы группа пользователей именно выбиралась в поле из выпадающего списка, а не перетаскивалась мышкой, как в настройке прав. Вариант 2: использовать стандартный расширенный фильтр. Для этого добавляю на форму еще 2 датасорса: sysuserinfo и usergroupinfo, но ничего не выходит. Как их нужно связать, чтобы можно было использовать стандартный фильтр? В фильтре эти датасорсы видны, только если джойнить их по inner-join, но тогда в гриде полная фигня ("размножаются" записи), а если джойнить другими способами - в расширенном фильтре этих таблиц не видно. В чем я туплю? или же действительно в принципе нельзя сделать фильтр по группе пользователей? |
|
07.04.2009, 20:52 | #2 |
Участник
|
UserGroupId
__________________
Энергия молодых и неравнодушных способна изменить мир к лучшему. |
|
07.04.2009, 20:59 | #3 |
Участник
|
Это как??? А в настройках журналов - "Личный для группы пользователей"? А в настройках журналов ГК - Одобрить? А в настройках статусов модулей в периодах - "Группа пользователей ля-ла-ля" ?
|
|
07.04.2009, 22:47 | #4 |
Участник
|
Цитата:
Сообщение от 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); Для корректной работы формы расширенного фильтра, такую же процедуру необходимо проделать в методе 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; } Добавлять новые датасорсы на существующие формы не надо. Достаточно будет сделать это стандартным способом: непосредственно в фильтре по правой кнопке мышки
__________________
Axapta v.3.0 sp5 kr2 |
|
|
За это сообщение автора поблагодарили: Zabr (2), sukhanchik (5), Logger (3), plumbum (1). |
07.04.2009, 23:48 | #5 |
Участник
|
а как же ?
X++: static void Job482(Args _args) { ; info(tableId2Name(tableNum(dataarea))); info( New dictTable(tableNum(dataarea)).name() ); info(strFMT("isSystemTable() = %1", New dictTable(tableNum(dataarea)).isSystemTable() )); } у меня результат такой Цитата:
DataArea
DataArea isSystemTable() = true |
|
08.04.2009, 09:05 | #6 |
Участник
|
Прошу прощения, уточню.
Вызов функции tableId2Name() на сервере возвращает для системных таблиц пустое значение.
__________________
Axapta v.3.0 sp5 kr2 |
|
08.04.2009, 10:08 | #7 |
Участник
|
Вопрос
Цитата:
X++: [B]server[/B] static void test() { Dictionary dictionary = new Dictionary(); Counter tableCnt = dictionary.tableCnt(); TableId tableId; DictTable dictTable; Counter i; Counter systemCnt; ; for (i=1; i <= tableCnt; i++) { tableId = dictionary.tableCnt2Id(i); dictTable = new DictTable(tableId); if (dictTable.name() != tableId2Name(tableId)) { info(strFmt("%1 %2", dictTable.name(), tableId2Name(tableId))); } } info(strFmt("done")); } |
|
08.04.2009, 10:33 | #8 |
Участник
|
Цитата:
Запихнул код в статический метод класса - выполняется гарантированно на сервере - результат тот же. X++: server static void Job482serv(Args _args =null) { str s; ; info("server :"); s = tableId2Name(tableNum(dataarea)); info(s); s = New dictTable(tableNum(dataarea)).name(); info( s ); s = strFMT("isSystemTable() = %1", New dictTable(tableNum(dataarea)).isSystemTable() ); info(s); } AndyD, попробуйте перестартовать аос. Замечено что иногда внутри аоса что-то кривится и функции tableName2Id(), fieldname2Id() перестают работать - выдают 0. По этой же причине при включенном логировании изменений в таблицах, после этой кривоты лезет ошибка тут (для приложения SP5 ) \Classes\Application\addLogFields что очень неприятно. Лечится перестартом аоса. Из-за чего возникает такая кривизна в аосе - непонятно. Есть подозрение что использование функции "Обновить АОТ" в комбинации со всевозможным сбросами кеша и вызовами \System Documentation\Classes\xSession\removeAOC (это мы так кеш аоса обновляли при обновлении без перестарта) повышает вероятность такой фигни. По крайней мере когда мы отказались от такого сброса кеша - глюк не повторялся. Последний раз редактировалось Logger; 08.04.2009 в 10:49. Причина: опечатки |
|
|
За это сообщение автора поблагодарили: AndyD (10). |
08.04.2009, 10:39 | #9 |
Участник
|
В DAX 3.0 SP5 KR2 - получаю список системных таблиц.
В DAX 3.0 SP3 (без KR) - список пустой. Где-то по дороге сломали А в четверке проверьте, там tableId2Name() работает или нет?
__________________
Axapta v.3.0 sp5 kr2 |
|
08.04.2009, 10:49 | #10 |
Участник
|
Цитата:
Сообщение от Logger
Лечится перестартом аоса.
Из-за чего возникает такая кривизна в аосе - непонятно. Есть подозрение что использование функции "Обновить АОТ" в комбинации со всевозможным сбросами кеша и вызовами \System Documentation\Classes\xSession\removeAOC (это мы так кеш аоса обновляли при обновлении без перестарта) повышает вероятность такой фигни. По крайней мере когда мы отказались от такого сброса кеша - глюк не повторялся. После рестарта заработало, хотя оптимизма не прибавило
__________________
Axapta v.3.0 sp5 kr2 |
|
08.04.2009, 10:58 | #11 |
Участник
|
|
|
08.04.2009, 11:28 | #12 |
Участник
|
в DAX 4 и 2009 код работает. Но код Job выполняется всегда на клиенте, так что для проверки лучше создать класс с серверным методом.
__________________
http://www.axdevposts.blogspot.com Пришел, уведел.... отойди, дай другому увидеть! |
|
08.04.2009, 11:40 | #13 |
Участник
|
|
|