16.11.2005, 13:35 | #1 |
Участник
|
Остатки номенклатуры
Возникла необходимость самостоятельно выбрать остатки по складу на некоторую дату
делаю так 1. выбираю InventSum 2. подтягиваю изменения InventTrans за некоторый период выглядит примерно так X++: while select itemid, sum(AvailPhysical) from inventSum group by itemid join inventDimSum group by inventLocationId where inventDimSum.inventDimId == inventSum.inventDimId join inventTable where inventSum.ItemId == inventTable.ItemId && inventTable.ItemType == ItemType::BOM &&//остатки тока по спецификациям inventTable.ItemGroupId like filter { select itemId from inventTransPostingPhysical group by itemId where inventTransPostingPhysical.inventTransPostingType == InventTransPostingType::Physical && inventTransPostingPhysical.transDate >= _date && inventTransPostingPhysical.ItemId == inventSum.ItemId join sum(costAmountPhysical),sum(qty) from inventTrans where inventTrans.voucherPhysical == inventTransPostingPhysical.voucher && inventTrans.datePhysical == inventTransPostingPhysical.transDate && inventTrans.inventTransId == inventTransPostingPhysical.inventTransId join inventDimTrans where inventDimTrans.inventDimId == inventTrans.inventDimId && inventDimSum.InventLocationId == inventDimTrans.InventLocationId; qty = inventSum.AvailPhysical - inventTrans.Qty; возникает следующий вопрос, если в InventSum нет записи даже с количесвом 0 то плакал весь мой запрос потому как обращение к InventTrans уже не будет и остток я потеряю если когда то возникало движение по номенклатуре по конкретной InventDim будет ли эта запись хранится там с нулевыми количествами или она оттуда успешно исчезает? |
|
16.11.2005, 13:37 | #2 |
----------------
|
Успешно останется.
|
|
16.11.2005, 13:38 | #3 |
Участник
|
то есть запрос будет работать нормально?
|
|
16.11.2005, 13:39 | #4 |
Модератор
|
А нельзя ли воспользоваться классом inventOnHand?? Кажется, он позволяет определить остатки на дату.
С Уважением, Георгий |
|
16.11.2005, 13:42 | #5 |
Участник
|
мне хотелось бы получить одним запросом, а не ходить по всей номенклатуре и не смотреть остатки у каждой
|
|
16.11.2005, 13:46 | #6 |
Участник
|
если номенклатуры (строк) много а остатков (строк) мало будет много лишних ненужных обращений к базе, хотя в свете того как это хранит inventSum кажется что получится одно и то же
|
|
16.11.2005, 13:46 | #7 |
Модератор
|
Цитата:
Сообщение от Def
Возникла необходимость самостоятельно выбрать остатки по складу на некоторую дату
С Уважением, Георгий. |
|
16.11.2005, 13:46 | #8 |
Участник
|
Надо использовать один из классов на основе InventSumDate. Иначе вы имеете шанс получить расхождения данных в стандартных отчетах и в ваших.
|
|
16.11.2005, 13:49 | #9 |
Участник
|
Цитата:
Сообщение от Def
мне хотелось бы получить одним запросом, а не ходить по всей номенклатуре и не смотреть остатки у каждой
|
|
16.11.2005, 13:56 | #10 |
Модератор
|
Хм. Просто InventSum, насколько я помню, можно грохнуть и перестроить заново. На факт, что она при этом будет помнить остатки по всем датам. Учтите этот нюанс.
Она, по идее, должна хранить текущие остатки... никто не обязывает эту таблицу помнить историю. С Уважением, Георгий. |
|
16.11.2005, 14:25 | #11 |
Administrator
|
Извините, а чем то, что Вы пишете в своем запросе, принципиально отличается от того, что делает класс?
Вы полагаете, что если будете использовать group by ItemId вместо внешнего цикла по номенклатуре, получите серьезный выигрыш в производительности? Для начала посмотрите профайлером на то, как выполняется функция расчета остатков на дату, на что расходуется больше всего времени. Кстати, Ваш запрос уже как минимум неправильно посчитатет остатки по номенклатуре, которая была возвращена по отборочной накладной.
__________________
Not registered yet? Register here! Have comments, questions, suggestions or anything else regarding our web site? Don't hesitate, send them to me |
|
16.11.2005, 14:34 | #12 |
Участник
|
вот я и хотел взвесить все за и против и найти оптимальныое решение
|
|
16.11.2005, 14:42 | #13 |
Участник
|
на самом деле я там указывал на случай если много номенклатуры к примеру 100 тыс единиц а остаков только 10 тыс единиц уже 90% обращений к базе в случае обхода номенклатуры и использования метода класса будут бесполезными
нежели напрямую выбрать записи из InventSum. Но как выяснилось в процессе диалога сомнительно что эффект дейсвительно будет. |
|
16.11.2005, 14:54 | #14 |
Administrator
|
Выбирайте только ту номенклатуру, которая есть в InventSum (в форме Создание строк в Заказах и Закупках номенклатура делится на новую и существующую именно по такому принципу). А потом лучше все равно к классу обращайтесь.
Вообще, не стоит дублировать функциональность. Особенно стандартную. Представьте, что она будет обновлена в сервис-паке. Тогда Ваши остатки будут отличаться от стандартных. Впрочем, об этом Вам уже сказали.
__________________
Not registered yet? Register here! Have comments, questions, suggestions or anything else regarding our web site? Don't hesitate, send them to me |
|
16.11.2005, 15:29 | #15 |
Участник
|
Цитата:
Сообщение от Def
вот я и хотел взвесить все за и против и найти оптимальныое решение
|
|
16.11.2005, 15:39 | #16 |
Участник
|
в принципе вот то что я хотел получить
X++: static void Reamins(Args _args) { InventSumDatePhysicalDim Remains = new InventSumDatePhysicalDim(); InventSum inventSum; inventDimParm inventDimParm; inventDim inventDim; ; while select inventSum group by itemId join inventDim group by inventlocationId where inventDim.inventDimId == inventSum.InventDimId { inventDimParm.initFromInventDim(inventDim); remains = new InventSumDatePhysicalDim(); Remains.parmItemId(inventSum.ItemId); Remains.parmInventDimParm(inventDimParm); Remains.parmInventDim(inventDim); Remains.parmPerDate(systemdateget()); remains.init(); info(strfmt('%1 %2 %3',inventSum.ItemId,inventDim.InventLocationId,Remains.physicalQuantity())); } } |
|
16.11.2005, 16:12 | #17 |
Administrator
|
Я бы только еще поменял
X++: remains = new InventSumDatePhysicalDim();
Remains.parmItemId(inventSum.ItemId);
Remains.parmInventDimParm(inventDimParm);
Remains.parmInventDim(inventDim);
Remains.parmPerDate(systemdateget());
remains.init(); X++: remains = InventSumDatePhysicalDim::newParameters(systemDateGet(), inventSum.itemId, inventDim, inventDimParm);
__________________
Not registered yet? Register here! Have comments, questions, suggestions or anything else regarding our web site? Don't hesitate, send them to me |
|