|  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
		 | 
|  |