26.04.2012, 15:43 | #1 |
Участник
|
Фильтрация Datasource с использованием внешних таблиц
Добрый день.
Передо мной следующая задача: Имеется форма, одна из колонок формы представлена не datafield, а datamethod. Требуется, ввести следующую функциональность: фильтрация datasource на основе колонки, заполняемой датаметодом. Т.е., ставим на форму элемент управления, если в нем есть значение критерия, отфильтровать по этой колонке с соответствующим значением. *** На сколько мне известно, класс QueryBuildDataSource не имеет методов, позволяющих сортировать по датаметодам. Отсюда, я собираюсь запомнить где-то изначальный query, если критерий в элементе задан, программно соединить с таблицей, из которой берутся данные для датаметода и отфильтровать по ней. А если критерий не задан, восстановить первоначальный запрос. Поэтому у меня 2 вопроса: 1. Как мне сохранить значение первоначального query, а не ссылку? Если я напишу Query q1 = this.query() будет ссылка. 2. Нет ли возможности использовать в качестве datasource хранимые процедуры? Корявый аксаптовский недоSQL слабоват. |
|
26.04.2012, 15:49 | #2 |
Молодой, подающий надежды
|
|
|
|
За это сообщение автора поблагодарили: Player1 (1), uskutus (1). |
26.04.2012, 15:57 | #3 |
Участник
|
|
|
26.04.2012, 16:23 | #4 |
Участник
|
А почему бы на постоянно не заменить display-метод на соединение с таблицей? Для чего возвращаться к display-методу обратно?
|
|
26.04.2012, 16:25 | #5 |
Участник
|
Еще вопрос возник, я сначала подумал, что если вызвать this.query в методе datasource Table1, вернется запрос для datasource. Но потом увидел конструкцию QueryBuildDataSource qbds = this.query().dataSourceTable(tablenum(Table1));
Получается это общий для всех datasource запрос? И мне надо использовать Table1_ds.query() ? Или это одно и тоже? |
|
26.04.2012, 16:28 | #6 |
Участник
|
this.query() подчинённого источника данных также возвращает общий запрос, а не только свою часть. Последний раз редактировалось S.Kuskov; 26.04.2012 в 16:35. |
|
|
За это сообщение автора поблагодарили: uskutus (1). |
26.04.2012, 16:28 | #7 |
Участник
|
Такая мысль была, но я подумал, что если постоянно не нужна эта таблица, может быть быстрее окажется приплюсовывать запрос. Хотя теперь еще раз подумал, наверное не быстрее)
Последний раз редактировалось uskutus; 26.04.2012 в 16:31. |
|
26.04.2012, 16:31 | #8 |
Участник
|
|
|
26.04.2012, 16:38 | #9 |
Участник
|
|
|
26.04.2012, 16:43 | #10 |
Участник
|
Честно? не понимаю что именно вы собираетесь сохранять?
Если нужна фильтрация, то добавляйте новый источник данных прописывайте связи и накладывайте на него фильтр. Если фильтр не нужен то отключайте добавленный источник и всё. Зачем запоминать исходный query? |
|
|
За это сообщение автора поблагодарили: Taker1796 (1). |
26.04.2012, 17:03 | #11 |
Участник
|
А как отключить добавленный источник? Еще хотелось узнать, как действует фильтр. Фильтруется набор данных в оперативной памяти или выполняется новый запрос к базе данных? Если первоначально фильтр был один, затем его изменили, видимо новый запрос.
Последний раз редактировалось uskutus; 26.04.2012 в 17:05. |
|
26.04.2012, 18:10 | #12 |
Участник
|
Если я ничего не путаю, то DataSource.enable(false)
В обоих случаях новый запрос. Дело в том что вообще говоря клиент никогда не тянет на себя весь результат запроса. Оперативно он получает от сервера только ту часть, которую необходимо отобразить, остальное подгружается по мере необходимости. |
|
04.05.2012, 09:38 | #13 |
Участник
|
|
|
04.05.2012, 12:17 | #15 |
Участник
|
Не знаю почему, но так пропадают все записи из грида.
С qbds.relations(false); такой проблемы нет. Зато есть другая проблема: по неизвестной причине строка qbds.relations(false); отрабатывает только при вызове executecuery из элемента грида. При автоматическом вызове после инициализации и проч. не отрабатывает. Проверил с помощью info(qbds.toString()); P.S. Разобрался. qbds.relations(false); работает только после того, как сначала вызвана qbds.relations(true); ))) Последний раз редактировалось uskutus; 04.05.2012 в 12:40. |
|
07.05.2012, 12:25 | #16 |
MCITP
|
Значит отключили что-то не то...
Не вздумайте отключать первый датасорс с квере Вообще тут никто не видит ни вашей структуры квери ни что вы пытаетесь в ней отключать, поэтому и сказать что-то конкретное сложно. Вообще-то relations() это включение/выключение связей между датасорсами на основании имеющихся связей между таблицами(EDT) в АОТ. С включением/выключением источника данных это ничего общего не имеет (не должно иметь) - датасорс всё равно остался (должен был остаться в кросс джоине). Либо вы чего-то не договариваете. Или не там смотрите... Проверьте запросы уходящие к БД на всякий случай с помощью трассировки SQL. Возможно увидите много нового и интересного.
__________________
Zhirenkov Vitaly Последний раз редактировалось ZVV; 07.05.2012 в 12:26. Причина: грамматика |
|