Просьба помочь собрать такой запрос при помощи класса select

select count(ID)

   from [dbo].[Case] AS TI

WHERE DATEPART(HOUR, DATEADD(hh, 6, TI.[UsrDueDate])) >=9  and DATEPART(HOUR, DATEADD(hh, 6, TI.[UsrDueDate])) <12

and FORMAT(DATEADD(hh, 6, TI.[UsrDueDate]), N'yyyy.MM.dd') = FORMAT(cast(GETDATE() +1 as date), N'yyyy.MM.dd')

Заранее спасибооо! 

Нравится

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

Добрый день, Адилет.

 

Вы можете настроить SQL-представление (view) с нужным условием.

 

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

 

Или же попробовать сделать по аналогии с примерами запросов по этой ссылке.

Alla Savelieva,

Благодарю, будем пробовать.

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

Продолжение темы: 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 добавлен не просто так, он необходим для правильного построения запросов.

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

Нет возможности в запросе (Select, Update и др.) указать математические функции, например: CEILING, FLOOR, ROUND и др.

Через Func.CustomFunction вызвать функцию нельзя, так как генерируется некорректный SQL текст, например для MS SQL:

[dbo].[CEILING](..params..)

а нужно без dbo:

CEILING(..params..)

Нет возможности выполнить элементарный запрос

UPDATE Contact
SET SomeContactColumn = CEILING(OtherContactColumn / 3)
WHERE Id = 'some id'

 

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

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

Пожелание зарегистрировано и передано аналитикам продукта.

Пока что для реализации Вашего запроса используйте CustomQuery.

Пример: CustomQuery(userConnection, sqlText)

Показать все комментарии
var contactIds = new List<Guid>();
var select = new Select(_userConnection).Distinct()
	.Column("SysAdminUnit", "ContactId")
	.From("SysAdminUnit").WithHints(Hints.NoLock)
	.Join(JoinType.Inner, "SysUserInRole").WithHints(Hints.NoLock)
		.On("SysAdminUnit", "Id").IsEqual("SysUserInRole", "SysUserId")
	.Where("SysUserInRole", "SysRoleId").IsEqual(Column.Parameter(roleId))
	.And("SysAdminUnit", "Active").IsEqual(Column.Parameter(true)) as Select;
 
select.ExecuteReader(dataReader =>
{
	contactIds.Add(dataReader.GetColumnValue<Guid>("ContactId"));
});

 

Нравится

Поделиться

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

Если суть публикации в том, что можно коротко без using считать коллекцию, то есть еще более "модный" способ с помощью Linq.

var contactIds = select.ExecuteReader(dataReader =&gt; dataReader.GetColumnValue&lt;Guid&gt;("ContactId")).ToList();

 

Владислав Литвинчук пишет:

ExecuteReader

На методе ExecuteReader типа void, вызывать .ToList() - очень модноsmiley.

Тогда уж лучше так : 

select.ExecuteReader( reader =&gt; contactIds.AddRange( reader.GetAllColumnValues&lt;Guid&gt;( "ContactId" ) ) );

 

virimm,

Прошу прощения за опечатку. Метод ExecuteEnumerable

var contactIds = select.ExecuteEnumerable(dataReader =&gt; dataReader.GetColumnValue&lt;Guid&gt;("ContactId")).ToList();

 

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

Что-то новенькое yes. А это в какой версии приложения?

virimm пишет:

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

Что-то новенькое yes. А это в какой версии приложения?

Точно не скажу, но пользуюсь давно уже, с 715 точно. 

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

Добрый день. Как реализовать вложенный OR с помощью Terrasoft.Core.DB.Select?

select id from account
where id = '123'
and (name = 'dsfsdf' or TypeId = 'wrew234')

 

Нравится

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

Илья, нужно использовать OpenBlock и CloseBlock.

Пример есть тут.

Илья, нужно использовать OpenBlock и CloseBlock.

Пример есть тут.

Показать все комментарии
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"))

 

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

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

Кто нибудь сталкивался с задаче формирования json объекта на ур-не SQL запроса?

Интересует возможно ли решить данную задачу через класс Select. Чистым SQL запросом знаю как сделать:

SELECT ES.Id AS [Id],
		ES.DayOfWeekId AS [DayOfWeekId],
		DOF.[Name] AS [DayOfWeekName],
		ES.AbTimeFrom AS [TimeFrom],
		ES.AbTimeTo AS [TimeTo],
		ES.EmployeeId AS [EmployeeId]
FROM [AbEmployeeSchedule] ES WITH(NOLOCK)
LEFT JOIN [DayOfWeek] DOF WITH(NOLOCK) ON ES.DayOfWeekId = DOF.Id
FOR JSON PATH

 

Нравится

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

Решить через класс Select нельзя но чуть ниже есть примеры выполнения пользовательского sql скрипта на bpm

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

через CustomQuery знаю как. Интересовало есть ли возможность непосредственно через класс Select. Благодарю.

Насколько понял, прямой поддержки этой функциональности в классе Select нет. А обходные варианты можно придумать разные, например, view и привязанный к ней объект. Также обратите внимание на метод SerializeToJson у Entity, позволяющий сериализировать в JSON полученную отдельную запись.

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

Благодарю.

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

Приветы, помогите как написать запрос на esq или select

SELECT TOP 1000 aa.[Id]

      ,aa.[AddressTypeId]

      ,aa.[Address]

      ,aa.[AccountId]

      ,aa.[SxSubwayStationId]

  FROM [BetaPressBPM].[dbo].[AccountAddress] aa, [BetaPressBPM].[dbo].[Account] a

  aa.AccountId = a.Id and a.Id = 'AcountId_Value' 

  and aa.AddressTypeId='FB7A3F6A-F36B-1410-6F81-1C6F65E50343'

 

Нравится

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

Тут зависит от того, где будет писаться запрос: на сервере или у клиента. 

Если у клиента: https://academy.terrasoft.ru/documents/technic-sdk/7-11/ispolzovanie-entityschemaquery-dlya-chteniya-dannyh-iz-bd

Если на сервере: https://academy.terrasoft.ru/documents/technic-sdk/7-11/crud-operacii-na-servere

Для TOP 1000 нужно использовать RowCount на сервере или rowCount на клиенте.

Все остальное достаточно подробно и с примерами описано на академии по ссылкам выше.

Золотарев Артем Андреевич,

Спасибо,

Мы нашли вот такую возможность https://prnt.sc/ix4znc

Покажите пример как сие настроить кодом?? 

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

 

Вот ссылка, где описаны бизнес-правила, создаваемые из кода, а не мастера: https://academy.terrasoft.ua/documents/technic-sdk/7-12/biznes-pravila-i-ih-primenenie Там еще 5 вложенных статей (посмотрите в левой части в содержимом).

Там достаточно подробно описано применение с примерами.

Золотарев Артем Андреевич,

Посмотрел, спасибо. В коде не разобрался как указать что справочник и конкретное значение справочника. И есть вот такая задача (хак нужен):

Дано

 

Есть самописная страница на которую добавлена ссылка из cti panel и вроде как удобно пользователям

 

Найти

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

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

У обычной самописной страницы не получится вызвать визуальный редактор. Мастер разделов работает со связкой Объект-Раздел-Страница. 

Золотарев Артем Андреевич,

Вид адреса у нее

http://practice-clone.local/0/Nui/ViewModule.aspx#CardModuleV2/SxCandid…

подменили все как положено, но из меню <вид> -> <открыть дизайнер страницы>  ничего не открывается, хотя вроде как связка соблюдена

Вероятнее всего страница редактирования не привязана к сущности.

Посмотрите подобный вопрос по ссылке: https://community.terrasoft.ua/questions/registracia-stranicy-redaktirovania-obekta

Там в комментариях достаточно хорошо описали порядок действий.

Золотарев Артем Андреевич,

Да, там не соответствие корневых схем... 

https://prnt.sc/j1pqw3 вот как такое кодом сделать в rules? есть пример

Пример бизнес-правил есть тут: https://academy.terrasoft.ru/documents/technic-sdk/7-12/primer-primeneniya-pravila-filtration, а пути к колонкам пишуться как в EntitySchemaQuery

Золотарев Артем Андреевич,

Угу, спасибо

 

Вот у меня есть БП созданное мастером, такое же нужно перенести на самописную страницу

                "BpDicWorkAddr": {

                    "efe924fb-a8b5-4522-870f-ca545fe50156": {

                    "uId": "efe924fb-a8b5-4522-870f-ca545fe50156",

                    "enabled": true,

                    "removed": false,

                    "ruleType": 1,

                    "baseAttributePatch": "AddressType",

                    "comparisonType": 3,

                    "type": 0,

                    "value": "fb7a3f6a-f36b-1410-6f81-1c6f65e50343",

                    "dataValueType": 10

                    }

                }


 

"efe924fb-a8b5-4522-870f-ca545fe50156" - это наверно произвольное имя, а вот дальше какие гуиды не так очевидно???

QArt,

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

Золотарев Артем Андреевич,

Это бизнес правило, код которого создан мастером, уже разобрался, можно просто уникализировать

efe924fb-a8b5-4522-870f-ca545fe50156, например, efe924fb-a8b5-2222-870f-ca545fe50156 и вставить этот код в другую схему самописной страницы и оно заработало :)

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

Приветы,

Учусь, читал всякое, например, https://academy.terrasoft.ru/documents/technic-sdk/7-8/rabota-s-filtram… не разобрался, подскажите плиз???

 

По смыслу нужно проверять есть ли звонки и считать сколько их

т. е. нужен Exists, Insert, Update

Как сделать запрос:

select CallCount from 

AACandCall a,

SxCandidate c

where

a.IdCand = c.Id

Нравится

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

Добрый день

Ну во-первых следует избегать декартовых произведений (* from a, b)

Во-вторых можно посмотреть как это сделано в системе, к примеру методом поиска  нужно текста среди загруженных на клиент js файлов

Далее, на community есть много статей, к примеру https://community.terrasoft.ru/articles/opisanie-osnovnyh-metodov-entityschemaquery-cast-1

Поищите на community по тексту EntitySchemaQuery

 

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