|
16.09.2013, 09:34 | #1 |
Участник
|
Как получить в query фильтр, созданный на форме пользователем? (Ax 3.0)
Подскажите пожалуйста, как получить в query конструкцию фильтра, созданную пользователем на форме.
Т.е. пользователь заходит в "Карточку сотрудника", выбирает там только операторов, принятых до 01.01.2013. Форма отображает нужные записи. Как обратиться к этому составленному запросу в коде? |
|
16.09.2013, 09:51 | #2 |
Участник
|
|
|
16.09.2013, 13:55 | #3 |
Участник
|
Спасибо, ds_q и ds_qr было новым. Но мне этого не хватило. Пишу на кнопку формы:
X++: queryRun = emplTable_qr; while(queryRun.next()) { emplTable = queryRun.get(tablenum(emplTable)); info(emplTable.EmplId); i++; } info(int2str(i)); super(); При повторном вызове цикл не выполняется совсем. Я так понимаю, потому что qr закончен. Как начать его сначала? |
|
16.09.2013, 21:44 | #4 |
Участник
|
|
|
|
За это сообщение автора поблагодарили: Fizik (1). |
16.09.2013, 22:47 | #5 |
Участник
|
Цитата:
А после прохода сдвиньте курсор на первую позицию. |
|
|
За это сообщение автора поблагодарили: Corkscrew (1). |
17.09.2013, 18:34 | #6 |
Участник
|
Цитата:
Сообщение от Fizik
Пишу на кнопку формы:
X++: queryRun = emplTable_qr; while(queryRun.next()) { emplTable = queryRun.get(tablenum(emplTable)); info(emplTable.EmplId); i++; } info(int2str(i)); super(); При повторном вызове цикл не выполняется совсем. Я так понимаю, потому что qr закончен. Как начать его сначала? Но тут многое зависит и от того, что Вы собираетесь делать с queryRun. В большинстве случаев лучше создать новый queryRun = New QueryRun(query); |
|
16.09.2013, 15:35 | #7 |
Участник
|
Так он у вас и так на первой записи стоит, а вы его некстом прогнали на 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 | #8 |
Участник
|
Добавлю, что именно второй вариант стоит использовать, когда создается новый инстанс QueryRun на основании запроса из таблицы (там возможно лучше EmplTable_qr.query(), чтобы пользовательские фильтры тоже попали).
Вообще не очень люблю код, где итерируют запрос, который в это же время отображается на форме. Я, конечно, оптимист, но не верю в 100% работу ядра |
|
16.09.2013, 21:46 | #9 |
Участник
|
Цитата:
Для чего были соответствующие методы то ли в global то ли в sysQuery. Навскидку не помню. |
|
17.09.2013, 13:22 | #10 |
Участник
|
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. |
|
18.09.2013, 01:32 | #11 |
Участник
|
Спасибо всем за развернутые ответы. Все получилось и уже в работе.
Могу написать, для какой цели такая задача: из 2000 сотрудников примерно 600 необходимо напечатать доп. соглашения в Word, причем однозначного критерия, кому надо, нет. Поэтому даю пользователю в форме выбрать нужную партию людей и кнопку для печати документов для них, потом след. партия по другим критериям. |
|
18.09.2013, 08:05 | #12 |
северный Будда
|
Можно было с другой стороны зайти - после наложения фильтра выбирать все отфильтрованные записи по Ctrl-A и печатать их. Тогда в печати надо будет просто перебрать выбранные строки датасоурса
__________________
С уважением, Вячеслав |
|
|
За это сообщение автора поблагодарили: Corkscrew (1). |