Доброго времени суток!
Возможно ли присоединить схему по обратным связям к схему, которая в свою очередь тоже была присоединена по обратным связям?
К примеру: необходимо отфильтровать справочное поле Контакт, и вывести туда все контакты, входящие в определенную группу пользователей. Т.е. присоединить SysAdminUnit, а к ней SysUserInRole.
Конечно можно вместо справочника Контакт использовать Объект администрирования, и проблема отпадет. Данная фильтрация приведена для примера. Интересует возможность построения таких связей.

Нравится

2 комментария

Здравствуйте, Олег.

Предложенным Вами способом решить данную задачу не получится. Вот здесь Вы можете посмотреть решение похожей задачи.

Спасибо

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

Добрый день!
Пример с использованием обратных связей
var servicePact = this.get("ServicePact");
if (!servicePact) {
return;
}
var filtersCollection = this.Terrasoft.createFilterGroup();
filtersCollection.add("ServiceItemByServicePactFilter", this.Terrasoft.createColumnFilterWithParameter(this.Terrasoft.ComparisonType.EQUAL,
"[ServiceInServicePact:ServiceItem].ServicePact", servicePact.value));

return filtersCollection;

выполняет следующий запрос
select * from ServiceItem
where exists(select * from ServiceInServicePact
where ServiceInServicePact.ServiceItemID = ServiceItem.ID and
ServiceInServicePact.ServicePactID = @value)

т.е. показываются только те сервисы, которые есть в этом сервисном договоре.

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

select * from ServiceCategory
where exists(select * from ServiceInServicePact
inner join ServiceItem on ServiceInServicePact.ServiceItemID=ServiceItem.ID
where ServiceItem.CategoryID = ServiceCategory.ID and
ServiceInServicePact.ServicePactID = @value)

Нравится

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

Попробовала такой вариант для вышеописанного запроса

var esq = this.Ext.create("Terrasoft.EntitySchemaQuery", {rootSchemaName: "ServiceCategory"});
esq.addColumn("Id");
esq.filters.add("servicePactAndCategoryFilter", this.getServiceCategoryFilters());

где
getServiceCategoryFilters: function() {
var servicePact = this.get("ServicePact");
if (!servicePact) {
return;
}
var filtersCollection = this.Terrasoft.createFilterGroup();
filtersCollection.add("ServiceCategoryByServicePactFilter", this.Terrasoft.createColumnFilterWithParameter(this.Terrasoft.ComparisonType.EQUAL, "[ServiceInServicePact.ServiceItem:ServiceCategory].ServicePact", servicePact.value));
return filtersCollection;

но такой вариант не работает.

Интересует - насколько корректна конструкция ? filtersCollection.add("ServiceCategoryByServicePactFilter", this.Terrasoft.createColumnFilterWithParameter(this.Terrasoft.ComparisonType.EQUAL, "[ServiceInServicePact.ServiceItem:ServiceCategory].ServicePact", servicePact.value));

Аналогична ли она условию в запросе
select * from ServiceCategory
where exists(select * from ServiceInServicePact
inner join ServiceItem on ServiceInServicePact.ServiceItemID=ServiceItem.ID
where ServiceItem.CategoryID = ServiceCategory.ID and
ServiceInServicePact.ServicePactID = @value) ?

Если такая конструкция неверна, то каким образом можно использовать прямые связи в обратных для получения подобного запроса?

Добрый день, Дарья!

Данная логика является специфичной и у нас нет примеров реализации данного функционала, но вероятнее всего в фильтре, который Вы пытаетесь построить должна быть колонка «[ServiceItem:Category].[ServiceInServicePact: ServiceItem].ServicePact».

Спасибо, Елена!
Думаю, это то, что нужно
Итак, фильтр на объект ServiceCategory
«[ServiceItem:Category].[ServiceInServicePact: ServiceItem].ServicePact».

Насколько я поняла, этот фильтр дает такой запрос
select * from ServiceCategory
where exists (select * from ServiceItem
where ServiceItem.CategoryID= ServiceCategory.ID
and exists (select * from ServiceInServicePact
where ServiceInServicePact.ServiceItemId = ServiceItem.ID
and ServiceInServicePact.ServicePactId = @value))

что в общем-то накладывает необходимое условие.

Елена, скажите, пожалуйста, я правильно поняла действие этого условия
[ServiceItem:Category].[ServiceInServicePact: ServiceItem].ServicePact ?

Не могли бы вы пояснить, какой в результате фильтр в терминах sql накладывается на ServiceCategory,
если применить условие
[ServiceItem:Category].[ServiceInServicePact: ServiceItem].ServicePact

Да, Елена, проверила!
Это условие действительно то самое.
Спасибо!

Всегда рада помочь:)

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