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

 
 
Опции темы Поиск в этой теме Опции просмотра
Старый 23.07.2013, 13:01   #1  
Евгений88 is offline
Евгений88
Участник
 
22 / 10 (1) +
Регистрация: 10.12.2012
Запрос формы "В наличии"
Добрый день!
Покопался на форуме, нашел много всего интересного по теме, но ничего "в яблочко". Поэтому, уважаемые форумчане, укажите ссылку на существующую ветку или окажите посильную помощь.
Проблема в следующем:
Имеется форма "В наличии" ("Управление запасами"/"Запросы"/"В наличии"). Необходимо модифицировать ее запрос таким образом, чтобы была реализована группировка по полю "Склад", а также сортировка (определенным образом) по номенклатуре в пределах каждой группы. Изначально стоит группировка по ItemId таблицы InventSum.
К тому же одновременно группировать и сортировать axapta не позволяет.
PS: Еще, как я полагаю, камнем преткновения встанет вопрос производительности, но это в дальнейшем.
Старый 23.07.2013, 13:14   #2  
sparco is offline
sparco
Участник
Самостоятельные клиенты AX
 
44 / 21 (1) +++
Регистрация: 10.10.2011
Адрес: Москва
Стояла почти аналогичная задача.
Пришлось нарисовать свою форму, группировки, сортировки это своими силами, а вот для сбора данных воспользовался классом InventOnHand. Еще в дополнение пригодится еще хорошая статья по InventSum
Может поможет.
Старый 24.07.2013, 07:10   #3  
Евгений88 is offline
Евгений88
Участник
 
22 / 10 (1) +
Регистрация: 10.12.2012
Цитата:
Сообщение от sparco Посмотреть сообщение
Стояла почти аналогичная задача.
Пришлось нарисовать свою форму, группировки, сортировки это своими силами, а вот для сбора данных воспользовался классом InventOnHand. Еще в дополнение пригодится еще хорошая статья по InventSum
Может поможет.
Новая форма - это конечно хорошо, но, возможно, существуют и не столь радикальные пути решения?!
Старый 24.07.2013, 08:17   #4  
EVGL is offline
EVGL
Banned
Соотечественники
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
 
4,445 / 3001 (0) ++++++++++
Регистрация: 09.07.2002
Адрес: Parndorf, AT
Пути решения:
- перенумеровать номенклатуру
- построить view и сделать свою форму
- сделать отчет вместо формы
- модифицировать класс, который применяет группировку к источнику данных в форме InventOnhand
- поступить так, как предлагает sparco
Старый 24.07.2013, 12:29   #5  
ansoft is offline
ansoft
Участник
Аватар для ansoft
 
123 / 37 (2) +++
Регистрация: 20.10.2005
Цитата:
К тому же одновременно группировать и сортировать axapta не позволяет.
Группировка сама по себе является сортировкой.
Вам никто не мешает включить в группировку поля по которым вы хотите отсортировать и даже приписать desc.
Цитата:
а также сортировка (определенным образом) по номенклатуре в пределах каждой группы
А если сортировать в пределах каждой группы (группировки) надо по-разному, то вам поможет только временная таблица или другое заполняемое хранилище...
Старый 24.07.2013, 12:48   #6  
Евгений88 is offline
Евгений88
Участник
 
22 / 10 (1) +
Регистрация: 10.12.2012
Цитата:
Сообщение от ansoft Посмотреть сообщение
Группировка сама по себе является сортировкой.
Вам никто не мешает включить в группировку поля по которым вы хотите отсортировать и даже приписать desc.

А если сортировать в пределах каждой группы (группировки) надо по-разному, то вам поможет только временная таблица или другое заполняемое хранилище...
Группировать необходимо данные из InventSum по полю InventDim.InventLocationId.
Плюс по каждой группе необходимо выполнить сортировку номенклатур.
Эта сортировка выполняется согласно третьей таблице X_table (не стандартная таблица), которая содержит ItemId и SortOrder. Таблица X_table join-ся по
X++:
X_table.ItemId == InventSum.ItemId &&
X_table.InventLocationId == InventDim.InventLocationId
Старый 24.07.2013, 13:02   #7  
ansoft is offline
ansoft
Участник
Аватар для ansoft
 
123 / 37 (2) +++
Регистрация: 20.10.2005
Тогда в вашем случае сортирока по X_table методом включения в группировку поля SortOrder и добавление группировки в InventDim по полю InventLocationId и должно заработать...
Старый 24.07.2013, 13:59   #8  
Евгений88 is offline
Евгений88
Участник
 
22 / 10 (1) +
Регистрация: 10.12.2012
Цитата:
Сообщение от ansoft Посмотреть сообщение
Тогда в вашем случае сортирока по X_table методом включения в группировку поля SortOrder и добавление группировки в InventDim по полю InventLocationId и должно заработать...
В теории то оно так, но зверь то сам вот какой:
X++:
SELECT WITH SELECT_ORDER, NESTED_LOOP, FORCE_PLACEHOLDERS INDEXISHINT
        SUM(PostedQty), SUM(PostedValue), SUM(PhysicalValue), SUM(Deducted), SUM(Registered),
        SUM(Received), SUM(Picked), SUM(ReservPhysical), SUM(ReservOrdered), SUM(OnOrder),
        SUM(Ordered), SUM(Arrived), SUM(QuotationReceipt), SUM(QuotationIssue), SUM(PhysicalInvent),
        SUM(PostedValueSecCur_RU), SUM(PhysicalValueSecCur_RU), SUM(AvailPhysical), SUM(AvailOrdered)
FROM InventSum
    GROUP BY InventSum.ItemId ASC USING INDEX ClosedItemDimIdx
    WHERE ((Closed = ))
JOIN INDEXISHINT *
FROM InventDim
    GROUP BY InventDim.InventLocationId ASC, InventDim.inventBatchId ASC USING INDEX DimIdIdx
    WHERE InventSum.InventDimId = InventDim.inventDimId
И как его победить для меня не совсем понятно.
Старый 24.07.2013, 14:32   #9  
ansoft is offline
ansoft
Участник
Аватар для ansoft
 
123 / 37 (2) +++
Регистрация: 20.10.2005
Я так понимаю нам надо получить типа:
X++:
SELECT WITH SELECT_ORDER, NESTED_LOOP, FORCE_PLACEHOLDERS INDEXISHINT
        SUM(PostedQty), SUM(PostedValue), SUM(PhysicalValue), SUM(Deducted), SUM(Registered),
        SUM(Received), SUM(Picked), SUM(ReservPhysical), SUM(ReservOrdered), SUM(OnOrder),
        SUM(Ordered), SUM(Arrived), SUM(QuotationReceipt), SUM(QuotationIssue), SUM(PhysicalInvent),
        SUM(PostedValueSecCur_RU), SUM(PhysicalValueSecCur_RU), SUM(AvailPhysical), SUM(AvailOrdered)
FROM InventSum
    USING INDEX ClosedItemDimIdx
    WHERE ((Closed = ))
JOIN INDEXISHINT *
FROM InventDim
    GROUP BY InventDim.InventLocationId ASC
    USING INDEX DimIdIdx
    WHERE InventSum.InventDimId = InventDim.inventDimId

JOIN ItemId, SotrOrder
FROM X_table
GROUP BY X_table.SotrOrder, X_table.ItemId ASC
WHERE X_table.ItemId = InventSum.ItemId
При этом в форме ItemId (itemName()) придется брать с X_table...
Добиться подобного запроса можно добавив X_table datasource в форму с inner join к InventSum...
Далее придеться переписать init X_table datasource как-то примерно так:

X++:
void init()
{
    Query q;
    QueryBuildDatasource qbds;
    ;
    super();

    q = this.Query();
    qbds = q.dataSourceTable(tableNum(InventSum));

    qbds.orderMode(OrderMode::GroupBy);
    qbds.fetchMode(QueryFetchMode::One2One);
    qbds.sortClear(); // долой ItemId
    qbds.addSortField(fieldNum(InventSum, dataAreaId)); // наверное можно и без этого

    qbds = q.dataSourceTable(tableNum(InventDim));
    qbds.orderMode(OrderMode::GroupBy);
    qbds.fetchMode(QueryFetchMode::One2One);
    qbds.sortClear(); // долой сортировку/группировку...
    qbds.addSelectionField(fieldNum(InventDim, InventLocationId));
    qbds.addSortField(fieldNum(InventDim, InventLocationId));

    qbds = q.dataSourceTable(tableNum(X_Table));
    qbds.orderMode(OrderMode::GroupBy);
    qbds.fetchMode(QueryFetchMode::One2One);
    qbds.addSelectionField(fieldNum(X_Table, SortOrder));
    qbds.addSelectionField(fieldNum(X_Table, ItemId));
    qbds.addSortField(fieldNum(X_Table, SortOrder));
    qbds.addSortField(fieldNum(X_Table, ItemId));
    
    // sql:
    /*
    qbds = q.dataSourceTable(tableNum(InventSum));
    box::info(qbds.toString());
    */
}
Беда только в том, что группировки могут меняться настройкой отображения аналитик...
Соот-но... по-правильному этот метод необходимо перестраивать с учетом настройки, поэтому
лучше свою форму или...


Фактически совет EVGL
Цитата:
- модифицировать класс, который применяет группировку к источнику данных в форме InventOnhand

Последний раз редактировалось ansoft; 24.07.2013 в 15:32.
Старый 25.07.2013, 14:30   #10  
Евгений88 is offline
Евгений88
Участник
 
22 / 10 (1) +
Регистрация: 10.12.2012
А разве при этом:
X++:
SELECT WITH SELECT_ORDER, NESTED_LOOP, FORCE_PLACEHOLDERS INDEXISHINT
        SUM(PostedQty), SUM(PostedValue), SUM(PhysicalValue), SUM(Deducted), SUM(Registered),
        SUM(Received), SUM(Picked), SUM(ReservPhysical), SUM(ReservOrdered), SUM(OnOrder),
        SUM(Ordered), SUM(Arrived), SUM(QuotationReceipt), SUM(QuotationIssue), SUM(PhysicalInvent),
        SUM(PostedValueSecCur_RU), SUM(PhysicalValueSecCur_RU), SUM(AvailPhysical), SUM(AvailOrdered)
FROM InventSum
    USING INDEX ClosedItemDimIdx
    WHERE ((Closed = ))
JOIN INDEXISHINT *
FROM InventDim
    GROUP BY InventDim.InventLocationId ASC
    USING INDEX DimIdIdx
    WHERE InventSum.InventDimId = InventDim.inventDimId

JOIN ItemId, SotrOrder
FROM X_table
GROUP BY X_table.SotrOrder, X_table.ItemId ASC
WHERE X_table.ItemId = InventSum.ItemId
не произойдет "смыкание" по складу и соответствующее суммирование полей?!
Группировка по номенклатуре в InventSum не просто так ведь стоит.
Старый 26.07.2013, 12:11   #11  
ansoft is offline
ansoft
Участник
Аватар для ansoft
 
123 / 37 (2) +++
Регистрация: 20.10.2005
X++:
GROUP BY InventDim.InventLocationId ASC
GROUP BY X_table.SotrOrder, X_table.ItemId ASC
Сначала группируем по складу, потом группируем и сортируем по SotrOrder, потом по номенклатуре
(Будем иметь итоги сумм по группировке склад, SotrOrder и номенклатуре, отсортированные в таком же порядке). Должно работать...

P.S. Да... приведенный вариант "абстрактный" (на уровне идеи)...
на форме InventOnhandItem 100% работать не будет...
В executeQuery датасоурса InventSum все поламается после вызова
element.inventDimSetupObject().modifyQuery(inventSum_DS,inventDim_DS);
так как там сам запрос и формируется в соответствии с настройками отображения аналитик.
Т.е. помещать в init бестолку... затреться... а поместив в executeQuery поламаем соответствие настройкам отображения аналитик (всегда будет работать только наш вариант), поэтому или
переписывать modifyQuery после добавления датасоурса X_table или в новой форме реализвовывать.
Старый 26.07.2013, 12:19   #12  
Pustik is offline
Pustik
Участник
 
807 / 372 (14) ++++++
Регистрация: 04.06.2004
Цитата:
Сообщение от Евгений88 Посмотреть сообщение
А разве при этом:
X++:
SELECT WITH SELECT_ORDER, NESTED_LOOP, FORCE_PLACEHOLDERS INDEXISHINT
        SUM(PostedQty), SUM(PostedValue), SUM(PhysicalValue), SUM(Deducted), SUM(Registered),
        SUM(Received), SUM(Picked), SUM(ReservPhysical), SUM(ReservOrdered), SUM(OnOrder),
        SUM(Ordered), SUM(Arrived), SUM(QuotationReceipt), SUM(QuotationIssue), SUM(PhysicalInvent),
        SUM(PostedValueSecCur_RU), SUM(PhysicalValueSecCur_RU), SUM(AvailPhysical), SUM(AvailOrdered)
FROM InventSum
    USING INDEX ClosedItemDimIdx
    WHERE ((Closed = ))
JOIN INDEXISHINT *
FROM InventDim
    GROUP BY InventDim.InventLocationId ASC
    USING INDEX DimIdIdx
    WHERE InventSum.InventDimId = InventDim.inventDimId

JOIN ItemId, SotrOrder
FROM X_table
GROUP BY X_table.SotrOrder, X_table.ItemId ASC
WHERE X_table.ItemId = InventSum.ItemId
не произойдет "смыкание" по складу и соответствующее суммирование полей?!
Группировка по номенклатуре в InventSum не просто так ведь стоит.
нет не произойдет, itemid из группировки то не выбросился, он просто переехал в таблицу X_table ниже этажом.
X++:
 .....JOIN ItemId, SotrOrder
FROM X_table
GROUP BY X_table.SotrOrder, X_table.ItemId ASC
__________________
-Ты в гномиков веришь?
-Нет.
-А они в тебя верят, смотри, не подведи их.
Старый 26.07.2013, 12:26   #13  
Евгений88 is offline
Евгений88
Участник
 
22 / 10 (1) +
Регистрация: 10.12.2012
Всем огромное спасибо за помощь!
По крайней мере теперь понятно, куда копать.
 

Похожие темы
Тема Автор Раздел Ответов Посл. сообщение
Галка "Закрыто" на таблице "В наличии" sev DAX: Функционал 1 11.04.2006 10:19
Отображение финансовых аналитик в "Номенклатура" - "В наличии" Roenick DAX: Функционал 50 27.03.2006 21:58
Подставлять "ранее использованный запрос" при открытии формы Plushy DAX: Функционал 4 16.01.2006 16:23
Номнклатура без запасов в запросе "В наличии" Van DAX: Функционал 2 03.03.2004 14:26
Русская локализация Axapta 3 ? SlavaK DAX: Администрирование 59 01.07.2003 22:38

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

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

Рейтинг@Mail.ru
Часовой пояс GMT +3, время: 07:11.
Powered by vBulletin® v3.8.5. Перевод: zCarot
Контактная информация, Реклама.