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

 
 
Опции темы Поиск в этой теме Опции просмотра
Старый 11.04.2007, 10:51   #1  
Owl83 is offline
Owl83
Участник
 
14 / 10 (1) +
Регистрация: 18.12.2006
Баг в сопоставлении открытых проводок
И снова салют вам, уважаемые коллеги!

Сегодня во время археологических раскопок кода обнаружил в методе \Classes\CustVendSettle_Vend\postAmountDiffTrans_RU один очень любопытный фрагмент. (Этот метод вызывается в процессе сопоставления открытых проводок по клиенту)

Код:
    maxCount = (select count (RecId) from VendInvoiceTrans
                    where VendInvoiceTrans.PurchID             == _vendInvoiceJour.Num                &&
                          VendInvoiceTrans.InvoiceId           == _vendInvoiceJour.InvoiceId          &&
                          VendInvoiceTrans.InvoiceDate         == _vendInvoiceJour.InvoiceDate        &&
                          VendInvoiceTrans.numberSequenceGroup == _vendInvoiceJour.NumberSequenceGroupId).RecId;
     postMarkup (tableNum(VendInvoiceJour),_vendInvoiceJour.RecId,_vendInvoiceJour.Dimension);
     while select vendInvoiceTrans
               where vendInvoiceTrans.PurchID             == _vendInvoiceJour.Num                   &&
                     vendInvoiceTrans.InvoiceId           == _vendInvoiceJour.InvoiceId             &&
                     vendInvoiceTrans.InvoiceDate         == _vendInvoiceJour.InvoiceDate           &&
                     vendInvoiceTrans.numberSequenceGroup == _vendInvoiceJour.NumberSequenceGroupId
{
....
}
Переменная _vendInvoiceJour типа custVendInvoiceJour передается в метод в качестве параметра.
Подозреваю, что это цикл по строкам накладной.
Но вот ведь незадача - набор полей для фильтрации неуникальный!
Получается так, что в цикл могут попасть строки нескольких накладных.

Есть мнение, что русские кодеры, программировавшие этот метод мягко говоря ошиблись, и связывать тыблицы нужно было по InernalInvoiceId

Собственно, о чем я...

Кто что может сказать по этому поводу?
Старый 11.04.2007, 11:01   #2  
kashperuk is offline
kashperuk
Участник
Аватар для kashperuk
MCBMSS
Соотечественники
Сотрудники Microsoft Dynamics
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии 2011
Лучший по профессии 2009
 
4,361 / 2084 (78) +++++++++
Регистрация: 30.05.2004
Адрес: Atlanta, GA, USA
Вообще, связка между этими таблицами везде по системе идет именно по этим четырем полям, afair.
И relation по ним же настроен
Старый 11.04.2007, 11:25   #3  
belugin is offline
belugin
Участник
Аватар для belugin
Сотрудники Microsoft Dynamics
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии 2011
Лучший по профессии 2009
 
4,622 / 2925 (107) +++++++++
Регистрация: 16.01.2004
Записей в блоге: 5
InernalInvoiceId вообще необязательный, он может не заполняться (попробуйте не задавать номерную серию "Внутренняя накладная")

Единственный уникальный индекс в VIJ это RecID но его-то как раз в VIT нет, так что это правильный код (вернее настолько правильный, насколько возможно)

Последний раз редактировалось belugin; 11.04.2007 в 11:28.
Старый 11.04.2007, 11:30   #4  
Owl83 is offline
Owl83
Участник
 
14 / 10 (1) +
Регистрация: 18.12.2006
2 kashperuk

Тогда есть другой не менее ламерский вопрос, но сначала немного фактов из жизни:

1. Открываю \Работа с поставщиками\Поставщики\Функции\Сопоставление открытых проводок
2. Выделяю две проводки, жму Обновить
3. Вылетает вот такое сообщение:
Цитата:
Ошибка времени выполнения. : Деление на ноль.

Трассировка стека:
(S) \Classes\CustVendSettle_Vend\postAmountDiffTrans_RU - line 29
(S) \Classes\CustVendSettle\postExchAmountDiff_RU - line 89
(S) \Classes\CustVendSettle\settleNow - line 714
(S) \Data Dictionary\Maps\CustVendTrans\Methods\updateOffsetVoucher - line 28
(S) \Data Dictionary\Tables\VendTrans\Methods\updateOffsetVoucher - line 7
(S) \Data Dictionary\Tables\VendTrans\Methods\settleTransact - line 31
(C) \Classes\FormButtonControl\Clicked - line 5
4. Иду в код - вижу то, что описано в первом сообщении
5. Иду в \Работа с поставщиками\Запросы\Журналы\Накладные
6. Ищу накладную с таким же полем "Накладная", как и в открытой проводке из пункта 2
7. Находится 2 накладные, созданные по одной и той же закупке, с одинаковой датой, InvoceId и NumberSequenceGroupId (обозначим их как Накл1 и Накл2)
8. Во всех строках Накл1 стоят нули в полях Цена/ед, Скидка, Скидка %, Сумма и Налог, включенный в цену
9. Возвращаюсь в Сопотавление открытых проводок по поставщику и в открытой проводке никаких нулей там не вижу
10. Жму Запрос\Документ ГК. Там в строках стоит Документ ГК такой же как у Накл2

Спрашивается, зачем при нажатии кнопки Обновить в цикле, который приведен в первом сообщении, идет обход по строкам обеих накладных - и Накл1 и Накл2?

2 belugin
Не знаю как у вас, но у нас прямой SQL-запрос к базе показывает, что в таблице VendInvoiceJour нет таких двух записей, у которых был бы одинаковый InernalInvoiceId
Старый 11.04.2007, 12:05   #5  
kashperuk is offline
kashperuk
Участник
Аватар для kashperuk
MCBMSS
Соотечественники
Сотрудники Microsoft Dynamics
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии 2011
Лучший по профессии 2009
 
4,361 / 2084 (78) +++++++++
Регистрация: 30.05.2004
Адрес: Atlanta, GA, USA
Только что посмотрел Relation на VendInvoiceTrans
(на DAX 4.0 SP1, DAX 3.0 SP5 KR2, DAX 3.0 SP3)
Везде связка по пяти полям, а не по 4ем. 5ым полем добавлен как раз внутренний номер накладной.

Так что забираю свои слова про Relation по 4ем только полям назад.
Хотя точно помнится, что видел связку именно по 4ем. Хм. Может это я перепутал с накладными клиентскими...
Старый 11.04.2007, 12:34   #6  
belugin is offline
belugin
Участник
Аватар для belugin
Сотрудники Microsoft Dynamics
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии 2011
Лучший по профессии 2009
 
4,622 / 2925 (107) +++++++++
Регистрация: 16.01.2004
Записей в блоге: 5
Цитата:
2 belugin
Не знаю как у вас, но у нас прямой SQL-запрос к базе показывает, что в таблице VendInvoiceJour нет таких двух записей, у которых был бы одинаковый InernalInvoiceId
- Удалите в найстройках значение у ссылки на номерную серию "Внутренняя накладная"
- Разнесите две накладных

Тогда будет
Старый 11.04.2007, 12:42   #7  
belugin is offline
belugin
Участник
Аватар для belugin
Сотрудники Microsoft Dynamics
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии 2011
Лучший по профессии 2009
 
4,622 / 2925 (107) +++++++++
Регистрация: 16.01.2004
Записей в блоге: 5
Цитата:
Так что забираю свои слова про Relation по 4ем только полям назад.
Я тоже. Я обычно копировал relation целиком в код потом регулярным выражением вставлял в конце каждой строчки && - так что количество наизусть не помню

PS. Правда я не знаю практикуется ли незаполнение внетренней накладной в реальности - возможно это делают, когда номер накладной уникален внктри закупки?
Старый 11.04.2007, 12:46   #8  
kashperuk is offline
kashperuk
Участник
Аватар для kashperuk
MCBMSS
Соотечественники
Сотрудники Microsoft Dynamics
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии 2011
Лучший по профессии 2009
 
4,361 / 2084 (78) +++++++++
Регистрация: 30.05.2004
Адрес: Atlanta, GA, USA
Цитата:
Сообщение от belugin Посмотреть сообщение
Я тоже. Я обычно копировал relation целиком в код потом регулярным выражением вставлял в конце каждой строчки &&
По этому поводу приведу ссылочку на код в АОТ.
\Classes\TradeLoopTrans\buildQuery

Кстати, используется при построении отчета по накладной.

Правда я сам грешу именно таким как у тебя вариантом реализации.
(разве что, без регулярных выражений )
Старый 11.04.2007, 13:10   #9  
Owl83 is offline
Owl83
Участник
 
14 / 10 (1) +
Регистрация: 18.12.2006
Уже спасибо за внимание к моей проблеме!
А кто что скажет про сабжевый цикл?
Может быть он в какой-то версии уже исправлен?
Старый 11.04.2007, 13:13   #10  
kashperuk is offline
kashperuk
Участник
Аватар для kashperuk
MCBMSS
Соотечественники
Сотрудники Microsoft Dynamics
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии 2011
Лучший по профессии 2009
 
4,361 / 2084 (78) +++++++++
Регистрация: 30.05.2004
Адрес: Atlanta, GA, USA
Ах, да, простите, код не привел

из DAX 4.0 SP1:
X++:
    maxCount = any2int((select count (RecId) from vendInvoiceTrans
                            where vendInvoiceTrans.PurchID             == _vendInvoiceJour.Num                &&
                                  vendInvoiceTrans.InvoiceId           == _vendInvoiceJour.InvoiceId          &&
                                  vendInvoiceTrans.InvoiceDate         == _vendInvoiceJour.InvoiceDate        &&
                          vendInvoiceTrans.NumberSequenceGroup == _vendInvoiceJour.NumberSequenceGroupId    &&
                          vendInvoiceTrans.InternalInvoiceId   == _vendInvoiceJour.PurchInternalInvoiceId_RU).RecId);
    postMarkup (tablenum(VendInvoiceJour),_vendInvoiceJour.RecId,_vendInvoiceJour.Dimension);
    while select vendInvoiceTrans
               where vendInvoiceTrans.PurchID             == _vendInvoiceJour.Num                   &&
                     vendInvoiceTrans.InvoiceId           == _vendInvoiceJour.InvoiceId             &&
                     vendInvoiceTrans.InvoiceDate         == _vendInvoiceJour.InvoiceDate           &&
                     vendInvoiceTrans.NumberSequenceGroup == _vendInvoiceJour.NumberSequenceGroupId &&
                     vendInvoiceTrans.InternalInvoiceId   == _vendInvoiceJour.PurchInternalInvoiceId_RU
За это сообщение автора поблагодарили: Owl83 (1).
Старый 11.04.2007, 13:40   #11  
Owl83 is offline
Owl83
Участник
 
14 / 10 (1) +
Регистрация: 18.12.2006
2 kashperuk
Огромное спасибо!
Старый 11.04.2007, 17:24   #12  
Maxim Gorbunov is offline
Maxim Gorbunov
Administrator
Соотечественники
Лучший по профессии 2009
 
2,483 / 645 (26) +++++++
Регистрация: 27.11.2001
Адрес: Dubai, UAE
Цитата:
Сообщение от kashperuk Посмотреть сообщение
По этому поводу приведу ссылочку на код в АОТ.
\Classes\TradeLoopTrans\buildQuery
Или, как вариант, \Tables\VendInvoiceJour\Methods\queryVendInvoiceTrans
__________________
Not registered yet? Register here!
Have comments, questions, suggestions or anything else regarding our web site? Don't hesitate, send them to me
Теги
custsettlement, vendsettlement, сопоставление

 

Похожие темы
Тема Автор Раздел Ответов Посл. сообщение
Разбиение проводок при сопоставлении по поставщикам lugachy DAX: Функционал 11 24.05.2005 17:10
Программное сопоставление открытых проводок DiZ DAX: Программирование 7 27.10.2004 06:23
Сопоставление открытых проводок Андре DAX: Программирование 0 14.03.2003 10:55
Сопоставление открытых проводок - копейки Boris DAX: Функционал 7 24.09.2002 10:33
сопоставление открытых проводок - 'коррекция' в основной валюте фирмы sguryev DAX: База знаний и проекты 0 18.12.2001 15:14
Опции темы Поиск в этой теме
Поиск в этой теме:

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

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

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

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