Добрый день!

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

Вот запрос, по которому нужен фильтр:

SELECT COUNT(*) FROM (SELECT DISTINCT ScreenID FROM
(select * from dbo.tbl_Shows where (DealID = :DealID) ) a) a;

Заранее благодарю!

Нравится

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

Вы можете использовать "итоги" в в любом реестре. Для подсчета количества записей в реестре подходит Ваш фильтр(который выводит id уникальных записей) с включенным итогом (по количеству) на одном из полей реестра.

мне необходимо использовать результат запроса в скрипте

Используйте свойство RecordsCount набора данных(Dataset). Как вариант, опишите задачу полностью, может есть простое решение :)

И к датасету не привязан фильтр.

Задача такова:
в Сделке необходимо посчитать количество уникальных продуктов. И в зависимости от полученного числа применить определенную скидку.

Я знаю, как можно вызвать фильтр из скрипта, проблема состоит только в создании этого фильтра.
Не очень хочется заморачиваться с ADO или писать цикл в коде.

А Select distinct ScreenID from ххх - Вам не подходит?

Насколько я понял, то "продукты в сделке" являются деталью. Поскольку в зависимости от полученного числа уникальных продуктов будет зависеть скидка, то именно бизнес логика должна определять метод, с помощью которого Вы будете вычислять значение этого поля.
Попробую догадаться..
Приведу простой пример:
1. Изменение количества продуктов в сделке: отказ от продукта, добавление нового и т.д.
2. Утверждение скидки менеджером: вероятнее всего скидка должна быть утверждена (а то я возьму у Вас по карандашу и ручке каждого вида и получу неправомерную скидку).

Варианты как можно решить Вашу задачу:
1. Триггер на таблице "продукты в сделке", который записывает нужное количество в таблицу "сделок".
2. Вычисляемое поле в наборе данных (датасете) сделки.
3. ExecuteCustomSQL - есть в комьюнити описание как выполнять любой запрос с параметрами.
4. Функция (вызывается по кнопке "Пересчитать" в карточке сделки), которая вычисляет данное поле.

Спасибо, Сергей
Я думала, что смогу уйти от этого ExecuteCustomSQL, но, видимо, все же придется его использовать.

>А Select distinct ScreenID from ххх - Вам не подходит?

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

Необязательно использовать 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();

Всем огромное спасибо за помощь!

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