|  14.11.2005, 12:51 | #1 | 
| Участник | Join FirstOnly 
			
			Пытаюсь разобраться как работает Join FirstOnly Для примера у меня есть закупка номер «12345» В ней есть четыре строки с номенклатурами: Item1 Item2 Item3 Item4 Запускаю код: while Select purchTable Where purchTable.PurchId == "12345" Join FirstOnly purchLine Where purchLine.PurchId == purchTable.PurchId { info(purchLine.ItemId+' '+purchLine.PurchId); } Результат следующий: Item1 12345 Item2 12345 Item3 12345 Item4 12345 Разве недолжна вернуться только одна строчка Item1 12345 ? Для чего же тогда используется FirstOnly? | 
|  | 
|  14.11.2005, 13:13 | #2 | 
| Участник | 
			
			Игнорирует она его в джойне. Ставьте в для мастер-таблицы (для purchTable)
		 
				__________________ Axapta v.3.0 sp5 kr2 | 
|  | 
|  14.11.2005, 13:42 | #3 | 
| Участник | 
			
			Вот оно как…. Ну для мастер таблицы не подойдет, в реальной задаче мне нужно пройтись по всем строкам мастер таблицы и выбрать последнюю (одну) строку в подчиненной…. Придется вложенными селектами делать. Ну тогда непонятно другое, а зачем выражение Join FirstOnly используется в стандартном функционале, даже на SYS слое, например \Classes\LedgerJournalTransUpdateVendCancel\checkSettleVoucher ?... Просто так что ли..... | 
|  | 
|  14.11.2005, 14:40 | #4 | 
| Участник | 
			
			Ну в этом запросе firstOnly стоит и для мастер-таблицы, так что он вернет одну запись.  Но вы правы. Есть несколько мест, где указывается firstOnly только для детейл-таблицы (правда очень много с префиксом R или суффиксом _RU). 
				__________________ Axapta v.3.0 sp5 kr2 | 
|  | 
|  14.11.2005, 16:12 | #5 | 
| Administrator | 
			
			Кроме того, обратите внимание на следующую цитату из Best Practice: Цитата: 
		
			Remember, firstOnly does not guarantee that only one record is returned.    Illegal: while select firstOnly - does not make sense.
		
	 
				__________________ Not registered yet? Register here! Have comments, questions, suggestions or anything else regarding our web site? Don't hesitate, send them to me | 
|  | 
|  02.08.2007, 08:29 | #6 | 
| Участник | 
			
			Как для подобной задачи реализовать подобие Join FirstOnly средствами аксапты? Может у кого появились идеи? Или всё также только вложенными циклами?
		 
				__________________ PS. Сложно приехать в Москву, но ещё сложнее уехать отсюда. | 
|  | 
|  02.08.2007, 08:51 | #7 | 
| Модератор | 
			
			Аксапта не может реализовать в одном запросе того, чего не может реализовать СУБД. Т.о. - в морг (пишите вложенные запросы)
		 
				__________________ -ТСЯ или -ТЬСЯ ? | 
|  | 
|  02.08.2007, 09:40 | #8 | 
| Участник | X++: static void Job(Args _args) { PurchTable purchTable; PurchLine purchLine; Counter counter; ; while select purchTable group by PurchId join maxof(ItemId) from purchLine where purchLine.PurchId == purchTable.PurchId { counter ++; info(strfmt('%1 %2', purchTable.PurchId, purchLine.ItemId)); if (counter == 20) break; } } Последний раз редактировалось dns; 02.08.2007 в 09:41. Причина: Изменение имён | 
|  | |
| За это сообщение автора поблагодарили: computernik (1). | |
|  02.08.2007, 09:41 | #9 | 
| Участник | 
			
			Оно?
		 | 
|  | 
|  02.08.2007, 10:53 | #10 | 
| Участник | 
			
			ОК Понял Спасибо. В СУБД можно писать подзапросы в одном запросе. Правдо не понятно сколько реальных селектов это пародит... 
				__________________ PS. Сложно приехать в Москву, но ещё сложнее уехать отсюда. Последний раз редактировалось 3oppo; 02.08.2007 в 10:57. | 
|  | 
|  02.08.2007, 11:12 | #11 | 
| Участник | 
				__________________ PS. Сложно приехать в Москву, но ещё сложнее уехать отсюда. | 
|  |