Согласно статье https://academy.terrasoft.ru/documents/technic-sdk/7-16/klass-entityschemaquery-rabota-s-filtrami можно подключать и отключать фильтры и далее считывать уже разные отфильтрованные данные

var esqFirstFilter = esq.createColumnFilterWithParameter(Terrasoft.ComparisonType.EQUAL, "Country.Name", "Испания");
var esqSecondFilter = esq.createColumnFilterWithParameter(Terrasoft.ComparisonType.EQUAL, "Country.Name", "Франция");
esq.filters.logicalOperation = Terrasoft.LogicalOperatorType.OR;
esq.filters.add("esqFirstFilter", esqFirstFilter);
esq.filters.add("esqSecondFilter", esqSecondFilter);
esq.getEntityCollection(function (result) {
    if (result.success) {
        result.collection.each(function (item) {
            // Обработка элементов коллекции.
        });
    }
}, this);
 
// Для второго фильтра указывается, что он не будет участвовать в построении результирующего запроса.
// При этом данный фильтр не удаляется из коллекции фильтров запроса.
esqSecondFilter.isEnabled = false;
 
esq.getEntityCollection(function (result) {
    if (result.success) {
        result.collection.each(function (item) {
            // Обработка элементов коллекции.
        });
    }
}, this);

Решил сделать так же

var esq = Ext.create("Terrasoft.EntitySchemaQuery", {
	rootSchemaName: "KtJasperFullNumberPool"
});
var requestFilter = esq.createColumnFilterWithParameter(Terrasoft.ComparisonType.EQUAL, 
	"KtRequest", this.get("KtRequest").value);
var productFilter = esq.createColumnFilterWithParameter(Terrasoft.ComparisonType.EQUAL, 
	"KtOpportunityProductInterest", this.get("Id"));
esq.filters.add("requestFilter", requestFilter);
esq.filters.add("productFilter", productFilter);
esq.getEntityCollection(function (result) {
	if (result.success) {
		this.set("IsVisibleKtJasperNumbersInKtRequestDetail", result.collection.getItems().length > 0 ? true : false);
	}
}, this);
productFilter.isEnabled = false;
esq.getEntityCollection(function (result) {
	if (result.success) {
		this.set("NumberCounts", result.collection.getItems().length);
	}
}, this);

Но при запуске, когда доходим до второго "esq.getEntityCollection" получаю ошибку "message: Uncaught Terrasoft.ItemAlreadyExistsException: Элемент с ключом "24f2c79e-4a52-457f-9e8e-e24009bb135b" Уже существует"

Изображение удалено.

Как бы не старался, не могу сделать что бы как в примере с ак=ккадемии работало.

Подскажите, что я делаю не так, и что это за элемент что при чтении создается новый?

Нравится

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

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

Литвинко Павел,

 в какую колонку? Может у меня что-то не так?

А что это за GUID «24f2c79e-4a52-457f-9e8e-e24009bb135b»?

Это запись в таблице KtJasperFullNumberPool, Id поля, фильтра или ещё что-то?

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

Доброго времени суток. Появились проблемы с написанием esq запроса. Для бд я его написал, но на esq не получается перенести.

Прикрепленные файлы

Нравится

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

Для правильного построения запроса Вам нужно посмотреть это и это

 

если вкратце, то относительные пути будут примерно такие:

"=[Contract:Account].Number"
"=[Contract:Account].=[NrbTradingPoint:NrbContract].NrbName"

 

 

 

Для правильного построения запроса Вам нужно посмотреть это и это

 

если вкратце, то относительные пути будут примерно такие:

"=[Contract:Account].Number"
"=[Contract:Account].=[NrbTradingPoint:NrbContract].NrbName"

 

 

 

Спасибо

 

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

Добрый день, коллеги!

 

Необходимо добавить в модальное окно количество обращений за промежуток времени с 9-12, 12-15, 15-17 часов на 10 дней.

 

Прилагаю код модального окна.

https://pastebin.com/RP0JvZ8S

Как делать esq запросы и интегрировать в данную схему, чтобы отображалось всё в модальном окне.

Буду очень благодарен любой помощи! 

Нравится

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

Вариантов решения много, мне кажется проще сделать  свое представление в БД  (view) которая бы формировала несколько колонок например 

Дата,

Кол-во обращения поступили с 9 до 12,

Кол-во обращения поступили с 12 до 15,

 

Наложить ваше представления в БД (view) на обїект в конфигурации и выводить в видек грида отфильтровав по диапазону дат...

Для этого необходимо создать в БД представление,  создать в Конфигурации объект, где установить признак для свойства [Представление в БД] Объект в Конфигурации должен иметь такое же название, как и представление в БД.

В системе есть объекты, имя которых начинается на "VW*"

Вариантов решения много, мне кажется проще сделать  свое представление в БД  (view) которая бы формировала несколько колонок например 

Дата,

Кол-во обращения поступили с 9 до 12,

Кол-во обращения поступили с 12 до 15,

 

Наложить ваше представления в БД (view) на обїект в конфигурации и выводить в видек грида отфильтровав по диапазону дат...

Для этого необходимо создать в БД представление,  создать в Конфигурации объект, где установить признак для свойства [Представление в БД] Объект в Конфигурации должен иметь такое же название, как и представление в БД.

В системе есть объекты, имя которых начинается на "VW*"

Как вообще использовать ESQ в странице модального окна (https://pastebin.com/RP0JvZ8S). Чтобы отобразить хоть какой нибудь результат.  GRID создал, VIEW создал. 

Насколько понял, Вы хотите выводить не обычный реестр, а просто набор надписей со значениями. В таком случае программно (при помощи привязанной функции) заполнять их можно как в последнем комментарии тут, а интересующая Вас  информация по работе клиентской ESQ есть в этих статьях.

 

А вообще, вариантов действительно много, в зависимости от того, что хотите увидеть. Может, будет проще вместо модального окна вообще настроить в разделе панель итогов из нескольких показателей, выводящих числа по данным той же view.

 

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

Добрый вечер, коллеги.

Возможно ли с помощью EntitySchemaQuery реализовать запрос:

SELECT Amount - PaidAmount AS DebtAmount
FROM MyTable

?

Спасибо!

Нравится

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

С помощью EntitySchemaQuery подобное реализовать не получится, а вот с помощью Select - легко

 

new Select(connection)
.Column(Column.SourceColumn("Amount") - Column.SourceColumn("PaidAmount")).As("DebtAmount")
.From("MyTable");

 

А зачем вам это делать? вы можете вычитать обе колонки и получить их разницу через EntitySchemaQuery 

С помощью EntitySchemaQuery подобное реализовать не получится, а вот с помощью Select - легко

 

new Select(connection)
.Column(Column.SourceColumn("Amount") - Column.SourceColumn("PaidAmount")).As("DebtAmount")
.From("MyTable");

 

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

Доброго времени суток

Создал замещающую схему для Section base schema ( NUI ) в новом пакете (не Custom). В схеме добавляется фильтр для EntitySchemaQuery через esq.filters.addItem(). Фильтр рабочий, т.к. проверялся на локальной машине с последующим пушем на препрод.

На препроде фильтр не работает. Вероятно, не хватает какой-то генерации или чего-то еще. Но вопрос, чего именно.

Я делал генерацию source code для выбранного файла, в котором прописан скрипт, делал генерацию для модифицированных, в общем, я по очереди делал все виды генераций и после этого компилил. Результата нет.

Нравится

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

Добрый день.

Попробуйте выполнить компиляцию всей конфигурации через меню [Скомпилировать все].

Если после этого фильтр не заработает, попробуйте отладиться и посмотреть, какие ошибки возникают в консоли.

Добрый день.

Попробуйте выполнить компиляцию всей конфигурации через меню [Скомпилировать все].

Если после этого фильтр не заработает, попробуйте отладиться и посмотреть, какие ошибки возникают в консоли.

Попробуйте очистить кэш браузера или проверить в другом броузере или в приват моде, проверьте наличие ошибок в консоли браузера

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

Добрый день!

Подскажите, как средствами серверной ESQ реализовать такой запрос

select o.Number
from [Order] o
where not exists(
	select null
	from OrderProduct op
	where op.OrderId = o.Id
	and op.TypeId = '29468170-1C73-4851-967B-90E5C108AEF9' --some type
)

Не получается задать связь op.OrderId = o.Id в подзапросе.

Нравится

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

Максим.Паламарчук,

Попробуйте такой вариант

var esq = new EntitySchemaQuery(_userConnection.EntitySchemaManager, "Order");
            esq.AddAllSchemaColumns();
var filtersByExisting = new EntitySchemaQueryFilterCollection(esq);
		filtersByExisting.IsNot = true;
		var notExFilter = esq.CreateFilterWithParameters(
			FilterComparisonType.IsNotNull,
			"[OrderProduct:Order].Id");
		filtersByExisting.Add(notExFilter);
		filtersByExisting.Add(esq.CreateFilterWithParameters(FilterComparisonType.Equal,
			"[OrderProduct:Order].Type.Id", new Guid("29468170-1C73-4851-967B-90E5C108AEF9")));
			esq.Filters.Add(filtersByExisting);
           var entityCollection = esq.GetEntityCollection(_userConnection);

 

Через Select:

var select = new Select(_userConnection)
            .Column("o", "Number")
            .From("Order").As("o")
            .Where()
                .Not().Exists(
                    new Select(_userConnection).Column("op", "Id").From("OrderProduct").As("op").Where("op", "OrderId ").IsEqual("o", "Id")
                    .And("op", "TypeId").IsEqual(Column.Parameter("29468170-1C73-4851-967B-90E5C108AEF9"))
                );

Через ESQ:

var esq = new EntitySchemaQuery(_userConnection.EntitySchemaManager, "Order");
            esq.AddAllSchemaColumns();
            esq.Filters.Add(esq.CreateFilterWithParameters(FilterComparisonType.Equal, "Type", new Guid("29468170-1C73-4851-967B-90E5C108AEF9")));
            esq.Filters.Add(esq.CreateFilterWithParameters(FilterComparisonType.NotExists, "[OrderProduct:Order:Id].Id"));
            var entityCollection = esq.GetEntityCollection(_userConnection);

 

Сидоров Александр В.,

насчет Select я согласен, а вот в esq, мне кажется, что колонка Type относится к схеме Order, а не OrderProduct, или я не прав?

Максим.Паламарчук, 

Да, согласен. Нужно Type внести во внутренний запрос

Сидоров Александр В.,

А каким образом это реализовать?

Максим.Паламарчук,

Попробуйте такой вариант

var esq = new EntitySchemaQuery(_userConnection.EntitySchemaManager, "Order");
            esq.AddAllSchemaColumns();
var filtersByExisting = new EntitySchemaQueryFilterCollection(esq);
		filtersByExisting.IsNot = true;
		var notExFilter = esq.CreateFilterWithParameters(
			FilterComparisonType.IsNotNull,
			"[OrderProduct:Order].Id");
		filtersByExisting.Add(notExFilter);
		filtersByExisting.Add(esq.CreateFilterWithParameters(FilterComparisonType.Equal,
			"[OrderProduct:Order].Type.Id", new Guid("29468170-1C73-4851-967B-90E5C108AEF9")));
			esq.Filters.Add(filtersByExisting);
           var entityCollection = esq.GetEntityCollection(_userConnection);

 

Сидоров Александр В.,

спасибо, все работает. Свойство IsNot как раз то, что нужно

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

Добрый день коллеги.

Столкнулся со странной ситуацией. Обратился к ТС, но все же решил и тут задать свой вопрос:

При реализации очередной кастомизации необходимо было выполнить запрос EntitySchemaQuery:

    

    var esq = new EntitySchemaQuery(UserConnection.EntitySchemaManager.GetInstanceByName("ServiceEngineer"));

    var colId = esq.AddColumn(esq.CreateAggregationFunction(AggregationTypeStrict.Count, "Id"));

    var esqFilter = esq.CreateFilterWithParameters(FilterComparisonType.Equal, "ServiceItem", serviseId);

    esq.Filters.Add(esqFilter);

    result = esq.GetSelectQuery(UserConnection).GetSqlText();

    return result;

Реализовывал с использованием ServiceHelper, где для анализа данных реализовал два метода: GET и POST.

Странность заключается в том, что исходный код у данных методов одинаков, а результат разный (см. аттач GET.png и POST.png)

Изображение удалено.

Изображение удалено.

Нравится

1 комментарий

Вероятно, дело не в GET и POST, а в том, что второй раз запускается под пользователем, у которого нет прав на таблицу ServiceEngineer. См. тут или тут.

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

Коллеги, подскажите есть ли в EntitySchemaQuery аналог Select COUNT (*)

Нравится

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

Добрый день!

Подозреваю, что речь идет о сервере, но желательно это указывать в вопросе. Именно Ваш вариант можно получить примерно таким образом

new Select(UserConnection).Column(Func.Count(Column.Asterisk())).From("Account")

Если необходимо именно esq, то примерно так

var esq = new EntitySchemaQuery(UserConnection.EntitySchemaManager.GetInstanceByName("Account"));
esq.AddColumn(esq.CreateAggregationFunction(AggregationTypeStrict.Count, "Id"));

Во втором варианте будет конечно не select count(*), а select count(Id), но, думаю, нужный эффект будет достигнут.

 

Ну и на всякий случай клиент

var esq = Ext.create('Terrasoft.EntitySchemaQuery', {
	rootSchemaName: "Account"
});
esq.addAggregationSchemaColumn("Id", Terrasoft.AggregationType.COUNT, 'CountRows');

 

Добрый день!

Подозреваю, что речь идет о сервере, но желательно это указывать в вопросе. Именно Ваш вариант можно получить примерно таким образом

new Select(UserConnection).Column(Func.Count(Column.Asterisk())).From("Account")

Если необходимо именно esq, то примерно так

var esq = new EntitySchemaQuery(UserConnection.EntitySchemaManager.GetInstanceByName("Account"));
esq.AddColumn(esq.CreateAggregationFunction(AggregationTypeStrict.Count, "Id"));

Во втором варианте будет конечно не select count(*), а select count(Id), но, думаю, нужный эффект будет достигнут.

 

Ну и на всякий случай клиент

var esq = Ext.create('Terrasoft.EntitySchemaQuery', {
	rootSchemaName: "Account"
});
esq.addAggregationSchemaColumn("Id", Terrasoft.AggregationType.COUNT, 'CountRows');

 

Лопатин Константин Николаевич,

Уточню:

Речь идет о запросе на сервере.

Сам запрос выглядит так:

Select COUNT (*) as CountServiceEngineers 

FROM [dbo].[ServiceEngineer] as [ServiceEngineer]

LEFT OUTER JOIN [dbo].[ServiceItem] as [ServiceItem] on [ServiceItem].id = [ServiceEngineer].[ServiceItemId]

Where [ServiceItem].Id = '9ac3a38b-fd9f-4802-b9d7-a3bcb28f8e96'

Во втором примере выше приведен именно серверный ESQ, о котором спрашиваете. Останется только наложить фильтр, как обычно.

Кстати, в приведенном запросе даже JOIN не нужен, поскольку ServiceItemId есть прямо в ServiceEngineer.

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

Если не использую фильтр, то все работает, но без фильтрации

Если использую, то null на выходе

В чем может быть причина?

var esq = Ext.create("Terrasoft.EntitySchemaQuery", {

        rootSchemaName: "GeneralForm"

    });

    

    esq.addColumn("Id");

    esq.addColumn("UsrCode");

    esq.addColumn("UsrInfoId.Name");

    esq.filters.addItem(Terrasoft.createColumnFilterWithParameter(

    Terrasoft.ComparisonType.EQUAL, "UsrInfoId.Name", "Инфо"));

    

    var rowsCount = 0;

    var rowsCount1 = "";

    esq.getEntityCollection(function(result) {

        if (result.success) {

            

            

            result.collection.each(function (item) {

                rowsCount = rowsCount + 1;

                rowsCount1 += item.get("UsrCode") + "#" + item.get("UsrInfoId.Name") + 

                    "(" + rowsCount + ")" + "\n";

            });

            this.set("UsrCount", rowsCount1);

        }

    }, this);

Нравится

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

Посмотрите профилировщиком какой sql запрос отправляется в БД, это поможет определить проблему

Посмотрите профилировщиком какой sql запрос отправляется в БД, это поможет определить проблему

Ошибка в том, что Вы неправильно построили связи - нужно писать UsrInfo.Name, а у Вас UsrInfoId.Name.

Вот корректный код:

var esq = Ext.create("Terrasoft.EntitySchemaQuery", {

        rootSchemaName: "GeneralForm"

    });

    

    esq.addColumn("Id");

    esq.addColumn("UsrCode");

    esq.addColumn("UsrInfo.Name");

    esq.filters.addItem(Terrasoft.createColumnFilterWithParameter(

    Terrasoft.ComparisonType.EQUAL, "UsrInfo.Name", "Инфо"));

    

    var rowsCount = 0;

    var rowsCount1 = "";

    esq.getEntityCollection(function(result) {

        if (result.success) {

            

            

            result.collection.each(function (item) {

                rowsCount = rowsCount + 1;

                rowsCount1 += item.get("UsrCode") + "#" + item.get("UsrInfo.Name") + 

                    "(" + rowsCount + ")" + "\n";

            });

            this.set("UsrCount", rowsCount1);

        }

    }, this);

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

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

пытаюсь реализовать запрос:



select 

    q1.UsrCode

    , q2.Name

from 

    GeneralForm q1 

    join UsrInfoList q2 

on 

    q1.UsrInfoId = q2.Id

При моей текущей реализации этот кусок работает:

esq.addColumn("UsrInfoId.Name");

Проблема с фильтром. 

Григорий Чех,

Ок. Разбираюсь с тем как его использовать.

Григорий Чех,

а как корректно этот механизм объявить в коде?

добавил:

//перед esq

var performanceManagerLabel = "";

performanceManager.start(performanceManagerLabel + "_Init");

//сразу после фильтрации

performanceManager.stop(performanceManagerLabel + "_Init");

пишет:

'performanceManager' is not defined

 

Григорий Чех,

Нашел. 

performanceManager указать надо было.

Григорий Чех,

Верно понимаю, что performanceManager.stop по сути служит меткой для того, чтобы в браузере можно было посмотреть состояние системы на этот момент и при необходимости перескочить на следующую метку?

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

Верно понимаю, что для такого запроса реализация ниже верна?

На практике без фильтра логика выдает правильное число строк, а с фильтром null.

select 

    q1.Id

    q1.UsrCode

    , q2.Name

from 

    GeneralForm q1 

    join UsrInfoList q2 

on 

    q1.UsrInfoId = q2.Id



var esq = Ext.create("Terrasoft.EntitySchemaQuery", {

    rootSchemaName: "GeneralForm"

esq.addColumn("Id");

esq.addColumn("UsrCode");

esq.addColumn("UsrInfoId.Name");

esq.filters.addItem(Terrasoft.createColumnFilterWithParameter(

Terrasoft.ComparisonType.EQUAL, "UsrInfoId.Name", "Инфо"));

Посмотрите в профайлере, что за SQL-запрос идёт в базу при выполнении последнего кода и потом запустите в Management Studio  его отдельно, чтобы выяснить, почему у него пустой результат.

Зверев Александр,

система в yазвании таблицы, которую пробую подцепить добавляет в начале и конце названия еще символы

SysUsrInfoListLcz. А нужна таблица была UsrInfoList. Это фича такая?

Хотя нет. Не в ней дело. Тут все хорошо.

SysUsrInfoListLcz — это автоматически сгенерированная таблица переводов названий для UsrInfoList.

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

Добрый день!

Пробую реализовывать запрос к данных через ESQ таким образом:

var esq = Ext.create("Terrasoft.EntitySchemaQuery", {

                    rootSchemaName: "UsrTbl1"

                });

                esq.addColumn("Id");

                esq.addColumn("UsrPar1");esq.addColumn("UsrInfoId");

                esq.addColumn("UsrValueList.Name");//вот с такими строками уже начинается проблема

esq.filters.addItem(Terrasoft.createColumnFilterWithParameter(Terrasoft.ComparisonType.EQUAL, "UsrValueList.Name", "значение1"));//и с такими фильтрами

 

Если нужно получить значение колонок с таблицы - rootSchemaName, то не вопрос.

Проблемы начинаются, когда пытаюсь использовать прямые ссылки или в одной запросе получать GUID, а во втором его использовать.

GUID  видимо со String плохо понимают друг друга. Если ли примеры их нормального совместного использования в рамках ESQ?

Можно ли как-то понять причины неработоспособности прямых ссылок? Или хотя бы понять как с GUID быть? Даже если я значение GUID пытаюсь вставлять так, то не работает:

esq.filters.addItem(Terrasoft.createColumnFilterWithParameter(Terrasoft.ComparisonType.EQUAL, "UsrInfoId", "337ED96B-B658-48B0-BBB6-7FACF918C735"));

Нравится

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

Eсли нужно получить справочную колонку, то её название нужно указывать без приставки "Id", как в схеме таблицы:

esq.addColumn("UsrInfo")

Аналогично и с фильтрами:

esq.filters.addItem(Terrasoft.createColumnFilterWithParameter(Terrasoft.ComparisonType.EQUAL, "UsrInfo", "337ED96B-B658-48B0-BBB6-7FACF918C735"));

Но обратите внимание, что, если у Вас фильтр построен по обратным связям, то можно писать 2 способами.

1. Через Id и тогда в качестве значения фильтра указываем Id:

var shipment = this.get("BTShipment");

sampleESQ.filters.addItem(sampleESQ.createColumnFilterWithParameter(

                    this.Terrasoft.ComparisonType.EQUAL, "[BTSampInShipment:BTSampleID].BTShipment.Id", shipment.value));

2. Через справочное поле и тогда в качестве значения указывать значение справочного поля:

var shipment = this.get("BTShipment");

sampleESQ.filters.addItem(sampleESQ.createColumnFilterWithParameter(

                    this.Terrasoft.ComparisonType.EQUAL, "[BTSampInShipment:BTSampleID].BTShipment", shipment));

А вообще, чтобы понять причину ошибки нужно отладиться на стороне клиента, если запрос уходит в базу данных, то посмотреть в SQL profiler, какой запрос идет в базу и какой результат работы этого запроса.

 

В js все Guid преобразуйте к нижнему регистру

те в вашем случае напишите что то типа esq.filters.addItem(Terrasoft.createColumnFilterWithParameter(Terrasoft.ComparisonType.EQUAL, "UsrInfoId", "337ed.....

Eсли нужно получить справочную колонку, то её название нужно указывать без приставки "Id", как в схеме таблицы:

esq.addColumn("UsrInfo")

Аналогично и с фильтрами:

esq.filters.addItem(Terrasoft.createColumnFilterWithParameter(Terrasoft.ComparisonType.EQUAL, "UsrInfo", "337ED96B-B658-48B0-BBB6-7FACF918C735"));

Но обратите внимание, что, если у Вас фильтр построен по обратным связям, то можно писать 2 способами.

1. Через Id и тогда в качестве значения фильтра указываем Id:

var shipment = this.get("BTShipment");

sampleESQ.filters.addItem(sampleESQ.createColumnFilterWithParameter(

                    this.Terrasoft.ComparisonType.EQUAL, "[BTSampInShipment:BTSampleID].BTShipment.Id", shipment.value));

2. Через справочное поле и тогда в качестве значения указывать значение справочного поля:

var shipment = this.get("BTShipment");

sampleESQ.filters.addItem(sampleESQ.createColumnFilterWithParameter(

                    this.Terrasoft.ComparisonType.EQUAL, "[BTSampInShipment:BTSampleID].BTShipment", shipment));

А вообще, чтобы понять причину ошибки нужно отладиться на стороне клиента, если запрос уходит в базу данных, то посмотреть в SQL profiler, какой запрос идет в базу и какой результат работы этого запроса.

 

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