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

 
 
Опции темы Поиск в этой теме Опции просмотра
Старый 06.08.2009, 18:05   #1  
Dima_Dima is offline
Dima_Dima
Участник
 
144 / 11 (1) +
Регистрация: 09.10.2008
Дополнительный фильтр на smmActiviies форме.
Добрый день.

Такой вопрос:

Сделал дополнительный фильтр на форме smmActivities --> TeamFilter. Смысл, показывать задания только тех работников, которые принадлежат к выбранной команде.

Работает, но почему-то только один раз. Если я выбираю другую команду или удаляю запись в фильтре, вижу пустой Grid.

Изменения в setupRanges на smmactivities_ds выглядит следующим способом:
X++:
datasourceForTeams      = queryBuildDataSource.addDataSource(tablenum(emplTable));
    datasourceForTeams.relations(true);
    datasourceForTeams.joinMode(JoinMode::ExistsJoin);
.
.
.
rangeForTeams           = SysQuery::findOrCreateRange(datasourceForTeams, fieldnum(emplTable, DispatchTeamId));
Изменения в методе executeQuery():

X++:
// If activities are not filtered on any employee
    if (!emplFilter && !teamFilter)
    {
        // Enable/disable ranges
        rangeForEmployee.enabled(false);
        rangeForPrivate.enabled(false);
        rangeForTeams.enabled(false);
        rangeRecId.enabled(true);
        // To show private and non-private activities for current employee AND non-private acitvities for other employees
        qStr = strfmt('((%1 == "%2") || ((%1 != "%2") && (%3 != %4)))', fieldstr(smmActivities, ResponsibleEmployee), smmUtility::getCurrentContact(), fieldstr(smmActivities,Sensitivity), enum2int(smmSensitivity::Privat));
        rangeRecId.value(qStr);
    }
    // If activities are filtered on any employee
    else if(emplFilter && !teamFilter)
    {
        // Enable/disable ranges
        rangeForEmployee.enabled(true);
        rangeForPrivate.enabled(true);
        rangeRecId.enabled(false);
        rangeForTeams.enabled(false);

        // Set value for filter on employee
        rangeForEmployee.value(emplFilter);

        // Private activities will be only visible to owner of activities
        if (emplFilter != smmUtility::getCurrentContact())
        {
            rangeForPrivate.value(queryValue(!smmSensitivity::Privat));
        }
        else
        {
            rangeForPrivate.value(SysQuery::valueUnlimited());
        }
    }
    
    else if(teamFilter && !emplFilter)
    {
        // Enable/disable ranges
        rangeForEmployee.enabled(false);
        rangeForPrivate.enabled(true);
        rangeRecId.enabled(false);
        rangeForTeams.enabled(true);
        //
        rangeForTeams.value(teamFilter);

        teamFilterAnyType = teamFilter;
        select emplTableloc where emplTableloc.DispatchTeamId == teamFilterAnyType;
        if (emplTableloc.EmplId != smmUtility::getCurrentContact())
        {
            rangeForPrivate.value(queryValue(!smmSensitivity::Privat));
        }
        else
        {
            rangeForPrivate.value(SysQuery::valueUnlimited());
        }
    }
    else if (teamFilter && emplFilter)
    {
        //Enable/disable ranges
        rangeForEmployee.enabled(true);
        rangeForPrivate.enabled(false);
        rangeRecId.enabled(false);
        rangeForTeams.enabled(true);

        //
        rangeForEmployee.value(emplFilter);
        rangeForTeams.value(teamFilter);
    }
На Контроле:

X++:
boolean modified()
{
    boolean ret;
    ;

    ret = super();

    // Set team filter
    teamFilter = teamFilterControl.text();

    // Run query again with the new filtering
    smmActivities_ds.executeQuery();
    //info(strfmt("%1", teamFilter));

    return ret;
}
Прошу совета, что я неправильно делаю.

Спасибо.
Старый 06.08.2009, 21:53   #2  
DSPIC is offline
DSPIC
Боец
 
1,077 / 1243 (44) ++++++++
Регистрация: 11.04.2008
В методе executeQuery(), непосредственно перед super() вставьте код

X++:
void executeQuery()
{
    ...
    info(this.query().dataSourceTable(tablenum(smmActivities)).toString());
    super();
}
Вы увидете результирующий запрос, по нему и ищите ошибку.
За это сообщение автора поблагодарили: Dima_Dima (1).
Старый 07.08.2009, 10:24   #3  
Dima_Dima is offline
Dima_Dima
Участник
 
144 / 11 (1) +
Регистрация: 09.10.2008
Цитата:
Сообщение от DSPIC Посмотреть сообщение
Вы увидете результирующий запрос, по нему и ищите ошибку.
Спасибо за совет!

Первый (рабочий) запрос выглядит так:

X++:
SELECT * FROM smmActivities USING INDEX SortIndex WHERE ((Category = 0)) AND ((Sensitivity = 0)) AND ((IsTemplate = 0)) 
        EXISTS JOIN * FROM EmplTable WHERE smmActivities.ResponsibleEmployee = EmplTable.EmplId 
        EXISTS JOIN * FROM EmplTable WHERE smmActivities.ResponsibleEmployee = EmplTable.EmplId 
        EXISTS JOIN * FROM EmplTable WHERE smmActivities.ResponsibleEmployee = EmplTable.EmplId 
        EXISTS JOIN * FROM EmplTable WHERE smmActivities.ResponsibleEmployee = EmplTable.EmplId AND ((DispatchTeamId = N'1 K'))
Второй (если меняю фильтр) оочень интересный:

X++:
SELECT * FROM smmActivities USING INDEX SortIndex WHERE ((Category = 0)) AND ((Sensitivity = 0)) AND ((IsTemplate = 0)) 
        EXISTS JOIN * FROM EmplTable WHERE smmActivities.ResponsibleEmployee = EmplTable.EmplId 
        EXISTS JOIN * FROM EmplTable WHERE smmActivities.ResponsibleEmployee = EmplTable.EmplId 
        EXISTS JOIN * FROM EmplTable WHERE smmActivities.ResponsibleEmployee = EmplTable.EmplId 
        EXISTS JOIN * FROM EmplTable WHERE smmActivities.ResponsibleEmployee = EmplTable.EmplId AND ((DispatchTeamId = N'1 K')) 
        EXISTS JOIN * FROM EmplTable WHERE smmActivities.ResponsibleEmployee = EmplTable.EmplId AND ((DispatchTeamId = N'2 M'))
т.е.

EXISTS JOIN * FROM EmplTable WHERE smmActivities.ResponsibleEmployee = EmplTable.EmplId AND ((DispatchTeamId = N'1 K'))

живет еще при втором запросе!!!

Есть ли способ его скинуть???
Старый 07.08.2009, 10:41   #4  
Dima_Dima is offline
Dima_Dima
Участник
 
144 / 11 (1) +
Регистрация: 09.10.2008
Вопрос снят.
clearRanges() - помог.

2 DSPIC. Спасибо еще раз!
.
Старый 07.08.2009, 13:41   #5  
DSPIC is offline
DSPIC
Боец
 
1,077 / 1243 (44) ++++++++
Регистрация: 11.04.2008
clearRanges - это хорошо, но у вас
X++:
EXISTS JOIN * FROM EmplTable WHERE smmActivities.ResponsibleEmployee = EmplTable.EmplId
цепляется столько раз, сколько раз вызывается метод setupRanges.
Конктетно - трабла в строке:
X++:
datasourceForTeams      = queryBuildDataSource.addDataSource(tablenum(emplTable));
Нужно при первом вызове сделать .addDataSource(tablenum(emplTable)), а при последующих вызовах испольльзовать .dataSourceTable(tablenum(emplTable))

Примерно так в общем.

P.S. Когда Вы уже X++ изучите...
Старый 07.08.2009, 16:09   #6  
Dima_Dima is offline
Dima_Dima
Участник
 
144 / 11 (1) +
Регистрация: 09.10.2008
Цитата:
Сообщение от DSPIC Посмотреть сообщение
Нужно при первом вызове сделать .addDataSource(tablenum(emplTable)), а при последующих вызовах испольльзовать .dataSourceTable(tablenum(emplTable))
Сделал как посоветовали, все работает.

Цитата:
Сообщение от DSPIC Посмотреть сообщение
P.S. Когда Вы уже X++ изучите...
К сожалению, помимо изучения Х++ приходится заниматься другими делами... а их немало.
Теги
crm, поиск, фильтр

 

Похожие темы
Тема Автор Раздел Ответов Посл. сообщение
Фильтр на форме InventClassifierItemSelection Andrux DAX: Программирование 11 06.05.2009 10:48
Фильтр на форме в гриде vale15 DAX: Программирование 1 18.09.2007 11:50
Фильтр на Веб форме egorych DAX: Программирование 3 21.06.2007 18:32
Фильтр на форме sah DAX: Программирование 5 10.11.2005 11:31
Не работает стандартный фильтр на форме Julietta DAX: Прочие вопросы 4 06.12.2004 13:30

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

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

Рейтинг@Mail.ru
Часовой пояс GMT +3, время: 17:21.