|
26.05.2011, 12:12 | #1 |
MS Dynamics AX 2012 R3
|
Выбор минимальной даты по двум параметрам из одной таблицы
Доброго дня, коллеги.
Система MS Dynamics 4 AX Поскажите, а желательно покажите примером кода как через запрос в коде X++ выявить минимальное значение даты по двум параметрам. По форуму я не нашёл такой информации. Например, есть таблица RAssetTrans, в ней есть поле TransDate, нужно вычислить его минимальное значение с определённым статусом поля AssetTransType - Depreciation (Амортизация), что будет являтся датой ввода в эксплуатацию, а так же по конкретному AccountNum. Т.е. по каждому номеру ОС с учётом статуса Амортизация нужно выбрать минимальную дату проводки. Нужно это для создание отчёта в генерируемый файл MS Excel(не шаблон), остановился я на этой, вышеописанной, проблеме. Все данные уже сгруппированы, вероятно группировка потребуется и тут. Заранее благодарен, Алексей.
__________________
"Человек человеку волк, а зомби зомби зомби." (с) С Уважением, Алексей Кабанов Последний раз редактировалось ZornFire; 26.05.2011 в 12:21. |
|
26.05.2011, 12:37 | #2 |
Участник
|
X++: select minof(TransDate) from RAssetTrans group by AccountNum where RAssetTrans.AssetTransType==RAssetTransType::Depreciation X++: select minof(TransDate) from RAssetTrans where RAssetTrans.AssetTransType==RAssetTransType::Depreciation && RAssetTrans.AccountNum ==AccountNum
__________________
Axapta v.3.0 sp5 kr2 |
|
26.05.2011, 12:38 | #3 |
Участник
|
Я правильно понял вопрос? Вы это хотите?
X++: RAssetTrans rAssetTrans; RAssetId rAssetId = 'ос2'; ; select minof(TransDate) from rAssetTrans where rAssetTrans.AssetTransType == RAssetTransType::Depreciation && rAssetTrans.AccountNum == rAssetId; info(strfmt("%1", rAssetTrans.TransDate)); |
|
26.05.2011, 12:59 | #4 |
Ищущий знания...
|
вариант с Query.
X++: qbds = query.addDataSource(tableNum(RAssetTrans)); qbds.addSelectionField(fieldNum(RAssetTrans, TransDate), SelectionField::Min); qbds.addRange(fieldNum(RAssetTrans, AccountNum)).value(QueryValue(AccountNum)); qbds.addRange(fieldNum(RAssetTrans, AssetTransType)).value(QueryValue(RAssetTransType::Depreciation));
__________________
"Страх перед возможностью ошибки не должен отвращать нас от поисков истины." (с) С Уважением, Елизаров Артем |
|
26.05.2011, 12:54 | #5 |
MS Dynamics AX 2012 R3
|
Как то не то.
Вот мой метод: Х++ Цитата:
void makeQueryRun()
{ Query query = new query(); QueryBuildDataSource qbds, qbds1,qbds2,qbds3; QueryBuildRange qbr; RAssetStandards rAssetStandards,_rassetStandards; RAssetTable rAssetTable; RAssetTrans rAssetTrans; RAssetSumCalc_Trans rAssetSumTrans; TransDate transDate; ; qbds = query.addDataSource(tableNum(RAssetTable)); // группировка по статусу --> qbds.addSortField(fieldNum(RAssetTable, Status)); qbds.orderMode(OrderMode::GroupBy); // группировка по статусу --< qbds.addRange(fieldNum(RAssetTable, Status)).value(QueryValue(RAssetStatus::Closed)); // фильтр на Закрыто qbds.addRange(fieldNum(RAssetTable, Status)).value(QueryValue(RAssetStatus:: Disposed)); // фильтр на Списано qbds.addRange(fieldNum(RAssetTable, Status)).value(QueryValue(RAssetStatus::Sold)); // фильтр на Продано // вывод значения номера ОС при группировке --> qbds.addSortField(fieldNum(RAssetTable, AccountNum)); qbds.orderMode(OrderMode::GroupBy); qbds.addRange(fieldNum(RAssetTable, AccountNum)); // вывод значения номера ОС при группировке --< // вывод значения Наименование ОС при группировке --> qbds.addSortField(fieldNum(RAssetTable, Name)); qbds.orderMode(OrderMode::GroupBy); qbds.addRange(fieldNum(RAssetTable, Name)); // вывод значения Наименование ОС при группировке --< qbds1 = qbds.addDataSource(tableNum(RAssetStandards)); qbds1.addLink(fieldNum(RAssetTable,AccountNum),fieldNum(RAssetStandards,AssetId)); // группировка по фильтру Амортизация --> qbds1.addSortField(fieldNum(RAssetStandards, AssetStandardId)); qbds1.orderMode(OrderMode::GroupBy); qbds1.addRange(fieldNum(RAssetStandards, AssetStandardId)); // группировка по фильтру Амортизация --< qbds2 = qbds1.addDataSource(tableNum(RassetTrans)); qbds2.addLink(fieldNum(RAssetStandards,AssetId),fieldNum(RAssetTrans,AccountNum)); qbds2.addLink(fieldNum(RAssetStandards,AssetStandardId),fieldNum(RAssetTrans,AssetStandardId)); // фильтр начислений только по амортизации, группировка и суммирование начисленной амортизации по каждому ОС --> qbds2.addSortField(fieldNum(RAssetTrans, AccountNum)); qbds2.orderMode(OrderMode::GroupBy); qbds2.addSelectionField(fieldNum(RAssetTrans, AmountMST), SelectionField::Sum); // фильтр начислений только по амортизации, группировка и суммирование начисленной амортизации по каждому ОС --< qbds2.addRange(fieldNum(RAssetTrans, AssetTransType)).value(QueryValue(AssetTransType:: Depreciation)); qbds2.addRange(fieldNum(RAssetTrans, TransDate)).value(QueryRange(fromDate,toDate)); // это для диалога // info(qbds.toString()); queryRun = new QueryRun(query); }
__________________
"Человек человеку волк, а зомби зомби зомби." (с) С Уважением, Алексей Кабанов Последний раз редактировалось ZornFire; 26.05.2011 в 12:59. Причина: прорисовка смайлов в коде вместо : D |
|
26.05.2011, 13:14 | #6 |
Участник
|
Цитата:
X++: qbds2.addRange(fieldNum(RAssetTrans, TransDate)).value(QueryRange(fromDate,toDate)); Ваша задача доработать исходный запрос так чтобы он искал одновременно и сумму и дату? или можно написать новый, который уже не будет искать сумму, а будет искать дату? offtop: Свойство orderMode для каждого QueryBuildDataSource достаточно задать один раз. Не нужно делать это после каждого addSortField Последний раз редактировалось S.Kuskov; 26.05.2011 в 13:27. |
|
26.05.2011, 13:21 | #7 |
Ищущий знания...
|
если честно, мне кажется человеку вообще надо не искать раннюю дату, а получить суммы в разрезе дат и прочих полей
__________________
"Страх перед возможностью ошибки не должен отвращать нас от поисков истины." (с) С Уважением, Елизаров Артем |
|
26.05.2011, 14:02 | #8 |
северный Будда
|
Автор, вы же делаете группировку по RAssetStandarts. А там уже есть поле "Дата начала амортизации". Добавьте его в перечень полей группировки - и получите на выходе первую дату по модели
__________________
С уважением, Вячеслав |
|
26.05.2011, 15:04 | #9 |
MS Dynamics AX 2012 R3
|
Цитата:
Начало амортизации это дата через 1 месяц после покупки ОС. Ввод в эксплуатацию..., прошу извинить меня, только что нашёл проводку с одноимённым статусом всё таки в RAssetTrans по полю AssetTransType, т.е. искал я почти правильно, но не совсем верным путём, собственно это всё сильно упрощает. Коллеги, спасибо за приведённые примеры, они мне пригодятся в дальнейшем)
__________________
"Человек человеку волк, а зомби зомби зомби." (с) С Уважением, Алексей Кабанов |
|