02.10.2006, 17:25 | #1 |
Участник
|
Бага в стандарте
В SalesLine нашел дивный метод - используется после обработки документов по заказу - ставит в шапку минимальный статус из строк, только вот if (salesLine) никогда не отработает.. Как переписать думаю понятно кому захочется, просто времени нет..
static SalesStatus lowestSalesStatus(SalesId salesId) { SalesLine salesLine; ; select minof(salesStatus) from salesLine index hint SalesStatusIdx where salesLine.salesId == salesId && salesLine.salesStatus > SalesStatus::None; if (salesLine) return salesLine.salesStatus; return SalesStatus::Backorder; } |
|
02.10.2006, 17:33 | #2 |
Участник
|
Да нет. В этом коде все верно.
X++: ; box::info(enum2str(SalesLine::lowestSalesStatus('00000010_061'))); По этому заказу мне выводит статус "Отгружено". Вас смутило, видимо, то, что выбирается только maxOf() . if (salesLine) будет проходить иногда. (хотя в debugger показывает recId = 0) Видимо, это еще одно доказательство того, что следует всегда писать именно if (salesLine) а не if (salesLine.RecId != 0) Последний раз редактировалось kashperuk; 02.10.2006 в 17:38. |
|
02.10.2006, 17:33 | #3 |
Участник
|
Будет выбираться? Я уменя не выбирается.. правда на другом примере проверял.. хм..
Последний раз редактировалось MironovI; 02.10.2006 в 17:40. |
|
02.10.2006, 17:42 | #4 |
Участник
|
фигняс, у меня recid не выбирается.. и мне это кажется весьмалогичным..
|
|
02.10.2006, 17:43 | #5 |
Участник
|
Правильно. RecId и не выбирается.
А вот условие проходит. Проверьте. Создайте заказ, и обработайте накладную. На PurchLine то же самое, кстати. Последний раз редактировалось kashperuk; 02.10.2006 в 18:01. |
|
02.10.2006, 17:57 | #6 |
Участник
|
Цитата:
Вообще это УЖОС какой-то, я перестал понимать как оно внутрях и что там себе думает.. |
|
03.10.2006, 09:02 | #7 |
Участник
|
Да все же по-моему просто.
if (table) срабатывает в true если хоть одно поле таблицы имеет значение отличное от пустого. Т.е. србатывает и здесь если поле SalesLine.salesStatus выбрано. Условие if (table.RecId) понятно дело срабатывает когда recId != 0, т.е. либо выбрана запись в таблице полностью, либо была выборка конкретно recId, например select RecId from table... |
|
03.10.2006, 09:09 | #8 |
Участник
|
А если ответить в тему, то, по-моему, баг в стандартном функционале присутствует в методе: PurchCalcTax_Invoice.initCursor()
Привожу этот метод с моими исправлениями. select nofetch forupdate vendInvoiceTrans index hint InvoiceIdx where vendInvoiceTrans.purchID == vendInvoiceJour.purchId && vendInvoiceTrans.invoiceId == vendInvoiceJour.invoiceId && vendInvoiceTrans.invoiceDate == vendInvoiceJour.invoiceDate && // STM, BugFix, 25.11.2005, kpn, --> vendInvoiceTrans.InternalInvoiceId == vendInvoiceJour.InternalInvoiceId && vendInvoiceTrans.numberSequenceGroup == vendInvoiceJour.numberSequenceGroup; // STM, BugFix, 25.11.2005, kpn, <-- } |
|
03.10.2006, 09:47 | #9 |
Участник
|
Цитата:
тоже самое select minof(salesqty) from salesLine - тоже выдаст допустим 0(ноль) - но система знает что salesLine выбрана, хотя Recid будет пустой, а вот select minof(salesqty) from salesLine where salesLine.SalesId = 'кря_кря_нет такого заказа' - система поймет что запись не выбрана вопрос - как? |
|
03.10.2006, 10:26 | #10 |
Участник
|
На этот вопрос, наверное, смогут ответить только сотрудники MS. Согласн, что по виду самой записи (все поля пустые) нельзя определить выбрана она с пустыми значениями полей или она вообще не выбрана.
|
|
03.10.2006, 11:12 | #11 |
Участник
|
Сама по себе запись - только видимая часть айсберга.
Не забывайте, табличная переменная может быть как связана с результатом выбоки, так и нет. Если не связана, то, на сколько я понимаю, проверка курсора эквивилентна проверке на RecId (если даже заполнить другие поля, короме RecId, то проверка не пройдет). Если связана (результат select или QueryRun), то проверяется результат выбоки, хранящейся в памяти и не доступный из кода. Табличная переменная показывает лишь полученные данные. Как пример - можно сделать выборку из любой таблицы, что бы в курсор вернулась хоть одна запись (с заполненным recId) и обнулить recId - проверка пройдет успешно. Есть еще один момент - если в результате выбоки не была получена ни одна запись, то табличная переменная получается не связанная (если изменить recId, то проверка пройдет успешно). Вообще, вывод из этого - проверяйте табличную переменную,а не RecId
__________________
Axapta v.3.0 sp5 kr2 |
|
03.10.2006, 12:12 | #12 |
Участник
|
Цитата:
Сообщение от petr
А если ответить в тему, то, по-моему, баг в стандартном функционале присутствует в методе: PurchCalcTax_Invoice.initCursor()
Привожу этот метод с моими исправлениями. select nofetch forupdate vendInvoiceTrans index hint InvoiceIdx where vendInvoiceTrans.purchID == vendInvoiceJour.purchId && vendInvoiceTrans.invoiceId == vendInvoiceJour.invoiceId && vendInvoiceTrans.invoiceDate == vendInvoiceJour.invoiceDate && // STM, BugFix, 25.11.2005, kpn, --> vendInvoiceTrans.InternalInvoiceId == vendInvoiceJour.InternalInvoiceId && vendInvoiceTrans.numberSequenceGroup == vendInvoiceJour.numberSequenceGroup; // STM, BugFix, 25.11.2005, kpn, <-- } Вот какие бывают совпадения, сегодня поймал аналогичную багу в SalesCalcTax_Invoice\initCursor и впомнил про этот пост Правда поймать ее имеют шанс далеко не все - те кто обрабатывают накладные с одинаковыми номерами но с разными группами номерных серий void initCursor() {; select nofetch forupdate custInvoiceTrans index hint InvoiceIdx where custInvoiceTrans.salesId == custInvoiceJour.salesId && custInvoiceTrans.invoiceId == custInvoiceJour.invoiceId && custInvoiceTrans.invoiceDate == custInvoiceJour.invoiceDate && // фикса, imir, 03.10.06 --> custInvoiceTrans.numberSequenceGroup == custInvoiceJour.numberSequenceGroup; // фикса, imir, 03.10.06 <-- } Последний раз редактировалось MironovI; 03.10.2006 в 12:23. |
|
04.10.2006, 10:26 | #13 |
Участник
|
А интересно зафиксирован ли этот баг в MS. Ведь исправить - плевое дело. Может правда он уже исправлен в свежих SP?
В принципе этот баг мало на что влияет. Я наткнулся на него, когда стал делать отчет по строкам накладных поставщиков и увидел неправильные сумма НДС. |
|
04.10.2006, 10:46 | #14 |
Участник
|
По крайне мере в Axapta 3.0 sp4 исправлено
PHP код:
|
|
|
За это сообщение автора поблагодарили: petr (1). |
04.10.2006, 12:00 | #15 |
Участник
|
На SP3 точно нет
|
|
04.10.2006, 13:15 | #16 |
Участник
|
у нас ax 3.0 sp3 cu1
PHP код:
|
|