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

 
 
Опции темы Поиск в этой теме Опции просмотра
Старый 07.06.2018, 17:43   #1  
kitty is offline
kitty
Участник
 
364 / 26 (1) +++
Регистрация: 24.05.2005
EffectiveDateTime на view с outerJoin
Есть MyView.
Оно основано на запросе со следующей структурой
VendTable
->(outerJoin 1:1)DirPartyPostalAddressView
->(outerJoin 1:1)ContactPerson
...
etc.

Проблема:
DirPartyPostalAddressView имеет validFrom & validTo, и также validTimeStampEnabled = yes, но пока я на моем "внешнем" MyView не поставлю validTimeStampEnabled = yes, выбираются все адреса, не зависимо от текущей даты.
Поэтому, чтобы выбирался коррктный адрес, приходится ставить validTimeStampEnabled = yes на моем внешнем view
Так как связь по outerJoin , то, те поставщики, у которых нет адреса, сразу пропадают из выборки, тк условие наклыдвается на все MyView, что мне не нужно

Как это обойти?

AX20121R3

Последний раз редактировалось kitty; 07.06.2018 в 19:08.
Старый 07.06.2018, 18:38   #2  
wojzeh is offline
wojzeh
Участник
Аватар для wojzeh
Соотечественники
 
674 / 512 (19) +++++++
Регистрация: 27.04.2006
Адрес: Montreal
а что нужно-то получить в итоге? в чём, так сказать, ТЗ?
__________________
Felix nihil admirari
Старый 07.06.2018, 19:03   #3  
kitty is offline
kitty
Участник
 
364 / 26 (1) +++
Регистрация: 24.05.2005
Нужна элементарная вещь - информация о поставщиках:
Поставщик1 - Адрес текущий - контактное лицо такое-то
Поставщик2 - (нет адреса) - контактное лицо такое-то

А получается:

либо (когда validTimeStampEnabled = no на внешнем view)::
Поставщик1 - Адрес старый - контактное лицо такое-то
Поставщик1 - Адрес текущий - контактное лицо такое-то
Поставщик2 - (нет адреса) - контактное лицо такое-то

либо (когда validTimeStampEnabled = yes на внешнем view):
Поставщик1 - Адрес текущий - контактное лицо такое-то

Установка validTimeStampEnabled = yes на внутреннем view влияния не оказывает. А нужно ограничить именно внутреннюю выборку, то есть адреса по дате. А поставщиков же показывать не зависимо от того, есть у них в принципе адрес или нет
Старый 07.06.2018, 19:08   #4  
kitty is offline
kitty
Участник
 
364 / 26 (1) +++
Регистрация: 24.05.2005
Уже даже пробовала даже сделать промежуточный view:
View внутренний ( validTimeStampEnabled = yes): vendTable inner join DirPartyPostalAddressView.
View внешний( validTimeStampEnabled = No): vendTable outer join "View внутренний" по vendTable.AccountNum

результат то же, то есть фильтр по дате на адреса в "View внешний" не накладываются

Видимо, ядро умеет накладывать фильтр по дате только целиком на весь запрос, то есть, результитрующий View А "по-умному" на его внутренние подзапросы не умеет, хоть внутренний подзапрос - сам по себе view c validTimeStampEnabled = yes

Последний раз редактировалось kitty; 07.06.2018 в 19:11.
Старый 07.06.2018, 19:32   #5  
wojzeh is offline
wojzeh
Участник
Аватар для wojzeh
Соотечественники
 
674 / 512 (19) +++++++
Регистрация: 27.04.2006
Адрес: Montreal
можно сделать первую вьюху с текущими адресами

либо (когда validTimeStampEnabled = yes на внешнем view):
Поставщик1 - Адрес текущий

а уже из него выбирать outer join во второй, где будут и контактные лица.

так работает?
__________________
Felix nihil admirari
Старый 07.06.2018, 23:45   #6  
kitty is offline
kitty
Участник
 
364 / 26 (1) +++
Регистрация: 24.05.2005
Извините, я либо не поняла Вашу идею, либо Вы говорите о том варианте, что я описала постом выше, когда пыталась внутренний view только ограничить. Этот вариант не работает

Попробую описать проблему еще раз:
У меня не все поставщики имеют адреса. Если я накладываю validTimeStampEnabled = yes на внешний view (у которого структура: VendTable-> outerjoin "DirPartyPostalAddressView"), то поставщики без адреса не выводятся. Но зато адрес выводится корректно у тех, у кого он есть, то есть, только актуальный адрес.
А если я оставляю validTimeStampEnabled = yes только на внутреннем DirPartyPostalAddressView, то эффект получается такой , будто вообще ограничеения по дате не накладываются. То есть, выводятся все поставщики( что хорошо), но вот
все их соответствующие адреса уже без фильтра по дате (что плохо).
Старый 08.06.2018, 00:07   #7  
wojzeh is offline
wojzeh
Участник
Аватар для wojzeh
Соотечественники
 
674 / 512 (19) +++++++
Регистрация: 27.04.2006
Адрес: Montreal
1. view1: vendAcc; vendAddr (только актуальные существующие адреса)
2. view2: vendAcc; contact; + outerJoin to view1.

так-то можно сделать?
__________________
Felix nihil admirari
Старый 08.06.2018, 07:49   #8  
S.Kuskov is offline
S.Kuskov
Участник
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
 
3,438 / 1775 (66) ++++++++
Регистрация: 28.04.2007
Адрес: Калуга
Дело в том, что validTimeStampEnabled = yes не добавляет в текст View желаемого фильтра по датам. Это свойство лишь протаскивает поля validFrom & validTo наружу View и сообщает ядру что с этим View нужно работать также как и с таблицей у которой включён validTimeStamp. При необходимости из такого View можно достать не только актуальные данные но и исторические. Также как и из оригинальной таблицы. Фильтрация по текущей дате добавляется ядром на последнем этапе, когда формируется уже запрос к самому View.
Не поможет также и попытка внедрить в текст View макро функции типа SysQueryRangeUtil ValidTimeState for views' queries

Для похожей задачи я использовал следующее допущение. Я предположил, что в моей validTimeStamp таблице не будет данных заведённых будущим числом и не будет безальтернативно закрытых позиций (когда validTo предыдущей записи закрыт прошедшей датой, а новая запись с актуальным validFrom отсутствует). Тогда актуальная строка, если она есть, будет иметь максимальный validFrom среди других строк относящихся к тому же ключу. Остаётся выбрать отдельным View максимальные значения и соединением с этим View отсечь все остальные. Вуаля, остались только актуальные записи! Максимальное значение выбирал через группировку и агрегатную функцию
За это сообщение автора поблагодарили: kitty (1), alex55 (1).
Старый 08.06.2018, 10:49   #9  
kitty is offline
kitty
Участник
 
364 / 26 (1) +++
Регистрация: 24.05.2005
Спасибо. Видимо, действительно единиственный вариант - через агрегацию
Или, может, union еще можно попробовать (отдельно добавить тех, у кого адресов нет)
 

Похожие темы
Тема Автор Раздел Ответов Посл. сообщение
dynamicsaxhints: How to restrict view datasource fields Blog bot DAX Blogs 0 22.03.2016 09:11
emeadaxsupport: AX Content: Using Power View with Dynamics AX Blog bot DAX Blogs 0 17.09.2013 01:12
DAX: Enabling Power View on Multidimensional Models for Microsoft Dynamics AX 2012 R2 Blog bot DAX Blogs 0 27.06.2013 06:16
dynamicsaxbi: Better together: Microsoft Dynamics AX 2012 R2 and SQL Server Power View Blog bot DAX Blogs 0 12.12.2012 13:11

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

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

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