Просьба помочь собрать такой запрос при помощи класса 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,

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

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

Нет возможности в запросе (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)

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

Как в SelectQuery добавить фильтр Greater на колонку CreatedOn

Нравится

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

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

А где нужно на сервере или на клиенте?

c# esq.Filters.Add(esq.CreateFilterWithParameters(FilterComparisonType.Greater, "CreatedOn", ТвояДата));

js filterGroup.add("Sort", Terrasoft.createColumnFilterWithParameter(Terrasoft.ComparisonType.GREATER, "CreatedOn", "ТвояДата"));

На всякий случай еще есть GREATER_OR_EQUAL

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

Доброго времени суток, коллеги.
Клиент TerrasoftCRM 3.3.2.245
Такая проблема: на основании данного форума я сделал сервис SelectQuery:

SELECT
        1 AS [a] INTO #tmp
DROP TABLE #tmp

EXEC GetMissingDocuments
/*  AS [FakeHeader],
         AS [DocNumber],
         AS [TaskID],
        */

IF 1=0
SELECT 1 AS [FakeFooter]
FROM
        [dbo].[tbl_DatabaseInfo] AS [tbl_DatabaseInfo]

и вызывал через него хранимую процедуру. Вызывал так:
[js]
var SelectQuery = GetSingleItemByCode('sq_GetMissingDocuments', 'GetMissingDocumentsTasks');
var Result = SelectQuery.Open();
[/js]
Пока база работала на MS SQL Server 2005 все было нормально. После перехода на SQL Server 2008 R2 при вызове SelectQuery.Open() получаю ошибку "Ошибка открытия источника данных "".
Оригинальное сообщение об ошибке: Неопознанная ошибка". Причем если выполнить этот запрос в SSMS, то он выполняется корректно. В SQL Server Profiler ошибок тоже нет. На клиентском компьютере установлена версия SQL Native Client 2008 R2. Куда еще можно копнуть?

Нравится

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

Можно переделать логику чисто на скрипт, без сервиса. Как тут.

"Зверев Александр" написал:Можно переделать логику чисто на скрипт, без сервиса.

Моя хранимая процедура возвращает таблицу. Ее можно завернуть в выходной параметр хранимой процедуры?

Можно процедуру в функцию переделать, с функциями в 2008 проблем не было. Также см. обсуждение, там тоже под новую версию переделывали.

"Зверев Александр" написал:Можно процедуру в функцию переделать

Попробую конечно, но все равно не понятно. У меня в базе есть еще одна аналогичная конструкция. Отличается тем, что ХП в ней получает параметры и результат достается через Dataset и отображается на форме. И она прекрасно работает.

Подобные способы использования что процедуры, что функции являются «хаком» и обходом стандартного поведения сервиса sq, их работа всегда и везде не гарантируется. Возможно, в 2008 что-то изменилось в движке работы с БД.

"Riptor" написал:И она прекрасно работает.

Это хорошо.:cool:

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

¡Hola!

Господа, в своём скрипте (scr_Script) имею

var sq = Services.GetNewItemByUSI('sq_SelectQuery');

sq_SelectQuery имеет вид
SELECT
    [tbl_First].[ID] AS [ID],
    [tbl_First].[Name] AS [Name]
FROM
    [dbo].[tbl_Second] AS [tbl_Second]
LEFT OUTER JOIN
    [dbo].[tbl_First] AS [tbl_First] ON [tbl_First].[FK] = [tbl_Second].[ID]
WHERE([tbl_Second].[ID] = [tbl_First].[FK]

Из скрипта необходимо добавить к sq фильтр типа CustomSQLFilter:
[tbl_Second].[Name] = 'Some string'

со строкой определённой в скрипте (обработчике)
Вывести результат и сбросить фильтр до следующего возникновения события с иной строкой.

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

С уважением
Ваш коллега.

Нравится

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

Добавляете в дизайнере в sq ещё один фильтр с текстовым параметром, затем его налагаете функцией ApplyDatasetFilter (для SelectQuery аналогичная ApplySelectQueryFilter).

Примеры можно найти в конфигурации по названию функции.

От теории к практике.
Не совсем пойму, как создать фильтр с текстовым параметром (я совсем новичок, ещё недели нет, как окунулся в TerraSoft).
Как я понял в самом SelectQuery с фильтра надо будет снять галку. А в коде применять его функцией

ApplySelectQueryFilter(sq, 'filter_name', 'здесь моя строка с которой хочу сравнивать поле указанное в фильтре', true (который говорит что галку надо поставить и применить фильтр));

Верный ли мой ход мыслей?

Верно. В дизайнере sq создаёте параметр, затем там же создаёте фильтр сравнения нужного поля с этим параметром.

Кроме sq лучше создать в дизайнере сервис ds и работать программно уже с ним.

"Зверев Александр" написал:Кроме sq лучше создать в дизайнере сервис ds и работать программно уже с ним.

То есть этот фильтр сразу применять к набору данных не затрагивая sq?

ApplyDatasetFilter(ds, 'filter_name', 'temp_string', true);

Никаких дополнительных манипуляций не требуется? а то у меня object Error выбрасывается.

А всё заполнено правильно в sq и ds?

"Litvyakov Yegor Vladimirovich" написал:Никаких дополнительных манипуляций не требуется? а то у меня object Error выбрасывается.

Название фильтра и параметра в sq должны совпадать.
Например:
/system/files/sq.png

Премного благодарен!
+10 к пониманию того что делаю =)
Всем ещё раз спасибо!

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

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

При этом обращение к тем же таблицам средствами дизайнера отчетов вполне успешно. В чем же секрет?

Дело в том, что если таблица администрируется по записям, дизайнер запросов при работе под пользователем автоматически подставляет вместо нее представление. А поскольку CustomSQL-колонки вставляются в запрос как есть, в результате у пользователя нет доступа к таблице, и есть доступ к предоставлению.

Схема работы:
selectquery

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

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

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

Нравится

Поделиться

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

"Alimova Anna" написал:

Есть еще один способ - сразу указать в CustomSQLColumn представление таблицы. Однако такой способ медленнее


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

Ну, а самое забавное начинается, когда таблица начинает администрироваться по полям =)

Максим, и что же начнется? :)

В случае добавления безобидной колонки Account.Name
И удалении прав на чтение этой колонки:

TSObjectLibrary.DBDataset: Ошибка открытия источника данных "ds_Account". 
Оригинальное сообщение об ошибке: The SELECT permission was denied on the column 'Name' of the object 'vw_Account", database 'XXX', schema 'dbo'

Это потому, что она ключевая? о_О

И еще: как это обойти?

Нет, это потому, что на нее доступ запрещен на уровне БД в самой таблице(и как следствие во вьюхе). Ядро в таком случае колонки заменяет на NULL, чтоб к ним вообще обращение не шло.
Пока мне известен один способ обхода - создавать отдельную функцию и использовать в CustomSQLColumn:

fn_GetAccountNameByID(Account.ID)
Показать все комментарии

Пример запросов
1.SELECT * FROM dbo.tbl_Account
2.Добавление основных колонок в запрос.
Использование FilterSet в условии Where,
выбор логики FilterSet для соединения условий (OR, AND).
Для выбора используются два параметра
3.Использование IsNull фильтра
Использование Like фильтра
Добавление колонки константы
Добавление колонки с текстом SQL
Добавление подзапроса с использованием агрегирующей функции
Проверка результатов в SQL Server Management Studio
Использование SQL Server Profiler для просмотра SQL запроса в БД

Для просмотра формата Camtasia необходим Camtasia Player
http://download.techsmith.com/camtasiastudio/player/camplay.zip

Нравится

Поделиться

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

Плеер который здесь указан, не читает этот файл. Как посмотреть это видео?

Я снимал данное видео в Camtasia Studio 7, если вы установите данную программу, проблем не будет
Если такой вариант не подойдет, буду искать варианты конвертации видео.

Ваше видео смог воспроизвести только в Camtasia Studio и то почему то звука нет, или его не должно быть?

Ринат, видео не озвучено.

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

Добавив фільтр типу IN і в підзапиті чотири фільтри.

З головним фільтром все OK, а от до фільтрів підзапиту доступу отримати не вдається,-
говорить, що TestExpression.ExpressionSelectQuery null або не об'єкт.

Дивився поради в темі
Включение фильтра типа Exists.Достучаться до фильтров в Подзапросе :-)

Вставив "Dataset.SelectQuery.LoadUserFilters();"
очікуваного ефекту не отримав.

function edtContactIDOnPrepareSelectWindow(LookupDataControl, SelectWindow) {
        var Dataset             = LookupDataControl.DataField.LookupDataset;
        var UserType    = CIUEdit.UserType;
        var UserKind    = CIUEdit.UserKind;
//
        Dataset.SelectQuery.LoadUserFilters();
//
        var SelectQuery         = Dataset.SelectQuery;
        var     CIUFilter               =
                SelectQuery.Items(0).Filters.ItemsByCode('ConfigurationItemUser');
        EnableFilter(CIUFilter  ,'ConfigurationItemUser'        ,true);
       
        var SubSelectFilters =
                CIUFilter.TestExpression.ExpressionSelectQuery.Items(0).Filters;
        for (var i = 0; i SubSelectFilters.Count; i++) {
                MessageBox(SubSelectFilters.Items(i).Code);
        }
}

Нравится

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

Здається знайшов, - треба використовувати дещо інші члени для фільтра типу 'Include':

var ValuesExpressions = CIUFilter.ValuesExpressions;
var SubSelectFilters =
ValuesExpressions.Items(0).ExpressionSelectQuery.Items(0).Filters;

тоді конструкція

for (var i = 0; i < SubSelectFilters.Count; i++) {
     MessageBox(SubSelectFilters.Items(i).Code);
}

показує всі фільтри підзапиту і без виконання

Dataset.SelectQuery.LoadUserFilters();

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

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

Пытаюсь выполнить запрос:

var ActQuery = Services.GetNewItemByUSI('sq_ActInfo');
ActQuery.Parameters.ItemsByName('DocumentID').Value = DocumentID;

Выпадает ошибка:"Parameters.ItemsByName(...)" - есть null или не является объектом

В самом запросе параметр указан верно, в том числе и его тип. DocumentID имеет корректное значение.
Пробовал создавать сервис заново, переименовывать, переименовывать параметр, использовать GetSingleItemByCode,SetParameterValue. Все остается по-прежнему.
Подскажите в чем может заключаться проблема.

Нравится

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

Может в слове DocumentID есть русские символы? Или в скрипт название параметра копировали через Clipboard?
Если написать debugger, то в нем - чему равен ActQuery.Parameters и если у него в Items-ах данные?

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

Всем доброго времени суток!
При SelectQuery.Open() не находит ничего

var SelectQuery = Services.GetNewItemByUSI(USI);
var Parameter = SelectQuery.Parameters.ItemsByName('inn');
Parameter.Value = val;
var id_accaount = SelectQuery.Open();

Сам SelectQuery

SELECT
"tbl_Account"."ID" AS "ID",

FROM
"tbl_Account" AS "tbl_Account"
WHERE(UPPER("tbl_Account"."Code") = :inn)

Фильтр сравнения по умолчанию активен

В базе точно есть запись, но этот запрос ничего не находит...
id_account.id возвращает новый ID, которого в базе нет.
В чем может быть проблема???

Нравится

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

Здравствуйте, Анатолий Олегович

...
var id_accaount = SelectQuery.Open();
...

Возвращает Dataset. Для получения значения Вам необходимо:

...
var dataset = SelectQuery.Open();
var id_accaount = dataset.ValAsGUID('ID');;
...

Анатолий, как вы из id_account получаете значение ID (id_account.Values('ID'))?

Спасибо за помощь. Я не правильно обращался к возвращаемому полю :)

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