Публикация

И снова про запросы - 2

И вновь продолжу тему запросов...
В скриншотах результаты исполнения одного и того же запроса в TSAdmin и в MS SQL Studio

Разница в общем видна - простой цифрой 1 в select для получения самой поздней по времени записи не обойтись

Из администратора

А вот студия


Я конечно в обход напишу, или из датасета первую запись после сортировки возьму, или вообще хранимку сделаю - но как-то некрасиво
Сервис в аттаче, если что...

Нравится

Поделиться

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

А можно вопрос по самому запросу. Просто интересно
Запрос у вас какой-то хитрый. Group By по первичному ключу ничего не сделает, т.е. вы получите результат как и без Group by.
Или это просто пример такой?

Александр, хочу уточнить: не выполнение

"Александр Кудряшов" написал:запроса в TSAdmin

а предпросмотр запроса в TSAdmin. Выполнение SelectQuery.Open() в скриптах Terrasoft при установленном TOP 1 вернёт одну запись. Поэтому некрасиво, но на реальный результат не влияет.

"Евгений Либин" написал:Group By по первичному ключу ничего не сделает

Евгений, если в сервисе запроса используются агрегатные функции, автоматически устанавливается группировка по остальным полям.

Так даты отсортированы в обратном порядке, и потребности в MAX нет.

Да, в этом с Вами согласен.

"Евгений Либин" написал:Запрос у вас какой-то хитрый. Group By по первичному ключу ничего не сделает, т.е. вы получите результат как и без Group by.
Или это просто пример такой?

Это сгенерил TSAdmin, я б такое не придумал:wink:

"Евгений Либин" написал:Так даты отсортированы в обратном порядке, и потребности в MAX нет.

Вы правы, нет потребности, погорячился, перестраховался. Минус один мне:sad:

"Лабьяк Олег Игоревич" написал:Выполнение SelectQuery.Open() в скриптах Terrasoft при установленном TOP 1 вернёт одну запись. Поэтому некрасиво, но на реальный результат не влияет.

Не соглашусь. Я тоже так думал:)

var Query = Services.GetNewItemByUSI('sq_ActInDocument');
var Dataset = Query.Open();

Результат виден здесь

Поэтому верно будет только в случае создания нового сервиса Dataset на основании данного запроса и обращении именно к нему Dataset.Open() - тогда все замечательно, одна запись.

"Александр Кудряшов" написал:Вы правы, нет потребности, погорячился, перестраховался. Минус один мне

Я сам, когда заработаюсь так что глаза из орбит лезут, такого накручу... что на утро приходится всё "оптимизировать":lol:

"Александр Кудряшов" написал:Не соглашусь. Я тоже так думал:)

По поводу RecordsCount - оно посчиталось в результате запроса вида select count() .. и ваши условия.
При чем вероятней всего оно считается как раз на get методе этого свойства.
PageRecordsCount - у вас как раз 1. То есть все так как сказал Олег.
Просто видимо TOP 1, при формирования запроса, вставляется толи в последнюю очередь то ли ..

А нет.. у вас по 1 записи на страницу и страниц 13 как и RecordsCount. Значит что-то не так, да..

"Доленко Юрий" написал:А нет.. у вас по 1 записи на страницу и страниц 13 как и RecordsCount. Значит что-то не так, да..

Вот и я когда экземпляр датасета в скрипте получил, удивился:)
Сервис датасет, подчеркну, работает как надо - только не всегда хочется им пользоваться...

[update] Разобрался.
Интересный момент - профайлер показывает абсолютно идентичный запрос! И при Dataset.Open() и при Query.Open() идет такой запрос

SELECT TOP 1
	[tbl_Document].[ID] AS [ID],
	CAST(CONVERT(VARCHAR(8), [tbl_Document].[Date], 112) AS DATETIME) AS [Date]
FROM
	[dbo].[tbl_Document] AS [tbl_Document]
ORDER BY
	2 DESC

Но в случае query запись возвращается в получаемый датасет одна и та же, но столько раз, сколько их всего (как при select .... без TOP 1 - получается dataset c несколькими одинаковыми записями) а при query - одна:smile:

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

А вы явно не указывали FetchRecordsCount = 1 ?
Если нет, то попахивает костылем в ядре )

"Доленко Юрий" написал:А вы явно не указывали FetchRecordsCount = 1 ?
Если нет, то попахивает костылем в ядре )

Не пробовал... долго писал апдейт к прошлому своему же комментарию - нашел решение:smile:

Кстати, к Администратору - а не надо ли нам опцию сделать такую, что нельзя редактировать свой комментарий если на него уже ответили? сейчас идею заведу

"Доленко Юрий" написал:А вы явно не указывали FetchRecordsCount = 1 ?

Думаю, не особо поможет. Поскольку

"Александр Кудряшов" написал:Сервис датасет, подчеркну, работает как надо - только не всегда хочется им пользоваться...

а для SelectQuery нет возможности установить значение свойству FetchRecordsCount по причине его отсутствия. Когда же выполнится var Dataset = SelectQuery.Open(), изменять это свойство уже поздно.

вопрос снят.

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