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

 
 
Опции темы Поиск в этой теме Опции просмотра
Старый 07.01.2008, 16:19   #1  
mazzy is offline
mazzy
Участник
Аватар для mazzy
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
Лучший по профессии 2009
 
29,472 / 4494 (208) ++++++++++
Регистрация: 29.11.2001
Адрес: Москва
Записей в блоге: 10
Нет, не могу на это смотерть спокойно.

Во-первых, раз уж чел рассказывает про "On-hand number", то мог бы хотя бы метод использовать вмето тупого суммирования "непонятных" полей. Код бы получился более коротким и более наглядным. Заодно разобрался бы, что перепутал знаки и пропустил статус Зарегистрировано (хотя в списке полей запроса указал).

X++:
InventDim inventDim; 
InventSum inventSum; 
InventQty inventQty; 
;
while select sum(postedQty), sum(received), sum(deducted), sum(registered), sum(picked), sum(reservPhysical) 
from            InventSum group by itemId 
join            InventDim 
where           inventSum.inventDimId == inventDim.inventDimId 
    &&          inventSum.itemId == 'your item' 
    &&          inventDim.inventLocationId == 'your WH' 
{ 
    inventQty += inventSum.availPhysical();
}
info(strfmt('%1', inventQty));
пока писал, нашел еще одну ошибку - он печатает только последнее найденное количество.
Чел даже не предполагает, что цикл может вернуть несколько значений (тогда зачем использует while?).
А все потому, что чел делает свертку по номенклатуре. Воистину "fast and dirty" поскольку при других условиях ему придется писать абсолютно новый код.
Исправил в моем примере.
__________________
полезное на axForum, github, vk, coub.
Старый 07.01.2008, 16:31   #2  
mazzy is offline
mazzy
Участник
Аватар для mazzy
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
Лучший по профессии 2009
 
29,472 / 4494 (208) ++++++++++
Регистрация: 29.11.2001
Адрес: Москва
Записей в блоге: 10
и даже после такой модификации код все еще не будет оптимальным и универсальным.
ведь кто-то может заоптимизировать inventSum или добавить туда статусов и дополнительных полей.
А этот австралийский индус жестко указывает список суммируемых полей в жестко написанном запросе.
Разобраться с методом newQuery?... Нет это же "quick and dirty" программирование.

На самом деле должно быть так:
X++:
Query = InventSum::newQuery(null, 'your item',DimCriteria, ParmCriteria, ParmGroupBy);
QueryRun = new Qureyrun(Query);
while( QueryRun.next() )
{
    inventSum = QueryRun.get(tablenum(InventSum));
    inventQty += inventSum.availPhysical();
}
info(strfmt('%1', inventQty));
Код сразу стал прозрачным и универсальным.
Недели и месяцы, потраченные на оптимизацию производительности запросов не пропадают зря только потому, что какой-то индус написал прямой запрос к таблице.

Но ведь для этого надо разобраться с параметрами.
А это так сложно, чтобы делать "enjoy" от "fast and dirty" примера...
__________________
полезное на axForum, github, vk, coub.
За это сообщение автора поблагодарили: belugin (3).
Старый 11.01.2008, 19:45   #3  
longson is offline
longson
Участник
 
231 / 49 (2) +++
Регистрация: 12.12.2006
Адрес: Москва
Спасибо, что дали ссылку на эту тему.

Вопрос, чем этот код,

Цитата:
Сообщение от mazzy Посмотреть сообщение

На самом деле должно быть так:
X++:
Query = InventSum::newQuery(null, 'your item',DimCriteria, ParmCriteria, ParmGroupBy);
QueryRun = new Qureyrun(Query);
while( QueryRun.next() )
{
    inventQty += inventSum.availPhysical();
}
info(strfmt('%1', inventQty));
...
универсальнее этот код, быстродействием или ещё чем-то ?

Цитата:
Сообщение от mazzy Посмотреть сообщение
X++:
InventDim inventDim; 
InventSum inventSum; 
InventQty inventQty; 
;
while select sum(postedQty), sum(received), sum(deducted), sum(registered), sum(picked), sum(reservPhysical) 
from            InventSum group by itemId 
join            InventDim 
where           inventSum.inventDimId == inventDim.inventDimId 
    &&          inventSum.itemId == 'your item' 
    &&          inventDim.inventLocationId == 'your WH' 
{ 
    inventQty += inventSum.availPhysical();
}
info(strfmt('%1', inventQty));
.
В своем посте вы сравнивали код во второй своей версии с исходным кодом автора, а не вторую версию с первой.
Старый 07.01.2008, 16:41   #4  
mazzy is offline
mazzy
Участник
Аватар для mazzy
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
Лучший по профессии 2009
 
29,472 / 4494 (208) ++++++++++
Регистрация: 29.11.2001
Адрес: Москва
Записей в блоге: 10
а теперь параметры

X++:
Query Query;
QueryRun QueryRun;
InventDim DimCriteria;
InventDimParm ParmCriteria;
InventDimParm ParmGroupBy;
;
////////////// параметры //////////////
DimCriteria.clear();
DimCriteria.InventLocationId = 'your wh';

ParmCriteria.clear();
ParmCriteria.ItemIdFlag = NoYes::Yes;
ParmCriteria.InventLocationIdFlag = NoYes::Yes;

ParmGroupBy.clear();
ParmGroupBy.ItemIdFlag = NoYes::Yes;

////////////// цикл //////////////
Query = InventSum::newQuery(null, 'your item',DimCriteria, ParmCriteria, ParmGroupBy);
QueryRun = new Qureyrun(Query);
while( QueryRun.next() )
{
    inventSum = QueryRun.get(tablenum(InventSum));
    inventQty += inventSum.availPhysical();
}
info(strfmt('%1', inventQty));
Стал ли код менее понятным?
Нет.

Стал ли код более универсальным?
Да.

Стал ли код правильным?
Еще не совсем. Не хватает проверки на допустимость склада - бывают номенклатуры, для которых склад неактивен.
Но поскольку в "примере" рассматривается только одна номенклатура и только один склад - это несущественно. Вот если бы мы раскрывали цикл по нескольким номенклатурам и складам...

Можно ли этот код использовать в качестве паттерна для дальнейшего использования?
Да.

А ведь достаточно было посмотреть на УЖЕ СУЩЕСТВУЮЩИЕ методы и чуть-чуть подумать...
"fast and dirty", блин
__________________
полезное на axForum, github, vk, coub.
 

Похожие темы
Тема Автор Раздел Ответов Посл. сообщение
Khue Trinh: Adjust Standard Cost of Item Blog bot DAX Blogs 1 30.04.2008 15:08
Khue Trinh: Inventory Min/Max Key Blog bot DAX Blogs 0 13.01.2008 19:32
November princess: How does Dynamics Ax perform the inventory settlement for closing process Blog bot DAX Blogs 0 11.01.2008 22:10
Khue Trinh: RESERVATION AT A GLANCE Blog bot DAX Blogs 0 07.01.2008 15:51
Khue Trinh: Be careful with Inventory journal Blog bot DAX Blogs 0 07.01.2008 15:51
Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск
Опции просмотра
Комбинированный вид Комбинированный вид

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

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

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