Вопрос

Exist-фильтр по пустой записи

Всем доброго времени суток. Версия 7.12.

По ссылке - https://community.terrasoft.ua/articles/kak-sdelat-filtraciu-pola-po-ex… - хорошая инструкция как задать фильтр для поиска всех записей объекта Account для которых в объекте AccountCommunication значение колонки SearchNumber равно searchValue.

А можно ли отфильтровать список всех записей объекта Account для которых нет ни одной записи в AccountCommunication?

NOT_EQUAL, createColumnIsNullFilter - не работают, т.к. поиск идёт среди существующих записей, а нужно найти все, кроме тех, которые существуют.

Нравится

6 комментариев
Лучший ответ

Смородинов Денис,

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

select *

from Account A

where not exists (select * from AccountCommunication AC

                    where AC.AccountId = A.Id)

Такой запрос можно построить с помощью createNotExistsFilter.

Используйте агрегатные функции, например количество для вашего фильтра, те возьмите тех контрагентов для которых средств коммуникации 0

а есть примеры использования?

Интересует только клиентская часть, т.е. ESQ-фильтр https://academy.terrasoft.ru/documents/technic-sdk/7-13/rabota-s-filtra…

Примерно так

var esq = this.Ext.create(Terrasoft.EntitySchemaQuery, {
    rootSchemaName: "Activity"
});
esq.addAggregationSchemaColumn("DurationInMinutes", Terrasoft.AggregationType.COUNT, "UniqueActivitiesCount", Terrasoft.AggregationEvalType.DISTINCT);

Подробнее олисано тут

Всё равно до конца не понимаю. Это же расчёт суммы или количества.

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

А если их тысячи?

Точно также поиск по конкретному номеру о котором вы писали будет выполнятся, и в том и в другом случае  все преобразуется в sql запрос который будет применен к вашему набору записей. 

Смородинов Денис,

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

select *

from Account A

where not exists (select * from AccountCommunication AC

                    where AC.AccountId = A.Id)

Такой запрос можно построить с помощью createNotExistsFilter.

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