29.08.2002, 10:58 | #1 |
Moderator
|
Фильтрация
Ничего не понимаю.
Есть форма, в DataSource одна таблица. В Class Declaration формы объявляю: PHP код:
PHP код:
PHP код:
Вопрос первый: почему установка значения моего фильтра сбивает фильтры установленные стандартным способом ? Я же устанавливаю значение поля своего QueryBuildRange. Хорошо. Можно попробовать перед: PHP код:
PHP код:
Вопрос второй: при отладке этого кода видно, что rangeCount всегда равен 1. То есть тому фильтру, который я установил в init(), а дополнительные фильтры наложенные пользователем, как будто не замечаются ? |
|
29.08.2002, 11:14 | #2 |
Участник
|
наверное...
твой код ДО или ПОСЛЕ super() стоит? Т.е. ты свои действия делаешь ДО того, как Аксапта выполнит стандартные или ПОСЛЕ? |
|
29.08.2002, 11:21 | #3 |
Moderator
|
Сначала был мой код потом super(), теперь попробовал наоборот - результат тот же.
|
|
29.08.2002, 12:53 | #4 |
----------------
|
Для того чтобы получить query с пользовательскими фильтрами и сортировками, надо использовать _ds.QueryRun().query()
|
|
29.08.2002, 13:35 | #5 |
Moderator
|
Спасибо. Действительно работает.
|
|
27.05.2004, 17:00 | #6 |
Гость
|
В каком месте использовать _ds.QueryRun().query()?
В Init датасорса this.QueryRun().query() вместо this.query() не поместить, вылетает с ошибкой объект не инициализирован
в обработке изменения контролов фильтр добавляется, но не работает в ExecuteQuery не работает и не добавляется Первый подход хотя бы работает, только рушит пользовательские фильтры |
|
28.05.2004, 10:30 | #7 |
Гость
|
Если в executeQuery() написать
info(this.queryRun().query().dataSourceNo(1).toString()); super(); то получится: Ошибка времени выполнения. : <empty class> object не инициализирован. Если в executeQuery() написать super(); info(this.queryRun().query().dataSourceNo(1).toString()); То нормально выводится запрос, значит наложить свой фильтр я могу только после супера? Но после супера он не будет отработан. В результате фильтр есть, но он не работает. |
|
28.05.2004, 10:57 | #8 |
Гость
|
Help Mazzy
I like clocks too. I'm hungry too.
How does it (QueryRun()) work? F^&%$#g c&@%y Axapta. |
|
28.05.2004, 11:30 | #9 |
Moderator
|
При первом вызове executeQuery() объект QueryRun еще не создан, как раз здесь он и создается. Поэтому перед наложением фильтра надо проверить, создан ли уже QueryRun, и если создан - использовать его, а нет - Query. На эту тему массу примеров можно найти, например, по перекрестным ссылкам.
Значения ranges присваиваются до супера, здесь все как обычно.
__________________
Андрей. |
|
28.05.2004, 12:50 | #10 |
Участник
|
Что то мне подсказывает, что Dron AKA andy прав.
но, видимо, надо проверить? проверю ближе к вечеру. Хорошо? |
|
28.05.2004, 13:06 | #11 |
Гость
|
Хорошо
Этот код фильтр ставит, но все равно рушит пользовательские
public void executeQuery() { if (TmpWmsAvail_M047_DS.queryRun()) { info('if (TmpWmsAvail_M047_DS.queryRun())'); if (ShowFree) { if (!criteriaShowFree) criteriaShowFree = TmpWmsAvail_M047_DS.queryRun().query().dataSourceNo(1).addRange(fieldnum(TmpWmsAvail_M047,Occupied_M047)); criteriaShowFree.value('Нет'); } else { if (!criteriaShowFree) criteriaShowFree = TmpWmsAvail_M047_DS.queryRun().query().dataSourceNo(1).FindRange(fieldnum(TmpWmsAvail_M047,Occupied_M047)); criteriaShowFree.value(''); } } // if (TmpWmsAvail_M047_DS.queryRun()) else { info('нету (TmpWmsAvail_M047_DS.queryRun())'); if (ShowFree) { if (!criteriaShowFree) criteriaShowFree = this.query().dataSourceNo(1).addRange(fieldnum(TmpWmsAvail_M047,Occupied_M047)); criteriaShowFree.value('Нет'); } else { if (!criteriaShowFree) criteriaShowFree = this.query().dataSourceNo(1).AddRange(fieldnum(TmpWmsAvail_M047,Occupied_M047)); criteriaShowFree.value(''); } } super(); |
|
29.05.2004, 15:29 | #12 |
Участник
|
Кирилл. Дело в том, что вы совсем не следуете рекомендациям для разработчиков.
См. руководство разработчика. Глава "To access and modify a system generated query" А также все что есть в хелпе по ключевому слову executeQuery. Ваши проблемы возникают из-за того, что вы пытаетесь в executeQuery пересоздать query. А на самом деле executeQuery предназначен только для того, чтобы изменить параметры текущего query Создавать query надо в init-методе. В excecuteQuery только изменять range.value. Если вы будете следовать рекомендациям, то вы избежите ваших проблем. Обратите внимание, что добавленный в init'е range можно сделать hidden или locked. Тогда ваш range пользователь не сможет увидеть или не сможет изменить. Чистый и очень наглядный пример правильного использования этой методики в Аксапте - форма KMKnowledgeCollectorCollection. См. datasource KMCollection обратите также внимание, что rangeCriteria можно и не запоминать в форме, а пользоваться методом Datasource.findValue(). |
|
31.05.2004, 10:21 | #13 |
Гость
|
;-(
Уважаемый Сергей,
как раз следование примеру KMKnowledgeCollectorCollection и приводит к обрушению фильтров пользователя при изменении запроса в зависимости от состояния контролов на форме. В форме KMKnowledgeCollectorCollection используется стандартный подход: PHP код:
Причина нареканий: если в форме установлен фильтр пользователем и мы пытаемся программно установить queryBuildRange, то действие фильтра пользователя будет отменено. Для решения данной проблемы Wamr предложил использовать не this.query().datasourceNo(1), а this.QueryRun().query().datasourceNo(1). Мой вопрос как раз и заключается в том, как грамотно использовать this.QueryRun().query().datasourceNo(1). Все чего я добился в этом направлении, это полное совпадение поведения моего кривого кода с поведением кода чистого и очень наглядного примера. А это поведение меня не устраивает по изложенным выше причинам. Обсуждение это было давно, значит, как минимум, Wamr и Андре решили проблему. |
|
31.05.2004, 11:11 | #14 |
Участник
|
как скажете. решили, так решили
Цитата:
Причина нареканий: если в форме установлен фильтр пользователем и мы пытаемся программно установить queryBuildRange, то действие фильтра пользователя будет отменено.
Выложите или пришлите проект, который можно загрузить в стандартное приложение. Постараюсь посмотреть ближе к вечеру и понять. Может быть, я ошибаюсь и отвечаю совсем не на заданный вопрос. |
|
31.05.2004, 11:58 | #15 |
Гость
|
Выслал
|
|
31.05.2004, 12:12 | #16 |
----------------
|
А фильтр теряется по всем полям или только по изменяемому в executeQuery?
|
|
31.05.2004, 13:25 | #17 |
Гость
|
По всем
Все фильтры исчезают как только я задаю этот QueryBuildRange.
Остается лишь тот, который я задал программно. Кроме того, когда фильтр ставится программно, то в форме фильтров он появляется, а кнопка удалить фильтры остается недоступной. |
|
14.11.2007, 15:23 | #18 |
Участник
|
Цитата:
Сообщение от Кирилл
Если в executeQuery() написать
info(this.queryRun().query().dataSourceNo(1).toString()); super(); то получится: Ошибка времени выполнения. : <empty class> object не инициализирован. Если в executeQuery() написать super(); info(this.queryRun().query().dataSourceNo(1).toString()); То нормально выводится запрос, значит наложить свой фильтр я могу только после супера? Но после супера он не будет отработан. В результате фильтр есть, но он не работает. X++: if(this.queryRun()){ if(this.queryRun().query().dataSourceNo(1).findRange(fieldnum(LedgerJournalTable, OffsetAccount))){ this.query().dataSourceNo(1).clearRange(fieldnum(LedgerJournalTable, OffsetAccount)); this.query().dataSourceNo(1).addRange(fieldnum(LedgerJournalTable, OffsetAccount)).value( this.queryRun().query().dataSourceNo(1).findRange(fieldnum(LedgerJournalTable, OffsetAccount)).value()); } else { this.query().dataSourceNo(1).clearRange(fieldnum(LedgerJournalTable, OffsetAccount)); } } super(); Последний раз редактировалось gefr; 14.11.2007 в 15:41. |
|
|
Похожие темы | ||||
Тема | Ответов | |||
Фильтрация в Lookup'е | 18 | |||
Фильтрация в 2.5 | 10 | |||
Фильтрация записей | 0 | |||
Расширенная фильтрация | 3 | |||
Фильтрация в Lookup-форме | 5 |
|