Добрый день!
Подскажите, пожалуйста, как правильно обратиться к результату выполнения запроса с использованием прямых связей.
Вот такой пример

есть объект сервис, берем из него в запросе контрагента владельца сервиса,
и значение контрагента получаем и записываем.

var serviceItem = this.get("ServiceItem");
if (!serviceItem) {
return;
}
var select = this.Ext.create("Terrasoft.EntitySchemaQuery", {
rootSchemaName: "ServiceItem"
});
select.addColumn("Owner.Account");
select.filters.add("ServiceItemIdFilter",
select.createColumnFilterWithParameter(
this.Terrasoft.ComparisonType.EQUAL, "Id", serviceItem.value));
select.getEntityCollection(function(result) {
if (result.success && result.collection.getCount()) {
var entity = result.collection.getByIndex(0);

this.set("UsrColumn", entity.values.Owner.Account);

}
}, this);

Вопрос - как правильно получить здесь значение контрагента ответственного в последней строке?
Такой способ неправильный entity.values.Owner.Account...

Если бы в select получили бы просто select.addColumn("Owner"),
то обратиться можно было бы entity.values.Owner
А как правильно обращаться в случае более сложного селекта select.addColumn("Owner.Account")?
Подскажите, пожалуйста
entity.values.Owner

Нравится

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

Можно добавить колонку в select следующим образом:

select.addColumn("Owner.Account","OwnerAccount");

И затем получить ее по заданному имени:

this.set("UsrColumn", entity.get("OwnerAccount"));

спасибо

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

Добрый день!
Пример с использованием обратных связей
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

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

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

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