Скрипты
Разработка

Как выполняется фильтрация записей по выбранной группе

Как выполняется фильтрация записей по выбранной группе?

У меня стоит задача по заданному названию группы выводить все продукты и отдельно их аналоги, которые входят в эту группу.
Сейчас пытаюсь эту всю цепочку развернуть, проследить в администраторе, но чувствую это может надолго затянуться.
Подскажите, пожалуйста, где можно посмотреть пример скрипта.

Нравится

6 комментариев

Если Вы имеете ввиду динамические или статические группы из дерева групп раздела, то при переходе на первые Вы можете увидеть в фильтрах условия, которым отвечают продукты, отображаемые в этот момент, а вхождение продуктов в статические группы определяется наличием записи с соответствующей группой на детали "Группы" у данной записи.

"Раловец Ольга" написал:при переходе на первые Вы можете увидеть в фильтрах условия, которым отвечают продукты, отображаемые в этот момент

Как мне из скрипта по названию динамической группы отфильтровать датасет со списком продуктов?

Создаем фильтербилдер контрол (FBC)и два датасетлинка. Пишем один в FBC.DatasetLink и в качестве датасета указываем ему фильтруемый датасет. Второй в FBC.FilterDataset. В него прописываем датасет групп. FBC.FilterDataFieldName = 'FilterData'.
Отфильтровываем датасет групп по имени.

После этого делаем
[javascript]
FBC.Load();
FBC.ApplyFilter();
[/javascript]

Как-то так. Посмотрите wnd_BaseWorkspace и scr_BaseWorkspace, там все есть.

В скрипте wnd_CampaignAudienceGridAreaScript можете посмотреть пример, как после выбора динамической группы контрагентов, например, входящие в эту группу записи попадают на деталь "Целевая аудитория". В условии if (GroupDataset.Values('IsFiltered') != 0) обрабатываются динамические группы.

Я так думаю, здесь нужно обратить внимание на бизнес логику. То есть, аналоги не обязательно должны входить в группу - аналоги должны быть аналогами к продуктам.

Я бы вам посоветовал сделать инклуд фильтр, отталкиваясь от отображаемых в основном реестре продуктов.
Подозрение такое, что делается для интернет магазина :)

Спасибо, Underscore a.k.a. _ и Ольга. Ваши ответы мне помогли. Сейчас я сделал, чтобы фильтровались динамические группы, осталось сделать статические.

"Глова Сергей" написал:То есть, аналоги не обязательно должны входить в группу - аналоги должны быть аналогами к продуктам.

В моем случае аналоги должны обязательно входить в указанную группу, то есть чтобы была возможность накладывать фильтр по группе на продукты и аналоги отдельно.

"Глова Сергей" написал:Подозрение такое, что делается для интернет магазина :)

Нет, это не связано с интернет-магазином. Но связано с продажами :)

Вот что у меня сейчас получилось:
Функция создает фильтер билдер для фильтрации продуктов
[javascript]
function GetOfferingFilterBilder() {
if (!Assigned(scr_OfferingSelection.OfferingFilterBilder)){
var FilterBuilder = System.CreateObject('TSObjectLibrary.FiltersBuilder');
scr_OfferingSelection.OfferingFilterBilder = FilterBuilder;
var Dataset = dlOffering.Dataset;
FilterBuilder.Dataset = Dataset;
FilterBuilder.FilterDataFieldName = 'FilterData';
}
return scr_OfferingSelection.OfferingFilterBilder;
}
[/javascript]

Функция возвращает датасет "Группы продуктов" отфильтрованный по названию заданной группы
[javascript]
function GetGroupOfferingDataset(GroupName){
if (!Assigned(scr_OfferingSelection.GroupDataset)) {
var Dataset = GetSingleItemByCode('ds_OfferingGroup');
scr_OfferingSelection.GroupDataset = Dataset;
} else {
var Dataset = scr_OfferingSelection.GroupDataset;
}
Dataset.Close(); EnableDatasetFilters(Dataset,false,'GroupName');
if (!IsEmpty(GroupName)) {
ApplyDatasetFilter(Dataset, 'GroupName', GroupName, true);
}
Dataset.Open();
return Dataset;
}
[/javascript]

Функция применяет фильтр по полю "Группа товара" на датасет "Продукты"
[javascript]
function FilterOfferingByGroup(GroupName) {
if (IsEmpty(GroupName)) {
GroupName = EmptyStr;
}
// Получаем датасет "Группа продуктов" отфильтрованный по заданному ID группы
var GroupDataset = GetGroupOfferingDataset(GroupName);
// Получаем признак динамичной (IsFiltered = 1) или статичной (IsFiltered = 0)
// группы
IsFiltered = CurrentGroupIsFiltered(GroupDataset);
// Получаем наш FilterBuilder
var FilterBuilder = GetOfferingFilterBilder();
if (!Assigned(FilterBuilder.FilterDataset)) {
FilterBuilder.FilterDataset = GroupDataset;
}
if (IsFiltered) { // Если группа является динамичной
FilterBuilder.Load();
FilterBuilder.ApplyFilter();
} else { // Если группа является статической
if (scr_OfferingSelection.LastGroupIsFiltered) {
FilterBuilder.ClearFilter();
}
// Здесь необходимо реализовать фильтрацию по статич. группе
}
// Какой фильтр использовать
FilterBuilder.UseDummyFilter = IsFiltered;
scr_OfferingSelection.LastGroupIsFiltered = IsFiltered;
}
[/javascript]

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