11.09.2010, 17:00 | #1 |
Administrator
|
DAX 2009 RU5 - Ошибка компилятора в конструкции select
Всем привет!
Наткнулся тут на интересную ошибку компилятора. X++: static void Job1(Args _args) { DocuRef docuRef; CustTable custTable; ; select docuRef where docuRef.RefTableId == tablenum(CustTable) join custTable // Ошибка компиляции на этой строке where custTable.RecId == docuRef.RefRecId; } Т.е. добавление между tablenum и join еще одного условия, например, написание так: X++: where docuRef.RefTableId == tablenum(CustTable) && true Но в 2009 RU5 компилятор пишет "Синтаксическая ошибка", а в 4.0 SP2 - "Переменная join не объявлена"
__________________
Возможно сделать все. Вопрос времени |
|
|
За это сообщение автора поблагодарили: gl00mie (2). |
12.09.2010, 12:44 | #2 |
Участник
|
Поменяй одну строчку
X++: where docuRef.RefTableId == custTable.TableId Последний раз редактировалось Волчара; 12.09.2010 в 12:47. Причина: объяснение причины некорректности |
|
12.09.2010, 13:19 | #3 |
Administrator
|
Цитата:
Дело-то не в том, как это обойти - а в том, что это достаточно неожиданная ошибка
__________________
Возможно сделать все. Вопрос времени |
|
13.09.2010, 11:51 | #4 |
Участник
|
В Axapta 3.0 SP1 компилятор так же пишет о синтаксической ошибке после tablenum(CustTable). Поэтому я могу сделать вывод о том, что в 5 версии разработчики решили вернуться к прежним обобщенным спецификациям ошибок, а именно "Синтаксическая ошибка"
__________________
С уважением, Александр. |
|
13.09.2010, 12:00 | #5 |
Administrator
|
__________________
Возможно сделать все. Вопрос времени |
|
14.09.2010, 01:56 | #6 |
Участник
|
Проблема с компиляцией такого выражения известна.
Сам текст ошибки - пофиг имхо, Синтаксическая ошибка получше будет. Лечится просто - нужно объявить переменную, ей присвоить это значение, и переменную уже использовать в select statement. |
|
14.09.2010, 02:03 | #7 |
Участник
|
Т.е. это фича, а не баг ? Исправлять не будут ?
|
|
14.09.2010, 11:28 | #8 |
Участник
|
Нет, это баг, конечно же.
Но исправлять пока/вообще не будут. К счастью, есть простой workaround |
|
|
За это сообщение автора поблагодарили: mazzy (2). |
17.08.2011, 14:40 | #9 |
Участник
|
Случайно наткнулся на свидетельство того, что разработчики стандартного приложения про этот косяк давно знают и нашли свой workaround без использования промежуточных переменных - см., например, \Classes\DirPartyMerge\runOnServer:
X++: while select forupdate docuRef where docuRef.RefTableId == (tablenum(DirPartyTable)) join partyTable where partyTable.PartyId == dirPartyId && partyTable.RecId == docuRef.RefRecId |
|
|
За это сообщение автора поблагодарили: AlGol (2), sukhanchik (2), MikeR (5), S.Kuskov (3). |
11.01.2013, 08:43 | #10 |
Участник
|
В очердной раз наткнулся на этот баг. Ошибка воспроизводится не только с функцией tablenum, но и со всеми встроенными функциями из AOT\System Documentation\Functions
|
|