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

 
 
Опции темы Поиск в этой теме Опции просмотра
Старый 30.11.2008, 16:03   #1  
DSan is offline
DSan
Участник
Аватар для DSan
 
9 / 10 (1) +
Регистрация: 15.06.2008
Как избежать отмены фильтра на форме
Имеется форма, которая, в частности, показывает количество доступной номенклатуры на складе. Она вызывается из формы по созданию строк в складском журнале. При открытии формы с доступной номенклатурой, в методе run() накладывается фильтр на склад, указанный в вызывающей форме. Но если вдруг пользователь нажимает кнопку сброса фильтра, наложенный фильтр сбрасывается, и становится доступна номенклатура с других складов. Собственно вопрос, как сделать так, чтобы этот фильтр нельзя было сбросить? Может накладывать его надо в другом месте, или восстанавливать в каком-то другом методе?
Старый 30.11.2008, 16:11   #2  
longson is offline
longson
Участник
 
231 / 49 (2) +++
Регистрация: 12.12.2006
Адрес: Москва
Если я правильно помню, то вам необходимо наложить фильтр в методе excuteQuery() на datasource. Тогда даже кнопка сброса фильтра изначально тоже станет недоступной.
Старый 30.11.2008, 16:27   #3  
ZVV is offline
ZVV
MCITP
MCP
Oracle
MCBMSS
 
1,006 / 246 (11) ++++++
Регистрация: 13.02.2004
Адрес: Минск
->
а может лучше диналинк таки прикрутить к складу? красивее будет, мне кажется.

ну либо, как отметил longson, пробивайте фильтр на executeQuery(), только проверьте, что нет других условий на склад, иначе будет "или". Должно быть только одно условие на склад - ваше. Так как executeQuery() выполняется собственно в момент выполнения запроса, то перебить этот фильтр уже никто не сможет.
__________________
Zhirenkov Vitaly
Старый 30.11.2008, 20:20   #4  
СибирскийКлещ is offline
СибирскийКлещ
Участник
 
26 / 11 (1) +
Регистрация: 24.11.2005
Цитата:
Сообщение от ZVV Посмотреть сообщение
а может лучше диналинк таки прикрутить к складу? красивее будет, мне кажется.
На какую таблицу ?
Диналинк при просмотре остатков срабатывает на InventSum по буферу InventJournalTrans ...
В обоих склада нету в принципе - он в при-joinen-ом InventDim.

Вывести в форму отображения остатков галчонку "фильтр по складу", по ее значению/изменению в executeQuery() у InventDim либо добавлять залоченный range по складу из соотвествующего InventDim'у от InventJournalTrans либо не добавлять.

И овцы сыты, и волки целы
Старый 30.11.2008, 21:15   #5  
AndyD is offline
AndyD
Участник
КОРУС Консалтинг
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
 
2,560 / 2479 (88) +++++++++
Регистрация: 20.08.2005
При сбросе фильтра используется запрос, хранящийся в ds.Query(), т.е. то, что добавлено в _ds.QueryRun().Query() теряется.
Для формирования фильтров используйте метод Init() датасорса - он вызывается один раз при его создании.
__________________
Axapta v.3.0 sp5 kr2
Старый 30.11.2008, 22:17   #6  
ZVV is offline
ZVV
MCITP
MCP
Oracle
MCBMSS
 
1,006 / 246 (11) ++++++
Регистрация: 13.02.2004
Адрес: Минск
->
Цитата:
Сообщение от СибирскийКлещ Посмотреть сообщение
На какую таблицу ?
Сорри, я условие невнимательно протитал похоже...
Да, в стандарте такое сложновато будет так сделать.


Можно сделать это всё и в ините датасорса, но тогда нужно блокировать этот range().
__________________
Zhirenkov Vitaly
Старый 30.11.2008, 23:50   #7  
ZVV is offline
ZVV
MCITP
MCP
Oracle
MCBMSS
 
1,006 / 246 (11) ++++++
Регистрация: 13.02.2004
Адрес: Минск
->
Если на инит датасорса, то выглядит так:

X++:
public void init()
{
    QueryBuildRange qbr;
    ;

    super();

    qbr = this.query().dataSourceNo(1).findRange(fieldNum(InventLocation, InventLocationId));

    if (! qbr )
        qbr = this.query().dataSourceNo(1).addRange(fieldNum(InventLocation, InventLocationId));
    qbr.value(queryValue("ля-ля-ля"));

    //qbr.status(RangeStatus::Locked);
}
Наличие qbr.status(RangeStatus::Locked); не позволит пользователю изменить этот рэндж или добавить новый такой же.

В принципе то же самое можно сделать и на executeQuery(), но этот вариант не считается "бест практис":
X++:
public void executeQuery()
{
    QueryBuildRange qbr;
    ;

   qbr = this.query().dataSourceNo(1).findRange(fieldNum(InventLocation, InventLocationId));

    if (! qbr )
        qbr = this.query().dataSourceNo(1).addRange(fieldNum(InventLocation, InventLocationId));
    qbr.value(queryValue("ля-ля-ля"));

    //qbr.status(RangeStatus::Locked);

    super();
}
И тоже будет работать (2 AndyD). Проверял на 3.0. При сбросе фильтра тоже остаётся это условие.
Как ни странно (я тоже не ожидал), оба этих варианта оказались с точки зрения пользователя одинаковые.
(Либо я что-то не заметил)
__________________
Zhirenkov Vitaly
Старый 01.12.2008, 09:25   #8  
mazzy is offline
mazzy
Участник
Аватар для mazzy
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
Лучший по профессии 2009
 
29,472 / 4494 (208) ++++++++++
Регистрация: 29.11.2001
Адрес: Москва
Записей в блоге: 10
Цитата:
Сообщение от ZVV Посмотреть сообщение
Наличие qbr.status(RangeStatus::Locked); не позволит пользователю изменить этот рэндж или добавить новый такой же.
Точно.
__________________
полезное на axForum, github, vk, coub.
Старый 01.12.2008, 09:32   #9  
mazzy is offline
mazzy
Участник
Аватар для mazzy
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
Лучший по профессии 2009
 
29,472 / 4494 (208) ++++++++++
Регистрация: 29.11.2001
Адрес: Москва
Записей в блоге: 10
Цитата:
Сообщение от ZVV Посмотреть сообщение
X++:
public void init()
{
    qbr = this.query().dataSourceNo(1).findRange(fieldNum(InventLocation, InventLocationId));

    if (! qbr )
        qbr = this.query().dataSourceNo(1).addRange(fieldNum(InventLocation, InventLocationId));
Вместо такой тягомотной конструкции лучше писать
X++:
SysQuery::findOrCreateRange(this.query().dataSourceTable(tablenum(InventLocation)),fieldNum(InventLocation, InventLocationId));
Кстати, обратите внимание, что dataSourceNo - источник очень трудноуловимых runtime ошибок, если датасоры с форме поменяются. Лучше юзать tablnum...
__________________
полезное на axForum, github, vk, coub.
За это сообщение автора поблагодарили: ZVV (1), aidsua (1).
Старый 01.12.2008, 09:45   #10  
ZVV is offline
ZVV
MCITP
MCP
Oracle
MCBMSS
 
1,006 / 246 (11) ++++++
Регистрация: 13.02.2004
Адрес: Минск
->
Цитата:
Сообщение от mazzy Посмотреть сообщение
Кстати, обратите внимание, что dataSourceNo - источник очень трудноуловимых runtime ошибок, если датасоры с форме поменяются. Лучше юзать tablnum...
Абсолютно согласен, всегда так и пишу.
Это просто был тестовый пример, совсем не на это.

А SysQuery::findOrCreateRange - действительно интерестно, не знал (или забыл). надо запомнить
__________________
Zhirenkov Vitaly
Старый 01.12.2008, 09:57   #11  
petergunn is offline
petergunn
Участник
 
118 / 274 (10) ++++++
Регистрация: 30.08.2005
Адрес: Tyumen
;) DAX 4.0 - реализация примера одной строкой
Цитата:
Сообщение от mazzy Посмотреть сообщение
Вместо такой тягомотной конструкции лучше писать
X++:
SysQuery::findOrCreateRange(this.query().dataSourceTable(tablenum(InventLocation)),fieldNum(InventLocation, InventLocationId));
Для DAX 4.0 используя Global::findOrCreateRange_W можно пойти еще дальше в направлении компактного написания кода и тогда
X++:
qbr = this.query().dataSourceNo(1).findRange(fieldNum(InventLocation, InventLocationId));

    if (! qbr )
        qbr = this.query().dataSourceNo(1).addRange(fieldNum(InventLocation, InventLocationId));
    qbr.value(queryValue("ля-ля-ля"));

    //qbr.status(RangeStatus::Locked);

будет выгдядеть как:
X++:
...
findOrCreateRange_W( this.query().dataSourceTable(tablenum(InventLocation)),
                     fieldNum(InventLocation, InventLocationId),
                     queryValue("ля-ля-ля") ).status(RangeStatus::Locked);
...
Старый 01.12.2008, 10:58   #12  
AndyD is offline
AndyD
Участник
КОРУС Консалтинг
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
 
2,560 / 2479 (88) +++++++++
Регистрация: 20.08.2005
2 zvv
Что будет срабатывать - это понятно. Только executeQuery() срабатывает каждый раз, когда запрос отправляется на сервер, в том числе и при фильтрации или сортировке. Будут избыточные вызовы.
__________________
Axapta v.3.0 sp5 kr2
Старый 01.12.2008, 11:14   #13  
ZVV is offline
ZVV
MCITP
MCP
Oracle
MCBMSS
 
1,006 / 246 (11) ++++++
Регистрация: 13.02.2004
Адрес: Минск
->
Цитата:
Сообщение от AndyD Посмотреть сообщение
2 zvv
Что будет срабатывать - это понятно. Только executeQuery() срабатывает каждый раз, когда запрос отправляется на сервер, в том числе и при фильтрации или сортировке. Будут избыточные вызовы.
Согласен.
Просто изночально думалось, что сброс фильтра не будет оставлять это, а оказалось оставляет.
Это раз.
А второй прикол, который я заметил в этом случае такой:
Когда нажимешь сброс фильтра, то код, добавляющий рэндж на executeQuery(), отрабатывает и добавляет ещё один (прикольно, если не делать findOrCreate ).
А если просто делать "фильтр" и выполнять запрос ещё раз, то код на executeQuery() как бы отрабатывает, но на действующую кверю это не "возымевает" никакого действия - все рэнджи остаются как в фильтре! Вот так-то.
__________________
Zhirenkov Vitaly
Старый 01.12.2008, 11:27   #14  
AndyD is offline
AndyD
Участник
КОРУС Консалтинг
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
 
2,560 / 2479 (88) +++++++++
Регистрация: 20.08.2005
Тут надо помнить про такую вещь - пользовательские фильтры добавляются на _ds.QueryRun().Query(). При вызове пользовательского фильтра или при программном вызове research() во вновь создаваемый QueryRun передается _ds.QueryRun().Query() (в отличие от простого вызова ExecuteQuery() - там передается _ds.Query()).
По-этому, если делать какие-либо изменения в _ds.Query() внутри метода ExecuteQuery(), то есть вероятность рассогласования с пользовательским фильтром.
__________________
Axapta v.3.0 sp5 kr2
За это сообщение автора поблагодарили: ZVV (1).
Старый 01.12.2008, 21:45   #15  
DSan is offline
DSan
Участник
Аватар для DSan
 
9 / 10 (1) +
Регистрация: 15.06.2008
Какая дискуссия получилась, не ожидал. Буду осмысливать написанное, спасибо
 

Похожие темы
Тема Автор Раздел Ответов Посл. сообщение
Использование семейства InventDimCtrl_Frm_* - 2 DS InventDim на одной форме Pavlo AKA Panok DAX: База знаний и проекты 5 22.12.2008 17:15
SalesQuickQuote - разрешить изменение фильтра в форме SHiSHok DAX: Программирование 6 26.06.2007 11:23
Фильтр на Веб форме egorych DAX: Программирование 3 21.06.2007 18:32
BugFix: В форме складских журналов нельзя перемещаться с помощью клавиш курсора Maxim Gorbunov DAX: Программирование 5 21.01.2005 01:20
Значение пользовательского фильтра на форме vpa DAX: Программирование 7 27.10.2004 17:14

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

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

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