Проблема с select_query - как правильно оформить условие WHERE?

Есть таблица с договорами и есть таблица со скидками на каждый договор. У каждого договора может не быть скидка, может быть активная скидка, и может быть неактивная скидка.
Необходимо получить в отчете все информацию об активных скидках. В случае, если скидки нет или она неактивная - для договора оформляется запись в виде строки "НЕТ СКИДКИ". В случае наличия активных скидок, выводятся все активные скидки (у одного договора может быть несколько скидок, в том числе и актиных и неактивных, каждая скидка в отчете - это строка).

Мне нужно в запросе сформировать что-то типа

FROM [dbo].[tbl_Contract] AS [tbl_Contract]
LEFT OUTER JOIN [dbo].[tbl_LoyaltyCard] AS [tbl_LoyaltyCard] ON [tbl_LoyaltyCard].[ContractID] = [tbl_Contract].[ID] AND tbl_LoyaltyCard.StatusID = 'код активного статуса>'

Но как это реализовать в TerraSoft?

Если я переношу это условие (tbl_LoyaltyCard.StatusID = 'код активного статуса>') в раздел WHERE, оно срабатывает, как будто у меня стоит INNER JOIN вместо LEFT OUTER JOIN.
И я вижу контракты ТОЛЬКО с активными скидками. В то время, как в случае отсутствия скидок или наличия только неактивных скидок, мне все равно надо получить информацию о договоре.

Как это можно решить?

Нравится

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

Наталия, смогу пока только на словах.
Скорее всего, вам не нужно переносить это условия и вообще не надо присоединять таблицу. Для отчета обычно надо 2 разных датасета, в вашем случаи : Список договоров (с нужными полями для отчета и фильтрами для вывода(например, даты с и по, тип и т.д.)), и сами активные скидки, привязанные к договорам.
Как пример, посмотрите отчет "Продукты в договоре" fr_ReportContractOfferings. Как видно там два датасета(к ним соответсвенно есть и запросы) ds_ReportContractCard(Контракты, он и вам подойдет, наверно) ds_ReportContractOfferings(Продукты в договоре), у вас это должно быть соответственно активные скидки (берете таблицу скидок в договоре и фильтруете по договору, как в sq_ReportContractOfferings + добавляете условие StatusID = '<код активного статуса>').
Если активных скидок нет, то в отчете будет указан договор, но табличной части(скидок) не будет, т.е. пустота.
Если вам пустота не подходит, то сейчас точно, как вместо нее добавить строк "Нет скидки", не скажу. Как предложение, можно к датасету договоров добавить вычисляемое строковое поле "Активных скидок столько-то", а если их нет, то "Скидок нет", и в скрипте вычислять.

Здравствуйте, Наталия.

Не используйте фильтры в блоке WHERE, выбирайте все скидки. А в контроле отчета используйте конструкцию условия:

[IIF( DataField = ConditionValue, TrueOutput, FalseOutput)]

Для Вашего случая это будет что-то вроде:

[IIF( <ds_ReportLoyalty."StatusID"> = код активного статуса, код активного статуса, НЕТ СКИДКИ)]

Где ds_ReportLoyalty - датасет отчета.

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

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