Показать сообщение отдельно
Старый 29.02.2008, 18:19   #4  
Gustav is offline
Gustav
Moderator
Аватар для Gustav
SAP
Лучший по профессии 2009
 
1,858 / 1152 (42) ++++++++
Регистрация: 24.01.2006
Адрес: Санкт-Петербург
Записей в блоге: 19
Трамплин в код из инфолога (SysInfoAction_Editor)
Почитываю книгу Microsoft Dynamics AX 4.0 (на русском языке). Выборочно, отдельными главами. Недавно прочитал 14-ю - "Отражение". После прочтения в голове хорошо и понятно выстроились все 3 API (UtilElements, Dict... и TreeNode AOT), которые раньше постигал урывками и бессистемно. Признаться, совсем доселе не приходилось возиться с UtilElements, а тут набросал джобик, повыводил в инфолог всякие списки последних модифицированных объектов - хорошо!

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

У меня есть несколько джобов, предназначенных для нужд конкретных пользователей по конкретным задачам, причем для удобства распознавания я включаю (вкратце) фамилию пользователя и название задачи в идентификатор джоба. И вот мне нужно было посмотреть какие изменения были внесены за последний месяц в джобы для пользователя Ивановой:
X++:
static void Job_Unsorted_8229(Args _args)
{
    UtilElements    utilElements;
;
    while select Name from utilElements
        where utilElements.RecordType == UtilElementType::Job
           && utilElements.Name like '*Ivanova*'
           && utilElements.ModifiedDate >= today()-30
    {
        info( utilElements.Name, '',
              SysInfoAction_Editor::newOpen( strfmt(@'\Jobs\%1', 
                                             utilElements.Name ) ));
    }
}
Приведенный код вывел мне в инфолог фактически меню-навигатор: список нужных мне в данный момент джобов и возможность двойным щелчком открыть любой из них в редакторе кода.

P.S. По поводу буквального перевода "отражения" (reflection). Вроде, в отечественной литературе по Java, о тесном родстве с которой принято говорить при упоминании об X++, имеется устойчивый, обычно непереводимый, термин "рефлексия" (из серии: "файл", а не "реестр", "подшивка", "напильник"...). Ну, да ладно, "отражение" тоже понятно

P.S. от 08.12.2008. Версия джоба с использованием формы запроса:
X++:
static void Job_Unsorted_8229_Query(Args _args)
{
    UtilElements            utilElements;
 
    Query                   query = new Query();
    QueryBuildDatasource    qbds  = new QueryBuildDatasource() ;
    QueryRun                qr;
    ;
 
    qbds = query.addDataSource(tablenum(UtilElements));
 
    qbds.addRange(fieldnum(UtilElements, RecordType))
        .value(queryValue(UtilElementType::Job));
 
    qbds.addRange(fieldnum(UtilElements, Name))
        .value('*Ivanova*');
 
    qbds.addRange(fieldnum(UtilElements, ModifiedDate))
        .value(strFmt('%1..',date2StrXpp( today()-30 )));
 
    qbds.addSortField(fieldnum(UtilElements, ModifiedDate), 
        SortOrder::Ascending);
 
 
    qr = new QueryRun(query);
 
    // qr.userUpdate(false);
    if (qr.prompt())
    {
        while (qr.next())
        {
            utilElements = qr.getNo(1);
 
            info( strfmt('%1 -- %2', utilElements.ModifiedDate, 
                                     utilElements.Name),
                  '',
                  SysInfoAction_Editor::newOpen( strfmt(@'\Jobs\%1',
                                                 utilElements.Name) ));
        }
    }
}