Вопрос

Добавление колонки в виде подзапроса

Нужно сделать следующий запрос на стороне клиента:

select id, Name, (select top(1) pp.Price from ProductPrice pp where pp.ProductId = Product.Id and pp.TypeId = 'xxxxxxx') from Product

На стороне сервера нашел как: https://academy.terrasoft.ua/documents/technic-sdk/7-13/dobavlenie-kolonok-v-zapros-metod-addcolumn

Как сделать этот запрос на клиенте?

Нравится

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

Здравствуйте, вам нужно смотреть в сторону Terrasoft.SubQueryExpression

https://academy.terrasoft.ua/jscoresdk/?partner=sibis#!/api/Terrasoft.d…

Поищите в конфигурации примеры по "SubQueryExpression"

Сортировку можно применить как к обычной колонке. И добавить необходимые фильтры.

Простите, описание съезжает в приложение кода)

/**
 * Добавляет в запрос колонку имени схемы.
 * @protected
 * @virtual
 * @param {Terrasoft.EntitySchemaQuery} esq Объект запроса.
 * @param {String} columnPath Путь к колонке.
 * @param {String} columnAlias Псевдоним колонки.
 */
 
addSchemaNameColumn: function(esq, columnPath, columnAlias) {
	var expressionConfig = {
		columnPath: columnPath,
		parentCollection: this,
		aggregationType: Terrasoft.AggregationType.NONE
	};
	var column = Ext.create("Terrasoft.SubQueryExpression", expressionConfig);
	var filter = Terrasoft.createColumnFilterWithParameter(
		Terrasoft.ComparisonType.EQUAL,
		"SysWorkspace",
		Terrasoft.SysValue.CURRENT_WORKSPACE.value
	);
	column.subFilters.addItem(filter);
	var esqColumn = esq.addColumn(columnAlias);
	esqColumn.expression = column;
}

 

Можно реализовать запрос в запросе, то есть сначала получить select id, Name from Product, а потом в функции обработки результата выборки для каждой записи вызывать select top(1) pp.Price from ProductPrice pp where pp.ProductId = Product.Id and pp.TypeId = 'xxxxxxx'.

С точки зрения нагрузки на базу данных будет тоже, что и select id, Name, (select top(1) pp.Price from ProductPrice pp where pp.ProductId = Product.Id and pp.TypeId = 'xxxxxxx') from Product

Алла Савельева,

К сожалению так нельзя. Изначально идет запрос на выборку всех продуктов. И мне нужно выбрать поля продукта и одну из цен на детальке цен продуктов

Для клиента это выглядит так

Получилось сделать так:

esq.addAggregationSchemaColumn("[WisPriceInRegion:WisProduct].WisCostDelivery",
          Terrasoft.AggregationType.MIN, "Price", Terrasoft.AggregationEvalType.ALL);
var esqFirstFilter = esq.createColumnFilterWithParameter(Terrasoft.ComparisonType.EQUAL,
        "[WisPriceInRegion:WisProduct].WisDistrict", this.get("WisDistrict").value);
esq.filters.add("esqFirstFilter", esqFirstFilter);

Но все же нужно сделать сортировку по дате создания и выбирать топ(1)

Здравствуйте, вам нужно смотреть в сторону Terrasoft.SubQueryExpression

https://academy.terrasoft.ua/jscoresdk/?partner=sibis#!/api/Terrasoft.d…

Поищите в конфигурации примеры по "SubQueryExpression"

Сортировку можно применить как к обычной колонке. И добавить необходимые фильтры.

Простите, описание съезжает в приложение кода)

/**
 * Добавляет в запрос колонку имени схемы.
 * @protected
 * @virtual
 * @param {Terrasoft.EntitySchemaQuery} esq Объект запроса.
 * @param {String} columnPath Путь к колонке.
 * @param {String} columnAlias Псевдоним колонки.
 */
 
addSchemaNameColumn: function(esq, columnPath, columnAlias) {
	var expressionConfig = {
		columnPath: columnPath,
		parentCollection: this,
		aggregationType: Terrasoft.AggregationType.NONE
	};
	var column = Ext.create("Terrasoft.SubQueryExpression", expressionConfig);
	var filter = Terrasoft.createColumnFilterWithParameter(
		Terrasoft.ComparisonType.EQUAL,
		"SysWorkspace",
		Terrasoft.SysValue.CURRENT_WORKSPACE.value
	);
	column.subFilters.addItem(filter);
	var esqColumn = esq.addColumn(columnAlias);
	esqColumn.expression = column;
}

 

Пащенко Александр Сергеевич,

Вот это было круто, спс

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