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

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

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

Нравится

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

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

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

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

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

После этого делаем

    FBC.Load();
    FBC.ApplyFilter();

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

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

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

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

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

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

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

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

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

Вот что у меня сейчас получилось:
Функция создает фильтер билдер для фильтрации продуктов

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;
}

Функция возвращает датасет "Группы продуктов" отфильтрованный по названию заданной группы

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;
}

Функция применяет фильтр по полю "Группа товара" на датасет "Продукты"

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;
}
Показать все комментарии