Как выполняется фильтрация записей по выбранной группе
Как выполняется фильтрация записей по выбранной группе?
У меня стоит задача по заданному названию группы выводить все продукты и отдельно их аналоги, которые входят в эту группу.
Сейчас пытаюсь эту всю цепочку развернуть, проследить в администраторе, но чувствую это может надолго затянуться.
Подскажите, пожалуйста, где можно посмотреть пример скрипта.
Нравится
Если Вы имеете ввиду динамические или статические группы из дерева групп раздела, то при переходе на первые Вы можете увидеть в фильтрах условия, которым отвечают продукты, отображаемые в этот момент, а вхождение продуктов в статические группы определяется наличием записи с соответствующей группой на детали "Группы" у данной записи.
"Раловец Ольга" написал:при переходе на первые Вы можете увидеть в фильтрах условия, которым отвечают продукты, отображаемые в этот момент
Как мне из скрипта по названию динамической группы отфильтровать датасет со списком продуктов?
Создаем фильтербилдер контрол (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; }