AXForum  
Вернуться   AXForum > Microsoft Dynamics AX > DAX: Программирование
DAX
Забыли пароль?
Зарегистрироваться Правила Справка Пользователи Сообщения за день Поиск Все разделы прочитаны

 
 
Опции темы Поиск в этой теме Опции просмотра
Старый 07.04.2009, 20:43   #1  
Zabr is offline
Zabr
Участник
Axapta Retail User
 
1,200 / 345 (14) ++++++
Регистрация: 26.06.2002
Адрес: Москва
Как сделать фильтр по группе пользователей?
Есть: табличка с полем "код пользователя" и форма с гридом по ней. для простоты предположим, что кроме кода там еще всего одно строковое поле.
Нужно: сделать возможность фильтрации записей по группе пользователей.

Вариант 1: сделать редактируемое поле фильтра прямо на форме - не удается сделать, т.к. не ясно какой расширенный тип данных использовать для выбора группы из выпадающего списка. Ведь таблица UserGroupInfo - системная, и в свойстах тип данных не отображается. В списке расширенных типов ничего подходящего не нашел. Косвенное подтверждение невозможности это сделать - отсутствие в интерфейсе каких-либо мест, где бы группа пользователей именно выбиралась в поле из выпадающего списка, а не перетаскивалась мышкой, как в настройке прав.

Вариант 2: использовать стандартный расширенный фильтр. Для этого добавляю на форму еще 2 датасорса: sysuserinfo и usergroupinfo, но ничего не выходит. Как их нужно связать, чтобы можно было использовать стандартный фильтр? В фильтре эти датасорсы видны, только если джойнить их по inner-join, но тогда в гриде полная фигня ("размножаются" записи), а если джойнить другими способами - в расширенном фильтре этих таблиц не видно.

В чем я туплю? или же действительно в принципе нельзя сделать фильтр по группе пользователей?
Старый 07.04.2009, 20:52   #2  
miklenew is offline
miklenew
Участник
Аватар для miklenew
MCBMSS
1C
Лучший по профессии 2009
 
1,688 / 433 (18) +++++++
Регистрация: 10.07.2006
Адрес: г. Ликино-Дулёво
Цитата:
Сообщение от Zabr Посмотреть сообщение
сделать редактируемое поле фильтра прямо на форме - не удается сделать, т.к. не ясно какой расширенный тип данных использовать для выбора группы из выпадающего списка.
UserGroupId
__________________
Энергия молодых и неравнодушных способна изменить мир к лучшему.
Старый 07.04.2009, 20:59   #3  
Raven Melancholic is offline
Raven Melancholic
Участник
Аватар для Raven Melancholic
Самостоятельные клиенты AX
Лучший по профессии 2015
 
2,158 / 1286 (47) ++++++++
Регистрация: 21.03.2005
Адрес: Москва-Петушки
Цитата:
Сообщение от Zabr Посмотреть сообщение
Косвенное подтверждение невозможности это сделать - отсутствие в интерфейсе каких-либо мест, где бы группа пользователей именно выбиралась в поле из выпадающего списка, а не перетаскивалась мышкой, как в настройке прав.
Это как??? А в настройках журналов - "Личный для группы пользователей"? А в настройках журналов ГК - Одобрить? А в настройках статусов модулей в периодах - "Группа пользователей ля-ла-ля" ?
Старый 07.04.2009, 22:47   #4  
AndyD is offline
AndyD
Участник
КОРУС Консалтинг
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
 
2,560 / 2476 (88) +++++++++
Регистрация: 20.08.2005
Цитата:
Сообщение от 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;
}
Вот и все.

Добавлять новые датасорсы на существующие формы не надо. Достаточно будет сделать это стандартным способом: непосредственно в фильтре по правой кнопке мышки
__________________
Axapta v.3.0 sp5 kr2
За это сообщение автора поблагодарили: Zabr (2), sukhanchik (5), Logger (3), plumbum (1).
Старый 07.04.2009, 23:48   #5  
Logger is offline
Logger
Участник
Лучший по профессии 2015
Лучший по профессии 2014
 
3,867 / 3123 (112) ++++++++++
Регистрация: 12.10.2004
Адрес: Москва
Записей в блоге: 2
а как же ?

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  
AndyD is offline
AndyD
Участник
КОРУС Консалтинг
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
 
2,560 / 2476 (88) +++++++++
Регистрация: 20.08.2005
Прошу прощения, уточню.

Вызов функции tableId2Name() на сервере возвращает для системных таблиц пустое значение.
__________________
Axapta v.3.0 sp5 kr2
Старый 08.04.2009, 10:08   #7  
SRF is offline
SRF
Участник
MCBMSS
Axapta Retail User
 
362 / 542 (19) +++++++
Регистрация: 08.08.2007
Записей в блоге: 1
Вопрос
Цитата:
Сообщение от AndyD Посмотреть сообщение
Прошу прощения, уточню.

Вызов функции tableId2Name() на сервере возвращает для системных таблиц пустое значение.
Доброго времени суток. Вызов ниже приведенного static-метода возвращает, только строку done. AX 3.0 SP 2
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  
Logger is offline
Logger
Участник
Лучший по профессии 2015
Лучший по профессии 2014
 
3,867 / 3123 (112) ++++++++++
Регистрация: 12.10.2004
Адрес: Москва
Записей в блоге: 2
Цитата:
Сообщение от AndyD Посмотреть сообщение
Прошу прощения, уточню.

Вызов функции tableId2Name() на сервере возвращает для системных таблиц пустое значение.
У меня на сервере то же самое выдает.
Запихнул код в статический метод класса - выполняется гарантированно на сервере - результат тот же.
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);

}
У меня Ax3.0 KR3

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  
AndyD is offline
AndyD
Участник
КОРУС Консалтинг
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
 
2,560 / 2476 (88) +++++++++
Регистрация: 20.08.2005
В DAX 3.0 SP5 KR2 - получаю список системных таблиц.
В DAX 3.0 SP3 (без KR) - список пустой.

Где-то по дороге сломали

А в четверке проверьте, там tableId2Name() работает или нет?
__________________
Axapta v.3.0 sp5 kr2
Старый 08.04.2009, 10:49   #10  
AndyD is offline
AndyD
Участник
КОРУС Консалтинг
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
 
2,560 / 2476 (88) +++++++++
Регистрация: 20.08.2005
Цитата:
Сообщение от Logger Посмотреть сообщение
Лечится перестартом аоса.
Из-за чего возникает такая кривизна в аосе - непонятно. Есть подозрение что использование функции "Обновить АОТ" в комбинации со всевозможным сбросами кеша и вызовами \System Documentation\Classes\xSession\removeAOC
(это мы так кеш аоса обновляли при обновлении без перестарта) повышает вероятность такой фигни. По крайней мере когда мы отказались от такого сброса кеша - глюк не повторялся.
Точно!

После рестарта заработало, хотя оптимизма не прибавило
__________________
Axapta v.3.0 sp5 kr2
Старый 08.04.2009, 10:58   #11  
Zabr is offline
Zabr
Участник
Axapta Retail User
 
1,200 / 345 (14) ++++++
Регистрация: 26.06.2002
Адрес: Москва
Цитата:
Сообщение от AndyD Посмотреть сообщение
В DAX 3.0 SP5 KR2 - получаю список системных таблиц.
В DAX 3.0 SP3 (без KR) - список пустой.

Где-то по дороге сломали

А в четверке проверьте, там tableId2Name() работает или нет?
Ax 4.0 SP2

Джобик Logger'a выдает:
Код:
server :
DataArea
DataArea
isSystemTable() = true
Старый 08.04.2009, 11:28   #12  
plumbum is offline
plumbum
Участник
Соотечественники
 
182 / 86 (3) ++++
Регистрация: 07.12.2007
Адрес: Vienna, AT
Цитата:
Сообщение от AndyD Посмотреть сообщение
В DAX 3.0 SP5 KR2 - получаю список системных таблиц.
В DAX 3.0 SP3 (без KR) - список пустой.

Где-то по дороге сломали

А в четверке проверьте, там tableId2Name() работает или нет?
в DAX 4 и 2009 код работает. Но код Job выполняется всегда на клиенте, так что для проверки лучше создать класс с серверным методом.
__________________
http://www.axdevposts.blogspot.com
Пришел, уведел.... отойди, дай другому увидеть!
Старый 08.04.2009, 11:40   #13  
Logger is offline
Logger
Участник
Лучший по профессии 2015
Лучший по профессии 2014
 
3,867 / 3123 (112) ++++++++++
Регистрация: 12.10.2004
Адрес: Москва
Записей в блоге: 2
Цитата:
Сообщение от plumbum Посмотреть сообщение
в DAX 4 и 2009 код работает. Но код Job выполняется всегда на клиенте, так что для проверки лучше создать класс с серверным методом.
Ага, или через менюитем джоб запускать.
Теги
aos, баг, законченный пример, поле, программно, тип данных

 

Похожие темы
Тема Автор Раздел Ответов Посл. сообщение
Заумный отчет по ОС, как сделать? Бриллиантик DAX: Программирование 13 09.07.2008 16:36
Как программно отправить сообщение группе пользователей demon46 DAX: Функционал 7 01.04.2008 14:57
Фильтр по номенклатурной группе listener DAX: Функционал 1 14.01.2005 17:15
Как сделать фильтр с "ИЛИ"? MIkeFW DAX: Программирование 8 19.01.2004 15:25
Настройка форм для групп пользователей Роман Кошелев DAX: Функционал 14 05.08.2002 16:32
Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск
Опции просмотра

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход

Рейтинг@Mail.ru
Часовой пояс GMT +3, время: 00:52.
Powered by vBulletin® v3.8.5. Перевод: zCarot
Контактная информация, Реклама.