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

 
 
Опции темы Поиск в этой теме Опции просмотра
Старый 02.06.2006, 12:34   #1  
makos
Гость
 
n/a
Динамическое изменение Query() на форме
Помогите, пожалуйста, решить проблемку
В форме PurchQuickQuote есть 3 связанных DataSource (InventTable,InventSum, InventDim). Мне необходимо динамически менять Query() по заданному условию(например по нажатию на кнопку).
Как делаю: На кнопку вешаю InventTable_DS.ExecuteQuery() , и в exequteQuery() добавляю следующее:
PHP код:
void exequteQuery()
{
....
QueryBuildDataSource qbds_IT;
QueryBuildDataSource qbds_My;
QueryBuildRange qbr
....
// К InventTable_ds.Query() добовляю свой DataSource
qbds_IT this.query().dataSourceTable(tablenum(InventTable));
qbds_My qbds_IT.addDataSource(tablenum(MyTable));
qbds_My.JoinMode(JoinMode::InnerJoin);
qbds_My.fetchMode(0);
qbds_My.addLink(fieldnum(InventTable,ItemId),fieldnum(MyTable,KeyValue));
// Задаю Range
qbr qbds_My.findRange(Fieldnum(MyTable,TypeID));
if (!
qbr)
qbr qbds_My.addRange(Fieldnum(HMyTable,TypeID));
qbr.value(QueryValue(2));
 
super();

Ничего нового не происходит. Что я делаю не так?
Старый 02.06.2006, 13:54   #2  
Wamr is offline
Wamr
----------------
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
 
1,737 / 858 (32) +++++++
Регистрация: 15.01.2002
Адрес: Москва
Записей в блоге: 7
this.queryRun().query().
Старый 02.06.2006, 14:09   #3  
makos
Гость
 
n/a
Цитата:
Сообщение от Wamr
this.queryRun().query().
пробовал, результат тот же.
более того пытался создать New Query() и выполнить..

PHP код:
= New Query();
.......
this.Query(Q);
super(); 
результат как был так и остался.
Интересно то, что сам Query() меняется(если смотреть через Debuger), но выполняется не он, а первоначальный.
Может что-то связанно с InventDimCtrl_Frm_QuickQuote(). Этот класс в ELEMENT.Run() модифицирует Query().
Старый 02.06.2006, 15:17   #4  
Garic is offline
Garic
NavAx
Аватар для Garic
NavAx Club
 
393 / 63 (3) ++++
Регистрация: 23.07.2002
Адрес: Москва
ИМХО приджойнить что-то в датасорс формы можно только при init-е. Дальше можно только менять фильры\сортировку.
Когда-то стояла задача - сделать динамический джойн. Сделать удалось, правда для этого пришлось невидимо для пользователя закрывать\открывать форму.
__________________
С уважением, Игорь Ласийчук.
Старый 02.06.2006, 16:05   #5  
makos
Гость
 
n/a
Большое спасибо. Действительно, если добавлять Datasource в методе Init() - все работает.
Старый 02.06.2006, 16:31   #6  
makos
Гость
 
n/a
?
Однако вопрос остается открытым!
Как же все-таки это сделать динамически?
Неужели нет боьше никаких хитростей?
Наверняка есть!

Поделитесь советом.
Старый 02.06.2006, 16:49   #7  
AndyD is offline
AndyD
Участник
КОРУС Консалтинг
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
 
2,560 / 2479 (88) +++++++++
Регистрация: 20.08.2005
Если надо только для фильтрации воспользуйтесь ExistsJoin. Если из вашей таблицы надо вытаскивать данные, то прицепите ее в дизайне и фильтруйте по кнопке
__________________
Axapta v.3.0 sp5 kr2
Старый 02.06.2006, 17:14   #8  
makos
Гость
 
n/a
В том-то и загвоздка, что изначально неизвестно Будет таблица учавствовать в запросе или нет, это определяется в процессе работы с формой.
Старый 02.06.2006, 17:25   #9  
Wamr is offline
Wamr
----------------
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
 
1,737 / 858 (32) +++++++
Регистрация: 15.01.2002
Адрес: Москва
Записей в блоге: 7
Пример
Если вызвать фильтр на форме, то там можно к текущей табличке присоединять другие. Почему вы решили, что нельзя также сделать из кода?

И примерчик имеется.
Вложения
Тип файла: xpo tutorial_Form_DisplayOptions.xpo (18.3 Кб, 301 просмотров)
Старый 02.06.2006, 17:26   #10  
AndyD is offline
AndyD
Участник
КОРУС Консалтинг
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
 
2,560 / 2479 (88) +++++++++
Регистрация: 20.08.2005
Вопрос не в участии/неучастии таблицы в запросе, а нужны/не нужны данные из таблицы в случае ее подключения
__________________
Axapta v.3.0 sp5 kr2
Старый 05.06.2006, 19:20   #11  
Garic is offline
Garic
NavAx
Аватар для Garic
NavAx Club
 
393 / 63 (3) ++++
Регистрация: 23.07.2002
Адрес: Москва
Да, я некорректно ответил. Нельзя после 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  
Sasha is offline
Sasha
Участник
 
3 / 10 (1) +
Регистрация: 18.02.2005
Адрес: Москва
Привет.

Как я понял, надо изменить параметры фильтра с учетом дополнительных источников данных, связей, и range-ей по ним. При этом, состав полей для отображения меняться не должен.

Для решения такой задачи нет необходимости переоткрывать форму, достаточно изменить запрос для главного источника данных (первого в запросе), а потом вызвать executeQuery на этом источнике....

Если надо модифицировать запрос с уже наложенным пользовательским фильтром, то брать надо запрос ..._ds.queryRun().query()...

В качестве примера могу предложить разобрать функциональность отражения данных на форме например "Управление запасами\ Запросы\ В наличии" - кнопка "Отображение аналитик"
__________________
Alexander
Старый 07.06.2006, 16:03   #13  
recruting2006 is offline
recruting2006
Участник
 
2 / 10 (1) +
Регистрация: 28.03.2006
Было бы замечательно!!!
Только для наглядности хотелось бы усложнить задачу. Например, динамически присоединить к запросу таблицу InventTable и отфильтровать по полю ItemName.

Буду весьма признателен!
Старый 07.06.2006, 16:18   #14  
mazzy is offline
mazzy
Участник
Аватар для mazzy
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
Лучший по профессии 2009
 
29,472 / 4494 (208) ++++++++++
Регистрация: 29.11.2001
Адрес: Москва
Записей в блоге: 10
Цитата:
Сообщение от recruting2006
к запросу таблицу InventTable и отфильтровать по полю ItemName.
*********** извините, удалил. самцензура ***********

1. Вопрос как включить (говорю в терминах 1С) основное представление в виде наименования здесь уже обсуждался раз двадцать. Поищите пожалуйста.

2. Если вы таки поленитесь поискать, то подумайте над следующим - ваше усложнение добавляет в запрос таблицу... Таблица может быть большой... Как повлияет на производительность добавление таблицы?

3. Усложняем вопрос, таблиц, для которых может потребоваться наименование в запросе может быть несколько. Сколько таблиц с наименованиями должен присоединять ваш динамический запрос? Как это повлияет на производительность?

3.1. Еще вопрос - сколько таблиц в запросе может быть, чтобы MS SQL выполнял оптимизацию запроса? Сколько таблиц в запросе может быть, чтобы Oracle выполнял оптимизацию запроса?

3.2. ******** извините, удалил. самцензура ********

4. ******** извините, удалил. самцензура ********

5. Пожалуйста, поищите предыдущие обсуждения.
__________________
полезное на axForum, github, vk, coub.
Старый 07.06.2006, 17:04   #15  
makos
Гость
 
n/a
Поиск по наименованию не цель, а наглядный пример...
Старый 07.06.2006, 17:20   #16  
Sasha is offline
Sasha
Участник
 
3 / 10 (1) +
Регистрация: 18.02.2005
Адрес: Москва
Коллеги, давайте обсудим постановку задачи конкретно, оценим время разработки, стоимость.... и код будет ваш...

А если кроме шуток, то в случае подключения второго подчиненного источника могут возникнуть проблемы, в таком случае попробуйте организовать запрос таким образом, что бы не было двух подчиненных (В случе с InventTable можно сделать его первым... опять же надо более точно задачу сформулировать)
__________________
Alexander
Старый 07.06.2006, 17:22   #17  
mazzy is offline
mazzy
Участник
Аватар для mazzy
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
Лучший по профессии 2009
 
29,472 / 4494 (208) ++++++++++
Регистрация: 29.11.2001
Адрес: Москва
Записей в блоге: 10
Цитата:
Сообщение от makos
Поиск по наименованию не цель, а наглядный пример...
ап-солютно согласен.
__________________
полезное на axForum, github, vk, coub.
Старый 07.06.2006, 17:28   #18  
mazzy is offline
mazzy
Участник
Аватар для mazzy
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
Лучший по профессии 2009
 
29,472 / 4494 (208) ++++++++++
Регистрация: 29.11.2001
Адрес: Москва
Записей в блоге: 10
Цитата:
Сообщение от Sasha
Коллеги, давайте обсудим постановку задачи конкретно, оценим время разработки, стоимость.... и код будет ваш...
пожалуйста.

Цитата:
Сообщение от makos
Мне необходимо динамически менять Query() по заданному условию(например по нажатию на кнопку).
Не меняйте query.
Создайте форму, в которой будет несколько возможных вариантов Query отображаться на разных закладках.

"По нажатию на кнопку" переключайтесь между закладками.
Время - пол дня, стоимость создания - минимальная, стоимость сопровождения - минимальная, код - тривиальный.

Но вы сейчас начнете говорить о том, что вариантов может быть бесконечное множество, что ваши пользователи вводят тысячи абсолютно произвольных параметров (они их помнят!)... Вы будете говорить, что права доступа вы совершенно не контролируете (специфика вашего предприятия такая)... В общем, в очередной раз мы увидим программистский подход к решению бизнес-задачи...
__________________
полезное на axForum, github, vk, coub.
Старый 07.06.2006, 17:44   #19  
makos
Гость
 
n/a
Постановка задачи:

Предоставить пользователю возможность в форме "В наличии" (InventOnhandItem)включать/отключать фильтрацию по полю(полям) справочника номенклатуры(InventTable).

Учитывая особенности данной формы, фильтруемые поля необходимо ограничить. Предлагаю для примера взять хотя бы одно поле(все равно какое)
Старый 07.06.2006, 17:49   #20  
mazzy is offline
mazzy
Участник
Аватар для mazzy
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
Лучший по профессии 2009
 
29,472 / 4494 (208) ++++++++++
Регистрация: 29.11.2001
Адрес: Москва
Записей в блоге: 10
Ок. упорствуйте и разбирайтесь.

Скажу только, что фильтр вам придется вводить не только в форму в Наличии, но и по крайней мере в форму создания строк, а также в отчеты которые показывают наличие на складе.

Удачи.
__________________
полезное на axForum, github, vk, coub.
Теги
lookup, query, программно

 

Похожие темы
Тема Автор Раздел Ответов Посл. сообщение
изменение LookUp поле на форме SHiSHok DAX: Программирование 15 25.02.2013 13:26
Динамическое изменение query для отчета Peppi DAX: Программирование 1 25.11.2008 06:59
Как в форме CustTrans через query отобрать записи у которых AmountCur != 0 ( когда в QueryBuildRange ставишь value(strFmt('!0')); - не работает!) rkorchagin DAX: Программирование 12 02.04.2007 17:58
Как вызвать изменение Query в DS1 не вызывая метод executeQuery? Morpheus DAX: Программирование 5 17.10.2006 10:26
Изменение Query у некоторых пользователей Владимир Максимов DAX: Программирование 9 23.09.2005 14:57

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

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

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