AXForum  
Zurück   AXForum > Microsoft Dynamics AX > DAX: Программирование
All
Kennwort vergessen?
Registrieren Forum Rules Hilfe Benutzerliste Heutige Beiträge Suchen

 
 
Themen-Optionen Thema durchsuchen Ansicht
Alt 07.04.2009, 20:43   #1  
Zabr ist offline
Zabr
Участник
Axapta Retail User
 
1.202 / 345 (14) ++++++
Registriert seit: 26.06.2002
Ort: Москва
Как сделать фильтр по группе пользователей?
Есть: табличка с полем "код пользователя" и форма с гридом по ней. для простоты предположим, что кроме кода там еще всего одно строковое поле.
Нужно: сделать возможность фильтрации записей по группе пользователей.

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

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

В чем я туплю? или же действительно в принципе нельзя сделать фильтр по группе пользователей?
Alt 07.04.2009, 20:52   #2  
miklenew ist offline
miklenew
Участник
Benutzerbild von miklenew
MCBMSS
1C
Лучший по профессии 2009
 
1.688 / 438 (18) +++++++
Registriert seit: 10.07.2006
Ort: г. Ликино-Дулёво
Zitat:
Zitat von Zabr Beitrag anzeigen
сделать редактируемое поле фильтра прямо на форме - не удается сделать, т.к. не ясно какой расширенный тип данных использовать для выбора группы из выпадающего списка.
UserGroupId
__________________
Энергия молодых и неравнодушных способна изменить мир к лучшему.
Alt 07.04.2009, 20:59   #3  
Raven Melancholic ist offline
Raven Melancholic
Участник
Benutzerbild von Raven Melancholic
Самостоятельные клиенты AX
Лучший по профессии 2015
 
2.164 / 1296 (48) ++++++++
Registriert seit: 21.03.2005
Ort: Москва-Петушки
Zitat:
Zitat von Zabr Beitrag anzeigen
Косвенное подтверждение невозможности это сделать - отсутствие в интерфейсе каких-либо мест, где бы группа пользователей именно выбиралась в поле из выпадающего списка, а не перетаскивалась мышкой, как в настройке прав.
Это как??? А в настройках журналов - "Личный для группы пользователей"? А в настройках журналов ГК - Одобрить? А в настройках статусов модулей в периодах - "Группа пользователей ля-ла-ля" ?
Alt 07.04.2009, 22:47   #4  
AndyD ist offline
AndyD
Участник
КОРУС Консалтинг
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
 
2.560 / 2494 (89) +++++++++
Registriert seit: 20.08.2005
Zitat:
Zitat von Zabr Beitrag anzeigen
Вариант 1: сделать редактируемое поле фильтра прямо на форме - не удается сделать, т.к. не ясно какой расширенный тип данных использовать для выбора группы из выпадающего списка. Ведь таблица UserGroupInfo - системная, и в свойстах тип данных не отображается. В списке расширенных типов ничего подходящего не нашел. Косвенное подтверждение невозможности это сделать - отсутствие в интерфейсе каких-либо мест, где бы группа пользователей именно выбиралась в поле из выпадающего списка, а не перетаскивалась мышкой, как в настройке прав.
Если бы даже такого типа и не было, то кто мешает вам создать собственный?

Zitat:
Zitat von Zabr Beitrag anzeigen
Вариант 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
This post has been rated by: Zabr (2), sukhanchik (5), Logger (3), plumbum (1).
Alt 07.04.2009, 23:48   #5  
Logger ist offline
Logger
Участник
Лучший по профессии 2015
Лучший по профессии 2014
 
3.996 / 3293 (117) ++++++++++
Registriert seit: 12.10.2004
Ort: Москва
Blog-Einträge: 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()
        ));

}
Для системной таблицы вернула непустую строку.
у меня результат такой
Zitat:
DataArea
DataArea
isSystemTable() = true
Alt 08.04.2009, 09:05   #6  
AndyD ist offline
AndyD
Участник
КОРУС Консалтинг
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
 
2.560 / 2494 (89) +++++++++
Registriert seit: 20.08.2005
Прошу прощения, уточню.

Вызов функции tableId2Name() на сервере возвращает для системных таблиц пустое значение.
__________________
Axapta v.3.0 sp5 kr2
Alt 08.04.2009, 10:08   #7  
SRF ist offline
SRF
Участник
MCBMSS
Axapta Retail User
 
376 / 562 (19) +++++++
Registriert seit: 08.08.2007
Blog-Einträge: 1
Вопрос
Zitat:
Zitat von AndyD Beitrag anzeigen
Прошу прощения, уточню.

Вызов функции 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"));
}
Alt 08.04.2009, 10:33   #8  
Logger ist offline
Logger
Участник
Лучший по профессии 2015
Лучший по профессии 2014
 
3.996 / 3293 (117) ++++++++++
Registriert seit: 12.10.2004
Ort: Москва
Blog-Einträge: 2
Zitat:
Zitat von AndyD Beitrag anzeigen
Прошу прощения, уточню.

Вызов функции 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
(это мы так кеш аоса обновляли при обновлении без перестарта) повышает вероятность такой фигни. По крайней мере когда мы отказались от такого сброса кеша - глюк не повторялся.

Geändert von Logger (08.04.2009 um 10:49 Uhr) Grund: опечатки
This post has been rated by: AndyD (10).
Alt 08.04.2009, 10:39   #9  
AndyD ist offline
AndyD
Участник
КОРУС Консалтинг
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
 
2.560 / 2494 (89) +++++++++
Registriert seit: 20.08.2005
В DAX 3.0 SP5 KR2 - получаю список системных таблиц.
В DAX 3.0 SP3 (без KR) - список пустой.

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

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

После рестарта заработало, хотя оптимизма не прибавило
__________________
Axapta v.3.0 sp5 kr2
Alt 08.04.2009, 10:58   #11  
Zabr ist offline
Zabr
Участник
Axapta Retail User
 
1.202 / 345 (14) ++++++
Registriert seit: 26.06.2002
Ort: Москва
Zitat:
Zitat von AndyD Beitrag anzeigen
В DAX 3.0 SP5 KR2 - получаю список системных таблиц.
В DAX 3.0 SP3 (без KR) - список пустой.

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

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

Джобик Logger'a выдает:
Code:
server :
DataArea
DataArea
isSystemTable() = true
Alt 08.04.2009, 11:28   #12  
plumbum ist offline
plumbum
Участник
Соотечественники
 
182 / 86 (3) ++++
Registriert seit: 07.12.2007
Ort: Vienna, AT
Zitat:
Zitat von AndyD Beitrag anzeigen
В DAX 3.0 SP5 KR2 - получаю список системных таблиц.
В DAX 3.0 SP3 (без KR) - список пустой.

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

А в четверке проверьте, там tableId2Name() работает или нет?
в DAX 4 и 2009 код работает. Но код Job выполняется всегда на клиенте, так что для проверки лучше создать класс с серверным методом.
__________________
http://www.axdevposts.blogspot.com
Пришел, уведел.... отойди, дай другому увидеть!
Alt 08.04.2009, 11:40   #13  
Logger ist offline
Logger
Участник
Лучший по профессии 2015
Лучший по профессии 2014
 
3.996 / 3293 (117) ++++++++++
Registriert seit: 12.10.2004
Ort: Москва
Blog-Einträge: 2
Zitat:
Zitat von plumbum Beitrag anzeigen
в DAX 4 и 2009 код работает. Но код Job выполняется всегда на клиенте, так что для проверки лучше создать класс с серверным методом.
Ага, или через менюитем джоб запускать.
Stichworte
aos, баг, законченный пример, поле, программно, тип данных

 

Ähnliche Themen
Thema Autor Forum Antworten Letzter Beitrag
Заумный отчет по ОС, как сделать? Бриллиантик 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

Forumregeln
Es ist Ihnen nicht erlaubt, neue Themen zu verfassen.
Es ist Ihnen nicht erlaubt, auf Beiträge zu antworten.
Es ist Ihnen nicht erlaubt, Anhänge hochzuladen.
Es ist Ihnen nicht erlaubt, Ihre Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Gehe zu

Рейтинг@Mail.ru
Alle Zeitangaben in WEZ +3. Es ist jetzt 19:38 Uhr.
Powered by vBulletin® Version 3.8.5 (Deutsch)
Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.