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

 
 
Опции темы Поиск в этой теме Опции просмотра
Старый 28.02.2013, 08:12   #1  
Romb is offline
Romb
Участник
Аватар для Romb
 
79 / 22 (1) +++
Регистрация: 06.01.2004
Критическая ошибка в функции LedgerBondServer_RU.addBondProrateAmountMSTSecond. (Проводки по операции ПЕР034122 не балансируют согласно 14.06.2012. (Валюта компании: 0,00 - вторичная валюта: 0,00)
Добрый день!

AX 2009
Kernel 5.0.1500.3761
Appl 5.0.1500.2985
Solution RU HRP5 5.0.1500.2116.1

При разноске журнала переноса возникает ошибка
Критическая ошибка в функции

LedgerBondServer_RU.addBondProrateAmountMSTSecond. (Проводки по операции ПЕР034122 не балансируют согласно 14.06.2012. (Валюта компании: 0,00 - вторичная валюта: 0,00)

Изучал вопрос, просмотрел весь форум, читал/баловался настройками округления, ничего не помогает. Трейсил какое-то время, но понял немного... И нет, честно говоря времени, чтобы его тратить на детальный анализ и демоделирование классов LedgerBond...

Сам код генерирующий ошибку.

X++:
    if (! _amountMSTSecond                                              ||
        ! bondTransDebit.ledgerTransObject().parmAmountMSTSecondary()   ||
        ! bondTransCredit.ledgerTransObject().parmAmountMSTSecondary())
    {
        fatalError = ! checkFailed(strfmt("@SYS19378", funcname()));
        return;
    }
_amountMSTSecond приходит нулевой.

Пожалуйста, подскажите, где-что посмотреть. Как я понимаю, это не алгоритмическая ошибка, а наша ошибка в данных, но что сделать/посмотреть, чтобы ее исправить (кроме настроек округления в ГК)?

Большое спасибо, буду очень благодарен.
(Грустно и обреченно доделываю FormRunListener...)
Старый 28.02.2013, 08:58   #2  
Sada is offline
Sada
Программатор
Аватар для Sada
 
1,450 / 153 (8) ++++++
Регистрация: 29.03.2005
Адрес: Толи Барнаул, толи Москва
Курить код вверх по стеку почему во вторичной валюте нули
Старый 28.02.2013, 09:49   #3  
Romb is offline
Romb
Участник
Аватар для Romb
 
79 / 22 (1) +++
Регистрация: 06.01.2004
Это и поглотило меня, не вырваться боле на волю....
Старый 28.02.2013, 10:17   #4  
Deepoint is offline
Deepoint
Участник
SAP
 
60 / 14 (1) ++
Регистрация: 01.04.2011
Записей в блоге: 1
Подобная ошибка возникала у нас в журналах ГК, когда профиль разноски был некорректно настроен...
Старый 28.02.2013, 11:11   #5  
user_ax is offline
user_ax
Участник
Аватар для user_ax
 
599 / 39 (3) +++
Регистрация: 07.10.2012
Адрес: ZP
Как разберётесь в чём проблема - отпишитесь, пожалуйста, интересно, в чём суть.
Старый 28.02.2013, 11:17   #6  
Romb is offline
Romb
Участник
Аватар для Romb
 
79 / 22 (1) +++
Регистрация: 06.01.2004
Talking
Цитата:
Сообщение от Deepoint Посмотреть сообщение
Подобная ошибка возникала у нас в журналах ГК, когда профиль разноски был некорректно настроен...
Осмелюсь спросить - а какой именно и где профиль разноски?
Старый 28.02.2013, 11:44   #7  
Михаил Андреев is offline
Михаил Андреев
Участник
Компания АМАНД
Лучший по профессии 2009
 
1,296 / 239 (10) ++++++
Регистрация: 09.11.2001
Адрес: Химки, Московская область
Профиль разноски в строке журнала ГК.

Навскидку, причин может быть много, это и курс валюты (а может, и самой валюты нет, но тогда ошибка должна быть другой), при разноске между двумя компаниями это могут быть ошибки в профилях по умолчанию (в одной профиль есть, в другой нету) и т.п.

Проверяйте не саму ошибку, а строку журнала. Просто "тупо" пройтись по финансовым полям. Проводка в пределах одной компании или разных? Валюта отличается от основной? Курсы валюты проставлены? Профили указаны и настроены?
__________________
Михаил Андреев
https://www.amand.ru
За это сообщение автора поблагодарили: Romb (1).
Старый 28.02.2013, 11:51   #8  
belugin is offline
belugin
Участник
Аватар для belugin
Сотрудники Microsoft Dynamics
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии 2011
Лучший по профессии 2009
 
4,622 / 2925 (107) +++++++++
Регистрация: 16.01.2004
Записей в блоге: 5
сначала надо понять, почему оно пытается сопоставить остатки именно во вторичной валюте. Если оно решило что все остальные остатки к сопоставлению нулевые, то по идее оно должно исключить из рассмотрения эту проводку ранее как полностью сопоставленную.

Какой колстек у этого места? Это корреспонденция чего и по какому алгоритму?
Старый 28.02.2013, 11:52   #9  
belugin is offline
belugin
Участник
Аватар для belugin
Сотрудники Microsoft Dynamics
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии 2011
Лучший по профессии 2009
 
4,622 / 2925 (107) +++++++++
Регистрация: 16.01.2004
Записей в блоге: 5
И при чем тут FormRunListener
Старый 28.02.2013, 12:26   #10  
Sada is offline
Sada
Программатор
Аватар для Sada
 
1,450 / 153 (8) ++++++
Регистрация: 29.03.2005
Адрес: Толи Барнаул, толи Москва
Когда слышу про сопоставление и профили всегда думаю про это
CustVendSettle просмотр кода

у вас в системе исправлено?
Старый 28.02.2013, 18:21   #11  
Logger is offline
Logger
Участник
Лучший по профессии 2015
Лучший по профессии 2014
 
3,952 / 3230 (115) ++++++++++
Регистрация: 12.10.2004
Адрес: Москва
Записей в блоге: 2
Иногда такая ошибка выскакивает когда просо забыли указать код счета или коррсчета.
Еще такое бывало если умудрялись дробные суммы вводить. нов случае переноса у вас это наверно не сделать. Если только какая модификация.
Старый 28.02.2013, 18:23   #12  
Logger is offline
Logger
Участник
Лучший по профессии 2015
Лучший по профессии 2014
 
3,952 / 3230 (115) ++++++++++
Регистрация: 12.10.2004
Адрес: Москва
Записей в блоге: 2
Можно еще вот здесь
\Classes\LedgerVoucherTransObject\newCreateTrans
поставить вывод в инфолог приходящих сумма и счетов.

Зачастую даёт подсказку где бага в настройках или в использовании.
Старый 01.03.2013, 09:01   #13  
Romb is offline
Romb
Участник
Аватар для Romb
 
79 / 22 (1) +++
Регистрация: 06.01.2004
Добрый день, спасибо за советы.
С профилями, округлениями и др. все нормально. Вторичную валюту не используем. Перенос в основной валюте. Внутри одной компании.

В данных проблемных строк в журнале переноса и в InventTrans ничего подозрительного не увидел.
Разве, что журнал сторно.

Дошел до следующего.
Дошел до ошибки в коде в методе LedgerBondClient_RU.bondVRef2VRef()
Для всех "нормальных" строк он отрабатывает по одной ветке, для "ненормальных" (на которых ошибка возникает) по другой.

Вот код.

X++:
public void bondVRef2VRef(LedgerBondVrefId_RU     _vRefId1,
                          LedgerBondVrefId_RU     _vRefId2,
                          Amount                  _amount        = 0.0,
                          LedgerBondAmountType_RU _amountType    = LedgerBondAmountType_RU::Currency,
                          LedgerBondOrder_RU      _bondOrder     = LedgerBondOrder_RU::Auto,
                          boolean                 _roundToCredit = false)
{
    LedgerBondVrefId_RU         vRefIdDebit;
    LedgerBondVrefId_RU         vRefIdCredit;
    LedgerBondTransObject_RU    bondTransObject2, bondTransObject1 = this.bondTransObject(_vRefId1);
    Amount                      amount1 = _amount, amount2;
    LedgerBondAmountType_RU     amountType = _amountType;
    ;

    if (ledgerBondServer.fatalErrorState())
        return;
    if (! amount1)
    {
// здесь все отрабатывает для "нормальных" строк
// без ошибок, т.е. amount2 и amount1 получают
// ненулевые значения 

        amount1 = bondTransObject1.remainAmountCur();
        bondTransObject2 = this.bondTransObject(_vRefId2);
        if (ledgerBondServer.fatalErrorState())
            return;

// для нормальных строк в  bondTransObject2.remainAmountCur() есть значение
// для "ненормальных" возращается 0
        amount2 = bondTransObject2.remainAmountCur();

        if (! amount1 || ! amount2)
        {
            amount1 = bondTransObject1.remainAmountMST();
            amount2 = bondTransObject2.remainAmountMST(); 
            amountType = LedgerBondAmountType_RU::MST;  
        }

        if (! amount1 || ! amount2)
        {
//  в случае, когда amount2 == 0  алгоритм приземляется здесь 
            amount1 = bondTransObject1.remainAmountMSTSecond(); 
            amount2 = bondTransObject2.remainAmountMSTSecond(); 
            amountType = LedgerBondAmountType_RU::MSTSecondary;
        }

        amount1 = min(abs(amount1), abs(amount2));
    }

.........
.........
// ну и далее при  amount1  == 0, возникает ошибка в во второй ветке LedgerBondAmountType_RU::MSTSecondary
// ledgerBondServer.addBondProrateAmountMSTSecond()
// т.к. как там внутри соответствующая проверка

// в нормальном же случае все идет по последней ветке 
// amount1 ненулевой, ошибки внутрях не возникает
    switch (amountType)
    {
        case LedgerBondAmountType_RU::MST : 
            ledgerBondServer.addBondProrateAmountMST(vRefIdDebit,
                                                     vRefIdCredit,
                                                     amount1,
                                                     _roundToCredit);
            break;

        case LedgerBondAmountType_RU::MSTSecondary :
            ledgerBondServer.addBondProrateAmountMSTSecond(vRefIdDebit,
                                                           vRefIdCredit,
                                                           amount1,
                                                           _roundToCredit);
            break;

        case LedgerBondAmountType_RU::Currency :
            ledgerBondServer.addBondProrateAmountCur(vRefIdDebit,
                                                     vRefIdCredit,
                                                     amount1,
                                                     _roundToCredit);
            break;
    }
Получается, что для "ненормальных" строк bondTransObject2 возвращается с нулевыми remainAmount... в то время как bondTransObject1 с ненулевыми. Получается, на данном "уровне копания" надо понять, почему так происходит.

Последний раз редактировалось Romb; 01.03.2013 в 09:17.
Старый 01.03.2013, 09:07   #14  
belugin is offline
belugin
Участник
Аватар для belugin
Сотрудники Microsoft Dynamics
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии 2011
Лучший по профессии 2009
 
4,622 / 2925 (107) +++++++++
Регистрация: 16.01.2004
Записей в блоге: 5
Теперь осталось посмотреть, как получается так, что оно полностью корреспондирует в первичной валюте, но есть остаток во вторичной
Старый 01.03.2013, 10:33   #15  
Alexius is offline
Alexius
Участник
Аватар для Alexius
 
461 / 248 (9) ++++++
Регистрация: 13.12.2001
Цитата:
Сообщение от Romb Посмотреть сообщение
Вторичную валюту не используем.
Так может выключить ее напрочь за ненадобностью ?
Администрирование / Настройки / Система / Конфигурация / Валюта / Вторичная валюта
Старый 04.03.2013, 08:40   #16  
Romb is offline
Romb
Участник
Аватар для Romb
 
79 / 22 (1) +++
Регистрация: 06.01.2004
Хм...
В общем, оказалось как всегда. Пока писал текст под чертой, параллельно проблему и решил.

Суть в том, что у нас был пересчет склада, в InventTrans записалась себестоимость.
Уж что, да как , да почему копейка в ней возникает - расследовать поздно.
Но оперативное решение - поправить InventTrans.CostAmountAdjustment у промаркированных проводок в InventTrans на одну копейку. (которые в синем квадрате)
Тогда все ошибки уходят.

Большое спасибо за участие. Надо было сразу лезть в InventTrans конечно




Снизу, что сначала хотел написать, но уже неактуально.
----------------------------------------------------------------------------------------------------
Вторичная валюта у нас отключена.

Проблема частично "решилась", но не до конца.
После безумной трассировки, решили выделить проблемные номенклатуры в другой журнал.
Включил дебаг (#if.never) отловил номенклатуры, строки с ними вынесли в отдельный журнал переноса.
В итоге исходный журнал без проблемных строк разнесся уже без ошибок.
А второй журнал с проблемными строками разнесся, но только с ошибкой "Критическая ошибка в функции LedgerBondServer_RU.addBondProrateAmountMSTSecond.".

Эту ошибку изучал, есть подозрение, что при корреспонденции "наш" метод InventTran. findBondInventTrans() отрабатывает некорректно (в случае, когда количество по складским проводкам "сопоставляется" по InventTrans.InventRefTransId не один в один, а разбивается. В нашем случае в журнале переноса в строке количество -24 , в InventTrans по InventTransId -16 и -8 (выделено на скрине снизу), а по InventRefTransId 3, 16 и 5. (выделено на скрине сверху). Вот тут то он с ума и сходит.

На очередном журнале, при повторении такого разбиения, ошибка "Не балансирует" осталась. И в логе видна эта копейка. Но теперь уже легче

X++:
public InventTrans findBondInventTrans(InventTransId _inventTransId = this.InventTransId)
{
    InventTrans             bondInventTrans;
    InventDim               bondInventDim;

    InventDim               thisInventDim = this.inventDim();

    container               dimFields = InventDimSearch::activeFields(this.inventTable().DimGroupId);
    int                     len, i;
    fieldId                 fieldId;

    boolean pastFieldId(fieldId _fieldId)
    {
        return (_fieldId == fieldnum(InventDim, InventLocationId)   ||
                _fieldId == fieldnum(InventDim, wMSLocationId)      ||
                _fieldId == fieldnum(InventDim, InventProfileId_RU) ||
                _fieldId == fieldnum(InventDim, InventRespPers)     ||
                _fieldId == fieldnum(InventDim, InventSiteId));
    }

    void findInventTrans(StatusReceipt    _StatusReceipt,
                         StatusIssue      _StatusIssue)
    {
        select firstonly bondInventTrans
            index hint TransIdIdx
            order by RecId desc
            where bondInventTrans.InventTransId         == _inventTransId               &&
                  bondInventTrans.TransType             == this.TransType               &&
                  bondInventTrans.StatusReceipt         == _StatusReceipt               &&
                  bondInventTrans.StatusIssue           == _StatusIssue
             join bondInventDim
                where bondInventDim.inventDimId         == bondInventTrans.inventDimId  &&
                      #InventDimMacros(thisInventDim, bondInventDim);
    }
    ;

    len = conlen(dimFields);
    for (i = 1; i <= len; i++)
    {
        fieldId = conpeek(dimFields, i);
        if(pastFieldId(fieldId))
        {
            thisInventDim.(fieldId) = null;
        }
    }

    switch (this.Direction)
    {
        case InventDirection::Issue:
            findInventTrans(StatusReceipt::Purchased,
                            StatusIssue::None);
            break;

        case InventDirection::Receipt:
            findInventTrans(StatusReceipt::None,
                            StatusIssue::Sold);
            break;
    }

    return bondInventTrans;
}
Миниатюры
Нажмите на изображение для увеличения
Название: Forum - ITrans - 04.03.2013.jpg
Просмотров: 429
Размер:	63.9 Кб
ID:	8099   Нажмите на изображение для увеличения
Название: Forum - ILog - 04.03.2013.jpg
Просмотров: 642
Размер:	153.3 Кб
ID:	8100  


Последний раз редактировалось Romb; 04.03.2013 в 10:08.
Старый 19.04.2013, 03:41   #17  
Romb is offline
Romb
Участник
Аватар для Romb
 
79 / 22 (1) +++
Регистрация: 06.01.2004
В данном посте ошибку решил несистемно, "как получилось".
Тут правильное решение и объяснение
Странная ошибка при разноске
Теги
ledgerbondserver_ru, не балансируют

 

Похожие темы
Тема Автор Раздел Ответов Посл. сообщение
Операции по коду КР069908 не балансируют согласно 30.06.2012. (Валюта компании: -1,00 - вторичная валюта: 0,00) maxkov DAX: Функционал 8 28.02.2013 07:51
Падает AOS MS DAX 2009 SP1 RU6 Daiver DAX: Администрирование 21 14.02.2011 09:59
Не балансируют проводки. NJD DAX: Функционал 1 07.06.2005 17:48
при построении перекрёстных ссылок выдаётся сообщение об ошибках mmmax DAX: Программирование 10 21.01.2005 12:42
Русская локализация Axapta 3 ? SlavaK DAX: Администрирование 59 01.07.2003 22:38

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

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

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