Добрый день.
Подскажите, как организовать в запросе условие типа "IN".
Я готовлю отчет, одно из полей которых должно показать количество контрагентов, у которых есть звонки с определенными результатами. Набор этих результатов фиксирован.
Я не совсем понял, где мне указать значения этих результатов
Нравится
Алексей, а в чем сложность? Создаете параметры и в них пишите Ваши значения. В IN-фильтре добавляете элементы и указываете Ваши параметры.
так вот я и не понял, как мне добавить туда элементы. В моем случае - это несколько IDшников.
Здравствуйте Алексей,
К примеру, хотим сделать такой Select в Администраторе который бы выводил всех контактов с типом "Контактное лицо" и "Клиент"
Данному запросу в SQL Server соответствует запрос
select * from tbl_Contact where ContactTypeID in ('{3D51B409-B691-4F77-9723-359C65399AB4}','{75277E61-09B4-4D7E-BD9D-FA7F8E90476B}')
Где
3D51B409-B691-4F77-9723-359C65399AB4 - Тип контакта "Контактное лицо "
75277E61-09B4-4D7E-BD9D-FA7F8E90476B - "Клиент"
Сделаем аналогичный сервис в Terrasoft Администраторе
Создаем сервис SelectQuery
Задаем таблицу From
Выбираем колонку для отображения, к примеру поле Name
Далее в блок Where добавляем Include фильтр
Указываем к какому полю применять Include фильтр
Далее добавляем параметры
Указываем значения параметров
Код в предпросмотре сервиса
SELECT [tbl_Contact].[Name] AS [Name] FROM [dbo].[tbl_Contact] AS [tbl_Contact] WHERE([tbl_Contact].[ContactTypeID] IN (:Expr2, :Expr1))
XML сервиса прикрепил к посту.
Разобрался. Я должен был насоздавать параметров, а в условии добавить Expression'ов
Всем спасибо за помощь.
Алексей, не создал дополнительного скриншота, финальный sq выглядит так
"Яворский Алексей" написал:
не создал дополнительного скриншота, финальный sq выглядит так
Это уже я додумал сам (комм #4).
В любом случаи Вы со Станиславом направили меня в нужное русло. У меня всё получилось. Еще раз спасибо.
Подсажите, а если нужно в In включить select, то как быть?
Использовала CustomSQLFilter с таким текстом:
OpportunityID in (select ID from [tbl_Opportunity] where CustomerID = :ID)
В итоге в карточке значение отображается верно, а в реестре нет. В техподдержке мне ответили следующее:
"У Вас идет отображение этого поля только для текущего ID. То есть, в карточке ID записи есть, и для него данные выводятся. В реестре же ID мы не получаем, поэтому и отображаются нули. Вам следует переделать Custom SQL filter."
Но как его переписать я понять не могу. Порекомендовали обратить внимание на эту тему, но что-то тоже не помогает... :(
Вам надо запрос переделать на EXISTS :
EXISTS (SELECT ID FROM [tbl_Opportunity] WHERE ID = OpportunityID AND CustomerID = :ID)
и использовать соответствующий тип фильтра в сервисе запроса
Не совсем понятно здесь условие "WHERE ID = OpportunityID" что под ним подрузамевается? Мы же выбираем как раз ID из таблицы Opportunity...
у меня получился вот такое поле:
(SELECT SUM([tbl_Payment].[PaySumm]) AS [PaySumm] FROM [dbo].[tbl_Payment] AS [tbl_Payment] WHERE([tbl_Payment].[Payed] = :True AND EXISTS (SELECT [tbl_Opportunity1].[ID] AS [ID] FROM [dbo].[tbl_Opportunity] AS [tbl_Opportunity1] WHERE([tbl_Opportunity1].[ID] = [tbl_Opportunity].[ID] AND :ID = [tbl_Opportunity1].[CustomerID])))) AS [PayedSumm]
но картина не изменилась: в карточке отображается все верно, а в реестре - нули
Не, немного не так. Вы проверяете вхождение OpportunityID в определенный диапазон, соответственно, EXISTS так же должен быть завязан на OpportunityID.
Более понятным станет изменение условия, если Вы пришлете исходный запрос (или подзапрос) в котором фигурирует данное условие, полностью.
Изначально я сделала так:
(SELECT SUM([tbl_Payment].[PaySumm]) AS [PaySumm] FROM [dbo].[tbl_Payment] AS [tbl_Payment] WHERE([tbl_Payment].[Payed] = :True AND OpportunityID in (select ID from [tbl_Opportunity] where CustomerID = :ID))) AS [PayedSumm], [tbl_Account].[PayedSummConst] AS [PayedSummConst]
А теперь совсем запуталась :)
Если я правильно понял, OpportunityID
- это поле таблицы [tbl_Payment]
, тогда запрос будет таким
(SELECT SUM([tbl_Payment].[PaySumm]) AS [PaySumm] FROM [dbo].[tbl_Payment] AS [tbl_Payment] WHERE([tbl_Payment].[Payed] = :True AND EXISTS (SELECT ID FROM [tbl_Opportunity] WHERE ID = [tbl_Payment].OpportunityID AND CustomerID = :ID) )) AS [PayedSumm], ...
Минуточку, а :ID это у Вас что? Я правильно понимаю, что это ID записи, карточку которой Вы открываете? Тогда того, чтобы запрос работал для каждой записи в реестре, Вам надо его переделать по такой схеме
SELECT [ВашаТаблица].ID, ... (SELECT SUM([tbl_Payment].[PaySumm]) AS [PaySumm] FROM [dbo].[tbl_Payment] AS [tbl_Payment] WHERE([tbl_Payment].[Payed] = :True AND EXISTS (SELECT ID FROM [tbl_Opportunity] WHERE ID = [tbl_Payment].OpportunityID AND CustomerID = [ВашаТаблица].ID) )) AS [PayedSumm] FROM [ВашаТаблица].ID WHERE [ВашаТаблица].ID = :ID
Если будет не понятно, тогда пришлите полностью весь запрос :).
Алексей, но ведь фильтр
[ВашаТаблица].ID = :ID
по умолчанию выключен, разве нет?
Суть я, кажется, поняла (хотя, возможно, я ошибаюсь), сделала так:
(SELECT SUM([tbl_Payment].[PaySumm]) AS [PaySumm] FROM [dbo].[tbl_Payment] AS [tbl_Payment] WHERE([tbl_Payment].[Payed] = :True AND EXISTS (SELECT [tbl_Opportunity].[ID] AS [ID] FROM [dbo].[tbl_Opportunity] AS [tbl_Opportunity] WHERE([tbl_Opportunity].[ID] = [tbl_Payment].[OpportunityID] AND [tbl_Account].[ID] = [tbl_Opportunity].[CustomerID])))) AS [PayedSumm]
проблема осталась
Странно. Это может не работать, если :ID, который вы указывали в изначальной конструкции, не соответствует [tbl_Account].[ID], в остальных случаях, условия вроде как эквивалентны.
Попробуйте ваш CustomSQLFilter
OpportunityID IN (SELECT ID FROM [tbl_Opportunity] WHERE CustomerID = [tbl_Account].[ID])
Если и это не сработает, то скорее всего мы по разному понимаем проблему. Понадобится полный текст запроса :)
Вложила файл с текстом запроса из предпросмотра.
Сделала так, как Вы рекомендуете - проблема осталась. В карточке поле рассчитывается, в реестре нули
Здравствуйте Алена
Запрос в SQL Server Management Studio выдает верные суммы, для каждого контрагента ?
Алена, судя по всему, Вам надо получить сумму платежей, который выполнил контрагент по своим счетам.
Я думаю, лучше вообще сделать вот так
[tbl_Account].[Birthday] AS [Birthday], ( SELECT SUM([tbl_Payment].[PaySumm]) AS [PaySumm] FROM [dbo].[tbl_Payment] AS [tbl_Payment] INNER JOIN [dbo].[tbl_Opportunity] as [tbl_Opportunity] ON [tbl_Opportunity].ID = [tbl_Payment].[OpportunityID ] WHERE [tbl_Opportunity].CustomerID = [tbl_Account].[ID] ) AS [PayedSumm],
Алексей, да, Management Studio отображает все верно.
Алексей, Вы не поверите, даже так не работает!
Алена, проверьте данное поле в датасете, обратите внимание на галочку "Поле для отображения"
1. А ту колонку вытянули? Может есть похожая?
2. Посмотрите у колонки DataField.
3. Права доступа на поле не настраивали?
Видимо, проблема была в том, что не было галочки "Поле для отображения". Спасибо всем большое! Теперь в реестре все корректно!
Но, вообще-то странно, потому что я думала, что если этой галочки нет, то поля в реестре вообще не будет... А так оно было, но с нулями...
Теперь у Вас есть три варианта всё-таки правильных запросов :) . Можете сами поисследовать, но в теории, последний - самый быстрый.