Почитываю книгу
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) ));
}
}
}