Вопрос

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

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,

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

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

Добрый день! 

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

Вопрос:

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

  

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

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

Такое сделано в дополнении Image preview for bpm'online.

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

Большое спасибо!

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

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

Преамбула.

Есть раздел Доп соглашение, на странице редактирования есть деталь Дочернее доп соглашение, которая берется с этого же раздела. Есть поле Основное доп соглашение, которое заполняется при добавлении дочернего доп соглашения. Между страницей редактирования и деталью настроен обмен сообщениями (message) реагирующими на изменение поля Основное доп соглашение, если поле заполнено - кнопка добавления записей невидима, если поле пустое - видима. 

Собственно проблема.

При добавлении записи в деталь (нажатии на "+") открывается карточка редактирования этого же раздела и в поле Основное доп соглашение проставляется ссылка на родителя, НО сообщение о заполнении поля не отправляется на деталь и соответственно кнопка добавления записи остаётся видима.

Насколько я понял это происходит из-за того что фактически текущей страницей является родительская (с которой нажали кнопку добавления записи). Может кто-нибудь знает как можно передать сообщение с открывшейся карточки добавления записи на её деталь для того что бы скрыть кнопку добавления записи и отменить создание "матрёшки" (дочка в дочке в дочке в дочке и т.п.)

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

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

На onEntityInitialized вызовите функцию которая обрабатывает изменение поля Основное доп соглашение и отправляет сообщение в деталь.

Игорь, добрый день! После добавления записи с карточки детали, сама запись отображается в детали на форме? Так же, запись существует в таблице БД?

На onEntityInitialized вызовите функцию которая обрабатывает изменение поля Основное доп соглашение и отправляет сообщение в деталь.

engineer7,

Добрый день. Сама запись на форме отображается и в БД существует.

Есть карточка детали(то есть та же карточка что и родитель) и есть схема детали, вы передаете на деталь сообщение? на детале ведь та кнопка добавить

Радчук Виталий Владимирович,

Да, именно так.

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

Добрый день!

Хочу сделать актуализацию курсов валют, указывая актуальные значения, полученные через веб-сервис. Возникает проблема с сохранением значения курса. Пишу новое значение как новую запись в таблицу CurrencyRate, заполняю поля CurrencyId, Rate, StartDate. Проблема в том, что система обрабатывает значения Rate, вычисляя обратный курс, мантиссу и на выходе в интерфейсе имею совсем другой курс и при расчетах получаю неверные значения. Подскажите каким образом корректно сохранить полученное прямое значение курса в системе и корректно вывести его в интерфейсе в справочнике Валюты.

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

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

Добрый день, вам нужно учесть что система производит расчеты относительно базовой валюты соответсвенно вам необходимо указывать курсы валют относительно базовой валюты. Так же следует учитывать что курс валют кешируется на уровне сессии пользователя, тоесть новый курс валюты при расчете на стороне клиента будет использоваться только после того как пользователь выйдет и войдет в систему(после обновления курса).
Пример реализации логики можете посмотреть тут https://marketplace.terrasoft.ru/app/exchange-rate-update-bpmonline

Добрый день, вам нужно учесть что система производит расчеты относительно базовой валюты соответсвенно вам необходимо указывать курсы валют относительно базовой валюты. Так же следует учитывать что курс валют кешируется на уровне сессии пользователя, тоесть новый курс валюты при расчете на стороне клиента будет использоваться только после того как пользователь выйдет и войдет в систему(после обновления курса).
Пример реализации логики можете посмотреть тут https://marketplace.terrasoft.ru/app/exchange-rate-update-bpmonline

Добрый день!

Здорово что есть готовый и бесплатный инструмент позволяющий загружать валюты и их курсы. Но я рано обрадовался. Установил приложение, запустил процесс и обнаружил ошибку в журнале БП:

System.ServiceModel.EndpointNotFoundException: Прослушивание на http://www.cbr.ru/DailyInfoWebServ/DailyInfo.asmx не выполняла ни одна конечная точка, которая могла бы принять сообщение. Среди прочих причин это могло быть вызвано неправильным адресом или действием SOAP. Подробнее см. в описании InnerException (если имеется). ---> System.Net.WebException: Невозможно соединиться с удаленным сервером ---> System.Net.Sockets.SocketException: Попытка установить соединение была безуспешной, т.к. от другого компьютера за требуемое время не получен нужный отклик, или было разорвано уже установленное соединение из-за неверного отклика уже подключенного компьютера 212.40.192.49:80
   в System.Net.Sockets.Socket.DoConnect(EndPoint endPointSnapshot, SocketAddress socketAddress)
   в System.Net.ServicePoint.ConnectSocketInternal(Boolean connectFailure, Socket s4, Socket s6, Socket& socket, IPAddress& address, ConnectSocketState state, IAsyncResult asyncResult, Exception& exception)
   --- Конец трассировки внутреннего стека исключений ---
   в System.Net.HttpWebRequest.GetRequestStream(TransportContext& context)
   в System.Net.HttpWebRequest.GetRequestStream()
   в System.ServiceModel.Channels.HttpOutput.WebRequestHttpOutput.GetOutputStream()
   --- Конец трассировки внутреннего стека исключений ---
 
Server stack trace: 
   в System.ServiceModel.Channels.HttpOutput.WebRequestHttpOutput.GetOutputStream()
   в System.ServiceModel.Channels.HttpOutput.Send(TimeSpan timeout)
   в System.ServiceModel.Channels.HttpChannelFactory`1.HttpRequestChannel.HttpChannelRequest.SendRequest(Message message, TimeSpan timeout)
   в System.ServiceModel.Channels.RequestChannel.Request(Message message, TimeSpan timeout)
   в System.ServiceModel.Dispatcher.RequestChannelBinder.Request(Message message, TimeSpan timeout)
   в System.ServiceModel.Channels.ServiceChannel.Call(String action, Boolean oneway, ProxyOperationRuntime operation, Object[] ins, Object[] outs, TimeSpan timeout)
   в System.ServiceModel.Channels.ServiceChannelProxy.InvokeService(IMethodCallMessage methodCall, ProxyOperationRuntime operation)
   в System.ServiceModel.Channels.ServiceChannelProxy.Invoke(IMessage message)
 
Exception rethrown at [0]: 
   в System.Runtime.Remoting.Proxies.RealProxy.HandleReturnMessage(IMessage reqMsg, IMessage retMsg)
   в System.Runtime.Remoting.Proxies.RealProxy.PrivateInvoke(MessageData& msgData, Int32 type)
   в Terrasoft.Configuration.CbrfDI.DailyInfoSoap.GetCursOnDate(DateTime On_date)
   в Terrasoft.Configuration.TscCbrfLoader.Load()
   в Terrasoft.Core.Process.TscLoadCurrencyRateMethodsWrapper.RunLoadCurrencyRateExecute(ProcessExecutingContext context)
   в Terrasoft.Core.Process.ProcessFlowElement.Execute(ProcessExecutingContext context)

Сталкивались ли вы с этим? В чем может быть причина?

Этот механизм реализован компанией «Техносерв консалтинг», лучше связаться с ними. А по тексту в журнале, может, с Вашего веб-сервера не было доступа к адресу http://www.cbr.ru/DailyInfoWebServ/DailyInfo.asmx.

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

Добрый день.

Подскажите пожалуйста как выбрать из объекта бизнес-процесса "Изменение данных" уникальные поля записей, которые были изменены? 

Есть объект Акции и Партнеры. У акции есть справочное поле с типом акции. Есть бизнес-процесс, который по определённому алгоритму изменяет акции. Изменение акций выполняется  через элемент "Изменить данные".

Как мнем выбрать уникальные типы акции, которые были изменены?

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

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

Можно делать не массовое изменение, а читать еще неизмененные, их изменять, индивидуально делать доп.действия, читать следующие неизмененные и т.п.

Второй вариант - сделать БП, который реагирует на изменение акции

Третий вариант - дождаться обещанного массового запуска подпроцессов, который будет в одной из следующих версий :)

Можно делать не массовое изменение, а читать еще неизмененные, их изменять, индивидуально делать доп.действия, читать следующие неизмененные и т.п.

Второй вариант - сделать БП, который реагирует на изменение акции

Третий вариант - дождаться обещанного массового запуска подпроцессов, который будет в одной из следующих версий :)

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

Не совсем понял условие, но если интересуют те значения справочника, которые недавно были использованы в записях раздела, то можно в справочник добавить поле типа «дата и время» и писать туда текущее время одновременно с изменением записи в разделе.

Опишите более подробно что вы хотите сделать, как вариант вы можете создать БП стартовый сигнал которого будет реагировать на изменение акции и что то с этими акциями делать....это будет более универсальное решение. Но вариантов много чтобы что то советовать нужно лучше понимать вашу задачу.

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

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

Есть раздел, в который необходимо добавить деталь средств связи с полями (мобильный телефон, email, дополнительный телефон). 

Попытался повторить ответ на вопрос https://community.terrasoft.ru/questions/sredstva-svazi-lida, так как в моем случае, средства связи будут привязываться(указывать) к конкретному лиду.

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

Таблица детали: 

UsrLeadCommunication, унаследована от Базовое средство связи ( Base ).

Добавил два Lookup'а на таблицу Lead, и на таблицу раздела, где должна отображаться данная деталь. 

Модель детали: 

define("UsrLeadCommunicationDetail", ["UsrLeadCommunicationDetailResources", "terrasoft", "Lead",
    "ConfigurationEnums", "ConfigurationConstants"], function(resources, Terrasoft, Lead, ConfigurationEnums,
    ConfigurationConstants) {
        return {
            entitySchemaName: "UsrLeadCommunication",
            methods: {}
        };
    });

В dependencies добавил все зависимости. 

В page раздела добавил: 

в details: 

  

{
   // Настройка детали [Способы связи]
   "UsrLeadCommunicationDetailElement": {
      "schemaName": "UsrLeadCommunicationDetail",
      "entitySchemaName": "UsrLeadCommunication"
      "filter": {
         "detailColumn": "UsrApplicationForm", // Lookup на раздел с формой
         "Id"
      }
   }
}

            

в diff:

{
   "operation": "insert",
   // Название детали.
   "name": "UsrLeadCommunicationDetailElement",
   "values": {
      "itemType": Terrasoft.core.enums.ViewItemType.DETAIL,
      "markerValue": "added-detail"
   },
   "parentName": "Tabf9415591TabLabel",
   "propertyName": "items",
   // Индекс в списке добавляемых элементов.
   "index": 3
}

 

В логи браузера сыпется ошибка: 

SchemaBuilderV2.js:282 Uncaught TypeError: Cannot read property 'entitySchemaName' of undefined
    at i.<anonymous> (SchemaBuilderV2.js:282)
    at all-combined.js:503
    at Object.execCb (require.js:1693)
    at Module.check (require.js:881)
    at Module.enable (require.js:1173)
    at Module.init (require.js:786)
    at require.js:1457

 

Вопрос: как правильно реализовать деталь средств связи для формы раздела? 

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

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

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

Если не получится найти ошибку самостоятельно приведите полный исходный код модуля (текст)

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

Если не получится найти ошибку самостоятельно приведите полный исходный код модуля (текст)

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

Спасибо за Ваш ответ! Ошибки действительно присутствовали(не хватало запятой), все исправил(так же проверил остальные модули). Теперь форма раздела открывается, отображаются другие детали, но данная деталь "Средства связи" не отображается.

В консоль браузера сыпятся ошибки:

Uncaught TypeError: Cannot set property 'entitySchemaName' of undefined
    at initSchemaCustomAttributes (SchemaBuilderV2.js:132)
    at f (all-combined.js:495)
    at i.<anonymous> (SchemaBuilderV2.js:111)
    at all-combined.js:503
    at Object.execCb (require.js:1693)
    at Module.check (require.js:881)
    at Module.<anonymous> (require.js:1136)
    at require.js:134
    at require.js:1186
    at each (require.js:59)
core.js:633 
--------------------------------------------------
user: Supervisor/7f553b869f-34f3-4f20-ab4d-7480a5fdf647
 file: http://localhost:83/0/Nui/ViewModule.aspx
 line: 3
 column: 1
 message: Uncaught SyntaxError: Unexpected token < 
 date: Wed Oct 31 2018 20:12:20 GMT+0300 (Москва, стандартное время)
 stack: SyntaxError: Unexpected token <
writeErrorMessage @ core.js:633
core.js:633 
--------------------------------------------------
user: Supervisor/7f3b869f-34f3-4f20-ab4d-7480a5fdf647
 file: http://localhost:83/0/configuration/257f6624f537935d17c182584045709dru-RU/SchemaBuilderV2.js
 line: 132
 column: 38
 message: Uncaught TypeError: Cannot set property 'entitySchemaName' of undefined 
 date: Wed Oct 31 2018 20:12:20 GMT+0300 (Москва, стандартное время)
 stack: TypeError: Cannot set property 'entitySchemaName' of undefined
    at initSchemaCustomAttributes 

По первой ошибке открыл код(привожу строки, где эта ошибка содержится): 

// файл SchemaBuilderV2.js
if (entitySchemaName) {
	schemaResponse.entitySchemaName = entitySchemaName; // ошибка тут
}
callback(config);

 

Вы деталь зарегестрировали, те выполнили sql запросы? Очистили кєш браузера, кєш рєдиса? Если это дела или не помогло выкладывайте код вашейдетали и код старницы куда ее подключили

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

Добрый день! Некоторыми способами удалось достичь желаемое, необходимо было в странице формы при объявлении детали, заменить колонку детали в фильтре: 

{
   // Настройка детали [Способы связи]
   "UsrLeadCommunicationDetailElement": {
      "schemaName": "UsrLeadCommunicationDetail",
      "entitySchemaName": "UsrLeadCommunication"
      "filter": {
         "detailColumn": "UsrLead", // << Здесь нужна была замена
         "Id"
      }
   }
}

Так же добавил все зависимости, какие находятся у базовой  детали средств связи с полями

В справочнике UsrApplicationForm изменил свойство "Обязательно для заполнения" на "Уровне приложения". 

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

Но, присутствует проблема сохранения. 

При сохранении записи кнопкой Save, расположенной в левой верхней части формы, в лог браузера появляется ошибка: 

user: Supervisor/7541b869f-34f3-4f20-ab4d-7480a5fdf647
 file: undefined
 line: undefined
 column: undefined
 message: Cannot read property 'replace' of undefined 
 date: Thu Nov 08 2018 15:40:33 GMT+0300 (Москва, стандартное время)
 moduleId: ext-window
 moduleName: undefined

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

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

1) Добавил базовую схему детали с полями согласно статье: https://academy.terrasoft.ru/documents/technic-sdk/7-11/sozdanie-polzovatelskoy-detali-s-polyami

define("InformationDetail", [],
    function() {
        return {
            entitySchemaName: "GeneralInformation",
            diff: [],
            methods: {
                getDisplayColumns: function() {
                    return ["Identifier", "Type", "FullName", 
                    "Birthday"];
                }
            }
        };
    }
);

На форме в разделе элементы отображаются последовательно, три на первой строке, один на второй.

 

Вопрос: как отобразить произвольное количество элементов (колонок) по две на строке?

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

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

Вам нужно создавать деталь с реестром (редактируемым или не редактируемым (если добавление/изменение будет по кнопке)

Подробнее смотрите в академии

Вам нужно создавать деталь с реестром (редактируемым или не редактируемым (если добавление/изменение будет по кнопке)

Подробнее смотрите в академии

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

Спасибо, посмотрю.

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

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

 

2018-10-26 17:22:07,220 [5] ERROR IIS APPPOOL\ArdshinBank7102-3 Terrasoft.WebApp.FileWebEventProvider ProcessEvent - Date: 26.10.2018 17:22:07
Date (UTC): 26.10.2018 13:22:07

Exception Message: Вложенный запрос вернул больше одного значения. Это запрещено, когда вложенный запрос следует после =, !=, <, <=, >, >= или используется в качестве выражения.
Exception Type: System.Data.SqlClient.SqlException
Exception Source: .Net SqlClient Data Provider

Exception Stack Trace:
   в System.Data.SqlClient.SqlConnection.OnError(SqlException exception, Boolean breakConnection, Action`1 wrapCloseInAction)
   в System.Data.SqlClient.SqlInternalConnection.OnError(SqlException exception, Boolean breakConnection, Action`1 wrapCloseInAction)
   в System.Data.SqlClient.TdsParser.ThrowExceptionAndWarning(TdsParserStateObject stateObj, Boolean callerHasConnectionLock, Boolean asyncClose)
   в System.Data.SqlClient.TdsParser.TryRun(RunBehavior runBehavior, SqlCommand cmdHandler, SqlDataReader dataStream, BulkCopySimpleResultSet bulkCopyHandler, TdsParserStateObject stateObj, Boolean& dataReady)
   в System.Data.SqlClient.SqlDataReader.TryHasMoreRows(Boolean& moreRows)
   в System.Data.SqlClient.SqlDataReader.TryReadInternal(Boolean setTimeout, Boolean& more)
   в System.Data.SqlClient.SqlDataReader.Read()
   в Terrasoft.Core.DB.DBSecurityEngine.GetCurrentUserAdminOperationsFromDB()
   в Terrasoft.Core.DB.DBSecurityEngine.InitializeCurrentUserAdministratedOperations(String code)
   в Terrasoft.Core.DB.DBSecurityEngine.GetCanExecuteOperation(String code)
   в Terrasoft.Core.DB.DBSecurityEngine.GetEntitySchemaOperationsRightLevels(String schemaName)
   в Terrasoft.Core.DB.DBSecurityEngine.GetEntitySchemaOperationsRightLevel(String schemaName)
   в Terrasoft.Core.DB.DBSecurityEngine.GetIsEntitySchemaReadingAllowed(String schemaName)
   в Terrasoft.Core.Entities.EntitySchemaQuery.CreateSelect()
   в Terrasoft.Core.Entities.EntitySchemaQuery.GetSelectQuery(UserConnection userConnection)
   в Terrasoft.Core.Entities.EntitySchemaQuery.GetEntityCollection(UserConnection userConnection)
   в Terrasoft.Configuration.FeatureUtilities.GetFeatureState(UserConnection source, String code)
   в Terrasoft.Configuration.FeatureUtilities.GetIsFeatureEnabled(UserConnection source, String code)
   в Terrasoft.Configuration.ConfigurationSectionHelper.GetModuleStructure(UserConnection userConnection)
   в Terrasoft.Configuration.ConfigurationSectionHelper.GetConfigurationScript(UserConnection userConnection)
   в Terrasoft.Configuration.SectionHelper.GetConfigurationScript(UserConnection userConnection)
   в Terrasoft.WebApp.Nui.ViewModuleHelper.CreateModulesConfigScript(UserConnection userConnection, HttpResponse response)
   в Terrasoft.WebApp.Nui.ViewModule.SetupModulesConfig()
   в Terrasoft.WebApp.Nui.ViewModule.Page_Load(Object sender, EventArgs e)
   в System.Web.Util.CalliEventHandlerDelegateProxy.Callback(Object sender, EventArgs e)
   в System.Web.UI.Control.OnLoad(EventArgs e)
   в System.Web.UI.Control.LoadRecursive()
   в System.Web.UI.Page.ProcessRequestMain(Boolean includeStagesBeforeAsyncPoint, Boolean includeStagesAfterAsyncPoint)

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

6 комментариев
Лучший ответ
SELECT SysAdminOperationId, SysAdminUnitId, COUNT(*)
FROM dbo.SysAdminOperationGrantee
GROUP BY SysAdminOperationId, SysAdminUnitId
HAVING COUNT(*) > 1
 
 
SELECT SysAdminOperationId, Position, COUNT(*)
FROM dbo.SysAdminOperationGrantee
GROUP BY SysAdminOperationId, Position
HAVING COUNT(*) > 1

Если любой из этих запросов вернул что-то, то в этом проблема. Необходимо почистить данную таблицу дублирующих данных.

Без ошибок из лога  и сообщений в консоли броузера трудно чтото сказать. Разве что посоветовать обратится в тех поддержку.

Запросите у поддержке sql скрипты для перераздачи прав на существующие обекты и выполните их для тех объектов что вы меняли! Свежий бэкап есть или вы делали на среде разработки?

Есть приложение на маркет плэйсе  которое раздает права на созданные записи (актуальнот если изминили права и хотите распространить это на существующие объекты)  но если входа не происходит это вам не поможет!

Где-то есть подзапрос, который выдаёт более одной строки, хотя логика внешнего SQL-запроса ожидает одну. Вызывается он в стандартной функции ядра GetCurrentUserAdminOperationsFromDB. Видимо, при работе скрипта или переносе залилось некорректное наполнение в таблицы прав.

Где именно, можно увидеть, записав в профайлере запрос, происходящий перед падением.

вот же

TOP (1) ставьте 

Я так понимаю что это из-за неправильно разданных прав происходит ошибка, в явном виде никто sql не корректировал. Так что  про TOP 1 єто не в тему 

SELECT SysAdminOperationId, SysAdminUnitId, COUNT(*)
FROM dbo.SysAdminOperationGrantee
GROUP BY SysAdminOperationId, SysAdminUnitId
HAVING COUNT(*) > 1
 
 
SELECT SysAdminOperationId, Position, COUNT(*)
FROM dbo.SysAdminOperationGrantee
GROUP BY SysAdminOperationId, Position
HAVING COUNT(*) > 1

Если любой из этих запросов вернул что-то, то в этом проблема. Необходимо почистить данную таблицу дублирующих данных.

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