Добрый день!
Подскажите, пожалуйста, каким образом я могу создать фильтр для подсчета уникальных записей.
Получилось создать только фильтр, который считает все записи и фильтр, который выводит id уникальных записей. А то, что нужно не получается :(
Вот запрос, по которому нужен фильтр:
SELECT COUNT(*) FROM (SELECT DISTINCT ScreenID FROM
(select * from dbo.tbl_Shows where (DealID = :DealID) ) a) a;
Заранее благодарю!
Нравится
Вы можете использовать "итоги" в в любом реестре. Для подсчета количества записей в реестре подходит Ваш фильтр(который выводит id уникальных записей) с включенным итогом (по количеству) на одном из полей реестра.
Используйте свойство RecordsCount набора данных(Dataset). Как вариант, опишите задачу полностью, может есть простое решение :)
И к датасету не привязан фильтр.
Задача такова:
в Сделке необходимо посчитать количество уникальных продуктов. И в зависимости от полученного числа применить определенную скидку.
Я знаю, как можно вызвать фильтр из скрипта, проблема состоит только в создании этого фильтра.
Не очень хочется заморачиваться с ADO или писать цикл в коде.
А Select distinct ScreenID from ххх - Вам не подходит?
Насколько я понял, то "продукты в сделке" являются деталью. Поскольку в зависимости от полученного числа уникальных продуктов будет зависеть скидка, то именно бизнес логика должна определять метод, с помощью которого Вы будете вычислять значение этого поля.
Попробую догадаться..
Приведу простой пример:
1. Изменение количества продуктов в сделке: отказ от продукта, добавление нового и т.д.
2. Утверждение скидки менеджером: вероятнее всего скидка должна быть утверждена (а то я возьму у Вас по карандашу и ручке каждого вида и получу неправомерную скидку).
Варианты как можно решить Вашу задачу:
1. Триггер на таблице "продукты в сделке", который записывает нужное количество в таблицу "сделок".
2. Вычисляемое поле в наборе данных (датасете) сделки.
3. ExecuteCustomSQL - есть в комьюнити описание как выполнять любой запрос с параметрами.
4. Функция (вызывается по кнопке "Пересчитать" в карточке сделки), которая вычисляет данное поле.
Необязательно использовать ExecuteCustomSQL :)
Может Вам проще будет использовать такую конструкцию:
Создайте 2 сервиса: запрос (sq) и датасет(ds)c одним полем "ScreenID".
Запрос "Select distinct ScreenID from ххх" с фильтром по заказу.
теперь
var ds = Services.GetNewItemByUSI('ds');
ApplyDatasetFilter(ds, '[название ID заказа]', [значение ID заказа],true);
ds.Open();
var Count = ds.RecordsCount;
Мы получили количество уникальных продуктов.
Такое значение можно присваивать вычисляемому полю заказа, а можно и писать в таблицу (чтобы отслеживать изменения и запускать пересчет скидки)
Сергей, сделала почти так же, как вы описали, но без создания сервиса ds
результатом фильтрации sq_ScreensCount является набор записей с уникальными id
var SelectQuery = Services.GetNewItemByUSI('sq_ScreensCount');
SetParameterValue(SelectQuery.Parameters, 'DealID', DealID);
var ScreenCountDataset = SelectQuery.Open();
var ScreensCount = ScreenCountDataset.RecordsCount;
ScreenCountDataset.Close();
Всем огромное спасибо за помощь!