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

 
 
Опции темы Поиск в этой теме Опции просмотра
Старый 01.03.2013, 09:01   #1  
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, 10:33   #2  
Alexius is offline
Alexius
Участник
Аватар для Alexius
 
461 / 248 (9) ++++++
Регистрация: 13.12.2001
Цитата:
Сообщение от Romb Посмотреть сообщение
Вторичную валюту не используем.
Так может выключить ее напрочь за ненадобностью ?
Администрирование / Настройки / Система / Конфигурация / Валюта / Вторичная валюта
Старый 04.03.2013, 08:40   #3  
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
Просмотров: 439
Размер:	63.9 Кб
ID:	8099   Нажмите на изображение для увеличения
Название: Forum - ILog - 04.03.2013.jpg
Просмотров: 650
Размер:	153.3 Кб
ID:	8100  


Последний раз редактировалось Romb; 04.03.2013 в 10:08.
Старый 19.04.2013, 03:41   #4  
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, время: 20:47.