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

 
 
Опции темы Поиск в этой теме Опции просмотра
Старый 11.11.2008, 18:00   #21  
fed is offline
fed
Moderator
Аватар для fed
Ex AND Project
Соотечественники
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
Лучший по профессии 2009
 
2,909 / 5730 (197) ++++++++++
Регистрация: 13.03.2002
Адрес: Hüfingen,DE
Цитата:
Сообщение от miklenew Посмотреть сообщение
Выкидывает сообщение
Отрицательная себестоимость не возможна.
(S) \Classes\InventTransAdjust\updateNow - line 72
Не могу понять в чём дело. Считается вроде всё правильно и интуиция подсказывает возможно входные данные не правильны. А именно поле корректировки.
Предположил что это поле на InventTrans проверяется таким образом.
Для ValueOpen = да
Хотя вызывает уважение желание топикстартера навести порядок в корректировках себестоимости, мне кажется, что miklenew взялся за задачу немного не с того конца. Такое сообщение выдается при попытке переоценить приходный складской лот (проводку грубо говоря) до отрицательной себестоимости. И на мой взгляд, тут более вероятна ситуация, при которой кто-то грязными руками покопался в логике класса, который грубо говоря преобразует новую сумму остатка по складам в коррекцию суммы каждой открытой проводки.(InventAdj-SumUp(), inventSumOpenTransact()).
Возможно, я не прав и топикстартер уже разобрался в том что происходит в этих классах. В таком случае, просьба написать почему возникло подозрение что неверно значение именно в inventTrans.costAmountAdjustment.
Старый 12.11.2008, 10:54   #22  
miklenew is offline
miklenew
Участник
Аватар для miklenew
MCBMSS
1C
Лучший по профессии 2009
 
1,688 / 433 (18) +++++++
Регистрация: 10.07.2006
Адрес: г. Ликино-Дулёво
К чему в результате дошёл

1) \Classes\InventSumOpenTransact\add
Закидываем в буфер costAmountPosted

2) (S) \Classes\InventSumOpenTransact\setTransAdjustNow - line 4
Инициализируем суммы корректировки нулями

3)(S) \Classes\InventSumOpenTransact\setAdjustment - line 49
Может получиться что расчитанная сумма корректировки нам не подходит,
тогда корректировка = this.transValue(x)+this.transAdjustNow(x)
Фактически это this.transValue(x) т.к. transAdjustNow(x) = 0

4) (S) \Classes\InventTransAdjust\updateNow - line 35
inventTrans.updateSplit(inventTrans.financialOpenQty());
Делим на две проводки (старая+новая)
И все суммы и количества пропорционально распределяем, кроме суммы по корректировке.
Корректировку оставляем на изначальной проводке. Т.к. в InventSettlement связь не только по лоту но и по recId.
После этой процедуры место старого inventTrans в памяти уже другой.
Вот это я исправил, так как это не правильно.
Поставил в верху метода
X++:
    RefRecId         origRecId;
А место
X++:
            if (inventTrans.financialOpenQty() != inventTrans.qty)
                inventTrans.updateSplit(inventTrans.financialOpenQty());
изменённый код
X++:
            if (inventTrans.financialOpenQty() != inventTrans.qty)
            {
                origRecId = inventTrans.RecId;
                inventTrans.updateSplit(inventTrans.financialOpenQty());
                if(inventTrans.RecId != origRecId)
                    inventTrans = InventTrans::findRecId(origRecId, true);
            }
Вопрос: Интересно, а зачем здесь вообще updatesplit()?
__________________
Энергия молодых и неравнодушных способна изменить мир к лучшему.
Старый 12.11.2008, 19:27   #23  
miklenew is offline
miklenew
Участник
Аватар для miklenew
MCBMSS
1C
Лучший по профессии 2009
 
1,688 / 433 (18) +++++++
Регистрация: 10.07.2006
Адрес: г. Ликино-Дулёво
Есть подозрения, что сделал не правильно.
Завтра ещё буду юзать.
Но неужели не у кого нет мыслей зачем там updatesplit().
Буду благодарен за любые догадки, даже неправильные.
__________________
Энергия молодых и неравнодушных способна изменить мир к лучшему.
Старый 12.11.2008, 19:41   #24  
fed is offline
fed
Moderator
Аватар для fed
Ex AND Project
Соотечественники
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
Лучший по профессии 2009
 
2,909 / 5730 (197) ++++++++++
Регистрация: 13.03.2002
Адрес: Hüfingen,DE
Извиняюсь - занят был - сразу не ответил. Этот самый updateSplit() - единственное что отличает переоценку остатков от переоценки проводок. Вот допустим ты купил 100 процессоров по $100 каждый и за месяц продал половину по цене $120. Потом 1ого числа Intel планово снизил цены за процы до $70 и даже компенсировал тебе разницу. Теперь ты должен ОСТАВШИЕСЯ 50 процессоров переоценить до $70 и продавать их по $85.
Если ты просто переоценишь проводку (или уберешь updateSplit()), то у тебя сумма переоценки равномерно размажется по всему приходному лоту (в том числе и по процессорам которые ты уже продал). В итоге у тебя получиться что первый месяц ты торговал процессорами с себестоимостью $85 при продажной цене $120; второй месяц ты торговал процессорами тоже с себестоимостью $85 при продажной цене $85. Получается что маржа и себестоимость криво посчитаны. А из за того что у тебя при переоценке остатков расщепляется на открытую и закрытую части, переоценка попадет только на открытую часть. В итоге у тебя себестоимость старых продаж не измениться, а новых - упадет ровно настолько насколько нужно.

Кстати - это единственное место в Аксапте, которое я знаю, которое расщепляет ФИНАНСОВО разнесенные проводки. Во всех остальных местах, расщепление финансово разнесенных проводок запрещено
За это сообщение автора поблагодарили: miklenew (7).
Старый 12.11.2008, 20:21   #25  
petr is offline
petr
Участник
Соотечественники
 
561 / 201 (8) ++++++
Регистрация: 30.05.2005
Адрес: Швейцария
Цитата:
Сообщение от fed Посмотреть сообщение
Кстати - это единственное место в Аксапте, которое я знаю, которое расщепляет ФИНАНСОВО разнесенные проводки. Во всех остальных местах, расщепление финансово разнесенных проводок запрещено
Может я немного не понял, но когда мы продали 100 процессоров, а потом решили на 50 из них создать кредит ноту, то система тоже расщипит первую фининсово разнесенную проводку на 2 и одну свяжет по номеру возвращенного лота с проводкой кредит-ноты, а другую оставит как есть.

Т.е. по-моему это еще один случай, когда система расщепляет фин. разнесенные проводки.
Старый 12.11.2008, 22:55   #26  
miklenew is offline
miklenew
Участник
Аватар для miklenew
MCBMSS
1C
Лучший по профессии 2009
 
1,688 / 433 (18) +++++++
Регистрация: 10.07.2006
Адрес: г. Ликино-Дулёво
Допустим есть такая ситуация есть 3 прихода по номенклатуре
Было закрытие (если нет ни одного закрытия система не позволит сделать корректировку)
Эти приходы ни с одним расходом не сопоставились. И коррекция равна 0.
Просто так легче дальше считать.
Так вот
Пример1
X++:
Qty 	CostAmountPosted
10	100
5	20
20	300
Итого в форме коррекция в наличие будет
X++:
         
35				420
Допустим мы хотим скорректировать остатки до себестоимости 5
35*5-420 = -245
Считаем Adjustment
InventSumOpenTransact\setAdjustment() (47)
adjustNow = Currency::amount(this.transQty(x) * adjustInTotal/ qtyTotal);
(для 1 прихода) 10*(-245)\35= - 70
(для 2 прихода) 5*(-245)\35= - 35
(для 3 прихода) 20*(-245)\35= - 140
Видим что для второго прихода получилось 35, а разнесённая сумма 20
Смотрим InventSumOpenTransact\setAdjustment() (49)
if (this.transValue(x) + this.transAdjustNow(x) + adjustNow < 0)
Ну раз 35 снять не можем снимем = 20
Теперь эти 15 пропали и мы должны их всунуть или в 1 или 3 приход иначе у нас себестоимость остатка 5 не будет.
Смотрим InventSumOpenTransact\setAdjustment() (44)
if (this.transQty(x) >= qtyRemain)
adjustNow = Currency::amount(amountRemain);
Т.е. эти 15 войдут в в последний приход
Если в последнем меньше чем коррекция
Пример2
X++:
Qty 	CostAmountPosted
10 	300
5   	20
20 	100
то коррекция будет
-70
-20
-100
А так как распределение не всё пройдёт вторая итерация
-70 (ещё -70) = -140
-20
-100 (и на последней +остаток 15) = - 85
И здесь всё ок (когда сопоставлений не было).
Но вот когда появляются частично сопоставлененые проводки.
Например если бы 2-ой приход был сопоставлен при закрытие 3 ед из 5.
То произойдёт разбиение проводки на количество 3 и 2(CostAmountPosted 12 и 8 соответственно).
И в результате будет попытка корректировки второй проводки (где Qty = 2 и CostAmountPosted = 8)
А в буфере то у нас 20. От туда и ошибка про отрицательную себестоимость.
Разделение проводки будет происходить для всех частично сопоставленых проводок которые участвуют в коррекции.
Так вот вопрос почему бы в методе InventSumOpenTransact\add
массив transValue для тех проводок у которых есть сопоставление заполнять не costAmountPosted, а costAmountPosted - (qtySettled*costAmountPosted)\qty = наши 8
И массив transQty = qty - qtySettled = наши 2 несопоставленные ед?
__________________
Энергия молодых и неравнодушных способна изменить мир к лучшему.

Последний раз редактировалось miklenew; 12.11.2008 в 23:01.
Старый 12.11.2008, 23:24   #27  
fed is offline
fed
Moderator
Аватар для fed
Ex AND Project
Соотечественники
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
Лучший по профессии 2009
 
2,909 / 5730 (197) ++++++++++
Регистрация: 13.03.2002
Адрес: Hüfingen,DE
Ну кстати, если посмотреть на inventSumOpenTransact.add(), то там в начале есть такой малоприметный метод inventTrans.setTransValueDate(). Он как раз занимается тем, что исключительно для целей коррекции остатков в наличии, отнимает от inventTrans.qty и inventTrans.costAmountPosted количества и сумму складских сопоставлений сделанных до даты переоценки. Так что если с этим методом никто не поигрался, то у тебя там не совсем оригинальные значения qty и costAmountPosted из исходной проводки должны в массиве лежать, а как раз что-то похожее на то что ты написал.
Старый 13.11.2008, 11:12   #28  
miklenew is offline
miklenew
Участник
Аватар для miklenew
MCBMSS
1C
Лучший по профессии 2009
 
1,688 / 433 (18) +++++++
Регистрация: 10.07.2006
Адрес: г. Ликино-Дулёво
Цитата:
Сообщение от fed Посмотреть сообщение
Ну кстати, если посмотреть на inventSumOpenTransact.add()
Спасибо. На работе то его видел. А дома позно уже было забыл про него.
Пока копался понял, что то что хотят консультанты надо делать не через коррекцию запасов, а через коррекцию проводок. Надеюсь там всё пройдёт гладко.
__________________
Энергия молодых и неравнодушных способна изменить мир к лучшему.
Старый 01.03.2009, 19:19   #29  
Logger is offline
Logger
Участник
Лучший по профессии 2015
Лучший по профессии 2014
 
3,953 / 3230 (115) ++++++++++
Регистрация: 12.10.2004
Адрес: Москва
Записей в блоге: 2
Цитата:
Сообщение от miklenew Посмотреть сообщение
По одной номенклатуре (возможно их больше) не получается скорректировать себестоимость через корректировку наличия.
Выкидывает сообщение
Отрицательная себестоимость не возможна.
(S) \Classes\InventTransAdjust\updateNow - line 72
Кажется разобрался почему так получается. Открыл обсуждение здесь
Расщепление InventSplitTrans_Remain и коррекция в наличии
Теги
логистика, переоценка

 

Похожие темы
Тема Автор Раздел Ответов Посл. сообщение
сопоставление оплат клиента, переносов сальдо-поле накладная в общем журнале? Aquarius DAX: Функционал 3 28.01.2009 12:51
InventTransIdReturn и Закрытие склада DenisS DAX: Программирование 15 03.12.2008 09:02
Denis Fedotenko: Новые поля в складских проводках Blog bot DAX: База знаний и проекты 10 24.05.2007 11:57
Как правильно достучаться из InventTrans до даты накладыной NJD DAX: Программирование 6 22.07.2005 20:52
Связь таблиц InventTrans и PurchLine Pustik DAX: Программирование 2 25.11.2004 12:23
Опции темы Поиск в этой теме
Поиск в этой теме:

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

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

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

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