15.11.2005, 18:20 | #1 |
Злыдни
|
Резервирование при переносе
Столкнулся с ситуацией:
на складе есть 2 партии одной номенклатуры по 1 штуке в каждой партии создаем журнал переноса на 2 штуки, в строках указываем только склад. Резервируем. Создаются 2 проводки прихода и 2 расхода, все корректно разбивается по партиям. Уменьшаем количество в журнал переноса до 1 штуки. Смотрим проводки - партии в проводке прихода и проводке расхода разные.... Изыскания привели меня к следующему куску кода в классе InventUpd_Estimated (методы updateDepreciateReceipt и updateDepreciateIssue): PHP код:
|
|
|
За это сообщение автора поблагодарили: kashperuk (5). |
16.11.2005, 12:31 | #2 |
Злыдни
|
Народ, ну неужели никто на эти грабли еще не наступал? Товар же с партии на партию мухой улетает
|
|
16.11.2005, 12:40 | #3 |
Member
|
У меня на вскидку в тестовой базе не воспроизвелось. Судя по всему, тут нужно особое стечение обстоятельств.
Еще теоретически можно предположить, что партию предполагали подбирать руками (для каждой партии отдельная строка журнала), а не через авторезервирование. А вообще, судя по всему, очередная бага. Спасибо, что предупредили.
__________________
С уважением, glibs® |
|
16.11.2005, 13:16 | #4 |
Злыдни
|
Спасибо, glibs!
Ситуация, при которой это вопсроизводится (вполне жизненная, во всяком случае для нас) 1. Приходуем 5 разных партий Товара по 1 штуке в каждой партии на Склад_1 2. Создаем резерв (любым складским журналом, я делал проводкой) 2-х штук Товара на Складе_1 3. Создаем перенос 5 штук Товара со Склада_1 на Склад_2 4. Резервируем (резервируется только 3 штуки, поскольку 2 штуки у нас зарезервированы ранее) 5. Лезем в журнал из пункта 2 и снимаем резерв 2-х штук 6. Возвращаемся в перенос и снова проводим резервирование (теперь зарезервированы все 5 штук) 7. В строке переноса уменьшаем количество (ну, допустим, не 5 штук, а только 3) 8. наблюдаем эффект, когда со Склада_1 уходят Партия 1, 2 и 3, а на Склад_2 приходят Партия 3,4 и 5. Что соответствует очередности создания записей для Товара по Складу_1 и Складу_2 в таблице InventDim "Прячась в лого свое Волки воют 'Ё-Моё' ... |
|
20.08.2008, 15:54 | #5 |
Участник
|
Похоже в 4-ке эту проблему не устранили...
Столкнулся с такой ситуацией: на складе по одной ном-ре имеется кол-во 10 шт.(с номером партии П1). Пользователи создают журнал переноса по этой ном-ре с кол-ом 20 шт. В итоге у нас создаються 4 проводки(Проводки расхода - Физ.зарезервировано 10 шт с партией П1 и Заказано 10 шт без партии, Проводки прихода Заказано 10 шт. с Партией П1 и Заказано 10 шт. без партии). Далее пользователь уменьшает кол-во до 10 шт. В итоге остаються 2 проводки(Проводки расхода - Физ.зарезервировано 10 шт с партией П1, проводки прихода - Заказано 10 шт. без партии). Важный момент в том что код аналитики у аналитик с заполным номером партии у нас всегда больше чем код аналитики без номера партии... Поэтому в методе InventUpd_Estimated\updateDepreciateReceipt X++: select forupdate inventTrans index hint TransIdIdx order by StatusReceipt desc, InventDimId desc where inventTrans.InventTransId == movement.transId() && inventTrans.TransChildType == movement.transChildType() && inventTrans.TransChildRefId == movement.transChildRefId() && inventTrans.StatusIssue == StatusIssue::None && inventTrans.StatusReceipt >= StatusReceipt::Ordered && inventTrans.StatusReceipt <= StatusReceipt::QuotationReceipt && inventTrans.InventRefTransId == ''; И в результате получаеться что товар ушел с номером партии, а пришел без номера. Кто-нибудь подскажет как решить эту проблему? |
|
20.08.2008, 16:16 | #6 |
Участник
|
Цитата:
Сообщение от AvrDen
Похоже в 4-ке эту проблему не устранили...
Столкнулся с такой ситуацией: на складе по одной ном-ре имеется кол-во 10 шт.(с номером партии П1). Пользователи создают журнал переноса по этой ном-ре с кол-ом 20 шт. В итоге у нас создаються 4 проводки(Проводки расхода - Физ.зарезервировано 10 шт с партией П1 и Заказано 10 шт без партии, Проводки прихода Заказано 10 шт. с Партией П1 и Заказано 10 шт. без партии). Далее пользователь уменьшает кол-во до 10 шт. В итоге остаються 2 проводки(Проводки расхода - Физ.зарезервировано 10 шт с партией П1, проводки прихода - Заказано 10 шт. без партии). Важный момент в том что код аналитики у аналитик с заполным номером партии у нас всегда больше чем код аналитики без номера партии... Поэтому в методе InventUpd_Estimated\updateDepreciateReceipt X++: select forupdate inventTrans index hint TransIdIdx order by StatusReceipt desc, InventDimId desc where inventTrans.InventTransId == movement.transId() && inventTrans.TransChildType == movement.transChildType() && inventTrans.TransChildRefId == movement.transChildRefId() && inventTrans.StatusIssue == StatusIssue::None && inventTrans.StatusReceipt >= StatusReceipt::Ordered && inventTrans.StatusReceipt <= StatusReceipt::QuotationReceipt && inventTrans.InventRefTransId == ''; И в результате получаеться что товар ушел с номером партии, а пришел без номера. Кто-нибудь подскажет как решить эту проблему? |
|
20.08.2008, 17:07 | #7 |
Злыдни
|
AvrDem Важный момент в том что код аналитики у аналитик с заполным номером партии у нас всегда больше чем код аналитики без номера партии
Yprit Что соответствует очередности создания записей для Товара по Складу_1 и Складу_2 в таблице InventDim |
|
20.08.2008, 17:24 | #8 |
MCTS
|
Такую сортировку можно наблюдать и в других классах семейства InventUpd*. Насколько я понимаю упорядочивание по номеру аналитики необходимо, чтобы обеспечить некоторое подобие LIFO при увеличении и уменьшении количества в журнале, дабы не создавать путаницы.
|
|
20.08.2008, 17:51 | #9 |
Участник
|
Ваня, а можешь проверить, у приходных проводок в переносе статус одинаковый был ?
По идее если одинаковый и совпадают X++: inventTrans.TransChildType
inventTrans.TransChildRefId
inventTrans.InventRefTransId == '' Либо тебе повезло с номерами аналитик InventDimID - так что отсортировалось так что проводки с заполненной партией первыми подцепились |
|
20.08.2008, 18:10 | #10 |
Участник
|
Предлагаю перед тем как воспроизводить глюк создать аналитики вот таким джобом
X++: static void Job378(Args _args) { #define.inventBatchId1("BatchID1") #define.inventBatchId2("BatchID2") #define.InventLocationIDFrom("From") #define.InventLocationIDTO("To") InventDim InventDim; ; ttsBegin; InventDim.InventLocationId = #InventLocationIDFrom; InventDim.inventBatchId = #inventBatchId1; InventDim::findOrCreate(InventDim); InventDim.clear(); InventDim.InventLocationId = #InventLocationIDFrom; InventDim.inventBatchId = #inventBatchId2; InventDim::findOrCreate(InventDim); InventDim.clear(); InventDim.InventLocationId = #InventLocationIDTo; InventDim.inventBatchId = #inventBatchId2; InventDim::findOrCreate(InventDim); InventDim.clear(); InventDim.InventLocationId = #InventLocationIDTo; InventDim.inventBatchId = #inventBatchId1; InventDim::findOrCreate(InventDim); InventDim.clear(); ttsCommit; } Должно сработать. P.S. В данном джобе я просто заранее создаю аналитики с нужным порядком следования InventDimId, чтобы на одном складе с большему значению InventBatch соответствовало большее значение InventDimID а на другом складе наоборот. В ax4.0 и ax5.0 может помешать тот факт что выравнивание InventDimID левое - в этом случае нужно убедиться что джоб правильно создал все. - Проблема может возникнуть, если при выделении номера аналитики - число значащих цифр увеличится. Для правого выравнивания гарантировано должно воспроизвестись. (в общем проще свои номера InventDimId константами пробить) Последний раз редактировалось Logger; 20.08.2008 в 18:17. |
|
|
За это сообщение автора поблагодарили: kashperuk (5). |
20.08.2008, 18:11 | #11 |
Участник
|
Указанные примеры могут показаться экзотическими случаями. Но у нас в реальной работе за несколько месяцев создалось несколько сотен лотов с такой пересортицей. Потом было очень геморно исправлять эту пересортицу, особенно после того как товары уже продали и остатки по аналитикам обнулились.
|
|
20.08.2008, 19:54 | #12 |
Участник
|
Да, проблему воспроизвел. Спасибо
Интересно узнать, как боретесь? Как-то влияет это на себестоимость? Я понимаю, что себестоимость товара из партии2 на втором складе изменяется в зависимости от себестоимости товара из партии1 со склада1. Насколько это критично? |
|
20.08.2008, 20:15 | #13 |
Аманд
|
Ребят, расскажите, как в ваших примерах настроена аналитика?
1. Первичная/Вторичная 2. В складских моделях фифо/лифо для резервирования 3. В параметрах резервирование заказанного 4. Процедура создания номера партии (автосоздание). |
|
20.08.2008, 20:24 | #14 |
Участник
|
Цитата:
Лечили так. У нас принят партионный учет для всех номенклатур. Соответственно, когда в InventJournalTrans.Update() стоит вызов X++: estimated = new InventUpd_Estimated(InventMovement::construct(this)); estimated.updateNow(); if (this.JournalType == InventJournalType::Transfer) { estimatedTransfer = new InventUpd_Estimated(InventMovement::construct(this,true)); estimatedTransfer.updateNow(); } X++: estimated.updateNow() Передавали полученную инфу во второй вызов X++: estimatedTransfer.updateNow(); учитывали эту информацию, так чтобы цеплялась нужная партия и на нужное количество. Думаю, что можно обобщить такой подход на произвольную аналитику. Добавить в группу складской аналитики еще одну галку, при помощи которой и определять - какую комбинацию аналитик сохранять при редактировании переноса. P.S. Ax 3.0 |
|
|
За это сообщение автора поблагодарили: player (1). |
20.08.2008, 20:28 | #15 |
Участник
|
Мне кажется, что ни один из этих параметров не должен влиять на воспроизводимость глюка. (Ну разве что склад и партия должны быть включены, если говорить о примере который я привел)
|
|
20.08.2008, 23:02 | #16 |
Участник
|
А какие еще проблемы, кроме неправильной себестоимости, возникают, если не исправить эту ошибку?
Неправильная себестоимость, насколько я понимаю, возникает только в случае, если аналитика Партия активирована как финансовая (в противном случае она все равно считается в разрезе склада). Или нет? |
|
21.08.2008, 08:45 | #17 |
Злыдни
|
Цитата:
1. склад, партия, серийный номер (по-моему, было так) 2. Фифо 3. Выключено 4. Да Цитата:
Относительно себестоимости - с переносами там вообще все довольно зыбко, во всяком случае с точки зрения партионного учета в его российском понимании. Я имею в виду знаменитое усредненине себестоимости в разрезе партий при резервирвании лотов. В самом начале внедрения мне кто-то из великих по этому поводу втолковывал... да, fed - вот здесь. В общем, с помощью этого способа (автоподстановка аналитики в строки журнала переноса, по кнопке и т.п.) и боролись в том числе. ОФФ: посмотрел свои вопросы 2004 года - как, однако, много воды утекло :-) Спасибо вам, форумчане, гуру наши - чтоб я без вас тогда делал! Просто за руку водили :-) |
|
21.08.2008, 08:48 | #18 |
Злыдни
|
Сама неприянтая ошибка - это когда надо перед поставщиком о реализации отчитываться по условиям договора... Черт бы с ней, с себестоимостью - можно коррекцией исправить, в конце концов. А вот то, что партии у товара меняются - это были очень большие грабли в нашем случае.
|
|
21.08.2008, 09:55 | #19 |
Участник
|
Цитата:
Исправил эту ситуацию следующим образом(может немного коряво, но работает): При удалении расходной проводки запоминаю InventDim и InventDimParm, и передаю их в InventUpd_Estimated\updateDepreciateReceipt. В InventDim заменяю склад, на склад прихода. |
|
21.08.2008, 13:23 | #20 |
Аманд
|
Цитата:
Мне кажется, что ни один из этих параметров не должен влиять на воспроизводимость глюка
О влиянии: первичная аналитика влияет на перерезервирование, автосоздание номера партии влияет на создание новых номеров при создании новых строк и проводок (при этом влияют параметры автосоздания - в строках, проводках и т.д.). |
|
Теги |
bug, журнал, перемещение, резервирование, crm2011 |
|
|