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

 
 
Опции темы Поиск в этой теме Опции просмотра
Старый 30.11.2008, 23:50   #1  
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   #2  
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   #3  
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   #4  
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   #5  
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, время: 18:53.