21.03.2009, 04:12 | #1 |
китайский стажер
|
Customer Aging Report / Отчет по срокам оплаты для клиента - неправильный баланс
Этот отчет не соответсвует GL. Показывает некорректный баланс, это как то связано с exchange adjustments ... Был хотфикс от Microsoft, загрузили... Ничего не изменилось. Может я хотфиксы не умею загружать? А чего там уметь вроде бы, импортировал проект и все. Может кто сталкивался с проблемой? Сутки уже голову ломаю...
__________________
Может быть выйдет, а может не-е-е-ет... Новая песня вместо штиблет.. |
|
21.03.2009, 17:56 | #2 |
Member
|
Напишите хоть версию. А РК он соответствует?
__________________
С уважением, glibs® |
|
22.03.2009, 06:13 | #3 |
китайский стажер
|
Прошу прощения, DAX 4.0.2501.
РК - это что за зверь? У меня пробелы в русской терминологии... Не соответствует оборотной ведомости по клиенту (customer balance list).
__________________
Может быть выйдет, а может не-е-е-ет... Новая песня вместо штиблет.. |
|
22.03.2009, 12:04 | #4 |
китайский стажер
|
Как я понимаю, разница возникает за счет двух моментов:
1. AR Aging report почему то берет не все exch. adj., сопоставленные против инвойсов., вошедших в отчет. Часть берет, а часть - не берет. Например, она не берет в отчет проводки по exch. adj, закрытые до даты отчета. И не только их, но сумма остальных проводок дает ноль, так как эти exch. adjustments закрываются следующим месяцем. 2. AR aging report берет открытые проводки из таблицы CustTransOpen. Я не понимаю зачем, ведь данные в отчете должны считаться на основании CustTrans? Ничего не понимаю, каша в голове...
__________________
Может быть выйдет, а может не-е-е-ет... Новая песня вместо штиблет.. |
|
02.04.2009, 04:14 | #5 |
китайский стажер
|
Время идет, а проблема остается.
Частью проблемы было, что Аксапта не брала часть проводок в расчет, например exchange adjustments. В результате разнообразных игр с запросом, сейчас отчет совпадает с балансом по клиенту в большинстве случаев, зато выяснилось что проблема есть не только там, где есть exchange adjustments... Неужели никто не сталкивался с этой проблемой? Кстати, может кто-нибудь в курсе, почему в методе queryRunClosedTransactions класса условие выглядит как: X++: queryRun.query().dataSourceTable(tablenum(CustSettlement)).findRange(fieldnum(CustSettlement, TransDate)).value(queryRange(transactionDate, dateMax())); X++: queryRun.query().dataSourceTable(tablenum(CustSettlement)).findRange(fieldnum(CustSettlement, TransDate)).value(queryRange(transactionDate, dateMax()));
__________________
Может быть выйдет, а может не-е-е-ет... Новая песня вместо штиблет.. |
|
02.04.2009, 05:35 | #6 |
китайский стажер
|
С ума сойти, обнаружился еще один источник проблемы:
Например, есть инвойс закрытый двумя платежами. Почему то Closing Date для инвойса - дата первого платежа, а не последнего. Такая проблема встречается "иногда". Но почему!?
__________________
Может быть выйдет, а может не-е-е-ет... Новая песня вместо штиблет.. |
|
02.04.2009, 08:26 | #7 |
Member
|
Как вы определяете очередность платежей? По дате платежа или по очередности сопоставления?
С ума сойти не сложно. Сложнее вылечиться. Так что нервы стоит беречь.
__________________
С уважением, glibs® |
|
02.04.2009, 08:35 | #8 |
Модератор
|
Отчего же, весьма устойчивый эффект
Цитата:
Но почему!?
__________________
-ТСЯ или -ТЬСЯ ? |
|
03.04.2009, 05:53 | #9 |
китайский стажер
|
Цитата:
Или это вопрос о том, как мы хотим сопоставлять? По бытовой логике дата закрытия инвойса должна быть равна дате последнего платежа, в каком бы порядке все это не сопоставлялось. Иначе это приводит к ошибкам в отчете.
__________________
Может быть выйдет, а может не-е-е-ет... Новая песня вместо штиблет.. |
|
03.04.2009, 06:01 | #10 |
китайский стажер
|
Цитата:
X++: _custTrans.Closed = CustVendTransData::construct(_custTrans).maxSettlementDate(_postingDate); X++: select maxof(TransDate) from custVendSettlement where custVendSettlement.TransRecId == custVendTrans.RecId; ... return max(custVendSettlement.TransDate, _transDate);
__________________
Может быть выйдет, а может не-е-е-ет... Новая песня вместо штиблет.. |
|
06.04.2009, 08:17 | #11 |
Участник
|
Цитата:
Просто записей в CustTransOpen должно быть существено меньше при правильном регламенте (платежи с отгрузками сопоставляются). А закрытые записи из CustTrans дают в сумме 0 баланс по определению. Кроме того, при правильном ведении базы и, если программист не вмешивался в бездумно в таблицы, то сумма custTransOpen должна совпадать с суммой незакрытых проводок в CustTrans. В общем, повышают производительность. |
|
|
За это сообщение автора поблагодарили: Qaz Qwerty (1). |
06.04.2009, 11:40 | #12 |
Member
|
Цитата:
Сообщение от Vadik
...
см. CustVendSettle_Cust.postClosing() ... Действо в русской версии происходит тут. АОТ\Classes\CustVendSettle.settleNow() Место выглядит вот так X++: if (custVendTransCredit.AmountCur == custVendTransCredit.SettleAmountCur) { if (maxClosingDate) { custVendTransCredit.Closed = CustVendTransData::construct(custVendTransDebet).maxSettlementDate_W(transactionDate); } else { custVendTransCredit.Closed = transactionDate; } settleAmountMSTCredit = custVendTransCredit.AmountMST - (custVendTransCredit.SettleAmountMST - custVendTransCredit.ExchAdjustmentRealized); specTransCredit.Balance01 = 0; } Значит отчет, говорите, не работает? Очень хорошо . Привет локализаторам. А у вас галка в параметрах стоит? Если нет, попробуйте поставить и проверить, какой будет эффект после ее проставления с т.з. корректности построения отчета. PS. По-русски параметр называется "Максимальная дата закрытия.".
__________________
С уважением, glibs® Последний раз редактировалось glibs; 06.04.2009 в 11:43. |
|
06.04.2009, 12:33 | #13 |
Member
|
Цитата:
Сообщение от Qaz Qwerty
...
По бытовой логике дата закрытия инвойса должна быть равна дате последнего платежа, в каком бы порядке все это не сопоставлялось. Иначе это приводит к ошибкам в отчете. ... Я посмотрел буржуйскую версию. Там в инвойсе проставляется дата оплаты, с которой он был сопоставлен физически последней (если она закрывает инвойс). Без вариантов. В тексте подсказки к полю написано: "Date ot total settlement of the transaction". Это в принципе соответствует тому, что и происходит. В тексте справки текст неоднозначно трактуемый. "... If the transaction has been settled, the date for the full settlement is displayed. This date corresponds to the transaction date of the final payment. If the field is empty, the transaction has not yet been fully settled. For example, if a prepayment posted on January 1 is settled against an invoice posted on February 1, the invoice date is displayed. ..." А ваша бытовая логика чем аргументирована? Вы уверены, что от даты закрытия зависит корректность построения отчета?
__________________
С уважением, glibs® |
|
|
За это сообщение автора поблагодарили: Qaz Qwerty (1). |
11.04.2009, 05:37 | #14 |
китайский стажер
|
glibs, спасибо огромной за наводку на параметр, он нашелся на закладке "Sales tax" в параметрах главной книги и называется "Settlement / Latest date for closing" .
И теперь дата закрытия всегда дата последнего платежа. Работает действительно АОТ\Classes\CustVendSettle.settleNow() . Mazzy, спасибо за объяснение по поводу использования CustTransOpen . Логично. По поводу того, почему отчет не работает в случае, когда дата закрытия не равна дате последнего платежа. Например, мы закрыли инвойс платежами от 10 октября и от 15 сентября и формируем отчет на 30 сентября. Для отчета выбираются все проводки по клиенту, проведенные ДО даты отчета, закрытые ПОСЛЕ даты отчета, сопоставленные ПОСЛЕ даты отчета. Смотрим CustBalanceList.queryRunClosedTransactions. X++: queryRun.query().dataSourceTable(tablenum(CustTrans)).findRange(fieldnum(CustTrans, AccountNum)).value(queryValue(_custTable.AccountNum)); queryRun.query().dataSourceTable(tablenum(CustTrans)).findRange(fieldnum(CustTrans, TransDate)) .value(queryRange(dateNull(),transactionDate)); queryRun.query().dataSourceTable(tablenum(CustTrans)).findRange(fieldnum(CustTrans, Closed)).value(SysQuery::valueEmptyString() + ',' + queryRange(transactionDate, dateMax())); if (!printReversed) { ... } queryRun.query().dataSourceTable(tablenum(CustSettlement)).findRange(fieldnum(CustSettlement, TransDate)).value(queryRange(transactionDate, dateMax())); Таким образом, баланс по клиенту (простая сумма всех проводок до определенного числа) будет расходиться с Aging Report. Так ведь? Вторая проблема с exchange adjustments. Тоже пришлось корректировать ручками.
__________________
Может быть выйдет, а может не-е-е-ет... Новая песня вместо штиблет.. |
|