Вопрос

Скрипты выполнены успешно, однако после обновления выдает ошибку:

Exception Message: Не удалось загрузить тип System.Collections.Generic.List`1[[Terrasoft.Core.LicHelper+SysLicPackageInfo, Terrasoft.Core, Version=7.4.0.2924, Culture=neutral, PublicKeyToken=edaadfbc3b0bb879]], необходимый для десериализации. Exception Type: System.Runtime.Serialization.SerializationException Exception Source: mscorlib Exception Stack Trace: в System.Runtime.Serialization.ObjectManager.CompleteObject(ObjectHolder holder, Boolean bObjectFullyComplete) в System.Runtime.Serialization.ObjectManager.DoNewlyRegisteredObjectFixups(ObjectHolder holder) в System.Runtime.Serialization.ObjectManager.FixupSpecialObject(ObjectHolder holder) в System.Runtime.Serialization.ObjectManager.DoFixups() в System.Runtime.Serialization.Formatters.Binary.ObjectReader.Deserialize(HeaderHandler handler, __BinaryParser serParser, Boolean fCheck, Boolean isCrossAppDomain, IMethodCallMessage methodCallMessage) в System.Runtime.Serialization.Formatters.Binary.BinaryFormatter.Deserialize(Stream serializationStream, HeaderHandler handler, Boolean fCheck, Boolean isCrossAppDomain, IMethodCallMessage methodCallMessage) в Terrasoft.Redis.BaseRedisStore.Deserialize(Byte[] data) в Terrasoft.Redis.BaseRedisStore.GetValue(String key) в Terrasoft.Core.UserConnection.get_LicHelper()

 

Не могу определить последовательность действий для исправления

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

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

Обратитесь в службу техподдержки террасофт

Судя по тому, что сначала неудачно обновлялись на 7.5, а теперь на 7.4.1, дело может быть именно в неверном порядке обновления. Если нужно обновить на несколько версий, накатывать нужно последовательно.

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

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

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

Проблема с обновлением. Все сделано по инструкции, структура БД обновилась, но компиляция не происходит из-за этих ошибок. Обновление с 7.4.0 до 7.4.1 прошло без проблем. Был запрошен список дистрибутивов для bpm'online sales. Прислали список для Salse Enterprise (может быть важная информация). Как возможно решить данную проблему?

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

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

Paul_lgb,

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

e подробности смотри тут

https://academy.terrasoft.ua/documents/technic-sdk/7-13/parametry-works…

Те тебе нужно

1) настроить консоль (добавить в конфиг консоли параметры подключения к твоей БД и тд)

2) выполнить RegenerateSchemaSources 

Надеюсь вы тренеруетесь на тестовом стенде?Попробуйте сгенерировать исходные коды и перекомпилировать конфигурацию (компилировать все)

Если не поможет то обращайтесьв тех поддержку

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

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

Paul_lgb,

На версиях 7,5-7,6 активно менялась структура пакетов. Проверьте, от всех ли необходимых пакетов у вас есть зависимости. Обратите внимание на Счета, документы, договоры, если где-то используются.

Для входа в конфигурацию добавьте WorkspaceExplorerModule.aspx по примеру:

http://localhost:999/0/WorkspaceExplorerModule.aspx

Paul_lgb,

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

e подробности смотри тут

https://academy.terrasoft.ua/documents/technic-sdk/7-13/parametry-works…

Те тебе нужно

1) настроить консоль (добавить в конфиг консоли параметры подключения к твоей БД и тд)

2) выполнить RegenerateSchemaSources 

Сообщение «Ссылка на объект не указывает на экземпляр объекта.
   в Terrasoft.Core.Packages.PackageStorage.AnalyzeHierarchy()»
 может быть связано с зацикливанием пакетов. Это, например, когда у пакета указан родительский (он от него зависит), а у родительского указан как  родительский его дочерний. Второй вариант — это, возможно, создали замещающую схему, а потом исходную удалили.

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

К сожалению, генерация и компиляция выполняются с ошибками

Исправьте ошибки, а потом компилируйте.

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

var accountUpdate = new Update(UserConnection, "Account")
                        .Set("IndustryId", Column.Parameter(IndustryIdParameter))
                        .Where("Id").IsEqual(Column.Const(AccountIdParameter)).Execute()

Если есть такой запрос и значение параметра IndustryIdParameter равно null, то выдаст ошибку так как в базу пойдет запрос не со значением null, a c Guid.Empty.

Каким образом можно решить эту задачу?

И ещё интересует возможно ли использование в этой конструкции сложных условий в Where, речь идет о запросе вида:

update Account
set
    IndustryId = @P4
where CountryId = @P1
    and (IndustryId = @P2
        or IndustryId = @P3)

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

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

Лучше использовать конструкцию .OpenBlock() пример ниже:

 

Select select = (Select)new Select(UserConnection)
	.Column("Id")
	.Column("AccountAId")
	.Column("AccountBId")
	.From("Relationship")
	.Where()
		.OpenBlock()
			.OpenBlock("AccountAId").IsEqual(Column.Parameter(accountId))
				.And("AccountBId").IsEqual(Column.Parameter(searchParentId))
			.CloseBlock()
		.Or()
			.OpenBlock("AccountAId").IsEqual(Column.Parameter(searchParentId))
				.And("AccountBId").IsEqual(Column.Parameter(accountId))
		.CloseBlock()
		.And()
			.OpenBlock("RelationTypeId").IsEqual(Column.Parameter(relationTypeId))
				.Or("ReverseRelationTypeId").IsEqual(Column.Parameter(relationTypeId))
			.CloseBlock();
		.CloseBlock();

 

null 

if (IndustryIdParameter != Guid.Empty) {
  var accountUpdate = new Update(UserConnection, "Account")
   .Set("IndustryId", Column.Parameter(IndustryIdParameter))
   .Where("Id").IsEqual(Column.Const(AccountIdParameter)).Execute()
}

А для конструкции получается просто
 

var accountUpdate = new Update(UserConnection, "Account")
   .Set("IndustryId", Column.Parameter(IndustryIdParameter))
   .Where("CountryId").IsEqual(Column.Parameter(CountryParameter))
   .And("IndustryId").IsEqual(Column.Parameter(IndustryIdParameter1))
   .Or("IndustryId").IsEqual(Column.Parameter(IndustryIdParameter2));

 

new Update(UserConnection, "ActivityCorrespondence")
.Set("ActivityId", Column.Const(null))
.Where("ActivityId").IsEqual(Column.Parameter(activityId))
.Execute(dbExecutor);

 

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

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

Лучше использовать конструкцию .OpenBlock() пример ниже:

 

Select select = (Select)new Select(UserConnection)
	.Column("Id")
	.Column("AccountAId")
	.Column("AccountBId")
	.From("Relationship")
	.Where()
		.OpenBlock()
			.OpenBlock("AccountAId").IsEqual(Column.Parameter(accountId))
				.And("AccountBId").IsEqual(Column.Parameter(searchParentId))
			.CloseBlock()
		.Or()
			.OpenBlock("AccountAId").IsEqual(Column.Parameter(searchParentId))
				.And("AccountBId").IsEqual(Column.Parameter(accountId))
		.CloseBlock()
		.And()
			.OpenBlock("RelationTypeId").IsEqual(Column.Parameter(relationTypeId))
				.Or("ReverseRelationTypeId").IsEqual(Column.Parameter(relationTypeId))
			.CloseBlock();
		.CloseBlock();

 

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

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

Интересует возможность прямо в Update запилить эту проверку.

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

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

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

 

Алла, что не так в написании в нужном месте одного и того же текста «Column.Const(null)»? Если не знаешь, будет там null или значение, можно написать в С# в месте формирования Update блок if(){}else{} и проверять значение переменной. Update можно формировать по частям, дописывая к нему строки от начала к концу. И запускать, когда готов.

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

Тогда делайте через тернарный оператор "?" и получите то же условие но в одну строку

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

Пожалуйста, расскажите подробнее на моем примере.

Алла Савельева,
Примерно так:

var accountUpdate = new Update(UserConnection, "Account")
.Set("IndustryId", Column.Const(IndustryIdParameter != Guid.Empty ? IndustryIdParameter.ToString() : null))
.Where("Id").IsEqual(Column.Const(AccountIdParameter)).Execute()

 

Алла, примерно:

 .Set("IndustryId", ((IndustryIdParameter!=Guid.Empty)?Column.Parameter(IndustryIdParameter):Column.Const(null)))

 

А еще лучше будет расширить метод Set, чтобы сразу проверять на Guid.Empty
 

public static Update Set(this Update update, string column, Guid value)
        {
            return value == Guid.Empty
                ? update.Set(column, Column.Parameter(null))
                : update.Set(column, Column.Parameter(value));
        }

И весь вызов станет еще компактнее
 

.Set("IndustryId", YourGuid);

 

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

Тернарный оператор ! 

Григорий Чех пишет:

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

Тернарный оператор ! 

 Точно! Поправил, спасибо)

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

Здравствуйте, подскажите, есть ли в нашей версии редактора отчетов возможность вносить изменения в БД ? Если да, то буду признателен за рабочий пример.

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

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

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

var manager = UserConnection.EntitySchemaManager.GetInstanceByName("Account");
var entity = manager.CreateEntity(UserConnection);
//entity.SetDefColumnValues();
entity.FetchFromDB(ID); //Account guid
entity.SetColumnValue("Name", "TEST");
entity.Save(false);

 

Мне интересно, какая бизнес-задача может потребовать этого?

Может, счётчик запусков или их логирование?

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

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

Например, есть запрос на sql такого вида:

declare @DocumentTypeId uniqueidentifier
declare @InvoiceTypeId uniqueidentifier

update I
set
    I.TypeId = @InvoiceTypeId
from Invoice I
    join Document D on D.Id = I.DocumentId
where D.TypeId = @DocumentTypeId

Можно ли его реализовать с помощью класса Update на C#?

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

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

Добрый день.

Попробуйте такой код

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

Здравствуйте! Пытался обновить верcию bpm'online bank customer jorney, с 7.11.0 до 7.11.1 (Oracle), после обновления попытался скомпилировать приложение, и в результате возник вот такой вот перечень ошибок, в результате чего могли возникнуть эти ошибки?

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

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

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

Пришлите, пожалуйста, логи приложения за время обновления, по умолчанию хранятся по пути:C:\Windows\Temp\BPMonline\Site_Х.

Так же хочу уточнить, не было ли ошибок, при компиляции до обновления ? 

Maksym Naumovets,

До обновления ошибок не было, вот log 

https://yadi.sk/i/wpnUGfK23TKEiq

 

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

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

Попробуйте повторно выполнить обновление.

Maksym Naumovets,

"Utility finished working." разве не говорит о том, что утилита завершила свою работу?

.

Александр, говорит. Но не говорит что все было выполнено успешно.

Произошла ошибка и утилита завершила работу.

Посмотрел выполненные шаги, нет генерации исходных кодов, компиляции и остальных что я описал.

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

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

Добрый день!

После недавнего обновления Win10 (KB4056892), в Terrasoft 3.4.0.130 перестал отображаться пользователь в верхней части окна, отсутствуют напоминания и при переходе во вкладку Сделки появляется ошибка(та, что на скриншоте). Возможно кто-то сталкивался? Если обновление удалить все работает.

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

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

Этот сбой возникает на Windows 10 после прихода обновления KB4074588, которое ломает в Terrasoft пользовательские настройки. А этот раздел одну из них при открытии проверяет, как и механизм напоминаний.

Для восстановления нормальной работы нужно либо удалить из Windows это обновление KB4074588, либо запускать Terrasoft к компьютеров не под Windows 10. В руководстве администратора Terrasoft 3.4.0 указаны как поддерживаемые Windows XP, Windows Server 2003, Windows Vista, Windows Server 2008 и Windows 7.

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

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

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

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

Собираюсь использовать службу DataService с клиентской части, так как совсем не разбираюсь в С#. Но в документации для чтения и добавления примеры для JS есть, а для удаления и обновления записей -
нет. Прошу помощи: буду очень признателен за пример удаления и обновления записи через DataService на из клиентской части)

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

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

Для обновления ищите по конфигурации слова "Terrasoft.UpdateQuery"
примеров множество, вот из OpportunityManagementEndOfStagePreconfiguredPage:

var updateQuery = Ext.create("Terrasoft.UpdateQuery", {
	rootSchemaName: "Activity"
});
updateQuery.filters.addItem(this.Terrasoft.createColumnFilterWithParameter(
		Terrasoft.ComparisonType.EQUAL, "Id", activityId));
updateQuery.setParameterValue("Status",
		ConfigurationConstants.Activity.Status.Cancel,
		this.Terrasoft.DataValueType.LOOKUP);
updateQuery.execute(function() {
	this.loadActivities();
}, this);

Удаление по словам "Terrasoft.DeleteQuery", примеров так же очень много, вот из DocumentRelationshipDetailV2:

var deleteQuery = this.Ext.create("Terrasoft.DeleteQuery", {
	rootSchemaName: "DocumentRelationship"
});
var masterRecordId = this.get("MasterRecordId");
var filters = this.getDeleteRelationFilters(masterRecordId, selectedRows);
deleteQuery.filters.add("DocumentsFilter", filters);
deleteQuery.execute(function() {
	this.hideBodyMask();
	this.deselectRows();
	this.reloadGridData();
}, this);

"Максим Шевченко" написал:

Для обновления ищите по конфигурации слова "Terrasoft.UpdateQuery"
примеров множество, вот из OpportunityManagementEndOfStagePreconfiguredPage:

var updateQuery = Ext.create("Terrasoft.UpdateQuery", {
        rootSchemaName: "Activity"
});
updateQuery.filters.addItem(this.Terrasoft.createColumnFilterWithParameter(
                Terrasoft.ComparisonType.EQUAL, "Id", activityId));
updateQuery.setParameterValue("Status",
                ConfigurationConstants.Activity.Status.Cancel,
                this.Terrasoft.DataValueType.LOOKUP);
updateQuery.execute(function() {
        this.loadActivities();
}, this);

Удаление по словам "Terrasoft.DeleteQuery", примеров так же очень много, вот из DocumentRelationshipDetailV2:

var deleteQuery = this.Ext.create("Terrasoft.DeleteQuery", {
        rootSchemaName: "DocumentRelationship"
});
var masterRecordId = this.get("MasterRecordId");
var filters = this.getDeleteRelationFilters(masterRecordId, selectedRows);
deleteQuery.filters.add("DocumentsFilter", filters);
deleteQuery.execute(function() {
        this.hideBodyMask();
        this.deselectRows();
        this.reloadGridData();
}, this);


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

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

Как обновить приложение с версии 7.8.2 на с 7.8.3

Не могу найти документацию.

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

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

Добрый день, Максим!

Документацию по обновлению системы Вы найдете по ссылке:
https://academy.terrasoft.ru/documents/instrukciya-po-obnovleniyu-bpmon…

За необходимым дистрибутивом Вам необходимо обратиться в службу поддержки:
support@terrasoft.ru

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

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

Есть определенный интерес поизучать классы Select, Insert, Update, EntitySchemaQuery и подробнее
разобраться, как с ними работать.

Чтобы это было проще и быстрее мне бы хотелось иметь возможность работать с ними из MS Visual Studio.

Например, запрос из статьи Использование EntitySchemaQuery для построения запросов к базе данных:

// Создание экземпляра запроса, добавление в запрос колонок и источника данных.
Select selectQuery = new Select(UserConnection)
                    .Column("Id")
                    .Column("Name")
                    .From("Contact");
// Выполнение запроса к базе данных и получение результирующего набора данных.
using (DBExecutor dbExecutor = UserConnection.EnsureDBConnection())
{
    using (IDataReader reader = selectQuery.ExecuteReader(dbExecutor))
    {
        while (reader.Read())
        {
            // Обработка результатов запроса.
        }
    }
}

Собственно, вопрос в конфигурировании класса UserConnection, как его использовать "вне платформы", не в режиме отладки?

Например, в методе Main:

static void Main(string[] args)
{
}

В элементе "Задание- сценарий" я могу получить его таким образом:

var userConnection = Get("UserConnection");

В Web- сервисе WCF:

var userConnection = (UserConnection)HttpContext.Current.Session["UserConnection"];

Был бы весьма признателен за информацию.

Спасибо.

--
С уважением, Алексей Быков.

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

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

Здравствуйте.
Если сайт у вас развернуть on-site, то есть, поднят на своем IIS сервере:
Тогда у вас есть возможность написать свой, к примеру, веб-сервис, или даже скрипт-сценарий, и пользуясь статьей по отладке,
http://academy.terrasoft.ru/documents/docs/technic/SDK/7.6.0/ServerCode…
ставить точки останова, и изучать поведение серверного ESQ.
Здесь главное, что бы код был частью системы, поэтому его и нужно писать как часть системы (веб-сервис, бизнес-процесс, и.т.д.), а не сторонние dll,exe,итд.
С автономной программы этого сделать не получится.

Если же сайт on-demand, то есть, развернут как http://имя-сайта.bpmonline.com/
То такой возможности у Вас нет, и со стороннего процесса (программы), Вы никак не обратитесь к ядру системы.
Из сторонних программ написанных Вами в Visual Studio, Вы можете разве что обратится к уже написанным веб-сервисам в рамках структуры сайта, либо же по протоколу OData,
http://academy.terrasoft.ua/documents/docs/technic/SDK/7.4.1/WorkWithBp… что, конечно же, совсем не запросы ESQ.

Александр, спасибо большое за ответ!

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