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

 
 
Опции темы Поиск в этой теме Опции просмотра
Старый 15.07.2005, 12:20   #1  
Pustik is offline
Pustik
Участник
 
807 / 372 (14) ++++++
Регистрация: 04.06.2004
Работа Range на форме
Добрый день.Может быть я что-то не понимаю.
Не буду описывать конкретно мою задачу приведу аналогичный пример попроще.

В таблице InventTable я хочу фильтровать записи по полю ItemBuyerGroupId, причем так, чтобы записей с другим значением этого поля
я никаким боком видеть не смог. Предположим в этом поле могут хранится значения 'АТЦ' или 'Обор'. И я хочу видеть только 'АТЦ'.

На datasource-e InventTable я создаю метод:
private void initRanges()
{ Query query = InventTable_ds.query();
QueryBuildDataSource qbds;
QueryBuildRange qbr;

qbds = query.dataSourceName( tablestr( InventTable ) );
qbds.clearRanges();

qbr = qbds.addRange(fieldnum (InventTable,ItemBuyerGroupId));
qbr.value(SysQuery::value('АТЦ'));
qbr.status(RangeStatus::Locked);
}
Далее перекрываю методы:
void init()
{ ;
super();
this.initRanges();
} и
public void executeQuery()
{ ;
this.initRanges();
super();
}
Вроде как бы все правильно и с первого взгляда работает. Но если встать на поле (на открытой форме естественно) ItemBuyerGroupId,
и через контекстное меню выбрать <Найти> , набрать 'Обор' , то он игнорирует мой код и в фильтр по полю подставляет 'Обор'.
Зачем тогда спрашивается qbr.status(RangeStatus::Locked);????? - если есть такая дыра.
Пытался обмануть: вместо qbr = qbds.addRange(fieldnum (InventTable,ItemBuyerGroupId)); , подставляю
qbr = qbds.addRange(fieldnum (InventTable,ItemBuyerGroupId));
qbr.enabled(false);
qbr = qbds.addRange(fieldnum (InventTable,ItemBuyerGroupId)); -- заработало , но только если один раз пытаться через <Найти> искать 'Обор' ,
на второй раз поиска опять меняет фильтр согласно искомому значению. Поясните где я не прав или что я не понимаю? Может быть фильтр и поиск - 2 разные вещи? Спасибо
Старый 15.07.2005, 13:08   #2  
kashperuk is offline
kashperuk
Участник
Аватар для kashperuk
MCBMSS
Соотечественники
Сотрудники Microsoft Dynamics
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии 2011
Лучший по профессии 2009
 
4,361 / 2084 (78) +++++++++
Регистрация: 30.05.2004
Адрес: Atlanta, GA, USA
?
а если попробовать в executeQuery вызывать ваш метод после super()?
Старый 15.07.2005, 13:13   #3  
Pustik is offline
Pustik
Участник
 
807 / 372 (14) ++++++
Регистрация: 04.06.2004
:)
я уже и так пробовал и в метод refresh и initvalue и до супер и после и одновременно: и до и после ))))) и куда только не пихал все равно Через <Найти> можно посылать куда подальше эти фильтры(range), даже заблокированные , и лазить по все таблице. Я подозреваю что это просто дыра.
Старый 15.07.2005, 13:25   #4  
online
sukhanchik
Administrator
Аватар для sukhanchik
MCBMSS
Злыдни
Лучший по профессии 2015
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
Лучший по профессии 2009
 
3,323 / 3547 (125) ++++++++++
Регистрация: 13.06.2004
Адрес: Москва
у меня работает.. правда на созданной форме, т.е. гарантированно чистой. Возможно, где-то происходит сброс query ?
Старый 15.07.2005, 13:31   #5  
George Nordic is offline
George Nordic
Модератор
Аватар для George Nordic
Злыдни
 
4,479 / 1250 (50) ++++++++
Регистрация: 17.12.2003
Адрес: Moscow
Записей в блоге: 9
LinkActive
Старый 15.07.2005, 13:43   #6  
dn is offline
dn
Участник
Самостоятельные клиенты AX
 
486 / 159 (6) ++++++
Регистрация: 26.03.2003
Адрес: Москва
Действительно, при помощи функции поиска можно сбросить значение из заблокированного range. Могу предложить лишь запретить поиск на форме по этому полю. Для этого можно на соотв. поле источника данных перекрыть метод find и закоментарить super.
Старый 15.07.2005, 13:50   #7  
Pustik is offline
Pustik
Участник
 
807 / 372 (14) ++++++
Регистрация: 04.06.2004
Просто так я сюда не пишу. Я сначала проверю все возможное и невозможное , правильное и неправильное и только после этого я прошу помощи специалистов. Конечно я создавал новую форму на таблицу, т.е. голую и там тоже метод Наийти сбрасывает Rang-и. Спасибо dn за солидарность и за предложение.Я еще подумаю потом как нибудь как можно это все- таки решить более грамотно - сегодня просто не хочется - пятница - ждут пиво и друзья
Старый 15.07.2005, 14:07   #8  
kashperuk is offline
kashperuk
Участник
Аватар для kashperuk
MCBMSS
Соотечественники
Сотрудники Microsoft Dynamics
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии 2011
Лучший по профессии 2009
 
4,361 / 2084 (78) +++++++++
Регистрация: 30.05.2004
Адрес: Atlanta, GA, USA
Может сделать view-шку, и в ней в ranges ваше поле ограничить. А форму основывать на этой view-хе?
Это решение. Правда очень извратное. И добавлять нельзя, и т.д.
Старый 15.07.2005, 14:18   #9  
Pustik is offline
Pustik
Участник
 
807 / 372 (14) ++++++
Регистрация: 04.06.2004
Ну это я конечно попробую, - главное чтобы результат был, а извратное или нет это еще вопрос .
Старый 15.07.2005, 14:58   #10  
Wamr is offline
Wamr
----------------
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
 
1,737 / 858 (32) +++++++
Регистрация: 15.01.2002
Адрес: Москва
Записей в блоге: 7
Погодите - не гоните!

1. Уж сколько раз говорилось, что менять надо ds.queryRun().query().
2. Совершенно неправильно каждый раз создавать range - надо находить текущий и его менять. А для этого есть метод Global::findOrCreateRange_RU.
3. Range, который ставится перед super в executeQuery никто никогда не снимет и не обойдет.
Старый 15.07.2005, 15:15   #11  
Pustik is offline
Pustik
Участник
 
807 / 372 (14) ++++++
Регистрация: 04.06.2004
Хорошо теперь мой метод выглядит так
private void initRanges()
{
Query query = InventTable_ds.query();
QueryBuildDataSource qbds;
QueryBuildRange qbr;

qbds = query.dataSourceName( tablestr( InventTable ) );
qbds.clearRanges();

qbr = Global::findOrCreateRange_RU(qbds,fieldnum (InventTable,ItemBuyerGroupId));
qbr.value(SysQuery::value('АТЦ'));
qbr.status(RangeStatus::Locked);
}
я согласен так правильнее, но проблемы сброса значения из заблокированного Range при помощи функции <Найти> это не решило.
Старый 15.07.2005, 15:18   #12  
kashperuk is offline
kashperuk
Участник
Аватар для kashperuk
MCBMSS
Соотечественники
Сотрудники Microsoft Dynamics
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии 2011
Лучший по профессии 2009
 
4,361 / 2084 (78) +++++++++
Регистрация: 30.05.2004
Адрес: Atlanta, GA, USA
!
вы пропустили пункт 1. Про queryRun вместо просто query().
Старый 18.07.2005, 09:37   #13  
Pustik is offline
Pustik
Участник
 
807 / 372 (14) ++++++
Регистрация: 04.06.2004
Считаю необходимым в этой дискусси заметить что изменение ds.queryRun().query().
не помогло. Заблокированные Ranges можно обходить функцией <Найти>.
Единственное решение пока вижу в запрете этой фунуции на соответствующем поле перекрыв метод Find().
Старый 18.07.2005, 10:04   #14  
Wamr is offline
Wamr
----------------
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
 
1,737 / 858 (32) +++++++
Регистрация: 15.01.2002
Адрес: Москва
Записей в блоге: 7
Очень жаль, что у Вас ничего не получилось.
Еще больше жаль, что Вы уверены в своей правоте.
Старый 18.07.2005, 12:25   #15  
Pustik is offline
Pustik
Участник
 
807 / 372 (14) ++++++
Регистрация: 04.06.2004
Прошу прощения , оказалось такой код работает
PHP код:
    Query query = New query();
    
QueryRun queryRun;
    
QueryBuildDataSource    qbds;
    
QueryBuildRange         qbr;
    ;

    if (
inventTable_ds.queryRun())
    {
        
query inventTable_ds.queryRun().query();
    }
    else
    {
        
query inventTable_ds.query();
    }

    
qbds query.dataSourceName(tablestrInventTable));
    
qbr FindOrCreateRange_RU(qbdsfieldnum (InventTable,ItemBuyerGroupId));
    
qbr.value(SysQuery::value('АТЦ'));

    
qbr.status(RangeStatus::Locked); 
Теги
query, queryrun, range, ax3.0

 

Похожие темы
Тема Автор Раздел Ответов Посл. сообщение
Интегрирование листа Excel в форму chi DAX: Программирование 25 21.05.2014 14:39
axaptapedia: Packing date range values in queries Blog bot DAX Blogs 1 09.11.2007 13:10
Работа с Excel через COM и ошибка 0x800A03EC (Range.AutoFilter) gl00mie DAX: Программирование 15 30.03.2007 18:37
Range на форме по статическому методу Pustik DAX: Программирование 2 27.02.2006 15:28

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

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

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