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

 
 
Опции темы Поиск в этой теме Опции просмотра
Старый 21.06.2016, 11:58   #1  
Artikov is offline
Artikov
Участник
 
33 / 12 (1) ++
Регистрация: 06.06.2016
вопросы по query
Доброго времени суток!

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



Я вывел эту кнопку на диалог и, как я понимаю, теперь с помощью неё можно настроить какие-то свои написанные запросы (с выборкой по диапазону значений) и тому подобное, но как это сделать я не понимаю. Ну и если я совсем неправильно написал вопрос, то не могли бы вы указать на мои проблемы в понимании.
Старый 21.06.2016, 11:58   #2  
Artikov is offline
Artikov
Участник
 
33 / 12 (1) ++
Регистрация: 06.06.2016
https://www.dropbox.com/s/9vhh5inzdg...ialog.png?dl=0

Вот ссылка на изображение
Старый 21.06.2016, 12:27   #3  
AlGol is offline
AlGol
Участник
 
277 / 93 (4) ++++
Регистрация: 24.12.2001
Адрес: Тверь.
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  
Artikov is offline
Artikov
Участник
 
33 / 12 (1) ++
Регистрация: 06.06.2016
Теперь вопрос правильно ли я понимаю сущность запроса. К примеру, у меня есть таблица 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  
Владимир Максимов is offline
Владимир Максимов
Участник
КОРУС Консалтинг
 
1,701 / 1195 (43) ++++++++
Регистрация: 13.01.2004
Записей в блоге: 3
Query - это "чертеж" (план) по которому Вы собираетесь построить "автомобиль"
QueryRun - это построенный по "чертежу" этот самый "автомобиль"

Но, сами понимаете, ни "чертеж", ни готовый "автомобиль" Вас никуда не отвезут. Надо в него "сесть" и "поехать" Собственно "езда" это

X++:
while (queryRun.next())
{
 // Вот здесь можем анализировать очередную строку выборки
}
Выполнение запроса (обращение к серверу) будет выполнено только в момент подачи первой команды queryRun.next(). Все, что было до этого - это подготовка, а не само выполнение
__________________
- Может, я как-то неправильно живу?!
- Отчего же? Правильно. Только зря...
За это сообщение автора поблагодарили: Товарищ ♂uatr (1).
Старый 22.06.2016, 11:33   #6  
Artikov is offline
Artikov
Участник
 
33 / 12 (1) ++
Регистрация: 06.06.2016
Спасибо большое за предыдущие ответы, очень помогло в понимании.
У меня возник еще один вопрос. На данный момент я реализовал в своем проекте следующие вещи:
У меня есть диалог, в этом диалоге есть поле, в которое я ввожу значение №, для которого будут проводиться дальнейшие операции. Есть запрос, который устанавливает фильтр на значения поля Posted в таблице, над которой эти операции будут производиться (рисунок 1).

В кнопке выбрать, как я понимаю, можно установить дополнительные параметры. К примеру задать конкретный номер или еще что-нибудь(Рисунок 2):

В настоящий момент в классе реализована логика только для той ситуации, когда пользователь ввел № в поле и нажал на кнопку "ок". Вопрос в следующем, если пользователь не ввел номер, а оставил поле пустым и решил воспользоваться результатом запроса на рисунке 2, то каким образом это обрабатывается и каким образом получить доступ к результатам этого запроса, чтобы по ним изменить нужные значения в таблице?
Миниатюры
Нажмите на изображение для увеличения
Название: 1.png
Просмотров: 281
Размер:	4.5 Кб
ID:	10864   Нажмите на изображение для увеличения
Название: 2.png
Просмотров: 334
Размер:	9.4 Кб
ID:	10865  

Старый 22.06.2016, 11:57   #7  
pitersky is offline
pitersky
северный Будда
Аватар для pitersky
Ex AND Project
Соотечественники
 
1,510 / 435 (18) +++++++
Регистрация: 26.09.2007
Адрес: Солнечная система
За query отвечает только то, что лежит под кнопкой Выбрать
Ваш номер документа попадёт в query только в том случае, если вы его туда вставите принудительно
__________________
С уважением,
Вячеслав
Старый 22.06.2016, 12:10   #8  
Artikov is offline
Artikov
Участник
 
33 / 12 (1) ++
Регистрация: 06.06.2016
Цитата:
Сообщение от pitersky Посмотреть сообщение
За query отвечает только то, что лежит под кнопкой Выбрать
Ваш номер документа попадёт в query только в том случае, если вы его туда вставите принудительно
Я понимаю, спасибо. Наверное немного неточно сформулировал вопрос.
Попробую спросить иначе:
Если пользователь оставляет поле "Номер документа" пустым и хочет произвести изменения в таблице опираясь только на те условия, которые задаст нажав на кнопку "выбрать" (В частности те условия, которые показаны на втором рисунке), после этого нажимает на кнопку "ок". Как в таком случае в программе учитывать то, что он указал в запросах вручную?
Старый 22.06.2016, 12:15   #9  
Weez is offline
Weez
Участник
Axapta Retail User
 
250 / 84 (3) ++++
Регистрация: 18.01.2006
Адрес: Moscow city
QueryRun после нажатия на кнопку ОК вы получите уже с учетом введенных пользователем фильтров. Чтобы удостовериться в этом можно вывести в инфолог что-то типа info(queryRun.query().dataSourceNo(1).toString()); перед тем местом, где планируете использовать queryRun.next()
__________________
Существует 10 типов людей: одни понимают двоичную систему, другие - нет.
За это сообщение автора поблагодарили: Artikov (1).
Старый 22.06.2016, 12:18   #10  
Владимир Максимов is offline
Владимир Максимов
Участник
КОРУС Консалтинг
 
1,701 / 1195 (43) ++++++++
Регистрация: 13.01.2004
Записей в блоге: 3
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  
Владимир Максимов is offline
Владимир Максимов
Участник
КОРУС Консалтинг
 
1,701 / 1195 (43) ++++++++
Регистрация: 13.01.2004
Записей в блоге: 3
На всякий случай замечу, что если Вы выводите настройку значения поля в окно диалога, то имеет смысл заблокировать возможность указать значение в этом поле через кнопку "Выбрать".

Должна быть одна точка ввода: или объект на форме диалога или по кнопке "Выбрать". Если точек ввода значения несколько, то у Вас будут дополнительные проблемы в том, как их совместить
__________________
- Может, я как-то неправильно живу?!
- Отчего же? Правильно. Только зря...
Старый 22.06.2016, 12:47   #12  
Artikov is offline
Artikov
Участник
 
33 / 12 (1) ++
Регистрация: 06.06.2016
Огромное спасибо за ответы, все получилось!
Не знал, что в мой объект queryRun записываются и дополнительные фильтры, введенные пользователем. Хотя это логично, по сути.
Старый 22.06.2016, 12:49   #13  
Artikov is offline
Artikov
Участник
 
33 / 12 (1) ++
Регистрация: 06.06.2016
Цитата:
Сообщение от Владимир Максимов Посмотреть сообщение
На всякий случай замечу, что если Вы выводите настройку значения поля в окно диалога, то имеет смысл заблокировать возможность указать значение в этом поле через кнопку "Выбрать".

Должна быть одна точка ввода: или объект на форме диалога или по кнопке "Выбрать". Если точек ввода значения несколько, то у Вас будут дополнительные проблемы в том, как их совместить
Да, так и сделал уже, чтобы этой проблемы избежать! Спасибо Вам большое.
 

Похожие темы
Тема Автор Раздел Ответов Посл. сообщение
dynamicsaxhints: Query datasource FirstOnly property Blog bot DAX Blogs 0 22.03.2016 09:11
emeadaxsupport: Microsoft Dynamics AX general performance analysis scripts page 5 Blog bot DAX Blogs 0 01.09.2014 14:11
AIF: OData Query Service Blog bot DAX Blogs 0 24.08.2011 09:11
jinx: Dynamics AX – Query-Ranges und Filtereinstellungen des Benutzers Blog bot DAX auf Deutsch 0 04.02.2010 00:05
Опции темы Поиск в этой теме
Поиск в этой теме:

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

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

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

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