Недавно при решении одной задачи потребовалось сделать так, чтоб в зависимости от значения одного из полей фильтр в лукапном поле становился то обычным, то инвертированным (Not - то же условие). Фильтр был громоздкий, писать вторую копию того же самого ради одного слова Not казалось нецелесообразным. Достаточно было сделать что-то вроде этого:
Dataset.SelectQuery.Items(0).Filters.ItemsByCode('Название фильтра').IsNot = IsNot;
и не стоило бы об этом писать в блоге, но... ведь это лукап!
А значит в любой момент на датасет будет наложен дополнительный фильтр Like, и в SelectQuery.Items(0).Filters
знакомого нам фильтра уже не окажется, он будет размещаться в одной из подчинённых веток. Захотелось создать общее решение. В scr_DB
(3.3.2) масса отличных функций для включения и выключения фильтров, а вот для инвертирования не нашёл. Но содрал идею с тех же функций, что фильтры просто выключают-выключают. Ничего сложного, но может кому пригодится в похожей ситуации.
Добавьте в scr_DB
эти три функции. Вызывать удобно из SetNotPropertyToSelectQueryFilters(SelectQuery, IsNot, FilterCodesArray)
, а обращение точь-в-точь такое же как с функцией включения/выключения фильтров EnableSelectQueryFilters
. Существенное отличие только в том, что признак инверсии ставится лишь указанным в FilterCodesArray
фильтрам, а не всему каскаду включая родительские фильтры.
function SetNotPropertyToSelectQueryFilters(SelectQuery, IsNot, FilterCodesArray) {
//Инверсия фильтров Select Query
for (var i = 0; i SelectQuery.Count; i++) {
SetNotPropertyToFilters(SelectQuery.Items(i).Filters, IsNot, FilterCodesArray);
}
}
function SetNotPropertyToFilters(Filters, IsNot, FilterCodesArray) {
//Инверсия фильтров
if ((!Assigned(FilterCodesArray)) || IsEmptyArray(FilterCodesArray)) {
return;
} else {
for (var i = 0; i FilterCodesArray.length; i++) {
SetNotPropertyToFilter(Filters, FilterCodesArray[i], IsNot);
}
}
}
function SetNotPropertyToFilter(FiltersNode, FilterCode, IsNot) {
//Инверсия фильтра
CheckAssigned(FiltersNode, 'Filter');
if (FiltersNode.Code == FilterCode) {
FiltersNode.IsNot = IsNot;
return true;
}
var Result = false;
if (FiltersNode.FilterType == ftFilters) {
for (var i = 0; (i FiltersNode.Count) && (!Result); i++) {
Result = SetNotPropertyToFilter(FiltersNode.Items(i), FilterCode, IsNot);
}
} else
if ((Assigned(FiltersNode.TestExpression)) &&
(FiltersNode.TestExpression.ExpressionType == fetSelect)) {
SetNotPropertyToSelectQueryFilters(
FiltersNode.TestExpression.ExpressionSelectQuery, IsNot,
new Array(FilterCode));
}
return Result;
}