29.06.2018, 11:10 | #1 |
Участник
|
Опасный метод 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; } Глянул этот метод в Ax2009 - аналогичный код. В 2012 глянуть возможности нет. Как вы считаете? Старый баг? Или специальный метод? Как выглядит метод в Ax2012? |
|
29.06.2018, 11:41 | #2 |
Axapta
|
В 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 |
Участник
|
Спасибо! Значит это была ошибка. Исправлю у себя.
X++: select firstonly purchLine where purchLine.InventTransId == _inventTransId && !purchLine.IsDeleted; |
|
29.06.2018, 12:53 | #4 |
Участник
|
В АХ 4.0 тот же код, что и в 3.0. Не думаю, что это баг. Тем более, что и в 5 версии то же самое, и никто ничего не исправил. 2012 очень сильно нормализована, поэтому там достаточно ссылки лишь на InventTransId.
Мне кажется, у вас не заполнен VendInvoiceTrans.PurchId, либо заполнен чем-то другим, раз уж метод у вас возвращает что-то не то.
__________________
// no comments |
|
29.06.2018, 13:13 | #5 |
Участник
|
VendInvoiceTrans.PurchID заполнен кодом закупки, из которой формируется накладная (приходный ордер).
VendInvoiceTrans.OrigPurchId как раз указывает на нужную закупку, откуда выбрали строку. И более того - зачем искать с кодом закупки и лотом, когда лот первичный ключ в строках. Не оптимальный запрос получается в итоге. |
|
29.06.2018, 13:33 | #6 |
Участник
|
Думаю, ошибка в том, что не Orig используется - действительно, в просто PurchID писалась "первая" закупка при обработке накладной по нескольким закупкам.
А вот зачем в принципе связи по коду закупки помимо лота - перестраховка, наверное. Можно и убрать.
__________________
Ivanhoe as is.. |
|
29.06.2018, 14:30 | #7 |
Участник
|
Цитата:
Смотрите, получается, если ничего не менять в коде метода purchLine(), то он вам возвращает не ту запись, которую вы ожидали. Как это так получилось? Логично было, если бы метод вообще ничего не вернул. На этом основании я полагаю, что у вас где-то нарушена бизнес-логика.
__________________
// no comments |
|
30.06.2018, 00:12 | #8 |
Участник
|
Вы немного не так интерпретировали
Цитата:
Ожидалось, что данный метод вернёт мне строку закупки по накладной, но в некоторых случаях этого не происходило.
|
|
01.07.2018, 08:52 | #9 |
Участник
|
В 2009 тоже недавно с этим столкнулся. Либо нужно ставить OrigPurchId или просто оставлять InventTransId.
|
|