|  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 | 
| Участник | |
|  |