|
06.08.2009, 18:05 | #1 |
Участник
|
Дополнительный фильтр на 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)); 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 |
Боец
|
В методе executeQuery(), непосредственно перед super() вставьте код
X++: void executeQuery() { ... info(this.query().dataSourceTable(tablenum(smmActivities)).toString()); super(); } |
|
|
За это сообщение автора поблагодарили: Dima_Dima (1). |
07.08.2009, 10:24 | #3 |
Участник
|
Спасибо за совет!
Первый (рабочий) запрос выглядит так: 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 |
Участник
|
Вопрос снят.
clearRanges() - помог. 2 DSPIC. Спасибо еще раз! . |
|
07.08.2009, 13:41 | #5 |
Боец
|
clearRanges - это хорошо, но у вас
X++: EXISTS JOIN * FROM EmplTable WHERE smmActivities.ResponsibleEmployee = EmplTable.EmplId Конктетно - трабла в строке: X++: datasourceForTeams = queryBuildDataSource.addDataSource(tablenum(emplTable)); Примерно так в общем. P.S. Когда Вы уже X++ изучите... |
|
07.08.2009, 16:09 | #6 |
Участник
|
Цитата:
К сожалению, помимо изучения Х++ приходится заниматься другими делами... а их немало. |
|
Теги |
crm, поиск, фильтр |
|
Похожие темы | ||||
Тема | Ответов | |||
Фильтр на форме InventClassifierItemSelection | 11 | |||
Фильтр на форме в гриде | 1 | |||
Фильтр на Веб форме | 3 | |||
Фильтр на форме | 5 | |||
Не работает стандартный фильтр на форме | 4 |
|