|
![]() |
#1 |
Участник
|
Нет, не могу на это смотерть спокойно.
Во-первых, раз уж чел рассказывает про "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" поскольку при других условиях ему придется писать абсолютно новый код. Исправил в моем примере. |
|
![]() |
#2 |
Участник
|
и даже после такой модификации код все еще не будет оптимальным и универсальным.
ведь кто-то может заоптимизировать 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" примера... |
|
|
За это сообщение автора поблагодарили: belugin (3). |
![]() |
#3 |
Участник
|
Спасибо, что дали ссылку на эту тему.
Вопрос, чем этот код, Цитата:
Цитата:
Сообщение от 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)); |
|
![]() |
#4 |
Участник
|
а теперь параметры
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", блин ![]() |
|
|
Опции темы | Поиск в этой теме |
Опции просмотра | |
|