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

 
 
Опции темы Поиск в этой теме Опции просмотра
Старый 26.05.2011, 12:12   #1  
ZornFire is offline
ZornFire
MS Dynamics AX 2012 R3
Аватар для ZornFire
Oracle
Злыдни
Ex AND Project
 
333 / 76 (3) ++++
Регистрация: 12.01.2009
Адрес: Москва
? Выбор минимальной даты по двум параметрам из одной таблицы
Доброго дня, коллеги.
Система MS Dynamics 4 AX
Поскажите, а желательно покажите примером кода как через запрос в коде X++ выявить минимальное значение даты по двум параметрам.
По форуму я не нашёл такой информации.
Например, есть таблица RAssetTrans, в ней есть поле TransDate, нужно вычислить его минимальное значение с определённым статусом поля AssetTransType - Depreciation (Амортизация), что будет являтся датой ввода в эксплуатацию, а так же по конкретному AccountNum.
Т.е. по каждому номеру ОС с учётом статуса Амортизация нужно выбрать минимальную дату проводки.
Нужно это для создание отчёта в генерируемый файл MS Excel(не шаблон), остановился я на этой, вышеописанной, проблеме.
Все данные уже сгруппированы, вероятно группировка потребуется и тут.
Заранее благодарен, Алексей.
__________________
"Человек человеку волк, а зомби зомби зомби." (с)
С Уважением, Алексей Кабанов

Последний раз редактировалось ZornFire; 26.05.2011 в 12:21.
Старый 26.05.2011, 12:37   #2  
AndyD is offline
AndyD
Участник
КОРУС Консалтинг
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
 
2,560 / 2479 (88) +++++++++
Регистрация: 20.08.2005
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  
Proba is offline
Proba
Участник
 
60 / 13 (1) ++
Регистрация: 25.06.2007
Адрес: Красноярск\Зеленогорск
Я правильно понял вопрос? Вы это хотите?
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:54   #4  
ZornFire is offline
ZornFire
MS Dynamics AX 2012 R3
Аватар для ZornFire
Oracle
Злыдни
Ex AND Project
 
333 / 76 (3) ++++
Регистрация: 12.01.2009
Адрес: Москва
Как то не то.
Вот мой метод:
Х++
Цитата:
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, 12:59   #5  
lev is offline
lev
Ищущий знания...
Аватар для lev
Oracle
MCBMSS
Axapta Retail User
 
1,723 / 491 (20) +++++++
Регистрация: 18.01.2005
Адрес: Москва
вариант с 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, 13:14   #6  
S.Kuskov is offline
S.Kuskov
Участник
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
 
3,440 / 1775 (66) ++++++++
Регистрация: 28.04.2007
Адрес: Калуга
Цитата:
Сообщение от mr.ZF Посмотреть сообщение
Как то не то.
Вот мой метод:
Х++

Аналогично я хочу запросом получить значение даты
В приведённом вами query множество строк, по которым идёт суммирование ограничено периодом fromDate..toDate. Вот здесь:
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  
lev is offline
lev
Ищущий знания...
Аватар для lev
Oracle
MCBMSS
Axapta Retail User
 
1,723 / 491 (20) +++++++
Регистрация: 18.01.2005
Адрес: Москва
Цитата:
Сообщение от S.Kuskov Посмотреть сообщение
А минимальную дату вам нужно искать не в этом периоде а вообще по всем проводкам. Так?
Ваша задача доработать исходный запрос? или можно написать новый, который уже не будет искать сумму, а будет искать дату?
если честно, мне кажется человеку вообще надо не искать раннюю дату, а получить суммы в разрезе дат и прочих полей
__________________
"Страх перед возможностью ошибки не должен отвращать нас от поисков истины." (с)
С Уважением,
Елизаров Артем
Старый 26.05.2011, 14:02   #8  
pitersky is offline
pitersky
северный Будда
Аватар для pitersky
Ex AND Project
Соотечественники
 
1,510 / 435 (18) +++++++
Регистрация: 26.09.2007
Адрес: Солнечная система
Автор, вы же делаете группировку по RAssetStandarts. А там уже есть поле "Дата начала амортизации". Добавьте его в перечень полей группировки - и получите на выходе первую дату по модели
__________________
С уважением,
Вячеслав
Старый 26.05.2011, 15:04   #9  
ZornFire is offline
ZornFire
MS Dynamics AX 2012 R3
Аватар для ZornFire
Oracle
Злыдни
Ex AND Project
 
333 / 76 (3) ++++
Регистрация: 12.01.2009
Адрес: Москва
Цитата:
Сообщение от pitersky Посмотреть сообщение
Автор, вы же делаете группировку по RAssetStandarts. А там уже есть поле "Дата начала амортизации". Добавьте его в перечень полей группировки - и получите на выходе первую дату по модели
Да, там есть такое поле, но, "Дата начала амортизации" не равна "Дате ввода в эксплуатацию".
Начало амортизации это дата через 1 месяц после покупки ОС.
Ввод в эксплуатацию..., прошу извинить меня, только что нашёл проводку с одноимённым статусом всё таки в RAssetTrans по полю AssetTransType, т.е. искал я почти правильно, но не совсем верным путём, собственно это всё сильно упрощает.

Коллеги, спасибо за приведённые примеры, они мне пригодятся в дальнейшем)
__________________
"Человек человеку волк, а зомби зомби зомби." (с)
С Уважением, Алексей Кабанов
 

Похожие темы
Тема Автор Раздел Ответов Посл. сообщение
Пересоздание таблицы при синхронизации Serg16 DAX: Администрирование 1 26.08.2009 13:55
выбор из одной таблице и вставка в другую bannov DAX: Программирование 3 26.06.2008 09:20
условие where по полям одной и той же таблицы Starling DAX: Программирование 23 05.03.2008 15:48
Как вычесть из одной даты другую? Хилари DAX: Программирование 10 27.10.2005 16:05
Как получить записи двух таблиц в виде одной таблицы? chi DAX: Программирование 32 16.12.2004 11:44

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

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

Рейтинг@Mail.ru
Часовой пояс GMT +3, время: 13:23.