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

 
 
Опции темы Поиск в этой теме Опции просмотра
Старый 13.11.2012, 14:07   #1  
S.Kuskov is offline
S.Kuskov
Участник
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
 
3,440 / 1775 (66) ++++++++
Регистрация: 28.04.2007
Адрес: Калуга
Расчёт сумм при печати доп. листа книги продаж/покупок
Печатаем дополнительный лист книги продаж, содержащий исправления предыдущего месяца. В столбец "В том числе продажи, облагаемые налогом по ставке 18 процентов (5) сумма НДС(5б)" выводится завышенная сумма.
Запрос "Итоги" на форме книги продаж отображает коректные значения. Также в этом запросе видно, что присутствует не нулевое значение поля "Восстановление НДС > НДС 18% > Стоимость без НДС"
При печати именно на эту величину не идёт указанное значение. Т.е. эта величина дважды учитывается при расчёте значении колонки 5б.

Анализ кода показал, что в SalesBook_AddList_PrintExcel_RU.calcTotal():
X++:
...
    bookAmountsEngine.fetchTaxMap();
    sumTotalAmount          += bookAmountsEngine.getAmountInclVAT();
    salesAmountExclVAT20    += bookAmountsEngine.getAmountVATStandard().amountLiableToVAT();
    taxAmountVAT20          += bookAmountsEngine.getAmountVATStandard().taxAmountVAT();
    salesAmountExclVAT20Tmp += bookAmountsEngine.getAmountVATStandard20().amountLiableToVAT();
    taxAmountVAT20Tmp       += bookAmountsEngine.getAmountVATStandard20().taxAmountVAT();
    salesAmountExclVAT10    += bookAmountsEngine.getAmountVATReduced().amountLiableToVAT();
    taxAmountVAT10          += bookAmountsEngine.getAmountVATReduced().taxAmountVAT();
...
метод bookAmountsEngine.getAmountVATStandard() выполняется дважды.

Внутри этого метода происходит приращение значений переменных:
X++:
public BookStructSmallVATAmounts_RU getAmountVATStandard()
{
    amountVATStandardDomestic.addAmounts2(amountVATStandardExport);
    amountVATStandardDomestic.addAmounts2(amountVATStandardRestored);
    return amountVATStandardDomestic;
}
Естественно при повторном вызове значения увеличиваются ещё раз.

Что это? Корявая реализация механизма отложенных вычислений?

Подскажите у кого в приложении в каком состоянии присутствуют эти классы? Может в каком KB это уже пофикшено?
За это сообщение автора поблагодарили: Pustik (2), iCloud (2).
Старый 13.11.2012, 15:11   #2  
iCloud is offline
iCloud
Enjoy!
Аватар для iCloud
MCP
Злыдни
 
195 / 112 (4) +++++
Регистрация: 06.03.2012
Про какой RollUp речь идет? И какая АХ?
Старый 13.11.2012, 15:21   #3  
S.Kuskov is offline
S.Kuskov
Участник
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
 
3,440 / 1775 (66) ++++++++
Регистрация: 28.04.2007
Адрес: Калуга
AX2009 RollUp восьмой ставлю. Может чего не поставилось?
Старый 13.11.2012, 19:44   #4  
DAX is offline
DAX
Участник
 
28 / 18 (1) ++
Регистрация: 03.12.2008
возможно проблема в RU8. в Нём много проблем с расчётом налогов

DAX2009 SP1 RU8 Перестал правильно считаться НДС
Старый 13.11.2012, 21:01   #5  
Pustik is offline
Pustik
Участник
 
807 / 372 (14) ++++++
Регистрация: 04.06.2004
Замечательно, и опять суффикс _RU.
__________________
-Ты в гномиков веришь?
-Нет.
-А они в тебя верят, смотри, не подведи их.
Старый 14.11.2012, 09:25   #6  
iCloud is offline
iCloud
Enjoy!
Аватар для iCloud
MCP
Злыдни
 
195 / 112 (4) +++++
Регистрация: 06.03.2012
Поставилось скорей всего все верно.
Цитата:
Сообщение от DAX Посмотреть сообщение
возможно проблема в RU8. в Нём много проблем с расчётом налогов
Такие же мысли меня посещают. Сравню с RollUp6 пожалуй.

*Сравнил. Ошибка не повторилась. Значит код смотреть буду.

Последний раз редактировалось iCloud; 14.11.2012 в 09:28. Причина: *
За это сообщение автора поблагодарили: S.Kuskov (2).
Старый 14.11.2012, 10:40   #7  
iCloud is offline
iCloud
Enjoy!
Аватар для iCloud
MCP
Злыдни
 
195 / 112 (4) +++++
Регистрация: 06.03.2012
!
Я делал доработку кстати, вспомнил
Этот класс же используется для вывода Итогов в печатную форму Доп. листа. И я ему не поверил тоже!
Заменил calcTotal() на calcTotalNew() ну и его вызов из printTotal():
X++:
private void calcTotalNew()
{
    SalesBook_Print_Excel_RU    salesBook_Print_Excel_RU;
    SalesBookTable_RU           salesBookTable_RU;
    ;
    salesBook_Print_Excel_RU = new SalesBook_Print_Excel_RU();
    salesBook_Print_Excel_RU.parmBookId(correctedBookId);
    select firstOnly salesBookTable_RU
        where salesBookTable_RU.BookId == correctedBookId;
    salesBook_Print_Excel_RU.parmFromDate(salesBookTable_RU.LastUpdateDate);
    salesBook_Print_Excel_RU.parmToDate(salesBookTable_RU.ClosingDate);

    [sumTotalAmount,
     salesAmountExclVAT20,
     taxAmountVAT20,
     salesAmountExclVAT20Tmp,
     taxAmountVAT20Tmp,
     salesAmountExclVAT10,
     taxAmountVAT10,
     sumSalesAmountVAT0,
     sumAmountWithOutTaxes] = salesBook_Print_Excel_RU.calculateToAddList();
}
Ну и соответственно создал метод calculateToAddList() в классе SalesBook_Print_Excel_RU:
X++:
protected container calculateToAddList()
{
    SalesBookTrans_RU      salesBookTrans;
    PurchBookTrans_RU      purchBookTrans;
    Query                  query;
    ;

    isOldBook = false;
    queryRun = new QueryRun(SalesBook_Print_RU::createDefaultQuery(bookId, null, fromDate, toDate)); //скопировал из initParmDefault()
    this.initBookDateNumDelimiter();
    this.changeQueryRun();
    queryRun.reset();
    while (queryRun.next())
    {
        salesBookTrans = queryRun.get(tablenum(SalesBookTrans_RU));

        sumTotalAmount += salesBookTrans.AmountInclVAT;

        purchBookTrans = SalesBook_Print_RU::salesBookTrans2PurchBookTrans(salesBookTrans, isOldBook);

        if (salesBookTrans.TransType != SalesPurchBookTransType_RU::Prepayment &&
            salesBookTrans.TransType != SalesPurchBookTransType_RU::PrepaymentStorno)
        {

            salesAmountExclVAT20    += SalesBook_Print_RU::isCreditNote(salesBookTrans, isOldBook) ?
                                       #AmountLiableToVAT20_Purch(purchBookTrans,0)                :
                                       #AmountLiableToVAT20_Sales(salesBookTrans,0);

            salesAmountExclVAT20Tmp += SalesBook_Print_RU::isCreditNote(salesBookTrans, isOldBook) ?
                                       #AmountLiableToVAT20_Purch(purchBookTrans,1)                :
                                       #AmountLiableToVAT20_Sales(salesBookTrans,1);

            salesAmountExclVAT10    += salesBookTrans.AmountLiableToVAT10;
        }

        taxAmountVAT20          += SalesBook_Print_RU::isCreditNote(salesBookTrans, isOldBook) ?
                                   #TaxAmountVAT20_Purch(purchBookTrans,0)                     :
                                   #TaxAmountVAT20_Sales(salesBookTrans,0);

        taxAmountVAT20Tmp       += SalesBook_Print_RU::isCreditNote(salesBookTrans, isOldBook) ?
                                   #TaxAmountVAT20_Purch(purchBookTrans,1)                     :
                                   #TaxAmountVAT20_Sales(salesBookTrans,1);

        taxAmountVAT10          += salesBookTrans.TaxAmountVAT10;
        sumSalesAmountVAT0      += salesBookTrans.AmountLiableToVAT0;
        sumAmountWithOutTaxes   += salesBookTrans.AmountNotLiableToVAT;
    }
    return [sumTotalAmount,
            salesAmountExclVAT20,
            taxAmountVAT20,
            salesAmountExclVAT20Tmp,
            taxAmountVAT20Tmp,
            salesAmountExclVAT10,
            taxAmountVAT10,
            sumSalesAmountVAT0,
            sumAmountWithOutTaxes];
}
По аналогии и в покупках.

Последний раз редактировалось iCloud; 14.11.2012 в 12:36.
Старый 15.11.2012, 12:57   #8  
iCloud is offline
iCloud
Enjoy!
Аватар для iCloud
MCP
Злыдни
 
195 / 112 (4) +++++
Регистрация: 06.03.2012
Прошу прощения, в методе calcTotalNew() заменить:
X++:
    select firstOnly salesBookTable_RU
        where salesBookTable_RU.BookId == correctedBookId;
    salesBook_Print_Excel_RU.parmFromDate(salesBookTable_RU.LastUpdateDate);
    salesBook_Print_Excel_RU.parmToDate(salesBookTable_RU.ClosingDate);
на:
X++:
    //select firstOnly salesBookTable_RU
    //    where salesBookTable_RU.BookId == correctedBookId;
    salesBook_Print_Excel_RU.parmFromDate(fromDate);
    salesBook_Print_Excel_RU.parmToDate(toDate);
Быстрая доработка, ибо не было времени разбираться с bookAmountsEngine.
Теги
ax2009, ru8, баг, доп лист, локализация, ошибка, печатная форма, счет-фактура

 

Похожие темы
Тема Автор Раздел Ответов Посл. сообщение
Включить в Доп.лист книги покупок фактуру по накладной поставщика meerkat DAX: Функционал 15 25.07.2013 11:09
DAX2009: Корректирующие СФ: Печать дополнительного листа книги продаж malex DAX: Программирование 2 18.06.2013 18:15
Книги покупок и продаж: Электронная и печатная формы Opolik DAX: Функционал 1 17.12.2009 13:09
Книги покупок/продаж dtsymbal DAX: Программирование 9 27.07.2009 08:16
Проводка предоплаты в книге продаж и книге покупок aevi82 DAX: Функционал 4 23.06.2005 16:35

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

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

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