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

 
 
Опции темы Поиск в этой теме Опции просмотра
Старый 30.11.2008, 16:11   #1  
longson is offline
longson
Участник
 
231 / 49 (2) +++
Регистрация: 12.12.2006
Адрес: Москва
Если я правильно помню, то вам необходимо наложить фильтр в методе excuteQuery() на datasource. Тогда даже кнопка сброса фильтра изначально тоже станет недоступной.
Старый 30.11.2008, 16:27   #2  
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   #3  
СибирскийКлещ is offline
СибирскийКлещ
Участник
 
26 / 11 (1) +
Регистрация: 24.11.2005
Цитата:
Сообщение от ZVV Посмотреть сообщение
а может лучше диналинк таки прикрутить к складу? красивее будет, мне кажется.
На какую таблицу ?
Диналинк при просмотре остатков срабатывает на InventSum по буферу InventJournalTrans ...
В обоих склада нету в принципе - он в при-joinen-ом InventDim.

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

И овцы сыты, и волки целы
Старый 30.11.2008, 22:17   #4  
ZVV is offline
ZVV
MCITP
MCP
Oracle
MCBMSS
 
1,006 / 246 (11) ++++++
Регистрация: 13.02.2004
Адрес: Минск
->
Цитата:
Сообщение от СибирскийКлещ Посмотреть сообщение
На какую таблицу ?
Сорри, я условие невнимательно протитал похоже...
Да, в стандарте такое сложновато будет так сделать.


Можно сделать это всё и в ините датасорса, но тогда нужно блокировать этот range().
__________________
Zhirenkov Vitaly
Старый 30.11.2008, 23:50   #5  
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   #6  
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   #7  
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   #8  
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   #9  
petergunn is offline
petergunn
Участник
 
118 / 279 (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);
...
 

Похожие темы
Тема Автор Раздел Ответов Посл. сообщение
Использование семейства 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, время: 16:13.