Показать сообщение отдельно
Старый 30.01.2017, 14:15   #1  
Яга1 is offline
Яга1
Участник
 
8 / 10 (1) +
Регистрация: 30.01.2017
Упрямые DataSource не дают построить прайс-лист
Помогите пож-та, у меня есть таблица номенклатур на которую очень редко и вразнобой меняется цена, поэтому решили хранить не прейкурант полностью, а таблицу, что цена на такой-то ItemId меняется с такой-то даты на такую-то (иногда на 0). Неожиданно для себя не удалось справиться с проблемой, как на заданную дату вывести полный прайс номенклатур с ненулевыми ценами на форму.
Сперва думали обойтись одним датасорсом, но никак не удается заставить его выводить только ОДНУ последнюю строку измененной цены, выводятся и все предыдущие. Тогда решили действовать двумя датасорсами (таблица одна и та же)
Первый датасорс выводит на форму ItemId и дату последнего изменения цены на эту номенклатуру
public void init()
{
QueryBuildDatasource qbds;
;
super();

qbds = this.query().dataSourceTable(tableNum(SOPCenaTable));
qbds.addGroupByField(fieldNum(SOPCenaTable, ItemId));
qbds.addOrderByField(fieldNum(SOPCenaTable, ItemId),SortOrder::Ascending);
qbds.addOrderByField(fieldNum(SOPCenaTable, TransDate),SortOrder:: Descending);
qbds.addSelectionField(fieldNum(SOPCenaTable, TransDate), SelectionField::Max);
qbds.addSelectionField(fieldNum(SOPCenaTable, ItemId), SelectionField:: Database);

qbrCenaTransDate=qbds.addRange(fieldNum(SOPCenaTable, TransDate)); //будет ограничен датой поиска

return;
}
А второй датасорс, который должен отобразить цену и остальные подробности, никак не приделать. Если его присоединять без GroupBy, то почему-то вся информация второго датасорса выводятся как пустая.
Попробовали с GroupBy
public void init()
{
QueryBuildDatasource qbds;
;
super();

qbds = this.query().dataSourceTable(tableNum(SOPCenaTableView));
qbds.addGroupByField(fieldNum(SOPCenaTableView, ItemId));
qbds.addGroupByField(fieldNum(SOPCenaTableView, TransDate));

qbds.addSelectionField(fieldNum(SOPCenaTableView, TransDate), SelectionField::Max);
qbds.addSelectionField(fieldNum(SOPCenaTableView, ItemId), SelectionField::Max);
qbds.addSelectionField(fieldNum(SOPCenaTableView, Price), SelectionField::Max);

qbds.addLink(fieldNum(SOPCenaTableView, ItemId),fieldNum(SOPCenaTable, ItemId));
qbds.addLink(fieldNum(SOPCenaTableView, TransDate),fieldNum(SOPCenaTable, TransDate));
//здесь еще хотели добавить проверку, что цена ненулевая
}
Тип связи InnerJoin, чтобы фильтровать ненулевые цены. Но Аксапта не хочет взять только те строки, для которых в первом датасорсе уже найден TransDate, а подтягивает и все предыдущие даты с ценами, а если поглядеть на запрос, так он получается невообразимый, вторая таблица попала в условие Group bу вместе с первой
SELECT FIRSTFAST MAX(TransDate), ItemId FROM SOPCenaTable GROUP BY SOPCenaTable.ItemId, SOPCenaTableView.ItemId, SOPCenaTableView.TransDate ORDER BY SOPCenaTable.ItemId ASC, SOPCenaTable.TransDate DESC WHERE ((Department = N'ВП-52-29')) AND ((TransDate<={ts '2017-01-27 00:00:00.000'})) JOIN FIRSTFAST MAX(TransDate), MAX(ItemIdMAX(Price) FROM SOPCenaTableView WHERE SOPCenaTable.ItemId = SOPCenaTableView.ItemId AND SOPCenaTable.TransDate = SOPCenaTableView.TransDate


при этом при всем в SQL Management Studio запросы построили легко и правильно выдавали прейскурант (здесь немного по-другому названы таблицы)
select *
from Invent
inner join (select Max(TransDate) As mtd, Item as mItem
from Price
WHERE (TransDate <= CONVERT(DATETIME, '2016-09-08 00:00:00', 102))
group by Item)
As td on Invent.Item=mItem

inner join Price as prend on (prend.Item=mItem) and (prend.TransDate=mtd)
where prend.Price >0
order by Invent.Item

Поскажите пожалуйста, как получить форму в Аксапте с прейскурантом на заданную дату, наверное мы действуем неграмотно? Запасные аэродромы, типа вообще не отфильтровывать ненулевые строки, цены выводить dysplay-функциями и т.п. - это все так неудобно

Axapta 2009 MS SQL Server 2008