Здравствуйте!
Существует ли инструкция по обновлению продуктов Creatio на ОС Linux?  Как перейти на новую версию? 
Как этот:
https://academy.terrasoft.ru/docs/release/instrukciya-po-obnovleniyu-si…
 

Нравится

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

Добрый день, Айнур!

 

Для получения инструкции и необходимых файлов для обновления на NetCore, необходимо обратиться к технической поддержке Terrasoft по адресу support@terrasoft.ru.

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

Продолжение темы: https://community.terrasoft.ru/questions/vopros-po-updateselect-k-razra…

 

Зачем в классе Terrasoft.DB.PostgreSql.PostgreSqlEngine в методе BuildUpdateSelectTargetSqlText(StringBuilder sb, ModifyQuerySource modifySource, string alias) код "string value = " \"" + alias + "\""; sb.Append(value);" ?

Класс генерирует неправильный запрос в БД:

var us =
	new UpdateSelect(_userConnection, "Contact", "c")
		.Set("Name", Column.Parameter("Andrew Baker (sample) + 1"))
		.From("Contact", "c")
		.InnerJoin("Account").As("a").On("a", "Id").IsEqual("c", "AccountId")
		.Where("a", "Web").IsEqual(Column.Parameter("ac.com"))
		.And("c", "Id").IsNotEqual(Column.Parameter(Guid.NewGuid()))
	as UpdateSelect;
UPDATE "public"."Contact" "c"
SET
	"Name" = 'Andrew Baker (sample) + 1'
FROM
	"public"."Contact" "c"
	INNER JOIN "public"."Account" "a" ON "a"."Id" = "c"."AccountId"
WHERE
	"a"."Web" = 'ac.com'
	AND "c"."Id" <> '{19812101-C7A9-4DED-BD44-F8973A98D746}'

Результат выполнения:

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

Нравится

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

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

var us =
                new UpdateSelect(UserConnection, "Contact", "c")
                    .Set("Name", Column.Parameter("Andrew Baker (sample) + 2"))
                    .From("Contact", "ca")
                    .InnerJoin("Account").As("a").On("a", "Id").IsEqual("ca", "AccountId")
                    .Where("a", "Web").IsEqual(Column.Parameter("ac.com"))
                    .And("ca", "Id").IsNotEqual(Column.Parameter(Guid.NewGuid()))
                as UpdateSelect;

Как и в случае с методом ReplaceUpdateTargetAliasWithName, эта строка нужна для правильного построения запроса. С ней были проведены тесты и они показали правильность её работы.

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

Зачем в классе Terrasoft.DB.MSSql.MSSqlEngine в методе BuildConditionSqlText(StringBuilder sb, UpdateSelect query) вызов метода ReplaceUpdateTargetAliasWithName(QueryCondition condition, string alias, string name) ?

 

Класс генерирует неправильный запрос в БД:

var us =
	new UpdateSelect(_userConnection, "Contact", "c")
		.Set("Name", Column.Parameter("Andrew Baker (sample) + 1"))
		.From("Contact", "c")
		.InnerJoin("Account").As("a").On("a", "Id").IsEqual("c", "AccountId")
		.Where("a", "Web").IsEqual(Column.Parameter("ac.com"))
		.And("c", "Id").IsNotEqual(Column.Parameter(Guid.NewGuid()))
	as UpdateSelect;

 

UPDATE [dbo].[Contact]
SET
        [Name] = N'Andrew Baker (sample) + 1'
FROM
        [dbo].[Contact] [c]
        INNER JOIN [dbo].[Account] [a] ON ([a].[Id] = [c].[AccountId])
WHERE
        [a].[Web] = N'ac.com'
        AND [Contact].[Id] <> '{19812101-C7A9-4DED-BD44-F8973A98D746}'

Результат выполнения:

При этом если бы упомянутый выше метод не вызывался, то запрос был бы верным:

Нравится

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

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

Прошу уточнить, при каких условиях у вас генерируется этот запрос?

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

var us =
                new UpdateSelect(UserConnection, "Contact", "c")
                    .Set("Name", Column.Parameter("Andrew Baker (sample) + 2"))
                    .From("Contact", "ca")
                    .InnerJoin("Account").As("a").On("a", "Id").IsEqual("ca", "AccountId")
                    .Where("a", "Web").IsEqual(Column.Parameter("ac.com"))
                    .And("ca", "Id").IsNotEqual(Column.Parameter(Guid.NewGuid()))
                as UpdateSelect;

Сам метод ReplaceUpdateTargetAliasWithName добавлен не просто так, он необходим для правильного построения запросов.

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

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

Update SysUsrCommercialOfferRight
set SysUsrCommercialOfferRight.SysAdminUnitId = sysNewOwner.id,
SysUsrCommercialOfferRight.SourceId = N'66EA17F7-DF1D-4058-91CA-09A2057DEAE8' 
FROM SysUsrCommercialOfferRight AS sysRights
	INNER JOIN UsrCommercialOffer AS offer ON sysRights.RecordId = offer.Id
	INNER JOIN Account ON Account.Id = offer.UsrAccountId 
	INNER JOIN Contact AS newOwner ON newOwner.Id = Account.OwnerId 
	INNER JOIN SysAdminUnit AS sysNewOwner ON sysNewOwner.ContactId = newOwner.Id 
WHERE sysRights.SourceId = N'4220CFBA-0514-44CE-ADD0-109B54B52084' 
AND sysRights.CreatedById != sysNewOwner.Id

 

Нравится

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

Вот документация https://academy.terrasoft.ru/api/netcoreapi/7.17.0/index.html#Terrasoft… классы Update, Select, Join. Читайте и реализуйте.

Версия 7.15

Вот документация https://academy.terrasoft.ru/api/netcoreapi/7.17.0/index.html#Terrasoft… классы Update, Select, Join. Читайте и реализуйте.

Илья, если стандартными предложенными выше механизмами не получится, можно ещё создать CustomQuery (выполняющий текст SQL-запроса), либо же создать на сервере БД хранимую процедуру с этим содержимым и запускать её при помощи класса StoredProcedure.

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

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

Стоит задача обновить стенд (с этим всё ясно) + сменить продукт с SalesEnterprise на SalesEnterprise_Marketing_ServiceEnterprise.

Попробовал в лоб, вписал в поле "Product" файла downloader.json заданный задачей продукт. Updater.exe выдаёт на такое: "You are using an invalid build type. You need to obtain SalesEnterprise..."

 

Смена продукта "на лету" вообще возможна? Может кто сталкивался? Как решается данный вопрос?

Нравится

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

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

Здравствуйте, Сергей!

Чтобы обновиться на бандл, необходимо и достаточно только установить в конфиге утилиты обновления значение Feature-SkipProductValidation  в true:

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

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

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);

 

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

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

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

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

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

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

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

Например, есть запрос на 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." разве не говорит о том, что утилита завершила свою работу?

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

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

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

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

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