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

 
 
Опции темы Поиск в этой теме Опции просмотра
Старый 14.11.2010, 03:30   #1  
Blog bot is offline
Blog bot
Участник
 
25,475 / 846 (79) +++++++
Регистрация: 28.10.2006
axaptapedia: Dialog macro
Источник: http://www.axaptapedia.com/Dialog_macro
==============

Summary:

<div>== Abstracts ==
I often need a quick dialog to check or moify some data.

Sometimes the customer doesn't know exactly what select critera he or she needs, so the dialog needs a lot of criteria fields (from .. to).

What I have to do is creating a dialog object with up to 10 dialog fields - or more.
This is very hard, because I have to repeat the ist of variables several times:
1. declare dialog fields
2. declare working fields
3. create dialog fields objects, and add them to the dialog
4. restore last saved values
5. set values to the dialog fields
6. after prompting and running the dialog: save values
7. move dialog fields to the working fields.

Especially if you need more variables, you can easily make some mistakes.

So I decided to create a macro (using [[Abstract macro]])
to do the hard work.

== Example ==
I have to check some invoices -
depending on customer groups, customer or invoice accounts, invoice date and invoice id.


static void CheckInvoices(Args _args)
{
CustInvoiceTable custInvoiceTable;

#define.DialogMacroId("CheckInvoice") // = fromCustGroupId) && // long version
(! toCustGroupId || custInvoiceTable.CustGroup
__________________
Расскажите о новых и интересных блогах по Microsoft Dynamics, напишите личное сообщение администратору.
Старый 14.11.2010, 12:59   #2  
lev is offline
lev
Ищущий знания...
Аватар для lev
Oracle
MCBMSS
Axapta Retail User
 
1,723 / 491 (20) +++++++
Регистрация: 18.01.2005
Адрес: Москва
что то я не понял в чем тут прелесть использования макроса?
гораздо нагляднее и проще вывести на диалог query, где пользователь спокойно может указать диапазон через "..". Более того, в query пользователь сможет, при желании, добавить ещё и свое поле с условием для выборки.

Вот такой код, ИМХО, проще для понимания и поддержания:
1. Создаем класс для нашего отчета\функции и наследуем его от RunBase.
2. Перекрываем методы: QueryRun - указываем свой queryRun, который определили в ClassDeclaration; ShowQueryValues - возвращаем true; Pack; UnPack; InitParmDefault.
3. Создаем метод InitQuery в котором пишем запрос для нашего диалога:
X++:
Query query = new Query();
QueryBuildDataSource qbds;
;

qbds = query.addDataSource(tableNum(CustInvoiceTable));
qbds.addRange(fieldNum(CustInvoiceTable, CustGroupId));
qbds.addRange(fieldNum(CustInvoiceTable, CustAccount));
qbds.addRange(fieldNum(CustInvoiceTable, InvoiceAccount));
qbds.addRange(fieldNum(CustInvoiceTable, InvoiceDate));
qbds.addRange(fieldNum(CustInvoiceTable, InvoiceId));

queryRun = new QueryRun(query); // queryRun объявлен в ClassDeclarartion класса
4. вызываем метод InitQuery в методе InitParmDefault до вызова super().

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

потом в Run будет простой перебор
X++:
while(queryRun.next())
и ничего мудрить не придется
__________________
"Страх перед возможностью ошибки не должен отвращать нас от поисков истины." (с)
С Уважением,
Елизаров Артем
За это сообщение автора поблагодарили: mazzy (2).
Старый 15.11.2010, 10:00   #3  
S.Kuskov is offline
S.Kuskov
Участник
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
 
3,429 / 1772 (66) ++++++++
Регистрация: 28.04.2007
Адрес: Калуга
Цитата:
Сообщение от lev Посмотреть сообщение
что то я не понял в чем тут прелесть использования макроса?
На сколько я понял, автор попытался с помощью макросов сделать своеобразный конструктор диалогов для запроса у пользователя параметров, которые потом можно использовать в условии where запроса.

Также согласен с вами, что использование QueryRun предпочтительнее.

В свою очередь могу поделиться собстенным инструментом для запроса у пользователя каких-либо параметров. Использую его, когда нужно создать "на лету" простейший диалог, который не может быть связан с каким-либо источником данных.
X++:
static container InputBox(container _conFields, caption _caption = '')
{
    Dialog dlg = new Dialog();
    container ret = conNull();
    int n = conlen(_conFields);
    int i;
    List listFields = new list(Types::Class);
    ListEnumerator enumerator;
    ;

    for (i = 1; i <= n; i += 3)
    {
        listFields.addEnd(
            dlg.addFieldValue(
                conpeek(_conFields, i),
                conpeek(_conFields, i + 1),
                conpeek(_conFields, i + 2)));
    }

    dlg.caption(_caption);

    if (dlg.run())
    {
        enumerator = listFields.getEnumerator();

        while (enumerator.moveNext())
        {
            ret += enumerator.current().value();
        }
    }

    return ret;
}

Пример использования статической функции InputBox
X++:
static void JobTestInputBox(Args _args)
{
    ItemId ItemId;
    fromDate fromDate;
    toDate toDate;
    container con;
    ;

// Тройки параметров аналогичны параметрам метода DialogRunbase.addFieldValue(...)
    con = InputBox(
        [typeid(ItemId), ItemId, '',
         typeid(fromDate), fromDate, '',
         typeid(toDate), toDate, ''],
        'ТЕСТ');

    if (con == conNull()) // Пользователь нажал кнопку "Отмена"
    {
        info('Операция прервана пользователем');
        return;
    }
    
    [ItemId, fromDate, toDate] = con;
    
    info(strfmt('ItemId: %1', ItemId));
    info(strfmt('fromDate: %1', fromDate));
    info(strfmt('toDate: %1', toDate));
}
Старый 15.11.2010, 10:24   #4  
lev is offline
lev
Ищущий знания...
Аватар для lev
Oracle
MCBMSS
Axapta Retail User
 
1,723 / 491 (20) +++++++
Регистрация: 18.01.2005
Адрес: Москва
Цитата:
Сообщение от S.Kuskov Посмотреть сообщение
На сколько я понял, автор попытался с помощью макросов сделать своеобразный конструктор диалогов для запроса у пользователя параметров, которые потом можно использовать в условии where запроса.
тут меня немного задел не сам факт попытки создания универсального инструмента создания диалога на лету (да и пример был приведен крайне не удачный), а не понятное желание написать функцию в макросе! Макросы не для этого, ИМХО.

Вот Вы к вопросу подошли куда более профессионально, создав свою статическую функцию! Ваш код легко читается, и при поддержке его другим программистом никаких трудностей не возникнет, все достаточно прозрачно и понятно.
__________________
"Страх перед возможностью ошибки не должен отвращать нас от поисков истины." (с)
С Уважением,
Елизаров Артем
Старый 15.11.2010, 12:22   #5  
MikeR is offline
MikeR
MCT
Аватар для MikeR
MCBMSS
Лучший по профессии 2015
Лучший по профессии 2014
 
1,628 / 627 (24) +++++++
Регистрация: 28.11.2005
Адрес: просто землянин
Это еще цветочки, я работал на проекте, где было жесткое требование в части запросов, что если запрос используется более одного раза, то записывать его макросом. Интересно было было отлаживать такие вещи
И этот человек ушел потом на повышение
__________________
Axapta book for developer
Старый 15.11.2010, 12:24   #6  
lev is offline
lev
Ищущий знания...
Аватар для lev
Oracle
MCBMSS
Axapta Retail User
 
1,723 / 491 (20) +++++++
Регистрация: 18.01.2005
Адрес: Москва
Цитата:
Сообщение от MikeR Посмотреть сообщение
Это еще цветочки, я работал на проекте, где было жесткое требование в части запросов, что если запрос используется более одного раза, то записывать его макросом. Интересно было было отлаживать такие вещи
И этот человек ушел потом на повышение
жесть я вам сочувствую...
__________________
"Страх перед возможностью ошибки не должен отвращать нас от поисков истины." (с)
С Уважением,
Елизаров Артем
За это сообщение автора поблагодарили: MikeR (1).
 

Похожие темы
Тема Автор Раздел Ответов Посл. сообщение
axaptapedia: RunBaseBatch Blog bot DAX Blogs 0 04.04.2009 22:05
axaptapedia: RunBaseBatch Blog bot DAX Blogs 0 31.03.2009 06:06
axaptapedia: Macro Blog bot DAX Blogs 1 16.11.2007 09:48
axaptapedia: Adding only one Dimension in Dialog Blog bot DAX Blogs 1 25.10.2007 17:54
Kashperuk Ivan: 3 Dialog extensions Blog bot DAX Blogs 4 28.09.2007 18:56

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

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

Рейтинг@Mail.ru
Часовой пояс GMT +3, время: 12:06.
Powered by vBulletin® v3.8.5. Перевод: zCarot
Контактная информация, Реклама.