AXForum  
Вернуться   AXForum > Microsoft Dynamics CRM > Dynamics CRM: Разработка
All
Забыли пароль?
Зарегистрироваться Правила Справка Пользователи Сообщения за день Поиск

 
 
Опции темы Поиск в этой теме Опции просмотра
Старый 26.11.2009, 11:46   #1  
Kipetcoff is offline
Kipetcoff
Участник
 
136 / 16 (1) ++
Регистрация: 20.05.2009
Адрес: Санкт-Петербург
Предварительная фильтрация в нескольких DataSet
Создаю .rdl отчет в CRM. Есть 2 таблицы. Для каждой свой Dataset. Оба запроса к Dataset используют предварительную фильтрацию. Т.е.как в в запросе к первому DS используется конструкция FilteredNew_loan AS CRMAF_New_loan
Код:
SELECT     CRMAF_New_loan.new_loanid, CRMAF_New_loan.new_account_number, CRMAF_New_loan.new_estdate, CRMAF_New_loan.new_legalentityname, 
                      CRMAF_New_loan.owneridname, CRMAF_New_loan.new_clientname, FilteredNew_event.new_descriptionen, FilteredNew_event.new_name, 
                      FilteredNew_event.new_eventsid, FilteredNew_event.new_event_owneridname, FilteredNew_event.new_dateutc, FilteredNew_event.new_project, 
                      FilteredNew_event.new_durations, FilteredNew_specialistbreakdown.new_rate
FROM         FilteredNew_loan AS CRMAF_New_loan INNER JOIN
                      FilteredNew_event ON CRMAF_New_loan.new_loanid = FilteredNew_event.new_eventsid LEFT OUTER JOIN
                      FilteredNew_specialistbreakdown ON FilteredNew_specialistbreakdown.new_specialisrateid = CRMAF_New_loan.new_loanid AND 
                      FilteredNew_specialistbreakdown.new_useridid = FilteredNew_event.new_event_ownerid
так и второй запрос использует FilteredNew_loan AS CRMAF_New_loan
Код:
SELECT     FilteredNew_specialistbreakdown.new_name, FilteredNew_specialistbreakdown.new_rate
FROM         FilteredNew_loan AS CRMAF_New_loan INNER JOIN
                      FilteredNew_specialistbreakdown ON FilteredNew_specialistbreakdown.new_specialisrateid = CRMAF_New_loan.new_loanid
Проблема в том,что в первом случае предварительная фильтрация работает, а во втром выбирает все подряд.
Есть такая тема,что дважды нельзя использовать CRMAF_New_loan в одном запросе. Но это в одном запросе,а не Dataset, кроме того я пробовал удалять первую таблицу и предварительная фильтрация во второй не работает. Кто-нить может что-нить подсказать?
Старый 26.11.2009, 11:57   #2  
a33ik is offline
a33ik
Чайный пьяница
Аватар для a33ik
MCP
MCBMSS
Злыдни
Соотечественники
Most Valuable Professional
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
Лучший по профессии 2009
 
3,243 / 896 (36) +++++++
Регистрация: 02.07.2008
Адрес: Greenville, SC
Цитата:
Сообщение от Kipetcoff Посмотреть сообщение
Создаю .rdl отчет в CRM. Есть 2 таблицы. Для каждой свой Dataset. Оба запроса к Dataset используют предварительную фильтрацию. Т.е.как в в запросе к первому DS используется конструкция FilteredNew_loan AS CRMAF_New_loan
Код:
SELECT     CRMAF_New_loan.new_loanid, CRMAF_New_loan.new_account_number, CRMAF_New_loan.new_estdate, CRMAF_New_loan.new_legalentityname, 
                      CRMAF_New_loan.owneridname, CRMAF_New_loan.new_clientname, FilteredNew_event.new_descriptionen, FilteredNew_event.new_name, 
                      FilteredNew_event.new_eventsid, FilteredNew_event.new_event_owneridname, FilteredNew_event.new_dateutc, FilteredNew_event.new_project, 
                      FilteredNew_event.new_durations, FilteredNew_specialistbreakdown.new_rate
FROM         FilteredNew_loan AS CRMAF_New_loan INNER JOIN
                      FilteredNew_event ON CRMAF_New_loan.new_loanid = FilteredNew_event.new_eventsid LEFT OUTER JOIN
                      FilteredNew_specialistbreakdown ON FilteredNew_specialistbreakdown.new_specialisrateid = CRMAF_New_loan.new_loanid AND 
                      FilteredNew_specialistbreakdown.new_useridid = FilteredNew_event.new_event_ownerid
так и второй запрос использует FilteredNew_loan AS CRMAF_New_loan
Код:
SELECT     FilteredNew_specialistbreakdown.new_name, FilteredNew_specialistbreakdown.new_rate
FROM         FilteredNew_loan AS CRMAF_New_loan INNER JOIN
                      FilteredNew_specialistbreakdown ON FilteredNew_specialistbreakdown.new_specialisrateid = CRMAF_New_loan.new_loanid
Проблема в том,что в первом случае предварительная фильтрация работает, а во втром выбирает все подряд.
Есть такая тема,что дважды нельзя использовать CRMAF_New_loan в одном запросе. Но это в одном запросе,а не Dataset, кроме того я пробовал удалять первую таблицу и предварительная фильтрация во второй не работает. Кто-нить может что-нить подсказать?
В таком случае лучше перестроить модель Вашего отчёта на использование параметров префильтрации.

Методика такая:
1. Создаётся параметр отчёта с названием CRM_<название сущности>.
2. Выборки запроса необходимо переписать под динамический SQL, т.е. прежнюю конструкцию

Код:
Select * From FilteredAccount CRMAF_Account
Необходимо преобразовать в такую:

declare @Query VarChar(Max)
Set @Query = 'Select * From (' + @CRM_Account + ') t'
Exec(@Query)

3. В датасете отчёта замапить созданный параметр отчёта CRM_Account на параметр запроса @CRM_Account.
__________________
Эмо разработчик, сначала пишу код, потом плачу над его несовершенством.

Подписывайтесь на мой блог, twitter и YouTube канал.
Пользуйтесь моим Ultimate Workflow Toolkit
За это сообщение автора поблагодарили: Kipetcoff (1).
Старый 26.11.2009, 12:50   #3  
Kipetcoff is offline
Kipetcoff
Участник
 
136 / 16 (1) ++
Регистрация: 20.05.2009
Адрес: Санкт-Петербург
Да..заменил "предварительную" фильтрацию на "явную" и все заработало. Просто не ожидал что нельзя использовать дважды Предварительную фильтрацию даже в разных Dataset/
Старый 26.11.2009, 16:05   #4  
Артем Enot Грунин is offline
Артем Enot Грунин
Moderator
Аватар для Артем Enot Грунин
MCBMSS
Злыдни
Most Valuable Professional
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
Лучший по профессии 2009
 
3,912 / 623 (28) +++++++
Регистрация: 16.08.2007
Адрес: Пермь!
Записей в блоге: 151
Все обжигаются на этом. Для разных типов записей можно использовать упрощенную схему. Если же используются сложные запросы с Join или несколькими запросами из одной таблицы, то нужно использовать "явную" фильтрацию. Об этом написано в SDK но как-то больно стыдливо.
__________________
http://fixrm.wordpress.com, снятие/наведение порчи. Быстро, дорого, гарантия.

MS Certified Dirty Magic Professional
Старый 26.11.2009, 16:14   #5  
datfi is offline
datfi
Участник
 
240 / 15 (1) ++
Регистрация: 20.08.2009
Адрес: Россия, Сыктывкар
Цитата:
Сообщение от Артем Enot Грунин Посмотреть сообщение
Все обжигаются на этом. Для разных типов записей можно использовать упрощенную схему. Если же используются сложные запросы с Join или несколькими запросами из одной таблицы, то нужно использовать "явную" фильтрацию. Об этом написано в SDK но как-то больно стыдливо.
Я впринципе обошел явную фильтрацию вот чем: Создал параметр который берет данные из 1 dataset, и потом подставлял этот параметр в другие dataset и все работало.
Старый 21.08.2012, 15:43   #6  
Cukasa is offline
Cukasa
Участник
 
2 / 10 (1) +
Регистрация: 21.08.2012
Здравствуйте.
Заранее извиняюсь за некропостинг, но ответа на форуме не нашёл (может плохо искал), а данный тред очень похож на мою проблему.
Задача.
Решил сделать красивый отчёт с "пирогом" по действиям в рамках CampaignActivity (действия кампании). То есть кастомизировал немного сущность Appointment (Встреча) добавив поля new_win (Положительный результат) и new_fail (Отрицательный результат) и на выходе получаю что-то вроде пирожка во вложении. Поля для него, в обычном варианте, вытаскиваются таким запросом:
Код:
SELECT 
	COUNT(*) AS kolvo, 'Положительные' AS 'type', FA.regardingobjectidname AS subject
FROM 
	FilteredAppointment AS FA
INNER JOIN 
	FilteredCampaignActivity AS FCA
ON 
	FA.regardingobjectid = FCA.activityid
WHERE 
	(FA.new_win IS NOT NULL) AND (FCA.activityid = @id)
GROUP BY 
	FA.regardingobjectidname
UNION ALL
SELECT 
	COUNT(*) AS kolvo, 'Отрицательные' AS 'type', FA.regardingobjectidname AS subject
FROM 
	FilteredAppointment AS FA
INNER JOIN 
	FilteredCampaignActivity AS FCA
ON 
	FA.regardingobjectid = FCA.activityid
WHERE 
	(FA.new_fail IS NOT NULL) AND (FCA.activityid = @id)
GROUP BY 
	FA.regardingobjectidname
UNION ALL
SELECT 
	COUNT(*) AS kolvo, 'Не начатые' AS 'type', FA.regardingobjectidname AS subject
FROM 
	FilteredAppointment AS FA
INNER JOIN 
	FilteredCampaignActivity AS FCA
ON 
	FA.regardingobjectid = FCA.activityid
WHERE 
	(FA.new_fail IS NULL) AND (FA.new_win IS NULL) AND (FCA.activityid = @id)
GROUP BY 
	FA.regardingobjectidname
В BIS всё работает хорошо и без вопросов. Теперь я хочу сделать немного удобства и запускать данный отчёт непосредственно с формы "Действия кампании" и динамически подставлять туда выделенную(ые) запись(и). Естественно автоматическая фильтрация по CRMAF_ тут работать не будет. Поэтому я полез по форумам и SDK за примерами жёсткой предварительной фильтрации. Но при попытки переписать данный, статичный, запрос под динамичный, наткнулся на грабли (ибо молод и неопытен) как же подружить столько WHERE в одном запросе. Так как, если я правильно понял примеры и общий смысл, то в параметр как раз и подставляется он самый.
Собственно динамический запрос (простите если разнесу разметку форума):
Код:
DECLARE @CRM_CampaignActivity VarChar(Max)
DECLARE @SQL VarChar(Max)
SET @CRM_CampaignActivity = 'SELECT FilteredCampaignActivity.activityid FROM FilteredCampaignActivity'
SET @SQL = 
	'SELECT COUNT(*) AS kolvo, FA.regardingobjectidname AS subject FROM  FilteredAppointment AS FA INNER JOIN ('+@CRM_CampaignActivity+') AS FCA ON  FA.regardingobjectid = FCA.activityid WHERE (FA.new_win IS NOT NULL) AND (FCA.activityid in  ('+@CRM_CampaignActivity+')) GROUP BY FA.regardingobjectidname
	UNION ALL 
	SELECT COUNT(*)  AS kolvo, FA.regardingobjectidname AS subject FROM FilteredAppointment AS FA INNER JOIN  ('+@CRM_CampaignActivity+') AS FCA ON FA.regardingobjectid = FCA.activityid WHERE (FA.new_fail  IS NOT NULL) AND (FCA.activityid in ('+@CRM_CampaignActivity+')) GROUP BY  FA.regardingobjectidname 
	UNION ALL 
	SELECT COUNT(*) AS kolvo, FA.regardingobjectidname AS  subject FROM FilteredAppointment AS FA INNER JOIN ('+@CRM_CampaignActivity+') AS FCA ON  FA.regardingobjectid = FCA.activityid WHERE (FA.new_fail IS NULL) AND (FA.new_win IS NULL) AND  (FCA.activityid in ('+@CRM_CampaignActivity+')) GROUP BY FA.regardingobjectidname'
EXEC (@SQL)
Проблем у этого запроса две.
Первая: Фильтрации данных не происходит. Всегда возвращаются все записи по всем Действиям кампаний.
Вторая: Ругается на конструкцию вида 'Положительные' AS 'type'. Говорит некорректный синтаксис. Как экранировать эту конструкцию? Или хотя бы скажите как называется она (выборка несуществующего поля?) чтобы я мог погуглить. Заранее благодарю за ответы.
Изображения
 
Старый 21.08.2012, 16:14   #7  
Артем Enot Грунин is offline
Артем Enot Грунин
Moderator
Аватар для Артем Enot Грунин
MCBMSS
Злыдни
Most Valuable Professional
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
Лучший по профессии 2009
 
3,912 / 623 (28) +++++++
Регистрация: 16.08.2007
Адрес: Пермь!
Записей в блоге: 151
Добрый день. Разрешите немного критики!
Во-первых, как делать фильтрацию нужно изучать не по форумам, а по SDK.
Во-вторых, есть ощущение, что вы неправльно делаете выборку. Вам не нужно два поля, достаточно одного: со списком возможных значений. В запросе достаточно сделать группировку по этому полю:
X++:
SELECT
 COUNT(*)
,CRMAF_FCA.new_resultTypeCode
FROM FilteredAppointment AS CRMAF_FA
INNER JOIN FilteredCampaignActivity AS CRMAF_FCA
ON CRMAF_ FA.regardingobjectid = CRMAF_FCA.activityid
GROUP BY CRMAF_FCA.new_resultTypeCode
В-третьих, вам не нужен никакой параметр с id. Идентификатор текущей кампании будет доступен как фильтр - система сама об этом позаботится.
__________________
http://fixrm.wordpress.com, снятие/наведение порчи. Быстро, дорого, гарантия.

MS Certified Dirty Magic Professional
За это сообщение автора поблагодарили: Cukasa (1).
Старый 21.08.2012, 16:46   #8  
Cukasa is offline
Cukasa
Участник
 
2 / 10 (1) +
Регистрация: 21.08.2012
Спасибо за критику и за нужные теги для оформления постов.
>а по SDK
Это первое куда я глянул. Но там весьма простенький запрос из одной таблицы и пожелание: "Если хотите знать больше, расковыряйте стандартный отчёт так как они все с префильтрацией".
По поводу предложенного запроса, я не совсем понял или не совсем правильно объяснил. Во "Встрече" которая Appointment нет пиклиста/статуса. Там, есть два ntext-ых поля. В зависимости от их заполнения я и фильтрую данные. Отсюда и юнионы которые объединяют три запроса в один. Хотя конечно Ваш вариант, с пиклистом/статусом хорош, но пользователи будт ныть, что им опять надо лишний переключатель/список выбрать.
Хотя знаете что, а Вы правы. Если бизнес-процессом выставлять статус действия и менять его в зависимости от заполненого поля, то всё ограничится Вашим простым запросом без выкрутасов с юнионами и пользователи не будут ныть.
Огромное вам спасибо.
Старый 21.08.2012, 23:46   #9  
Артем Enot Грунин is offline
Артем Enot Грунин
Moderator
Аватар для Артем Enot Грунин
MCBMSS
Злыдни
Most Valuable Professional
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
Лучший по профессии 2009
 
3,912 / 623 (28) +++++++
Регистрация: 16.08.2007
Адрес: Пермь!
Записей в блоге: 151
Как вариант, но все же реализация с двумя текстовыми полями выглядит "несистемной". Она непригодна для сбора статистики и плохо расширяется - что если в дальнейшем потребуются промежуточные или уточняющие статусы? Или в одном отчете захотеся видеть все статусы и описания в одной колонке?
Иными словами нужно одно текстовое поле для отчета и какой-то статус-признак операции. Заставить заполнять это можно через Диалог. В нем вы можете предоставить для ввода хоть сто полей и далее в ходе логики дилога заполнить только нужные и даже закрыть встречу за пользователя.
__________________
http://fixrm.wordpress.com, снятие/наведение порчи. Быстро, дорого, гарантия.

MS Certified Dirty Magic Professional
 

Похожие темы
Тема Автор Раздел Ответов Посл. сообщение
Подстановка в поле из нескольких сущностей Tarasov E Dynamics CRM: Разработка 9 09.09.2009 10:45
Выбор нескольких значений vienna Dynamics CRM: Разработка 12 03.06.2009 19:38
Предварительная фильтрация по теме Черничкин Станислав Dynamics CRM: Разработка 3 21.12.2007 08:10
Предварительная фильтрация в отчётах (CRMAF) SeregaK Dynamics CRM: Разработка 10 06.11.2007 13:33

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход

Рейтинг@Mail.ru
Часовой пояс GMT +3, время: 21:05.