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

 
 
Опции темы Поиск в этой теме Опции просмотра
Старый 16.09.2013, 09:34   #1  
Fizik is offline
Fizik
Участник
 
26 / 10 (1) +
Регистрация: 07.07.2005
Адрес: Владивосток
? Как получить в query фильтр, созданный на форме пользователем? (Ax 3.0)
Подскажите пожалуйста, как получить в query конструкцию фильтра, созданную пользователем на форме.
Т.е. пользователь заходит в "Карточку сотрудника", выбирает там только операторов, принятых до 01.01.2013. Форма отображает нужные записи.
Как обратиться к этому составленному запросу в коде?
Старый 16.09.2013, 09:51   #2  
S.Kuskov is offline
S.Kuskov
Участник
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
 
3,440 / 1775 (66) ++++++++
Регистрация: 28.04.2007
Адрес: Калуга
Form, Datasource
Старый 16.09.2013, 13:55   #3  
Fizik is offline
Fizik
Участник
 
26 / 10 (1) +
Регистрация: 07.07.2005
Адрес: Владивосток
Спасибо, ds_q и ds_qr было новым. Но мне этого не хватило. Пишу на кнопку формы:
X++:
    queryRun = emplTable_qr;
    while(queryRun.next())
    {
        emplTable = queryRun.get(tablenum(emplTable));
        info(emplTable.EmplId);
        i++;
    }
    info(int2str(i));
    super();
Результат: первая запись в info не попадает. Видимо, надо как-то "сдвигать курсор" в начало.
При повторном вызове цикл не выполняется совсем. Я так понимаю, потому что qr закончен. Как начать его сначала?
Старый 16.09.2013, 15:35   #4  
LeonDerCom is offline
LeonDerCom
Участник
 
45 / 20 (1) +++
Регистрация: 08.10.2012
Так он у вас и так на первой записи стоит, а вы его некстом прогнали на 2-ую позицию, то есть либо вот так:
X++:
queryRun = emplTable_qr;
emplTable = queryRun.get(tablenum(emplTable));
info(emplTable.EmplId);
i++;
while(queryRun.next())
{
emplTable = queryRun.get(tablenum(emplTable));
info(emplTable.EmplId);
i++;
}
info(int2str(i));
super();
Иначе
X++:
QueryRun      queryRun;
EmplTable     tEmplTable;
int             i;
;
queryRun = new QueryRun(EmplTable_q);
while(queryRun.next())
{
    tEmplTable = queryRun.get(tablenum(EmplTable));
    info(strFmt('%1', tEmplTable.EmplId));
    i++;
}
info(int2str(i));
За это сообщение автора поблагодарили: Fizik (1).
Старый 16.09.2013, 17:29   #5  
kashperuk is offline
kashperuk
Участник
Аватар для kashperuk
MCBMSS
Соотечественники
Сотрудники Microsoft Dynamics
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии 2011
Лучший по профессии 2009
 
4,361 / 2084 (78) +++++++++
Регистрация: 30.05.2004
Адрес: Atlanta, GA, USA
Добавлю, что именно второй вариант стоит использовать, когда создается новый инстанс QueryRun на основании запроса из таблицы (там возможно лучше EmplTable_qr.query(), чтобы пользовательские фильтры тоже попали).

Вообще не очень люблю код, где итерируют запрос, который в это же время отображается на форме.
Я, конечно, оптимист, но не верю в 100% работу ядра
Старый 16.09.2013, 21:44   #6  
Logger is offline
Logger
Участник
Лучший по профессии 2015
Лучший по профессии 2014
 
3,952 / 3230 (115) ++++++++++
Регистрация: 12.10.2004
Адрес: Москва
Записей в блоге: 2
Цитата:
Сообщение от Fizik Посмотреть сообщение
При повторном вызове цикл не выполняется совсем. Я так понимаю, потому что qr закончен. Как начать его сначала?
X++:
QueryRun.reset();
ставлю везде на автопилоте. Всегда помогает.
За это сообщение автора поблагодарили: Fizik (1).
Старый 16.09.2013, 21:46   #7  
Logger is offline
Logger
Участник
Лучший по профессии 2015
Лучший по профессии 2014
 
3,952 / 3230 (115) ++++++++++
Регистрация: 12.10.2004
Адрес: Москва
Записей в блоге: 2
Цитата:
Сообщение от kashperuk Посмотреть сообщение
Добавлю, что именно второй вариант стоит использовать, когда создается новый инстанс QueryRun на основании запроса из таблицы (там возможно лучше EmplTable_qr.query(), чтобы пользовательские фильтры тоже попали).
Там еще надо дайналинки красиво в обычные range переделать.
Для чего были соответствующие методы то ли в global то ли в sysQuery. Навскидку не помню.
Старый 16.09.2013, 22:47   #8  
Aron is offline
Aron
Участник
 
2 / 11 (1) +
Регистрация: 13.05.2013
Цитата:
Сообщение от Fizik Посмотреть сообщение
Результат: первая запись в info не попадает. Видимо, надо как-то "сдвигать курсор" в начало.
При повторном вызове цикл не выполняется совсем. Я так понимаю, потому что qr закончен. Как начать его сначала?
Вспомните про конструкцию do{}while().
А после прохода сдвиньте курсор на первую позицию.
За это сообщение автора поблагодарили: Corkscrew (1).
Старый 17.09.2013, 13:22   #9  
LRA is offline
LRA
Участник
 
41 / 39 (2) +++
Регистрация: 19.12.2005
Адрес: Москва
X++:
    FormDataSource          fds;
    QueryBuildDataSource    qbds;
    ;
    fds = this.dataSource(<     >);
    query   = fds.queryRun().query();   // Запрос с учетом фильтра пользователя на форме, заданного, например, по Ctrl+F3
//или
    query   = fds.query();              // Это если без учета фильтра пользователя
    qbds = query.dataSourceNo(xx);
//модификация qbds, если нужно, например,  qbds.addRange(…);
    queryRun = New QueryRun(query);

Последний раз редактировалось LRA; 17.09.2013 в 13:34.
Старый 17.09.2013, 18:34   #10  
LRA is offline
LRA
Участник
 
41 / 39 (2) +++
Регистрация: 19.12.2005
Адрес: Москва
Цитата:
Сообщение от Fizik Посмотреть сообщение
Пишу на кнопку формы:
X++:
    queryRun = emplTable_qr;
    while(queryRun.next())
    {
        emplTable = queryRun.get(tablenum(emplTable));
        info(emplTable.EmplId);
        i++;
    }
    info(int2str(i));
    super();
Результат: первая запись в info не попадает. Видимо, надо как-то "сдвигать курсор" в начало.
При повторном вызове цикл не выполняется совсем. Я так понимаю, потому что qr закончен. Как начать его сначала?
Однозначно queryRun.reset();

Но тут многое зависит и от того, что Вы собираетесь делать с queryRun. В большинстве случаев лучше создать новый queryRun = New QueryRun(query);
Старый 18.09.2013, 01:32   #11  
Fizik is offline
Fizik
Участник
 
26 / 10 (1) +
Регистрация: 07.07.2005
Адрес: Владивосток
Спасибо всем за развернутые ответы. Все получилось и уже в работе.
Могу написать, для какой цели такая задача: из 2000 сотрудников примерно 600 необходимо напечатать доп. соглашения в Word, причем однозначного критерия, кому надо, нет. Поэтому даю пользователю в форме выбрать нужную партию людей и кнопку для печати документов для них, потом след. партия по другим критериям.
Старый 18.09.2013, 08:05   #12  
pitersky is offline
pitersky
северный Будда
Аватар для pitersky
Ex AND Project
Соотечественники
 
1,510 / 435 (18) +++++++
Регистрация: 26.09.2007
Адрес: Солнечная система
Можно было с другой стороны зайти - после наложения фильтра выбирать все отфильтрованные записи по Ctrl-A и печатать их. Тогда в печати надо будет просто перебрать выбранные строки датасоурса
__________________
С уважением,
Вячеслав
За это сообщение автора поблагодарили: Corkscrew (1).
 

Похожие темы
Тема Автор Раздел Ответов Посл. сообщение
atinkerersnotebook: Walkthrough & Tutorial Summary Blog bot DAX Blogs 1 09.09.2013 09:11
ax-erp: Pass Query from dialog to Form and Filter records Blog bot DAX Blogs 0 18.09.2012 18:11
ax-erp: Get underlying SQL query using getSQLStatement [Dynamics AX 2012] Blog bot DAX Blogs 0 19.07.2012 18:11
axinthefield: Compatibility Testing for Microsoft Dynamics AX Blog bot DAX Blogs 0 23.06.2012 02:26
Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск
Опции просмотра

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

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

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