|
02.06.2006, 12:34 | #1 |
Гость
|
Динамическое изменение Query() на форме
Помогите, пожалуйста, решить проблемку
В форме PurchQuickQuote есть 3 связанных DataSource (InventTable,InventSum, InventDim). Мне необходимо динамически менять Query() по заданному условию(например по нажатию на кнопку). Как делаю: На кнопку вешаю InventTable_DS.ExecuteQuery() , и в exequteQuery() добавляю следующее: PHP код:
|
|
02.06.2006, 13:54 | #2 |
----------------
|
this.queryRun().query().
|
|
02.06.2006, 14:09 | #3 |
Гость
|
Цитата:
Сообщение от Wamr
this.queryRun().query().
более того пытался создать New Query() и выполнить.. PHP код:
Интересно то, что сам Query() меняется(если смотреть через Debuger), но выполняется не он, а первоначальный. Может что-то связанно с InventDimCtrl_Frm_QuickQuote(). Этот класс в ELEMENT.Run() модифицирует Query(). |
|
02.06.2006, 15:17 | #4 |
NavAx
|
ИМХО приджойнить что-то в датасорс формы можно только при init-е. Дальше можно только менять фильры\сортировку.
Когда-то стояла задача - сделать динамический джойн. Сделать удалось, правда для этого пришлось невидимо для пользователя закрывать\открывать форму.
__________________
С уважением, Игорь Ласийчук. |
|
02.06.2006, 16:05 | #5 |
Гость
|
Большое спасибо. Действительно, если добавлять Datasource в методе Init() - все работает.
|
|
02.06.2006, 16:31 | #6 |
Гость
|
Однако вопрос остается открытым!
Как же все-таки это сделать динамически? Неужели нет боьше никаких хитростей? Наверняка есть! Поделитесь советом. |
|
02.06.2006, 16:49 | #7 |
Участник
|
Если надо только для фильтрации воспользуйтесь ExistsJoin. Если из вашей таблицы надо вытаскивать данные, то прицепите ее в дизайне и фильтруйте по кнопке
__________________
Axapta v.3.0 sp5 kr2 |
|
02.06.2006, 17:14 | #8 |
Гость
|
В том-то и загвоздка, что изначально неизвестно Будет таблица учавствовать в запросе или нет, это определяется в процессе работы с формой.
|
|
02.06.2006, 17:25 | #9 |
----------------
|
Пример
Если вызвать фильтр на форме, то там можно к текущей табличке присоединять другие. Почему вы решили, что нельзя также сделать из кода?
И примерчик имеется. |
|
02.06.2006, 17:26 | #10 |
Участник
|
Вопрос не в участии/неучастии таблицы в запросе, а нужны/не нужны данные из таблицы в случае ее подключения
__________________
Axapta v.3.0 sp5 kr2 |
|
05.06.2006, 19:20 | #11 |
NavAx
|
Да, я некорректно ответил. Нельзя после init-а изменять датасорсы на форме. Т.е. даже если что-то и заджойнить, то отобразить эти данные нельзя.
Это можно в принципе обойти - если открыть\закрыть форму. Вот пример - код из класса, который вызван из init формы, но до вызова super(). Проверяется - есть ли в форме нужный датасорс - если нету - добавляется и форма переоткрывается. Код: // Метод вызывается из init формы до вызова super() protected void addDataSources() { Args args; Form formNew; FormRun formRunNew; FormBuildDataSource formBuildDataSource; int i; ; for (i = 1; i <= formRun.form().dataSourceCount(); i++) { formBuildDataSource = formRun.form().dataSource(i); // Ищем датасорсы - добавлены ли они уже в форму (добавляются динамически) if (formBuildDataSource.name() == #SetupGroupingDS) buildSetupGroupingDS = formBuildDataSource; } if (useGrouping && !buildSetupGroupingDS) restartForm = true; if (restartForm) // Не добавлены - придётся перезагружать форму { formNew = new Form(formRun.name()); // Добавляем датасорсы if (useGrouping) { formBuildDataSource = formNew.addDataSource(#SetupGroupingDS); formBuildDataSource.table(tablenum(TmpSysQuery)); formBuildDataSource.index(indexnum(TmpSysQuery, SortOrderIdx)); formBuildDataSource.allowCreate(false); formBuildDataSource.allowDelete(false); } // Теперь можно запустить новую форму - датасорсы добавлены args = formRun.args(); args.object(formNew); formRunNew = classFactory.formRunClass(args); formRunNew.init(); formRunNew.run(); formRunNew.wait(); // Не забыть закрыть старую форму если параметр restartForm = true // (это надо сделать после super() в init формы) } }
__________________
С уважением, Игорь Ласийчук. |
|
06.06.2006, 21:23 | #12 |
Участник
|
Привет.
Как я понял, надо изменить параметры фильтра с учетом дополнительных источников данных, связей, и range-ей по ним. При этом, состав полей для отображения меняться не должен. Для решения такой задачи нет необходимости переоткрывать форму, достаточно изменить запрос для главного источника данных (первого в запросе), а потом вызвать executeQuery на этом источнике.... Если надо модифицировать запрос с уже наложенным пользовательским фильтром, то брать надо запрос ..._ds.queryRun().query()... В качестве примера могу предложить разобрать функциональность отражения данных на форме например "Управление запасами\ Запросы\ В наличии" - кнопка "Отображение аналитик"
__________________
Alexander |
|
07.06.2006, 16:03 | #13 |
Участник
|
Было бы замечательно!!!
Только для наглядности хотелось бы усложнить задачу. Например, динамически присоединить к запросу таблицу InventTable и отфильтровать по полю ItemName. Буду весьма признателен! |
|
07.06.2006, 16:18 | #14 |
Участник
|
Цитата:
Сообщение от recruting2006
к запросу таблицу InventTable и отфильтровать по полю ItemName.
1. Вопрос как включить (говорю в терминах 1С) основное представление в виде наименования здесь уже обсуждался раз двадцать. Поищите пожалуйста. 2. Если вы таки поленитесь поискать, то подумайте над следующим - ваше усложнение добавляет в запрос таблицу... Таблица может быть большой... Как повлияет на производительность добавление таблицы? 3. Усложняем вопрос, таблиц, для которых может потребоваться наименование в запросе может быть несколько. Сколько таблиц с наименованиями должен присоединять ваш динамический запрос? Как это повлияет на производительность? 3.1. Еще вопрос - сколько таблиц в запросе может быть, чтобы MS SQL выполнял оптимизацию запроса? Сколько таблиц в запросе может быть, чтобы Oracle выполнял оптимизацию запроса? 3.2. ******** извините, удалил. самцензура ******** 4. ******** извините, удалил. самцензура ******** 5. Пожалуйста, поищите предыдущие обсуждения. |
|
07.06.2006, 17:04 | #15 |
Гость
|
Поиск по наименованию не цель, а наглядный пример...
|
|
07.06.2006, 17:28 | #16 |
Участник
|
Цитата:
Сообщение от Sasha
Коллеги, давайте обсудим постановку задачи конкретно, оценим время разработки, стоимость.... и код будет ваш...
Цитата:
Сообщение от makos
Мне необходимо динамически менять Query() по заданному условию(например по нажатию на кнопку).
Создайте форму, в которой будет несколько возможных вариантов Query отображаться на разных закладках. "По нажатию на кнопку" переключайтесь между закладками. Время - пол дня, стоимость создания - минимальная, стоимость сопровождения - минимальная, код - тривиальный. Но вы сейчас начнете говорить о том, что вариантов может быть бесконечное множество, что ваши пользователи вводят тысячи абсолютно произвольных параметров (они их помнят!)... Вы будете говорить, что права доступа вы совершенно не контролируете (специфика вашего предприятия такая)... В общем, в очередной раз мы увидим программистский подход к решению бизнес-задачи... |
|
07.06.2006, 17:49 | #17 |
Участник
|
Ок. упорствуйте и разбирайтесь.
Скажу только, что фильтр вам придется вводить не только в форму в Наличии, но и по крайней мере в форму создания строк, а также в отчеты которые показывают наличие на складе. Удачи. |
|
07.06.2006, 20:08 | #18 |
----------------
|
makos,
в чем трудность? PHP код:
|
|
08.06.2006, 01:15 | #19 |
Участник
|
Может я чего не понял, но если вам нужна конкретно фильтрация по наименованию номенклатуры в запросе В наличии, то ее просто можно добавить в методе modifyQuery класса InventDimCtrl_Frm_OnHand следующим образом:
Код: void modifyQuery( ..... InventDimParm inventDimParmRange; QueryBuildDataSource qBDSITable; ; qBSSum = inventSum_DS.query().dataSourceName(inventSum_DS.name()); qBDSITable = qBSSum.addDataSource(tableNum(InventTable)); qBDSITable.addSelectionField(fieldNum(InventTable, ItemName)); qBDSITable.orderMode(OrderMode::GroupBY); qBDSITable.addSortField(fieldNum(InventTable, ItemId)); qBDSITable.relations(true); qBSSum.sortClear(); ..... Код в браузере набирал, может где ошибся |
|
05.07.2006, 16:28 | #20 |
Участник
|
Spasibo za kod... tozhe muchalsja s etoj problemoj (dinamicheskij Link/Join)
vsja zagvostka zdes': Код: if(InventSum_ds.queryRun()) q = InventSum_ds.queryRun().query(); else q = InventSum_ds.query(); |
|
Теги |
lookup, query, программно |
|
Опции темы | Поиск в этой теме |
Опции просмотра | |
|