Добрый день коллеги!
Пытаюсь написать запрос на EntitySchemaQuery
select sum( d.projektsumm )
from dpzzayvki d ,BorrowerCo c
where
d.id=c.string
and c.borrowerId='6C693A17-6447-4205-9BE5-A98C17AD4FF8'
and c.borrowerstatusId='16C3B22A-BE4A-4436-B536-9750B7273FD2'
не получается условие where (использую фильтрацию )
var accid ='6C693A17-6447-4205-9BE5-A98C17AD4FF8';
var esq = Ext.create("Terrasoft.EntitySchemaQuery", {
rootSchemaName: "DPZzayvki"});
esq.addAggregationSchemaColumn("projektsumm", Terrasoft.AggregationType.SUM,"projektsumm", Terrasoft.AggregationEvalType.ALL);
var esqFirstFilter = esq.createColumnFilterWithParameter(Terrasoft.ComparisonType.EQUAL,"BorrowerCo:borrower", accid);
esq.filters.add("esqFirstFilter", esqFirstFilter);
esq.getEntityCollection (function(result)
подскажите где допустил неточность?
Спасибо!
Нравится
Добрый день Евгений!!!
вот реализация вашего запроса на EntitySchemaQuery:
var borrowerId = "6C693A17-6447-4205-9BE5-A98C17AD4FF8"; var borrowerstatusId = "16C3B22A-BE4A-4436-B536-9750B7273FD2"; var select = this.Ext.create("Terrasoft.EntitySchemaQuery", { rootSchemaName: "dpzzayvki" }); select.addAggregationSchemaColumn("projektsumm", this.Terrasoft.AggregationType.SUM, "SumProject"); var filterGroup = new this.Terrasoft.createFilterGroup(); filterGroup.logicalOperation = this.Terrasoft.LogicalOperatorType.AND; filterGroup.add("BorrowerFilter", this.Terrasoft.createColumnFilterWithParameter( this.Terrasoft.ComparisonType.EQUAL, "[BorrowerCo:string:Id].borrower", borrowerId)); filterGroup.add("BorrowerStatusFilter", this.Terrasoft.createColumnFilterWithParameter( this.Terrasoft.ComparisonType.EQUAL, "[BorrowerCo:string:Id].borrowerstatus", borrowerstatusId)); select.filters = filterGroup;
так же рекомендую ознакомиться с документацией по разработки на платформе BPMOnline, размещенной на Академии террасофт: Документация по разработке bpm’online
"Власов Михаил Викторович" написал:Добрый день Евгений!!!
вот реализация вашего запроса на EntitySchemaQuery:
var borrowerId = "6C693A17-6447-4205-9BE5-A98C17AD4FF8";
var borrowerstatusId = "16C3B22A-BE4A-4436-B536-9750B7273FD2";
var select = this.Ext.create("Terrasoft.EntitySchemaQuery", {
rootSchemaName: "dpzzayvki"
});
select.addAggregationSchemaColumn("projektsumm", this.Terrasoft.AggregationType.SUM, "SumProject");
var filterGroup = new this.Terrasoft.createFilterGroup();
filterGroup.logicalOperation = this.Terrasoft.LogicalOperatorType.AND;
filterGroup.add("BorrowerFilter", this.Terrasoft.createColumnFilterWithParameter(
this.Terrasoft.ComparisonType.EQUAL, "[BorrowerCo:string:Id].borrower", borrowerId));
filterGroup.add("BorrowerStatusFilter", this.Terrasoft.createColumnFilterWithParameter(
this.Terrasoft.ComparisonType.EQUAL, "[BorrowerCo:string:Id].borrowerstatus", borrowerstatusId));
select.filters = filterGroup;так же рекомендую ознакомиться с документацией по разработки на платформе BPMOnline, размещенной на Академии террасофт: Документация по разработке bpm’online
Михаил спасибо!
получилось
коллеги добрый день!
В SDK не могу найти примеры как в EntitySchemaQuery описать условие IN
select name
from table1
where id in (selec id2
from table2 where ... )
есть только метод createInFilter без подробностей,
буду благодарен за конкретные работающие примеры.
Вот пример - http://www.community.terrasoft.ru/forum/topic/10254
это пример не совсем то что мне нужно, мне нужен сравнение IN
Добрый день Евгений!!!
выложите свой текст SQL запроса где применяется IN. я вам в ответ напишу запрос в EntitySchemaQuery, но и не забываем читать документацию по EntitySchemaQuery для обучения и саморазвития. вот ссылка: Использование EntitySchemaQuery для чтения данных из БД
Михали вот запрос
select sum (d.projektsumm)
from dpzzayvki d
where
d.accountId in ( select b.borrowerId
from dpzzayvki d ,BorrowerCo b
where d.id=b.STRING
and d.accountId='6C693A17-6447-4205-9BE5-A98C17AD4FF8')
спасибо
Добрый день Евгений!!!
чтобы исполнить ваш запрос с помощью EntitySchemaQuery вам потребуется его разделить на две части. Первый запрос:
select b.borrowerId from dpzzayvki d ,BorrowerCo b where d.id=b.STRING and d.accountId='6C693A17-6447-4205-9BE5-A98C17AD4FF8'
Данный запрос исполняете и сохраняете в коллекцию. И уже второй запрос который вам требуется выполнить это:
select sum (d.projektsumm) from dpzzayvki d where d.accountId in (COLLECTION)
вот при таком подходе вы сможете исполнить свой запрос с помощью EntitySchemaQuery.
Добрый день Михаил!
В таком ключе и пытался действовать, вот
var select = Ext.create("Terrasoft.EntitySchemaQuery", {
rootSchemaName: "BorrowerCo"});
select.addColumn("borrower", "borrowerID");
var selectFirstFilter = select.createColumnFilterWithParameter(Terrasoft.ComparisonType.EQUAL,"[DPZzayvki:Id:STRING].account",accid);
select.filters.add("selectFirstFilter", selectFirstFilter); Эта часть работает!!
var esq = Ext.create("Terrasoft.EntitySchemaQuery", {
rootSchemaName: "DPZzayvki"
});
esq.addAggregationSchemaColumn("projektsumm", Terrasoft.AggregationType.SUM,"projektsumm", Terrasoft.AggregationEvalType.ALL);
var esqFirstFilter = esq.createInFilter("account", select);
// Добавление созданных фильтров в коллекцию запроса.
esq.filters.add("esqFirstFilter", esqFirstFilter);
но результат никакого нет((
думаю что не верно описываю условие IN
можете подсказать где именно ошибка ?
спасибо!
Добрый день Евгений!!!
ошибка у вас в том, что вы невнимательно прочитали мое сообщение. первый запрос вы составили верно, но результат запроса нужно было поместить в "Коллекцию" значений. вот что у вас должно получиться:
var select = Ext.create("Terrasoft.EntitySchemaQuery", {rootSchemaName: "BorrowerCo"}); select.addColumn("borrower", "borrowerID"); var selectFirstFilter = select.createColumnFilterWithParameter(Terrasoft.ComparisonType.EQUAL, "[DPZzayvki:Id:STRING].account",accid); select.filters.add("selectFirstFilter", selectFirstFilter); select.getEntityCollection(function(result) { var existsCollection = []; if (result.success) { result.collection.each(function(item) { var record = item.get("borrowerID"); existsCollection.push(record.value); }, this); } // TODO: И вот здесь ниже пишем второй запрос. В который вставляем результат первого в виде коллекции var esq = Ext.create("Terrasoft.EntitySchemaQuery", {rootSchemaName: "DPZzayvki"}); esq.addAggregationSchemaColumn("projektsumm", Terrasoft.AggregationType.SUM, "projektsumm", Terrasoft.AggregationEvalType.ALL); var esqFirstFilter = this.Terrasoft.createColumnInFilterWithParameters("account", existsCollection); esq.filters.add("esqFirstFilter", esqFirstFilter); .... // TODO: И ниже уже исполняем свой основной запрос и получаем результат }, this);
вот как требовалось вам правильно сделать. Чтобы ваш запрос Евгений, состоящий из Двух частей исполнился программой.
Михаил запрос отрабатывает,
но почему то если первый запрос возвращает результат, тогда во втором сумма считается правильно,
а если в результате первого запроса пусто (записей нет), тогда второй запрос считает сумму во всех записях по всей таблице.
Почему , ведь если запустить SQL запрос прямо в базе то отрабатывает правильно.
Это особенности EntitySchemaQuery и как можно исправить этот момент?
Добрый день Евгений!!!
для того чтобы 2 запрос не выполнялся, при условии, что 1 запрос вернул NULL записей, вам требуется вставить условие проверки if (existsCollection.length > 0)
. Вот как получается в результате добавления условия.
var select = Ext.create("Terrasoft.EntitySchemaQuery", {rootSchemaName: "BorrowerCo"}); select.addColumn("borrower", "borrowerID"); var selectFirstFilter = select.createColumnFilterWithParameter(Terrasoft.ComparisonType.EQUAL, "[DPZzayvki:Id:STRING].account",accid); select.filters.add("selectFirstFilter", selectFirstFilter); select.getEntityCollection(function(result) { var existsCollection = []; if (result.success) { result.collection.each(function(item) { var record = item.get("borrowerID"); existsCollection.push(record.value); }, this); } // TODO: И вот здесь ниже пишем второй запрос. В который вставляем результат первого в виде коллекции if (existsCollection.length > 0) { var esq = Ext.create("Terrasoft.EntitySchemaQuery", {rootSchemaName: "DPZzayvki"}); esq.addAggregationSchemaColumn("projektsumm", Terrasoft.AggregationType.SUM, "projektsumm", Terrasoft.AggregationEvalType.ALL); var esqFirstFilter = this.Terrasoft.createColumnInFilterWithParameters("account", existsCollection); esq.filters.add("esqFirstFilter", esqFirstFilter); .... // TODO: И ниже уже исполняем свой основной запрос и получаем результат } }, this);
Михаил , спасибо, с Вашей помощью разобрался,
теперь есть такой вопрос если мне нужно обьеденить эти запросы в один с помощью UNION
select 1
.....
union
select 2
.......
union
select 3
........
чем лучше воспользоваться EntitySchemaQuery,
классом SELECT или через хранимую процедуру (SQL сценарии )
на Ваш взгляд и практический опыт каким путем проще пойти?
Евгений все зависит от задачи в которой вы хотите получить результат. В EntitySchemaQuery лучше использовать мелкие небольшие запросы, так как они выполняются асинхронно и инициируются и обрабатываются на клиентской стороне.
Конструктором new Select()
лучше пользоваться если запрос Достаточно большой и его требуется обработать на серверной уже стороне, а клиенту вернуть результат в виде Массива данных или в единственном значение.
Вьюверами лучше пользоваться если создаете Отчет и запрос нетривиальный.
Все что вы описали выше я бы обработал бы уже на серверной стороне на Си шарпе, а клиенту бы вернул результат.
Михаил я тоже склоняюсь к обработке на сервере ,
не подскажите где я могу найти информацию для ознакомления и желательно примеры
с описанием подобных задач.
Евгений документацию, что нашел на Академии террасофт: Назначение EntitySchemaQuery. Отличие от Select, ссылка на SDK класса Select: Select - класс По Select классу где-то видел примеры на Академии, но сходу не смог найти. Можете Евгений примеры найти и в своей конфигурации, если включите настройку "Выгружать C# код при компиляции", и обычным "Far manager-om" выполнить поиск в файлах, где искомый текст указать "new Select". Как настроить выгрузку Исходного кода, можно прочесть здесь: Отладка серверного кода Если после прочитанного будут вопросы Евгений пишите. Если будет совсем сложно создать самому запрос, тогда прошу сначала прочесть, попробовать сделать самому, и если не получиться, вот тогда прошу выложить Текст SQL запроса, и я вам его помогу создать на C# с помощью класса "Select"
Добрый день Евгений!!!
удалось справиться с написанием SQL запроса с помощью конструктора "SELECT"?
Добрый день Михаил!!
теоретически изучил ,к сожалению маловато примеров в SDK.
Написал простенький запрос,
Select selectQuery = new Select(UserConnection)
.Column("number")
.From("DPZzayvki");
using (DBExecutor dbExecutor = UserConnection.EnsureDBConnection())
{
using (IDataReader reader = selectQuery.ExecuteReader(dbExecutor))
{
while (reader.Read())
{
this.showInformationDialog(number);
// Обработка результатов запроса.
}
}
}
когда сохраняю код ругается на
using (DBExecutor dbExecutor is not defined не совсем понятно какие дополнительные модули и ссылки подключать,
а также правильность использования результата запроса.
Добрый день Евгений!!!
как вам и говорил предоставьте SQL запрос я вам его конвертирую в конструкцию SELECT на C#, чтобы вам легче было начинать изучение данного конструктора. Конструктор если разобраться очень мощный и с помощью него можно выполнять достаточно сложные и нетривиальные SQL запросы. это первое второе ваш пример попробуйте исполнить следующим образом:
namespace Terrasoft.Configuration { using System; using System.Data; using System.Collections.Generic; using System.ServiceModel; using System.ServiceModel.Web; using System.ServiceModel.Activation; using Terrasoft.Common; using System.Web; using Terrasoft.Core; using Terrasoft.Core.Entities; using Terrasoft.Core.DB; using System.Runtime.Serialization; using System.Linq; using Newtonsoft.Json; using Newtonsoft.Json.Linq; .... Select selectQuery = new Select(UserConnection) .Column("number") .From("DPZzayvki"); using (DBExecutor dbExecutor = UserConnection.EnsureDBConnection()) { using (var reader = selectQuery.ExecuteReader(dbExecutor)) { while (reader.Read()) { this.showInformationDialog(number); // Обработка результатов запроса. } } } ... }
Михаил написал код который вы отправили, все равно выходит ошибка, вот как я у меня получилось
define('DPZzayvkiSection', ['GridUtilitiesV2', 'GeneralDetails', 'BusinessRuleModule', "GoogleIntegrationUtilities",
"RightUtilities", "ConfigurationConstants", "GoogleIntegrationUtilitiesV2", "DataUtilities"],
function(resources, GoogleUtilities,DataUtilities) {
return {
entitySchemaName: 'DPZzayvki',
contextHelpId: '1001',
diff: /**SCHEMA_DIFF*/[]/**SCHEMA_DIFF*/,
messages: {},
methods: { getSectionActions: function() {
var actionMenuItems = this.callParent(arguments);
actionMenuItems.addItem(this.getButtonMenuItem({
//Type: "Terrasoft.MenuSeparator",
Caption: "Проверить суммy на лимит 3",
Enabled: { "bindTo": "isAnySelected" },
Click: { bindTo: 'poisksumselect'},
}));
return actionMenuItems;
},
poisksumselect: function()
{
namespace Terrasoft.Configuration {
using System;
using System.Data;
using System.Collections.Generic;
using System.ServiceModel;
using System.ServiceModel.Web;
using System.ServiceModel.Activation;
using Terrasoft.Common;
using System.Web;
using Terrasoft.Core;
using Terrasoft.Core.Entities;
using Terrasoft.Core.DB;
using System.Runtime.Serialization;
using System.Linq;
using Newtonsoft.Json;
using Newtonsoft.Json.Linq;
Select selectQuery = new Select(UserConnection)
.Column("number")
.From("DPZzayvki");
using (DBExecutor dbExecutor = UserConnection.EnsureDBConnection()) {
using (var reader = selectQuery.ExecuteReader(dbExecutor)) {
while (reader.Read()) {
this.showInformationDialog(number);
// Обработка результатов запроса.
}
}
}
namespace is not define и т д
JS != C# :smile:
Вы попытались в JS схеме написать код на c#, так нельзя. Если Вы пишите в JS то используйте клиентский esq.
https://academy.terrasoft.ru/documents/technic-sdk/7-7-0/ispolzovanie-r…
Стоп стоп стоп Евгений. Пример кода и конструктор SELECT работает только на C#. вы пишите данный запрос на C# в отдельном PUBLIC классе и обращаетесь к нему уже из Javascripta. хоть раз это делали?
Давайте так Евгений. Как я и писал выше, предоставьте в тестовике текст SQL запроса и какие входящие данные должны быть, какие данные получаем в результате выполнения запроса на выходе из Класса C#. Я подготовлю вам сервис на C#. И так же кусок кода на ява-скрипте как его вызвать. Далее вы сможете вставить его к себе в код.
Михаил нужно выполнить (запрос в файле) входящие параметры
var activeRow = this.get("ActiveRow");
var item = this.get("GridData").get(activeRow);
var activeRow = this.get("ActiveRow");
var item = this.get("GridData").get(activeRow);
var accid = item.get("account").value;
var borrowerId = item.get("account").value;
var borrowerstatusId = "16C3B22A-BE4A-4436-B536-9750B7273FD2";
на выходе получить набора данных Name , ProjektSumm
вторым этапом при помощи метода, отвечающий за экспорт в Excel, ( ExportToExcel.DataUtilities:)
выгрузить в Excel.
Делаю это все поэтапно чтобы на этих примерах получить практический опыт работы с системой.
Евгений если успею напишу ответ вам сегодня вечером, Если не успею то завтра утром. помогу вашему вопросу.