30.01.2017, 14:15 | #1 |
Участник
|
Упрямые 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 |
|