|
21.06.2016, 11:58 | #1 |
Участник
|
вопросы по query
Доброго времени суток!
Не могли бы вы рассказать, или указать на источники информации, где подробно можно прочитать про настройку запросов для кнопки "выбрать", на изображении ниже. Я вывел эту кнопку на диалог и, как я понимаю, теперь с помощью неё можно настроить какие-то свои написанные запросы (с выборкой по диапазону значений) и тому подобное, но как это сделать я не понимаю. Ну и если я совсем неправильно написал вопрос, то не могли бы вы указать на мои проблемы в понимании. |
|
21.06.2016, 11:58 | #2 |
Участник
|
|
|
21.06.2016, 12:27 | #3 |
Участник
|
https://jkmsdax2012.wordpress.com/20...x-2009ax-2012/
В приведенном примере настройка Query выполняется в методе initParmDefault(). Описание класса Query который формирует структуру запроса смотрите здесь: https://msdn.microsoft.com/en-us/library/query.aspx Примеры ищутся быстро по ключевым словам QueryBuildDataSource и QueryBuildRange.
__________________
Ален ноби, ностра алис. Что означает - если один человек построил, другой завсегда разобрать может. |
|
|
За это сообщение автора поблагодарили: Artikov (1). |
21.06.2016, 16:13 | #4 |
Участник
|
Теперь вопрос правильно ли я понимаю сущность запроса. К примеру, у меня есть таблица TableHead, где есть поле Posted с типом NoYes, я хочу в запросе выбрать только те строки, в которых поле Posted = No.
X++: protected QueryRun buildInternalQueryRun(QueryRun _queryRun) { Query query; QueryBuildDataSource qbds; QueryBuildRange qbr; query = new Query(); qbds = _queryRun.query().dataSourceTable(tableNum(TableHead)); qbr = qbds.addRange(fieldNum(TableHead,Posted)); qbr.value(enum2str(NoYes::No)); return new QueryRun(query); } X++: qbr = qbds.addRange(fieldNum(TableHead,Posted));
qbr.value(enum2str(NoYes::No)); X++: return new QueryRun(query); |
|
21.06.2016, 16:25 | #5 |
Участник
|
Query - это "чертеж" (план) по которому Вы собираетесь построить "автомобиль"
QueryRun - это построенный по "чертежу" этот самый "автомобиль" Но, сами понимаете, ни "чертеж", ни готовый "автомобиль" Вас никуда не отвезут. Надо в него "сесть" и "поехать" Собственно "езда" это X++: while (queryRun.next()) { // Вот здесь можем анализировать очередную строку выборки }
__________________
- Может, я как-то неправильно живу?! - Отчего же? Правильно. Только зря... |
|
|
За это сообщение автора поблагодарили: Товарищ ♂uatr (1). |
22.06.2016, 11:33 | #6 |
Участник
|
Спасибо большое за предыдущие ответы, очень помогло в понимании.
У меня возник еще один вопрос. На данный момент я реализовал в своем проекте следующие вещи: У меня есть диалог, в этом диалоге есть поле, в которое я ввожу значение №, для которого будут проводиться дальнейшие операции. Есть запрос, который устанавливает фильтр на значения поля Posted в таблице, над которой эти операции будут производиться (рисунок 1). В кнопке выбрать, как я понимаю, можно установить дополнительные параметры. К примеру задать конкретный номер или еще что-нибудь(Рисунок 2): В настоящий момент в классе реализована логика только для той ситуации, когда пользователь ввел № в поле и нажал на кнопку "ок". Вопрос в следующем, если пользователь не ввел номер, а оставил поле пустым и решил воспользоваться результатом запроса на рисунке 2, то каким образом это обрабатывается и каким образом получить доступ к результатам этого запроса, чтобы по ним изменить нужные значения в таблице? |
|
22.06.2016, 11:57 | #7 |
северный Будда
|
За query отвечает только то, что лежит под кнопкой Выбрать
Ваш номер документа попадёт в query только в том случае, если вы его туда вставите принудительно
__________________
С уважением, Вячеслав |
|
22.06.2016, 12:10 | #8 |
Участник
|
Цитата:
Попробую спросить иначе: Если пользователь оставляет поле "Номер документа" пустым и хочет произвести изменения в таблице опираясь только на те условия, которые задаст нажав на кнопку "выбрать" (В частности те условия, которые показаны на втором рисунке), после этого нажимает на кнопку "ок". Как в таком случае в программе учитывать то, что он указал в запросах вручную? |
|
22.06.2016, 12:15 | #9 |
Участник
|
QueryRun после нажатия на кнопку ОК вы получите уже с учетом введенных пользователем фильтров. Чтобы удостовериться в этом можно вывести в инфолог что-то типа info(queryRun.query().dataSourceNo(1).toString()); перед тем местом, где планируете использовать queryRun.next()
__________________
Существует 10 типов людей: одни понимают двоичную систему, другие - нет. |
|
|
За это сообщение автора поблагодарили: Artikov (1). |
22.06.2016, 12:18 | #10 |
Участник
|
X++: // ClassDeclaration class MyClass extends RunBase { // Переменная, которая будет использована в диалоге с пользователем QueryRun myQueryRun; } // Перекрыть метод класса RunBase, чтобы указать, // какую именно переменную надо использовать в диалоге с пользователем public QueryRun queryRun() { return myQueryRun; } // Перекрыть метод void run() { Query query; QueryBuildDataSource qbds; QueryBuildRange qbr; ; // Вот здесь в переменной myQueryRun теперь находится то, // что пользователь указал в диалоге по кнопке "Выбрать" // Именно здесь теперь можно дополнить критерии отбора, если необходимо if ("Номер документа") { query = myQueryRun.query(); qbds = query.DataSource(tablenum(MyTable)); qbr = qbds.addRange(feldnum(MyTable, MyField)); qbr.value(sysQuery::value("Номер документа")); } // Если не создавать новый QueryRun, то изменения в Query сразу отразятся на нем while (myQueryRun.next()) { ..... } }
__________________
- Может, я как-то неправильно живу?! - Отчего же? Правильно. Только зря... |
|
22.06.2016, 12:24 | #11 |
Участник
|
На всякий случай замечу, что если Вы выводите настройку значения поля в окно диалога, то имеет смысл заблокировать возможность указать значение в этом поле через кнопку "Выбрать".
Должна быть одна точка ввода: или объект на форме диалога или по кнопке "Выбрать". Если точек ввода значения несколько, то у Вас будут дополнительные проблемы в том, как их совместить
__________________
- Может, я как-то неправильно живу?! - Отчего же? Правильно. Только зря... |
|
22.06.2016, 12:49 | #12 |
Участник
|
Цитата:
Сообщение от Владимир Максимов
На всякий случай замечу, что если Вы выводите настройку значения поля в окно диалога, то имеет смысл заблокировать возможность указать значение в этом поле через кнопку "Выбрать".
Должна быть одна точка ввода: или объект на форме диалога или по кнопке "Выбрать". Если точек ввода значения несколько, то у Вас будут дополнительные проблемы в том, как их совместить |
|
22.06.2016, 12:47 | #13 |
Участник
|
Огромное спасибо за ответы, все получилось!
Не знал, что в мой объект queryRun записываются и дополнительные фильтры, введенные пользователем. Хотя это логично, по сути. |
|