Показать сообщение отдельно
Старый 15.11.2010, 10:00   #3  
S.Kuskov is offline
S.Kuskov
Участник
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
 
3,443 / 1781 (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));
}