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

 
 
Опции темы Поиск в этой теме Опции просмотра
Старый 02.10.2014, 18:53   #1  
IKA is offline
IKA
Участник
 
359 / 65 (3) ++++
Регистрация: 15.03.2006
Как сделать хитрый фильтр?
Для каждой записи из custTrans может быть 0 или 1 запись в таблице CustDispute
Есть отчет, построенный по custTrans. Пользователи хотят видеть в диалоге отчета перечисление custVendDisputeStatus и иметь возможность выбрать несколько значений для фильтрации - соответственно, простым добавлением комбобокса (перечисления) в диалог не отделаешься.
Но, если я по outerJoin добавлю к custTrans таблицу CustDispute , то при наложении фильтра custVendDisputeStatus::None пользователь по сути ожидает увидеть все записи из custTrans , которых нет в CustDispute, но получает пустую выборку, тк записей с custVendDisputeStatus::None в таблице CustDispute нет.

Вопрос: как такое реализовать?
Естественно, если бы не было требования , чтобы можно было выбрать неск значений из списка, можно было бы динамически добавлть CustDispute таблицу к запросу, если в фильтре указано значение , отличное от custVendDisputeStatus::None, но это,к сожалению, не мой случай(.

AX2012 R2
Старый 02.10.2014, 19:02   #2  
gl00mie is offline
gl00mie
Участник
MCBMSS
Most Valuable Professional
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
Лучший по профессии 2009
 
3,684 / 5788 (200) ++++++++++
Регистрация: 28.11.2005
Адрес: Москва
Записей в блоге: 3
при наложении фильтра по значению CustVendDisputeStatus::None вместо фильтрации по CustDispute менять outer join на notexists join?..

Хотя нет, если None может быть одним из нескольких выбранных значений, то так не получится - тут скорее нужен union-запрос.

Последний раз редактировалось gl00mie; 02.10.2014 в 19:17.
Старый 02.10.2014, 19:10   #3  
pitersky is offline
pitersky
северный Будда
Аватар для pitersky
Ex AND Project
Соотечественники
 
1,486 / 408 (16) +++++++
Регистрация: 26.09.2007
Адрес: Солнечная система
вместо комбо добавьте в создание диалога цикл по значениям комбо, для каждого значения выводите чекбокс. потом соберите чекбоксы и рассчитайте кверю

P.S. ну или замените диалог на форму
__________________
С уважением,
Вячеслав
Старый 02.10.2014, 19:28   #4  
S.Kuskov is offline
S.Kuskov
Участник
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
 
3,429 / 1772 (66) ++++++++
Регистрация: 28.04.2007
Адрес: Калуга
Цитата:
Сообщение от gl00mie Посмотреть сообщение
при наложении фильтра по значению CustVendDisputeStatus::None вместо фильтрации по CustDispute менять outer join на notexists join?..
А если одновременно с Nonе выбрано ещё какое-нибудь значение?

У меня кроме UNION пока никаких идей нет
Старый 02.10.2014, 19:33   #5  
IKA is offline
IKA
Участник
 
359 / 65 (3) ++++
Регистрация: 15.03.2006
Именно так, как Kuskov сказал, поэтому not exisst не подойдет
можно самой парсить range , убирать DS, а потом , в зависимости от значений в range,там добавляь DS обратно, если есть только range, который не None, если нету, то union и для только None- по nonExixts уже. Но муторно как-то ради такой простой задачи

Последний раз редактировалось IKA; 02.10.2014 в 19:37.
Старый 02.10.2014, 19:45   #6  
DSPIC is offline
DSPIC
Боец
 
1,077 / 1234 (44) ++++++++
Регистрация: 11.04.2008
Приходилось решать такую задачу.
- Делаете View custTransDisputeView на базе Query, в которой линкуете custTrans и CustDispute по outerJoin. [У view будут поля CustTransRecId, Status]
- В форму где нужен фильтр добавляете custTransDisputeView как дополнительный датасорс и джоините его с custTrans по innerJoin. [линкуете по полям CustTrans.RecId == custTransDisputeView.CustTransRecId].

Вот вкратце и всё.

Последний раз редактировалось DSPIC; 02.10.2014 в 19:56.
За это сообщение автора поблагодарили: Logger (3), IKA (1).
Старый 02.10.2014, 20:11   #7  
IKA is offline
IKA
Участник
 
359 / 65 (3) ++++
Регистрация: 15.03.2006
Спасибище, попробую
Старый 02.10.2014, 20:17   #8  
S.Kuskov is offline
S.Kuskov
Участник
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
 
3,429 / 1772 (66) ++++++++
Регистрация: 28.04.2007
Адрес: Калуга
Цитата:
Сообщение от DSPIC Посмотреть сообщение
У view будут поля CustTransRecId, Status
А в случае outer join какое значение в аксаптовском View будет иметь поле Status для несуществующих строк CustDispute? Это будет значение по умолчанию соответствующего типа? Т.е. в случае enum (int) - это будет ноль? Тогда принципиально (ну и это на самом деле логично) чтобы custVendDisputeStatus::None имел именно такое значение. Так?
Старый 02.10.2014, 20:27   #9  
DSPIC is offline
DSPIC
Боец
 
1,077 / 1234 (44) ++++++++
Регистрация: 11.04.2008
Цитата:
Сообщение от S.Kuskov Посмотреть сообщение
Т.е. в случае enum (int) - это будет ноль?
Да, скорее всего так и будет.

Цитата:
Сообщение от S.Kuskov Посмотреть сообщение
Тогда принципиально (ну и это на самом деле логично) чтобы custVendDisputeStatus::None имел именно такое значение. Так?
Да, видимо так.

Вообще, в AX2012 появилась возможность во вьюхи добавлять вычисляемые поля. Таким образом, можно расширить поле статус, в зависимости от того, есть запись или нет - скажем [-1, 1, 0], а потом фильтровать по желанию.
За это сообщение автора поблагодарили: AndyD (2).
Старый 02.10.2014, 20:36   #10  
AndyD is offline
AndyD
Участник
КОРУС Консалтинг
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
 
2,560 / 2476 (88) +++++++++
Регистрация: 20.08.2005
Цитата:
Сообщение от DSPIC Посмотреть сообщение
Приходилось решать такую задачу.
- Делаете View custTransDisputeView на базе Query, в которой линкуете custTrans и CustDispute по outerJoin. [У view будут поля CustTransRecId, Status]
- В форму где нужен фильтр добавляете custTransDisputeView как дополнительный датасорс и джоините его с custTrans по innerJoin. [линкуете по полям CustTrans.RecId == custTransDisputeView.CustTransRecId].

Вот вкратце и всё.
Хм.
А рейнж по Status точно преобразовывает значение 0 в NULL?
__________________
Axapta v.3.0 sp5 kr2
Старый 02.10.2014, 20:46   #11  
AndyD is offline
AndyD
Участник
КОРУС Консалтинг
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
 
2,560 / 2476 (88) +++++++++
Регистрация: 20.08.2005
Цитата:
Сообщение от IKA Посмотреть сообщение
...
если нету, то union и для только None- по nonExixts уже.
Не выйдет, если я правильно понял идею

На одном уровне юниона должен быть одинаковый уровень связи
Т.е. в обоих ветках юниона должны возвращаться курсоры CustTrans и CustDispute из запроса

У меня, в частности, был случай с юнионами, когда пришлось отказываться от референсов в пользу дисплейных методов, поскольку ядро лепило подзапрос только к одной ветке юниона и валилась ошибка сиквела
__________________
Axapta v.3.0 sp5 kr2
Старый 02.10.2014, 21:10   #12  
AndyD is offline
AndyD
Участник
КОРУС Консалтинг
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
 
2,560 / 2476 (88) +++++++++
Регистрация: 20.08.2005
Цитата:
Сообщение от DSPIC Посмотреть сообщение
Вообще, в AX2012 появилась возможность во вьюхи добавлять вычисляемые поля. Таким образом, можно расширить поле статус, в зависимости от того, есть запись или нет - скажем [-1, 1, 0], а потом фильтровать по желанию.
А вот это уже правильная идея
Можно использовать такую функцию на View
X++:
public static server str isNullExpression(str _expression)
{
    return strFmt('COALESCE(T2.STATUS, %1)', int2str(CustVendDisputeStatus::None));
}
И фильтровать по вычисляемому полю - значение 0 будет для отсутствия связи
__________________
Axapta v.3.0 sp5 kr2
За это сообщение автора поблагодарили: S.Kuskov (2).
Старый 03.10.2014, 16:58   #13  
IKA is offline
IKA
Участник
 
359 / 65 (3) ++++
Регистрация: 15.03.2006
Цитата:
Сообщение от DSPIC Посмотреть сообщение
Приходилось решать такую задачу.
- Делаете View custTransDisputeView на базе Query, в которой линкуете custTrans и CustDispute по outerJoin. [У view будут поля CustTransRecId, Status]
- В форму где нужен фильтр добавляете custTransDisputeView как дополнительный датасорс и джоините его с custTrans по innerJoin. [линкуете по полям CustTrans.RecId == custTransDisputeView.CustTransRecId].

Вот вкратце и всё.
Чот в теории должно работать, а на практике - нет.
Если этот VIew открыть, то оно отображает данные правильно. Но вот накладывать фильтр - по "Not disputed" (отображаемое значение, соответствующее Enum 0, т.е те строки View, где поля из custDispute отсутствуют) не позволяет. При этом, пробовала 0, null - тоже не получается, т.е возвращается просто пустая выборка.
Старый 03.10.2014, 18:01   #14  
DSPIC is offline
DSPIC
Боец
 
1,077 / 1234 (44) ++++++++
Регистрация: 11.04.2008
Тогда так:

1. Сделайте свой EDT как копию стандартного, но с дополнительным значением:
Название: 03.10.png
Просмотров: 1482

Размер: 3.6 Кб

2. Сделайте во View вычисляемое поле:
X++:
display CustVendDisputeStatusExt disputeStatusExt()
{
    if (this.CustDisputeRecId)
    {
        return this.CustDisputeStatus;
    }
    else
    {
        return CustVendDisputeStatusExt::TSTNotExist;
    }
}
- тут я для простоты понимания привел пример display-метода, но на самом деле это должно быть вычисляемое поле. Там сложный синтаксис, вы его можете посмотреть в стандартных view.
- дополнительно нужно во view протянуть поле CustDisputeRecId
 

Похожие темы
Тема Автор Раздел Ответов Посл. сообщение
Добавить хитрый фильтр в Query ackid DAX: Программирование 5 16.12.2013 08:14
Фильтр. Как сделать? Apollon33 DAX: Программирование 9 30.01.2013 12:51
Как сделать фильтр по группе пользователей? Zabr DAX: Программирование 12 08.04.2009 11:40
Как сделать хитрый лукап miklenew DAX: Программирование 11 08.10.2007 17:28
Как сделать фильтр с "ИЛИ"? MIkeFW DAX: Программирование 8 19.01.2004 15:25
Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск
Опции просмотра

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

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

Рейтинг@Mail.ru
Часовой пояс GMT +3, время: 17:39.
Powered by vBulletin® v3.8.5. Перевод: zCarot
Контактная информация, Реклама.