Вопрос

Добрый день коллеги.
Столкнулся со странной ситуацией. Обратился к ТС, но все же решил и тут задать свой вопрос:
При реализации очередной кастомизации необходимо было выполнить запрос 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.

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

Добрый день.

Возникла необходимость добавить проверку значения поля, например, чтобы оно соответствовало определённому регулярному выражению. Делал это через Custom бизнес-правило. Для установки валидности поля использовался код:

record.changeProperty("ColumnName", {
    isValid: {
        value: isValid,
        message: columnMessage
    }
});

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

Есть возможность как-то решить данную проблему, желательно не модифицируя сам объект.

У меня такой же вопрос

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

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

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

Обязательность дефолтными правилаи проверяется как раз после выполнения пользовательских правил. Из-за чего моя проверка не учитывается: если значение имеет неверный формат, но поле заполнено, то после отработки всех правил оно всё равно считается верно заполненным.

У своего правила можно задать position, чтобы выполнялось после других.

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

Привет!

 

Подскажите как в схеме с типом "Исходный код" прочитать значение ключа, добавленного мной в web.config в раздел appSettings?

<appSettings>
    <add key="MyKey" value="MyValue" />
</appSettings>

 

У меня такой же вопрос

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

Попробуйте при помощи WebConfigurationManager.AppSettings или ConfigurationManager.AppSettings. Например, в схеме LDAPUtilities есть:

var timeout = WebConfigurationManager.AppSettings["RequestTimeout"];

 

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

да, 

WebConfigurationManager.AppSettings работает

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

Добрый день!
Необходимо добавить раздел на контрагенты на портал.
Попробовал добавить раздел в рабочее место, он не отобразился. Попробовал добавлять с помощью sql скриптов. Есть у кого-нибудь актуальная документация по добавлению раздела на портал?

У меня такой же вопрос

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

Добрый день, Дмитрий. Инструкция по добавлению кастомного раздела на портал находится по ссылке

С 7.13.2 добавили возможность создавать портальные разделы пользовательскими средствами в мастере разделов.

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

Добрый день коллеги, подскажите как добавить действие в cti панель звонков, к существующим действиям необходимо добавить создать лид из звонка

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

У меня такой же вопрос

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

В маркете есть БП для выполнения той же задачи.

Также такая функция встроена в одну из интеграций с телефонией.

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

Добрый день!

Имеется унаследованная от "базовой схемы детали средств связи" деталь. Внутрь детали рядом с самим средством связи вставлены создаваемые вручную контейнеры (Terrasoft.Container) с чекбоксами (Terrasoft.CheckBoxEdit).
Задача: при полной отрисовки детали блокировать все чекбоксы кроме одного выбранного, если он есть, иначе не блокировать ничего. Решаю с помощью jquery на странице раздела. Т.к. не знаю, как поймать событие полной отрисовки детали (чтобы получить доступ к DOM), использую костыль в виде setTimeout. Как это событие можно отловить? 
И еще один вопрос: есть ли какое-то единое событие для перерисовки детали (детали перерисовывается при нажатии на кнопку "отмена" на странице, переходе между вкладками, сворачивании/разворачивании детали и т.д.). 

Возможно есть какой-то способ решения этой задачи кроме jQuery?

У меня такой же вопрос

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

Добрый день, в различных модулях существует метод onRender, он срабатывает после полной отрисовки модуля стоит посмотреть в его сторону

Добрый день, в различных модулях существует метод onRender, он срабатывает после полной отрисовки модуля стоит посмотреть в его сторону

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

Есть такой метод:

addRecords: function(detailColumnName, segmentName, isEditableSegment) {
            var masterId = this.get("MasterRecordId");
            var esq = this.Ext.create("Terrasoft.EntitySchemaQuery", {
                rootSchemaName: this.entitySchemaName
            });
            esq.addColumn(segmentName);
            esq.filters.add("masterFilter", Terrasoft.createColumnFilterWithParameter(
                this.Terrasoft.ComparisonType.EQUAL, detailColumnName, masterId));
            esq.filters.add("isDeletedFilter", Terrasoft.createColumnFilterWithParameter(
                this.Terrasoft.ComparisonType.EQUAL, "IsDeleted", false));
            esq.getEntityCollection(function(result) {
                var existsContactsCollection = [];
                if (result.success) {
                    result.collection.each(function(item) {
                        existsContactsCollection.push(item.get(segmentName).value);
                    });
                }
                var config = {
                    entitySchemaName: segmentName,
                    multiSelect: true,
                    columns: ["Type"]
                };
                
                var isAccount;
                if (segmentName === "Account") {
                    config.filters = Ext.create("Terrasoft.FilterGroup");
                    config.filters.add("first", Terrasoft.createColumnFilterWithParameter(
                        Terrasoft.ComparisonType.EQUAL, "Type", "b32e9350-aac5-47ca-89c5-b987205a510f"));
                    isAccount = true;
                }
                if (existsContactsCollection.length > 0) {

                    var existsFilter = Terrasoft.createColumnInFilterWithParameters("Id", existsContactsCollection);
                    existsFilter.comparisonType = Terrasoft.ComparisonType.NOT_EQUAL;

                    existsFilter.Name = "existsFilter";
                    if (isAccount) {
                        config.filters.add("second", existsFilter);
                    } else {
                        config.filters = existsFilter;
                    }
                }
                this.openLookup(config, function(config) {
                    methods.addRecordsCallback.call(this, config, detailColumnName, segmentName);
                }, this);
            }, this);
        },
где detailColumnName = "Campaing",
segmentName = "Product",
entitySchemaName = "ProductUsage"

В ProductUsage есть идентификатор родительского объекта (Campaing) и идентификатор продукта (Product)

Он нужен для того, чтобы лукап выводил только те записи, которых нет в детали для этого объекта и отрабатывает корректно, но вот когда на детали больше записей, чем 2100, БД SQL выдает ошибку, что конструкция IN принимает максимум 2100 параметров, поэтому я решил переделать запрос под конструкцию NotExists.

Изменил этот метод с фильтрами на следующий:

addNotExistsRecords: function(detailColumnName, segmentName, isEditableSegment) {
            var masterId = this.get("MasterRecordId");
            var esq = this.Ext.create("Terrasoft.EntitySchemaQuery", {
                rootSchemaName: this.entitySchemaName
            });
            esq.addColumn(segmentName);
            esq.filters.add("masterFilter", Terrasoft.createColumnFilterWithParameter(
                this.Terrasoft.ComparisonType.EQUAL, detailColumnName, masterId));
            esq.filters.add("isDeletedFilter", Terrasoft.createColumnFilterWithParameter(
                this.Terrasoft.ComparisonType.EQUAL, "IsDeleted", false));
            esq.filters.add("isEqualsTo", Terrasoft.createColumnFilterWithParameter(
                this.Terrasoft.ComparisonType.EQUAL, "Product.Id", "ProductId"));
                
            var config = {
                entitySchemaName: segmentName,
                multiSelect: true,
                columns: ["Type"]
            };
            
            var isAccount;
            if (segmentName === "Account") {
                config.filters = Ext.create("Terrasoft.FilterGroup");
                config.filters.add("first", Terrasoft.createColumnFilterWithParameter(
                    Terrasoft.ComparisonType.EQUAL, "Type", "b32e9350-aac5-47ca-89c5-b987205a510f"));
                isAccount = true;
            }
            
            var existsFilter = Terrasoft.createNotExistsFilter("Id", esq);
            existsFilter.Name = "existsFilter";
            if (isAccount) {
                config.filters.add("second", existsFilter);
            } else {
                config.filters = existsFilter;
            }
            
            this.openLookup(config, function(config) {
                methods.addRecordsCallback.call(this, config, detailColumnName, segmentName);
            }, this);
        },

 

Однако при выполнении происходит ошибка errorCode: "NotSupportedException", message: "None", stackTrace: undefined, errors: Array(0)
Где я ошибся при построении фильтров?

По сути нужно повторить такой запрос:

select Id from Product where NOT EXISTS(select Id from ProductUsage where CampaignId = 'f39db115-d2f4-4936-b415-bf6543187463' AND IsDeleted = 'false' AND Product.Id = ProductId)
 

У меня такой же вопрос

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

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

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

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

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

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

Добрый день! Столкнулся со следующей проблемой. Cайт работает по протоколу https. При настройке подключения к сайту в интерфейсе плагина ReportDesigner, для указанной строки подключения не подтягивается конфигурация для входа.
Подскажите, если ли какие-то дополнительные настройки для работы плагина с сайтом на https.

У меня такой же вопрос

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

Подключился в BPMonlineReportDesigner к демо-сайту, по https пускает нормально.

Настройки разных веб-сервисов сайта для работы по http и https прописываются в config-файлах, находящихся в папках Terrasoft.WebApp\ServiceModel\http\ и Terrasoft.WebApp\ServiceModel\https\.

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

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

Александр, спасибо за рекомендацию. Все получилось

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

Коллеги, приветствую.

Столкнулись с неожиданной проблемой при сохранении объекта в любом из пакетов: "Ошибка сохранения: Измерения массива превысили поддерживаемый диапазон.".

Никто не сталкивался? Также не понятно, где в логах найти подробную информацию об этой ошибке.

У меня такой же вопрос

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

Дело не совсем в приложении, очень похоже на то, что проблема с размером оперативной памяти на сервере.

Дело не совсем в приложении, очень похоже на то, что проблема с размером оперативной памяти на сервере.

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

Алла, здравствуйте. На IIS сервере памяти хватает, тем не менее ошибка есть.

Arthur Matyukov,

А на сервере базы данных память проверяли?

Войдите или зарегистрируйтесь, чтобы комментировать