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

 
 
Опции темы Поиск в этой теме Опции просмотра
Старый 29.06.2018, 11:10   #1  
Brave is offline
Brave
Участник
 
26 / 14 (1) ++
Регистрация: 13.09.2010
Адрес: Санкт-Петербург
Опасный метод PurchLine в VendInvoiceTrans
Здравствуйте! Axapta 3.0
Недавно накололся на методе в таблице VendInvoiceTrans.PurchLine()

Ожидалось, что данный метод вернёт мне строку закупки по накладной, но в некоторых случаях этого не происходило.

Некоторым случаем оказалась ситуация, когда по накладной от поставщика попадалась строчка из другой закупки. Ситуация не очень частая, но функцианал такое позволяет.
X++:
PurchLine purchLine()
{
  PurchLine purchLine;
  ;
  select purchLine
    where purchLine.purchId == this.purchID &&
               purchLine.inventTransId == this.inventTransId;
  return purchLine;
}
Собственно в методе VendInvoiceTrans.PurchLine() осуществляется выборка по PurchId и InventTransId. Зачем?! Достаточно одного InventTransId, так как он является первичным ключиком в строках закупки.
Глянул этот метод в Ax2009 - аналогичный код.
В 2012 глянуть возможности нет.

Как вы считаете? Старый баг? Или специальный метод?
Как выглядит метод в Ax2012?
Старый 29.06.2018, 11:41   #2  
oip is offline
oip
Axapta
Лучший по профессии 2014
 
2,564 / 1416 (53) ++++++++
Регистрация: 28.11.2005
Записей в блоге: 1
В AX2012 только InventTransId.

X++:
public PurchLine purchLine()
{
    return PurchLine::findInventTransId(this.InventTransId);
}
X++:
static PurchLine findInventTransId(TradeInventTransId   _inventTransId,
                                   boolean              _update = false)
{
    PurchLine purchLine;

    if (_inventTransId)
    {
        purchLine.selectForUpdate(_update);

        select firstonly purchLine
            where purchLine.InventTransId == _inventTransId
               && !purchLine.IsDeleted;
    }

    return purchLine;
}
Старый 29.06.2018, 12:28   #3  
Brave is offline
Brave
Участник
 
26 / 14 (1) ++
Регистрация: 13.09.2010
Адрес: Санкт-Петербург
Спасибо! Значит это была ошибка. Исправлю у себя.

X++:
 select firstonly purchLine
            where purchLine.InventTransId == _inventTransId
               && !purchLine.IsDeleted;
Смотрю в ax2012 отказались от удаления и завели флаги? Хорошее решение, предотвращает образования дыр в кучах и индексах.
Старый 29.06.2018, 12:53   #4  
dech is offline
dech
Участник
Аватар для dech
Самостоятельные клиенты AX
 
647 / 350 (13) ++++++
Регистрация: 25.06.2009
Адрес: Омск
Записей в блоге: 3
В АХ 4.0 тот же код, что и в 3.0. Не думаю, что это баг. Тем более, что и в 5 версии то же самое, и никто ничего не исправил. 2012 очень сильно нормализована, поэтому там достаточно ссылки лишь на InventTransId.
Мне кажется, у вас не заполнен VendInvoiceTrans.PurchId, либо заполнен чем-то другим, раз уж метод у вас возвращает что-то не то.
__________________
// no comments
Старый 29.06.2018, 13:13   #5  
Brave is offline
Brave
Участник
 
26 / 14 (1) ++
Регистрация: 13.09.2010
Адрес: Санкт-Петербург
VendInvoiceTrans.PurchID заполнен кодом закупки, из которой формируется накладная (приходный ордер).
VendInvoiceTrans.OrigPurchId как раз указывает на нужную закупку, откуда выбрали строку.
И более того - зачем искать с кодом закупки и лотом, когда лот первичный ключ в строках. Не оптимальный запрос получается в итоге.
Старый 29.06.2018, 13:33   #6  
Ivanhoe is offline
Ivanhoe
Участник
Аватар для Ivanhoe
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
 
4,143 / 2156 (80) +++++++++
Регистрация: 29.09.2005
Адрес: Санкт-Петербург
Думаю, ошибка в том, что не Orig используется - действительно, в просто PurchID писалась "первая" закупка при обработке накладной по нескольким закупкам.
А вот зачем в принципе связи по коду закупки помимо лота - перестраховка, наверное. Можно и убрать.
__________________
Ivanhoe as is..
Старый 29.06.2018, 14:30   #7  
dech is offline
dech
Участник
Аватар для dech
Самостоятельные клиенты AX
 
647 / 350 (13) ++++++
Регистрация: 25.06.2009
Адрес: Омск
Записей в блоге: 3
Цитата:
Сообщение от Ivanhoe Посмотреть сообщение
А вот зачем в принципе связи по коду закупки помимо лота - перестраховка, наверное. Можно и убрать.
Согласен, InventTransId - уникальный ключ, можно искать строку закупки только по одному этому полю.
Цитата:
Сообщение от Brave Посмотреть сообщение
Некоторым случаем оказалась ситуация, когда по накладной от поставщика попадалась строчка из другой закупки. Ситуация не очень частая, но функцианал такое позволяет.
Смотрите, получается, если ничего не менять в коде метода purchLine(), то он вам возвращает не ту запись, которую вы ожидали. Как это так получилось? Логично было, если бы метод вообще ничего не вернул. На этом основании я полагаю, что у вас где-то нарушена бизнес-логика.
__________________
// no comments
Старый 30.06.2018, 00:12   #8  
Brave is offline
Brave
Участник
 
26 / 14 (1) ++
Регистрация: 13.09.2010
Адрес: Санкт-Петербург
Вы немного не так интерпретировали
Цитата:
Ожидалось, что данный метод вернёт мне строку закупки по накладной, но в некоторых случаях этого не происходило.
Я получал пустой курсор.
Старый 01.07.2018, 08:52   #9  
IvanS is offline
IvanS
Участник
Аватар для IvanS
 
241 / 44 (2) +++
Регистрация: 30.06.2006
Адрес: Екатеринбург
В 2009 тоже недавно с этим столкнулся. Либо нужно ставить OrigPurchId или просто оставлять InventTransId.
Теги
purchline, vendinvoicetrans

 

Похожие темы
Тема Автор Раздел Ответов Посл. сообщение
alirazazaidi: Relation between PurchLine and PurchReqline Tables in Dynamics AX 2012 R3. Blog bot DAX Blogs 0 09.11.2017 15:11
PurchLine update conflict ?? IKA DAX: Программирование 20 19.01.2016 11:18
args.record - как заставить работать в форме PurchLine? Gustav DAX: Программирование 9 12.01.2010 16:53
Связь VendInvoiceTrans и PurchLine vadimiron DAX: Программирование 17 29.08.2008 08:59
Создние PurchLine NJD DAX: Программирование 4 22.06.2004 11:14

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

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

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