15.07.2005, 12:20 | #1 |
Участник
|
Работа 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 |
Участник
|
а если попробовать в executeQuery вызывать ваш метод после super()?
|
|
15.07.2005, 13:13 | #3 |
Участник
|
я уже и так пробовал и в метод refresh и initvalue и до супер и после и одновременно: и до и после ))))) и куда только не пихал все равно Через <Найти> можно посылать куда подальше эти фильтры(range), даже заблокированные , и лазить по все таблице. Я подозреваю что это просто дыра.
|
|
15.07.2005, 13:25 | #4 |
Administrator
|
у меня работает.. правда на созданной форме, т.е. гарантированно чистой. Возможно, где-то происходит сброс query ?
|
|
15.07.2005, 13:31 | #5 |
Модератор
|
LinkActive
|
|
15.07.2005, 13:43 | #6 |
Участник
|
Действительно, при помощи функции поиска можно сбросить значение из заблокированного range. Могу предложить лишь запретить поиск на форме по этому полю. Для этого можно на соотв. поле источника данных перекрыть метод find и закоментарить super.
|
|
15.07.2005, 13:50 | #7 |
Участник
|
Просто так я сюда не пишу. Я сначала проверю все возможное и невозможное , правильное и неправильное и только после этого я прошу помощи специалистов. Конечно я создавал новую форму на таблицу, т.е. голую и там тоже метод Наийти сбрасывает Rang-и. Спасибо dn за солидарность и за предложение.Я еще подумаю потом как нибудь как можно это все- таки решить более грамотно - сегодня просто не хочется - пятница - ждут пиво и друзья
|
|
15.07.2005, 14:07 | #8 |
Участник
|
Может сделать view-шку, и в ней в ranges ваше поле ограничить. А форму основывать на этой view-хе?
Это решение. Правда очень извратное. И добавлять нельзя, и т.д. |
|
15.07.2005, 14:18 | #9 |
Участник
|
Ну это я конечно попробую, - главное чтобы результат был, а извратное или нет это еще вопрос .
|
|
15.07.2005, 14:58 | #10 |
----------------
|
Погодите - не гоните!
1. Уж сколько раз говорилось, что менять надо ds.queryRun().query(). 2. Совершенно неправильно каждый раз создавать range - надо находить текущий и его менять. А для этого есть метод Global::findOrCreateRange_RU. 3. Range, который ставится перед super в executeQuery никто никогда не снимет и не обойдет. |
|
15.07.2005, 15:15 | #11 |
Участник
|
Хорошо теперь мой метод выглядит так
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 |
Участник
|
вы пропустили пункт 1. Про queryRun вместо просто query().
|
|
18.07.2005, 09:37 | #13 |
Участник
|
Считаю необходимым в этой дискусси заметить что изменение ds.queryRun().query().
не помогло. Заблокированные Ranges можно обходить функцией <Найти>. Единственное решение пока вижу в запрете этой фунуции на соответствующем поле перекрыв метод Find(). |
|
18.07.2005, 10:04 | #14 |
----------------
|
Очень жаль, что у Вас ничего не получилось.
Еще больше жаль, что Вы уверены в своей правоте. |
|
18.07.2005, 12:25 | #15 |
Участник
|
Прошу прощения , оказалось такой код работает
PHP код:
|
|