Добрый день.

Нужна подсказка по использованию функции Charindex в SQL запросах.

 

Используется класс Select для формирования SQL запроса к БД, т.к. подключение некоторых фильтров выполняется при определённый условиях.

К основной таблице идет подключение дополнительной таблицы, которое использует в условии подключения функцию Charindex(и Concat).

Реализовать условие подключения таблицы получилось используя класс Column метод SqlText, но он помечен как Obsolete.

Подскажите каким образом нужно правильно реализовать задуманный функционал?

 

.From("UsrJobPosting")

.InnerJoin("City")

.On("City", "Id")

.IsEqual("UsrJobPosting", "UsrLocationId")

.Or(Column.SqlText("CHARINDEX(CONCAT(City.Name,';'), UsrJobPosting.UsrAdditionalLocations)"))

.IsGreater(Column.Parameter(0))

Нравится

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

В БД формируется такой запрос:

SELECT Name, Data FROM SysModuleReportTable

 

Колонки Data нет в таблице SysModuleReportTable, но это уже детали.

 

Как найти откуда в коде этот запрос генерируется?

Какие есть варианты?

Нравится

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

Евгений, добрый день!

Исходя из таблицы SysModuleReportTable, этот запрос связан с печатными формами. Не могу точно сказать когда именно он формируется, однако, можно поступить следующим образом. Если вы используете mssql, то в меню Manegement->Extended Events->Session и там создать свою сессию, которая будет отлавливать вес запросы уходящие в бд. После запуска этой сессии повыполняйте действия с печатными формами и посмотрите. после чего в бд появляется этот запрос.

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

У меня есть много файлов скриптов 
Есть ли возможность импортировать/добавить их все разом?

Нравится

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

Вам нужно массово выполнить sql скрипты в облачной creatio?

Да

Смотрите, в данной ситуации я бы порекомендовал воспользоваться утилитой clio. Написать батник по запуску скриптов и натравить на облачную систему.

Там есть возможность выполнять sql скрипты на целевой системе

https://github.com/Advance-Technologies-Foundation/clio#execute-custom-…

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

Добрый вечер, возникла задача:
Нужно отфильтровывать SQL-запрос и создавать из него xlsx отчёт.

Фильтрация реализована с помощью хранимой процедуры, в которую из БП передаются значения, выбранные пользователем, но выгрузка в xlsx с помощью ExportToExcel выгружает только esq.

Можно ли как-нибудь перевести StoredProcedure в ESQ? Если нет, то как выгрузить StoredProcedure в xlsx?

 

Нравится

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

Добрый вечер.

 

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

 

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

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

Спасибо. Не подскажите, а как потом хранимую функцию вызвать в БП и передать в esq?

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

И стандартными механизмами работать дальше с ESQ.

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

Случилось так, что у меня слетело время на серверах. стал 2041 год. Исправили. 

Но вохник вопрос а что же с БД произошло? много ли записей с датой в будущем теперь у меня? Ответ - не много - около 1000, все исправил.

Но по ходу пьесы наткнулся на интересную вещь. Чисто логически в БД не должно быть записей с CratedOn или ModifiedOn > GETUTCDATE(). А они есть и не где либо, а в системных таблицах.

Для поиска своих записей из 2041 года набросал скрипт 

if  OBJECT_ID(N'tempdb..#Results') is not null
	Drop Table #Results
 
CREATE TABLE #Results (ColumnName nvarchar(370), Id uniqueidentifier)
 
SET NOCOUNT ON
 
DECLARE @TableName nvarchar(256), @ColumnName nvarchar(128), @SearchStr2 nvarchar(110)
SET  @TableName = ''
WHILE @TableName IS NOT NULL
BEGIN
	SET @ColumnName = ''
	SET @TableName = 
	(
		SELECT MIN(QUOTENAME(TABLE_SCHEMA) + '.' + QUOTENAME(TABLE_NAME))
		FROM 	INFORMATION_SCHEMA.TABLES
		WHERE 		TABLE_TYPE = 'BASE TABLE'
			AND	QUOTENAME(TABLE_SCHEMA) + '.' + QUOTENAME(TABLE_NAME) > @TableName
			AND	OBJECTPROPERTY(
					OBJECT_ID(
						QUOTENAME(TABLE_SCHEMA) + '.' + QUOTENAME(TABLE_NAME)
							), 'IsMSShipped'
						    ) = 0
	)
 
	WHILE (@TableName IS NOT NULL) AND (@ColumnName IS NOT NULL)
	BEGIN
 
		SET @ColumnName =
		(
			SELECT MIN(QUOTENAME(COLUMN_NAME))
			FROM 	INFORMATION_SCHEMA.COLUMNS
			WHERE 		TABLE_SCHEMA	= PARSENAME(@TableName, 2)
				AND	TABLE_NAME	= PARSENAME(@TableName, 1)
				AND	QUOTENAME(COLUMN_NAME) > @ColumnName
				And QUOTENAME(COLUMN_NAME) in ('[CreatedOn]', '[ModifiedOn]')
		)
		IF @ColumnName IS NOT NULL
		BEGIN
 
			INSERT INTO #Results
			EXEC
			(
				'SELECT ''' + @TableName + '.' + @ColumnName + ''', Id  
				FROM ' + @TableName + ' (NOLOCK) ' +
				' WHERE ' + @ColumnName + ' > GETUTCDATE() '
			)
		END
	END	
END
 
SELECT ColumnName, Id FROM #Results

После устранения 2041 года остались записи

ColumnName    Id

[dbo].[SysPackageSchemaData].[ModifiedOn]    2C172889-10E7-460D-A630-91E20CCC9ED8
[dbo].[SysPackageSqlScript].[ModifiedOn]    B2C17845-F2FD-43A9-97DF-946E2D74588C
[dbo].[SysProfileData].[ModifiedOn]    452EB96A-2F2D-4CDC-B244-823DEE7F36EA
[dbo].[SysProfileData].[ModifiedOn]    A46E427B-1514-478C-8F1E-A909B7D32B03
[dbo].[SysProfileData].[ModifiedOn]    349014E2-54AB-41C5-8072-9278D1829F5A
[dbo].[SysProfileData].[ModifiedOn]    B1B78E04-2D3D-414D-BD1F-565D9D96213E
[dbo].[SysProfileData].[ModifiedOn]    553596E4-06D1-4299-B012-F2098849E271
[dbo].[SysProfileData].[ModifiedOn]    D453578C-DB8C-4ECC-918A-26ED068054F4
[dbo].[SysProfileData].[ModifiedOn]    2F316056-B411-4FEF-BBD2-47CC5167320E
[dbo].[SysProfileData].[ModifiedOn]    DD200005-1F2F-4891-B3F2-32EF08CEF537
[dbo].[SysProfileData].[ModifiedOn]    E80BE419-186B-4AFA-A726-8CFC362DCAB1
[dbo].[SysProfileData].[ModifiedOn]    EFE8B4C8-6612-42EB-A39C-2418ACFB532D

 

Если смотреть конкретно по записям SysProfileData, то там дата текущего часового профиля, а не UTC. Т.е. если в моем запросе заменить GETUTCDATE() на GETDATE(), то скрипт больше не выдает эти записи. На либо баг сохранения данных в БД.

Но не дают покоя эти записи 

тут больше похоже на баг в поставке.

Террасофт, что скажите?

И у кого есть такие записи из будущего?

 

Версия 7.17.1

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

Добрый день, Алексей.

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

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

 

Доброго времени суток!

Прошу подсказать - столкнулся с такой задачей:

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

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

В чем может быть проблема?

Нравится

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

Добрый день.

 

Вносите данные через пункт [Импорт данных] главного меню:

 

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

Добрый день. При добавлении обращения любым способом такая ошибка. Помогите! Что делать? Поддержка игнорит нас((( The INSERT statement conflicted with the FOREIGN KEY constraint "FKHt8lBgKfy2jprTXzDRFvnS56zg". The conflict occurred in database "bpmpredprod", table "dbo.Case", column 'Id'. The statement has been terminated. ---> System.Data.SqlClient.SqlException: The INSERT statement conflicted with the FOREIGN KEY constraint "FKHt8lBgKfy2jprTXzDRFvnS56zg". The conflict occurred in database "bpmpredprod", table "dbo.Case", column 'Id'. The statement has been terminated.

Нравится

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

Уверены, что ошибка именно в коробочном функционале?

Скорее всего есть какая-то доработка на именно вашем сайте (напр. процесс), которая пытается добавить записи на деталь обращения, но подставляет неверный Id записи обращения.

Либо же логика пытается добавить записи на деталь ДО сохранения обращения в БД. Все заполнения деталей возможны только после сохранения основной записи в базу данных.

Уверены, что ошибка именно в коробочном функционале?

Скорее всего есть какая-то доработка на именно вашем сайте (напр. процесс), которая пытается добавить записи на деталь обращения, но подставляет неверный Id записи обращения.

Либо же логика пытается добавить записи на деталь ДО сохранения обращения в БД. Все заполнения деталей возможны только после сохранения основной записи в базу данных.

Владислав Литвинчук,

Ошибка возникла после обновления на версию 7.16.
До этого все работало стабильно. Мне кажется при таком раскладе дело не в логике.
Есть еще какие-то варианты?
Спасибо!

Надежда, это ссылка на Case из таблицы CaseLifecycle. Проверьте, нет ли у Вас  каких-то доработок в этом объекте или его страницах, которые могли сломаться при обновлении. Если нет и сломалось обновление системы без доработок, лучше обратиться к поддержке.

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

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

Добрый день, Александр!
Доработки ЖЦ были, переопределили схему в нашем пакете: добавлено поле в объект, и добавлено отслеживание изменений этого поля в объекте Case и его запись в ЖЦ. 
Как можно оперативно исправить ошибку? Спасибо за помощь!

Действительно проблемы были из-за доработок событийных процессов объекта Case. В новой версии 7.16 добавилась колонка CaseRecordId в объекте CaseLifeCycle, которая не обрабатывалась у нас.
Всем спасибо!

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

Всем привет. Столкнулся с такой проблемой:

Очень долго выполнялась бизнес-логика, когда пользователь CRM в странице редактирования Обращения пытается подгрузить шаблон письма. 
Запустил в SQL Profiler трасировку, выполнил действие, нашел.
Заметил, что Duration гораздо больше CPU + Reads, и нет никакого плана выполнения для такого запроса.
Сталкивался ли кто с подобной ситуацией? Какие меры предпринимали?
Я так понимаю, что рано или поздно данная ситуация возникает у всех, если развивать СРМ с куча интеграций и т.п., получения обращений в систему с 5 почт, подключением сотрудников в количестве от 30-48.
Ресурсов у сервера БД достаточно, 2 виртуалки, по 2 ТБ памяти, по 98 ГБ ОЗУ, процессор 2.4Ггц X 12 ядер.

Нравится

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

Саид, как видно со скриншота, это запрос на вставку в таблицу активностей записи с названием "Диагностировать и решить инцидент #...".

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

Или дело в какой-то глобальной блокировке на таблицу, наложенную одновременнно работающей другой логикой.

Не пробовали аналогичный запрос (естественно, с другим Id) запускать из Management Studio вручную, так тоже тормозит?

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

Да, это на добавление активности "Диагностировать  и решить инцидент ..." запись в трасировке, я забыл в описании указать. В следующий раз попробую через Management Studio выполнить запрос. Вот не знаю почему, но после добавления 2 индексов в SysCaseRight действия такие, как Отправка письма в обращении и т.д., переход между состояниями в кейсе страницы редактирования, стали работать быстрее заметно.

Саид, после добавления индексов ускорилась же не работа конкретного запроса вставки активности, а всё действие? Может, там перед этим (или после) ещё был длительный запрос чтения обращений с учётом прав, он и ускорился?

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

Да, он ускорился.

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

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

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

Добрый день, всем. Очень долго выполняются запросы связанные с UpdateQuery, SelectQuery, InsertQuery. Кто-нибудь сталкивался с этим? Какие пути использовали, для нахождения проблемы?

Нравится

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

Для анализа запросов есть профайлер в mssql. Запускаете профайлере, делаете запрос из клиентской части. Смотрите какой sql для select получается в профайлере.

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

И еще creatio требовательна к ресурсам, если вам кажется что все работает медленно, то стоит проанализировать производительность ваших серверов.

Для анализа запросов есть профайлер в mssql. Запускаете профайлере, делаете запрос из клиентской части. Смотрите какой sql для select получается в профайлере.

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

И еще creatio требовательна к ресурсам, если вам кажется что все работает медленно, то стоит проанализировать производительность ваших серверов.

В profiler смотрел, запросы выполняются за доли миллисекунд.
Websocket работает отлично.
Запросы выполняются долго в момент переключения состояния Обращения, вот что заметил. Пока не отлаживал сам процесс перехода состояний, но может уже кто-то сталкивался с этим.

Саид Иманмагомедов,

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

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

Показать все комментарии
SELECT SysRoleId 
FROM SysUserInRole 
WHERE SysUserId = '7F3B869F-34F3-4F20-AB4D-7480A5FDF647'
UNION SELECT '7F3B869F-34F3-4F20-AB4D-7480A5FDF647'

Как реализовать это в Terrasoft.Core.DB.Select ??

Нравится

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

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

Пример такого использования есть в функции DeactivateProcessEntryPoint схемы ProcessUserTaskUtilities:

var processListenersSelect =
	new Select(userConnection)
		.Column("Id")
	.From("SysEntityCommonPrcEl")
	.Where("RecordId").IsEqual(entityIdParameter)
	.And("RecordChangeType").IsEqual(Column.Parameter(EntityChangeType.Updated));
var select =
	new Select(userConnection)
		.Column("Id")
	.From("EntryPoint")
	.Where("EntityId").IsEqual(entityIdParameter)
	.And("IsActive").IsEqual(Column.Parameter(true))
	.Union(processListenersSelect);

А получить во втором колонку-константу можно при помощи:

Column.Parameter(new Guid("7F3B869F-34F3-4F20-AB4D-7480A5FDF647"))

 

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

Пример такого использования есть в функции DeactivateProcessEntryPoint схемы ProcessUserTaskUtilities:

var processListenersSelect =
	new Select(userConnection)
		.Column("Id")
	.From("SysEntityCommonPrcEl")
	.Where("RecordId").IsEqual(entityIdParameter)
	.And("RecordChangeType").IsEqual(Column.Parameter(EntityChangeType.Updated));
var select =
	new Select(userConnection)
		.Column("Id")
	.From("EntryPoint")
	.Where("EntityId").IsEqual(entityIdParameter)
	.And("IsActive").IsEqual(Column.Parameter(true))
	.Union(processListenersSelect);

А получить во втором колонку-константу можно при помощи:

Column.Parameter(new Guid("7F3B869F-34F3-4F20-AB4D-7480A5FDF647"))

 

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