Недавно при решении одной задачи потребовалось сделать так, чтоб в зависимости от значения одного из полей фильтр в лукапном поле становился то обычным, то инвертированным (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;
}

Нравится

Поделиться

0 комментариев
Показать все комментарии