Здравствуйте!

1) Добавила новое действие.
Требуется реализовать переход на другую страницу при нажатии на данное действие.
Не могли бы вы подсказать как это сделать?

2) Не могу найти какая страница отвечает стандартному действию "Права доступа"

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

Нравится

19 комментариев

Здравствуйте!

1) Правильно ли я понимаю, что Вы используете версию 5.X?
Примеры есть в темах:
http://www.community.terrasoft.ru/forum/topic/9471
http://www.community.terrasoft.ru/forum/topic/8691
2) Деталь "Права доступа" в разделе (если речь идет о 5.X) отображается в том случае, если объект раздела администрируется по записям.

1) Спасибо большое, Андрей!!
2) Нет, деталь я вижу , я не могу найти его исходный код.

Сабина, посмотрите BaseObjectRecordRightsGridPage.

Другой вопрос, для чего Вам это нужно:)

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

Спасибо!

Хочу создать аналогичную страницу для редактирования прав доступа для выделенных активностей.

"Безродный Андрей" написал:

Здравствуйте!

1) Правильно ли я понимаю, что Вы используете версию 5.X?

Примеры есть в темах:

http://www.community.terrasoft.ru/forum/topic/9471

http://www.community.terrasoft.ru/forum/topic/8691

2) Деталь "Права доступа" в разделе (если речь идет о 5.X) отображается в том случае, если объект раздела администрируется по записям.


Я очень извиняюсь, здесь как я понимаю редактируется карточка. При редактировании раздела надо поступать аналогично? Просто при изменении раздела открывается окно для написания javascript кода, а для карточки c#.

Спасибо.

1. Как сделать по кнопке переход в другой раздел — описано здесь.
2. В линейке 5.Х код всех окнон: карточек, реестров, разделов написан на C#. На JS есть только отдельные вкрапления внутри C#. Пожалуйста, покажите скриншот, чтобы понять, что Вы хотите изменить.

"Смена прав" в разделе "Мои активности". (1я картинка)
Исходный код на 2й картинке.

Мне надо чтобы при нажатии открывалась некая страница .

Сабина, для добавления действия в раздел достаточно переопределить метод getSectionActions. Например, как это сделано в разделе «Контакты» (ContactSectionV2).

"Вильшанский Дмитрий" написал:

Сабина, для добавления действия в раздел достаточно переопределить метод getSectionActions. Например, как это сделано в разделе «Контакты» (ContactSectionV2).


Спасибо, но вопрос ведь не в добавлении, а в реализации перехода на другую страницу.
Или там что-то подобное реализовано?

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

"Вильшанский Дмитрий" написал:

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


this.methods.onSchedulerView = function() {
var tag = prepareEdit(this);
var recordId = this.get('activeRow');
this.view(tag, recordId);

это оно?

Можно создать для одного раздела две разные страницы вида?(одна уже реализована в базовом)

"Исаева Сабина" написал:
Вильшанский Дмитрий пишет:

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

this.methods.onSchedulerView = function() {

var tag = prepareEdit(this);

var recordId = this.get('activeRow');

this.view(tag, recordId);

это оно?

Можно создать для одного раздела две разные страницы вида?(одна уже реализована в базовом)

Вам нужен метод getSectionActions.
Конечно можно, у раздела может быть несколько страниц редактирования.
Посмотрите базовый функционал в разделе «Активности». Например, в разделе есть страницы с типом «Задача», «E-mail».

"Исаева Сабина" написал:
Вильшанский Дмитрий пишет:

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

this.methods.onSchedulerView = function() {

var tag = prepareEdit(this);

var recordId = this.get('activeRow');

this.view(tag, recordId);

это оно?

Можно создать для одного раздела две разные страницы вида?(одна уже реализована в базовом)

Вам нужен метод getSectionActions.
Конечно можно, у раздела может быть несколько страниц редактирования.
Посмотрите базовый функционал в разделе «Активности». Например, в разделе есть страницы с типом «Задача», «E-mail».

"Александр Зубков" написал:Задача

this.methods.onSchedulerCopy = function() {
var tag = prepareEdit(this);
var recordId = this.get('activeRow');
this.copy(tag, recordId);
};
this.methods.onSchedulerDelete = function() {
prepareEdit(this);
this.onDelete();
};

вот они они как я понимаю.
А как они связываются?
т.е как система понимает что вызывать при данной операции? (в каком месте эта привязка осуществляется? )

Сабина, добрый день!

Конкретно эти методы связываются с соответствующими кнопками в функции generateEditButtons схемы ActivitySection (обработчик события click):

buttonsConfig.push({
	className: 'Terrasoft.Button',
	enabled: {
		bindTo: 'getEditButtonsEnabled'
	},
	click: {
		bindTo: 'onSchedulerCopy'
	},
	styles: {
		textStyle: {
			margin: '0px 10px 0px 0px'
		}
	},
	style: Terrasoft.controls.ButtonEnums.style.DEFAULT,
	caption: resources.localizableStrings.CopyButtonCaption,
	tag: ConfigurationEnums.CardState.Copy
});

"Лабьяк Олег Игоревич" написал:

Сабина, добрый день!

Конкретно эти методы связываются с соответствующими кнопками в функции generateEditButtons схемы ActivitySection (обработчик события click):

buttonsConfig.push({

        className: 'Terrasoft.Button',

        enabled: {

                bindTo: 'getEditButtonsEnabled'

        },

        click: {

                bindTo: 'onSchedulerCopy'

        },

        styles: {

                textStyle: {

                        margin: '0px 10px 0px 0px'

                }

        },

        style: Terrasoft.controls.ButtonEnums.style.DEFAULT,

        caption: resources.localizableStrings.CopyButtonCaption,

        tag: ConfigurationEnums.CardState.Copy

});

С уважением,

Олег Лабьяк,

инженер-программист,

группа компаний Terrasoft.

Добрый день, Олег!
Нет , вопрос в последующем действии, как программа понимает какую страницу открывать при вызове this.copy?

Страница определяется в результате вызова функции prepareEdit(this). Внутри этой функции происходит поиск карточки редактирования, соответствующей текущему модулю. Если страница найдена, она сохраняется в переменную tag, которая используется в вызове this.copy.

this.methods.onSchedulerView = function() {
var tag = prepareEdit(this);
var recordId = this.get('activeRow');
this.view(tag, recordId);
};
this.methods.onSchedulerEdit = function() {
var tag = prepareEdit(this);
var recordId = this.get('activeRow');
this.edit(tag, recordId);
};
this.methods.onSchedulerCopy = function() {
var tag = prepareEdit(this);
var recordId = this.get('activeRow');
this.copy(tag, recordId);
};

this.methods.onSchedulerDelete = function() {
prepareEdit(this);
this.onDelete();
};

Что бы ни передавали в эти edit, copy view , для каждого открываются одинаковые страницы. Может они как то по умолчанию прикреплены?

Сабина, посмотрите, пожалуйста, реализацию функции prepareEdit. В ней происходит поиск карточек редактирования, соответствующих текущему разделу. Сами карточки регистрируются в системной таблице SysModuleEdit, но при старте системы информация о них сохраняется в отдельную коллекцию для каждого раздела. Сами разделы сохраняются в Terrasoft.configuration.ModuleStructure, а получить карточки редактирования, соответствующие модулю, можно следующим образом (пример для раздела "Активности"):

var pages = Terrasoft.configuration.ModuleStructure[Activity.name].pages;

Далее в зависимости от типа выбранной активности определяется соответствующая ей карточка редактирования.

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

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

Возникла задача:

Необходимо установить признак обязательности поля UsrDeviationReason, если даты UsrDatePlan и UsrDateActual не равны друг другу и UsrDateActual заполнена:

Написали правило:

"UsrDeviationReason":{
        "BindParameterRequiredDeviationReason": {
        "ruleType": BusinessRuleModule.enums.RuleType.BINDPARAMETER,
        "property": BusinessRuleModule.enums.Property.REQUIRED,
        "logical": Terrasoft.LogicalOperatorType.AND,
        "conditions": [
                {
                        "leftExpression": {
                                "type": BusinessRuleModule.enums.ValueType.ATTRIBUTE,
                                "attribute": "UsrDatePlan"
                        },
                        "comparisonType": Terrasoft.ComparisonType.NOT_EQUAL,
                        "rightExpression": {
                                "type": BusinessRuleModule.enums.ValueType.ATTRIBUTE,
                                "attribute": "UsrDateActual"
                        }
                },
                {
                        "leftExpression": {
                                "type": BusinessRuleModule.enums.ValueType.ATTRIBUTE,
                                "attribute": "UsrDateActual"
                        },
                        "comparisonType": Terrasoft.ComparisonType.IS_NOT_NULL
                }
        ]
}

В итоге два вопроса:
1) По UsrDateActual IS_NOT_NULL работает (т.е., если поле UsrDateActual не заполнено, то признак обязательности не появляется).
Но при равенстве UsrDatePlan и UsrDateActual признак обязательности всё равно остаётся. Что указано не так?
2) Даже если признак обязательности исчезает, всё равно остаётся подсказка заполнить это поле и никак не исчезает.

Спасибо за помощь!

Нравится

6 комментариев

Может, конечно, я тупость скажу, но условие "не равно" вроде бы без нижнего подчеркивания, просто NotEqual.
Информацию брал отсюда https://www.bpmonline.com/bpmonlinesdken/Terrasoft.Core~Terrasoft.Core…

Хотя и IsNotNull там тоже без нижних подчеркиваний написано, но у вас работает.

Владимир, добрый день!

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

"Демьяник Алексей Олегович" написал:Проверьте, чтобы даты были абсолютно идентичными

Формат полей date, а не datetime, и в них нет времени.

"Сазанов Александр Владимирович" написал:Хотя и IsNotNull там тоже без нижних подчеркиваний написано, но у вас работает.

В логике карточек вижу, что с подчеркиваниями. и NOT_EQUAL тоже видел. А в процессах, кажется, без подчеркивания.

Владимир, добрый день!

Типы сравнений EQUAL и NOT_EQUAL не совсем корректно работают в случае сравнения дат, поскольку в JavaScript даты являются объектами, а два объекта никогда не будут равными друг другу, если это не один и тот же объект.

Рекомендую для изменения обязательности поля использовать не бизнес-правило, а создать отдельное свойство модели, значение которого связать с атрибутом isRequired нужного поля в блоке diff:

{
	"operation": "insert",
	"parentName": "Header",
	"propertyName": "items",
	"name": "UsrDeviationReason",
	"values": {
		"layout": {"column": 12, "row": 0},
		"isRequired": {"bindTo": "IsUsrDeviationReasonRequired"}
	}
}

Инициализировать это свойство можно при инициализации страницы, а также при изменении полей плановой и фактической даты.

Поделюсь результатом:

IsUsrDeviationReasonRequired: function(columnName) {
	var endDate = this.get("EndDate");
	var deadline = this.get("Deadline");
	var isRequired = false;
	if ((endDate) && (deadline)) {
		isRequired = (endDate.toDateString() !== deadline.toDateString());
	}
	var column = this.columns[columnName];
	if (column) {
		column.isRequired = isRequired;
		this.validateColumn(columnName);
	}
	return isRequired;
}
Показать все комментарии

Добрый день.
Переношу пакет с доработками 7.4 на 7.5 средствами SVN и MD файлами.
В процессе переноса выявлена, что для замещающих клиентских модулей ActPageV2,
CorrespondencePageV2 отсутствует родитель.
Как быть в этой ситуации? Как переносить доработки с версии на версию, если от версии к версии изменяются схемы ядра?

Нравится

5 комментариев

Здравствуйте, Игорь.

Спасибо за Ваш вопрос.
Действительно, ранее в системе были отдельные страницы для различных типов документов. В версии 7.5 данных схем не должно быть, вместо них реализована страница DocumentPageV2.

В утилите и пакетах обновления на версию 7.5 предусмотрен учет данного изменения.
Прошу детализировать проблему и описать шаги, которые выполнялись Вами в письме на адрес support@tscrm.com.

Постараемся Вам помочь.
Заранее спасибо.

Я переносил указанные доработки md-файлами на другую базу, т.к. обновление не предполагалось.
Предоставьте, пожалуйста, инструкцию по использованию утилиты для корректного переноса доработок.

Игорь, здравствуйте!

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

1) Сначала важно указать параметры подключения к БД, которые будет использовать WsC. WsC использует строку подключения из конфигурационного файла Terrasoft.Tools.WorkspaceConsole.exe.config (должен находиться в каталоге с WsC).
В секции указывается используемая строка подключения
В секции указываются значения строк подключения к БД.
...............................................................

2) Выполнить 1, 3 и 4 пункты из прикреплённой инструкции.
3) Сделать выгрузку пакетов из первой базы с помощью WorkspaceConsole, запустив файл update.bat со следующими параметрами:
Terrasoft.Tools.WorkspaceConsole.exe -operation=SaveDBContent -workspaceName=Default -destinationPath=D:\Temp\Repository\ -contentTypes=Repository
4) Выполняем первый пункт, указав теперь путь к базе, на которую накатываются пакеты.
5) Выполняем полностью прикрепленную инструкцию. Накатятся пакеты с доработками на другую базу.

Инструкцию по накатке пакетов прикрепляю.

Спасибо!

Не будет ли конфликта при обновлении, т.к. необходимый пакет будет выгружен со всеми наследуемыми им пакетами, а эти пакеты в целевой BPM 7.5 уже есть?

Игорь, добрый день!

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

Спасибо!

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

Добрый день, подскажите как изменить фильтрацию поля "Продажа" на детале "Связи", в зависимости от поля на карточке раздела, т.е. есть у нас к примеру Счет, в нем булевое поле, изменяем в нем значение и тогда нужно менять фильтр в поле "Продажа" в детале "Связи"
Возможно ли такое?

Нравится

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

Олег, добрый день!

Есть два варианта: добавить бизнес-правило с типом FILTRATION или добавить фильтр в свойство lookupListConfig соответствующего атрибута.

Пример первого варианта - схема ActivityPageV2, пакет Opportunity, фильтрация значений поля "Продажа" в зависимости от поля "Контрагент":

rules: {
	"Opportunity": {
		"FiltrationOpportunityByAccount": {
			"ruleType": BusinessRuleModule.enums.RuleType.FILTRATION,
			"autocomplete": true,
			"autoClean": true,
			"baseAttributePatch": "Account",
			"comparisonType": Terrasoft.ComparisonType.EQUAL,
			"type": BusinessRuleModule.enums.ValueType.ATTRIBUTE,
			"attribute": "Account"
		}
	}
}

Пример второго варианта - схема ActivityPageV2 пакета UIv2, фильтрация значений поля "Результат" в зависимости от категории активности:

attributes: {
	"Result": {
		lookupListConfig: {
			filters: [
				function() {
					var type = this.get("ActivityCategory");
					var filterGroup = Ext.create("Terrasoft.FilterGroup");
					filterGroup.add("ActivityCategory",
						Terrasoft.createColumnFilterWithParameter(
							Terrasoft.ComparisonType.EQUAL,
							"[ActivityCategoryResultEntry:ActivityResult].ActivityCategory",
							type.value));
					filterGroup.add("BusinessProcessOnly",
						Terrasoft.createColumnFilterWithParameter(
							Terrasoft.ComparisonType.EQUAL,
							"BusinessProcessOnly",
							0));
					return filterGroup;
				}
			]
		}
	}
}

С помощью второго варианта можно реализовать фильтрацию любой сложности.

Спасибо, использовал второй вариант

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

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

Нравится

4 комментария
Guid currentUserContactId = UserConnection.CurrentUser.ContactId;

спасибо

а где указать, что такое UserConnection?
При сохранении скрипта - ошибка UserConnection is not defined

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

Здраствуйте! подскажите пожалуйста как можно вручную освободить ресурсы объекта CustomQuery. Я не могу вызвать мотод Dispose() так как этот класс не реализует интерфейс IDisposable.

Нравится

6 комментариев

Добрый день!

            public static bool IsSchemaExistsInDB(UserConnection userConnection, EntitySchema entitySchema) {
                    string sqlText = userConnection.DBEngine.GetIsEntitySchemaExistSqlText();
                    var checkSchemaExistCustomQuery = new CustomQuery(userConnection, sqlText)
                           .WithParameter("EntitySchemaName", entitySchema.Name);
                    if (sqlText.Contains("@DBSchemaName") || sqlText.Contains(":DBSchemaName")) {
                           checkSchemaExistCustomQuery.WithParameter("DBSchemaName", userConnection.DBEngine.CurrentSchemaName);
                    }
                    using (DBExecutor dbExecutor = userConnection.EnsureDBConnection()) {
                           using (IDataReader dataReader = checkSchemaExistCustomQuery.ExecuteReader(dbExecutor)) {   // (!)
                                  return dataReader.Read();
                           }
                    }
             }

CustomQuery не использует Disponse, так как он не хранит данные.

После выполнения CustomQuery запроса возвращается специальный тип IDataReader, который умеет читать данные запроса. После выхода за пределы using он автоматически освобождает память.

А если делать insert в базу, using тогда не используется. Возможно ли в этом случае вручную освободить ресурсы после команды Execute() ?

Владимир, вышлите пример кода с insert. Стало не совсем понятно, какие ресурсы вы хотите освободить.

Для примера

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

Вся магия происходит в методе Execute. Внутри этого метода в using-е создастся DBExecuter, который выполнит ваш SQL и автоматически освободит подключение к БД.

Понятно. Спасибо!

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

Добрый день!

Не подскажет ли кто-нибудь ответ на такой вопрос: можно ли "перехватить" json до его скармливания системе на десериализацию с тем, чтобы преобразовать его в массив и исключить ряд элементов?

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

Отсюда и возник вопрос - можно ли, до десериализации, "ненужные" данные вычленить из json (сохранив оригинал отдельно) и скормить системе только то, что нужно для работы?

Кроме преобразования в массив я ничего не могу придумать, а bpm не умеет работать с json как с текстом (только как с объектом... или нет?)

Спасибо и сорри, если немного невнятно :)

Нравится

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

Добрый день, возникла проблема, если заходить просто в раздел Лиды то кнопка отображается нормально, но если перейти в карточку Лида по связи, например из Активности - кнопка пропадает, как это исправить и почему вообще кнопка пропадает?

Версия 7.5.0.1328

Нравится

6 комментариев

Олег, попробуйте отладить метод getIsQualificationStageActive в LeadSectionV2 чтобы понять в чем причина.

хм а при чем тут LeadSection если открывается через связь LeadPage?

p.s. прошелся дебагером по LeadPage, нашел там метод processStatusColumn который вроде должен отвечать за логику показа кнопки "Квалифицировать/Дисквалифицировать", но не понял суть, во время исполнения есть строка this.set("IsQualifyVisible", isCheckedEnabled); и туда передается true, но кнопка все равно не отображается

В LeadPage тоже есть метод getIsQualificationStageActive

Тобишь, в diff'e смотрите где определена кнопка:

{
					"operation": "insert",
					"parentName": "LeftContainer",
					"propertyName": "items",
					"name": "QualificationProcessButton",
					"values": {
						"itemType": Terrasoft.ViewItemType.BUTTON,
						"style": Terrasoft.controls.ButtonEnums.style.GREEN,
						"caption": {"bindTo": "getQualificationProcessButtonCaption"},
						"markerValue": {"bindTo": "getQualificationProcessButtonCaption"},
						"classes": {"textClass": "actions-button-margin-right"},
						"iconAlign": Terrasoft.controls.ButtonEnums.iconAlign.RIGHT,
						"imageConfig": resources.localizableImages.QualificationProcessButtonImage,
						"click": {"bindTo": "continueQualify"},
						"layout": {"column": 6, "row": 0, "colSpan": 2},
						"visible": {"bindTo": "getIsQualificationStageActive"}
					}
				}

смотрим свойство visible и связанный с ним атрибут (метод).
В нашем случае тут метод - ставим в него дебагер, воспроизводим проблему и смотрим что не так.

хорошо, открыл я просто карточку лида, прошел с дебаггером, для нового Лида метод getIsQualificationStageActive возвращает false, но в методе processStatusColumn в переменные

this.set("isCheckedEnabled", isCheckedEnabled);
this.set("IsQualifyVisible", isCheckedEnabled);

передается true и далее выполняется метод processOperationColumn который устанавливает

this.set("IsQualifyEnabled", !this.isAddMode());

конкретно в моем случае это тоже true. Кнопка отображается.
Далее открываю Лида из Активности, с брейкпоинтами на тех же методах, приходят те же значения, но кнопка не отображается

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

Олег, добрый день!

Действительно, данная ошибка с кнопкой присутствовала в версии приложения 7.5.0.1328.
Данная ситуация была исправлена и протестирована на версиях 7.6.

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

Имеется в виду вот этот Feed

Нравится

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

Добрый день!

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

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

Окружение: bpmonline 7.2

Опишу вкратце задумку:
1. На странице пользователь меняет какие-то поля у объекта жмет кнопку сохранения (это сейчас уже работает).
2. На изменение статуса (было Новое, стало Изменено) создан бизнес-процесс, в котором реализована логика обработки объекта при изменении (это сейчас уже работает).
3. Теперь требуется вызвать внешнюю процедуру (связь баз по linked server), которая в свою очередь должна получить данные по объекту и не только.

И вот как раз с третьим пунктом возникла проблема - внешняя процедура отваливается по таймауту. В ходе разбора этой проблемы, удалось выяснить следующее (поправьте если не прав):
1. бизнес-процесс вызывается в том же потоке, что и сохранение объекта
2. при этом все это происходит в одной транзакции
3. вызывая внешнюю процедуру, которая обращается в тем же данным, получаем неявную блокировку данных. Т.е. при выполнении запросов с одной базы к другой открывается своя транзакция, которая блокируется уже открытой транзакции.

Проблема "решается" если вызов вызвать в отдельном потоке (реализация через Task) - тогда транзакции закрываются в основном потоке и не мешают выполнению запроса. Или принудительно закрыть транзакцию. Но это на мой взгляд не верное решение данной проблемы. Так как отрабатывает бизнес-процесс-2 по изменению другого поля, которое изменяется в "вызове" и в результате бизнес-процесс-2 не запускается.

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

поменял тему для привлечения внимания

Нравится

6 комментариев

Еще момент, если реализовывать через Task, т.е. в отдельном потоке, то периодически возникает ошибка:

 file: http://****/0/core/4ec8ac09273bab8d86ca61871b5b3a39/combined/all-combined.js
 line: 460
 message: Uncaught The transaction operation cannot be performed because there are pending requests working on this transaction. 

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

А что если часть логики с вызовом сторонней процедуры вынести в AFTER UPDATE/INSERT trigger?

IF UPDATE(StatusID)
BEGIN
  exec stor.proc
END

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

Тут скорее вопрос следующий возникает - можно ли где-то почитать/узнать как реализован вызов процессов по изменению поля у объекта? Какая именно работа в этом случае происходит с транзакциями?
Так как я могу лишь предполагать, основываясь на результате работы, что процессы-подписчики вызываются в том же потоке и в той же транзакции, что и метод обновления объекта, вызываемый со страницы. Если это так, то можно ли как-то на это повлиять?

Еще вариант, может быть есть какой-то параметр, поле, значение - для вызова процесса уже после сохранения и закрытия транзакции? Чтобы не возникало вышеописанной проблемы.

Здравствуйте, Александр!

Процессы-подписчики действительно вызываются в том же потоке. Для создания нового потока используйте элемент "Таймер". Поставьте минимальное значение (1 секунда). Запуск элементов, следующих после таймера, будет осуществлятся уже в новом потоке.

Спасибо, за ответ. Попробую сделать через таймер.

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

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