AXForum  
Вернуться   AXForum > Microsoft Dynamics AX > DAX: Программирование
All
Забыли пароль?
Зарегистрироваться Правила Справка Пользователи Сообщения за день Поиск

 
 
Опции темы Поиск в этой теме Опции просмотра
Старый 14.11.2005, 12:51   #1  
leshy is offline
leshy
Участник
 
118 / 11 (1) +
Регистрация: 23.02.2004
Адрес: Киев
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  
AndyD is offline
AndyD
Участник
КОРУС Консалтинг
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
 
2,560 / 2479 (88) +++++++++
Регистрация: 20.08.2005
Игнорирует она его в джойне. Ставьте в для мастер-таблицы (для purchTable)
__________________
Axapta v.3.0 sp5 kr2
Старый 14.11.2005, 13:42   #3  
leshy is offline
leshy
Участник
 
118 / 11 (1) +
Регистрация: 23.02.2004
Адрес: Киев
Вот оно как…. Ну для мастер таблицы не подойдет, в реальной задаче мне нужно пройтись по всем строкам мастер таблицы и выбрать последнюю (одну) строку в подчиненной…. Придется вложенными селектами делать.

Ну тогда непонятно другое, а зачем выражение Join FirstOnly используется в стандартном функционале, даже на SYS слое, например \Classes\LedgerJournalTransUpdateVendCancel\checkSettleVoucher ?... Просто так что ли.....
Старый 14.11.2005, 14:40   #4  
AndyD is offline
AndyD
Участник
КОРУС Консалтинг
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
 
2,560 / 2479 (88) +++++++++
Регистрация: 20.08.2005
Ну в этом запросе firstOnly стоит и для мастер-таблицы, так что он вернет одну запись.

Но вы правы. Есть несколько мест, где указывается firstOnly только для детейл-таблицы (правда очень много с префиксом R или суффиксом _RU).
__________________
Axapta v.3.0 sp5 kr2
Старый 14.11.2005, 16:12   #5  
Maxim Gorbunov is offline
Maxim Gorbunov
Administrator
Соотечественники
Лучший по профессии 2009
 
2,483 / 645 (26) +++++++
Регистрация: 27.11.2001
Адрес: Dubai, UAE
Кроме того, обратите внимание на следующую цитату из 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  
3oppo is offline
3oppo
Участник
Аватар для 3oppo
 
222 / 32 (2) +++
Регистрация: 30.06.2005
Цитата:
Сообщение от leshy Посмотреть сообщение
Вот оно как…. Ну для мастер таблицы не подойдет, в реальной задаче мне нужно пройтись по всем строкам мастер таблицы и выбрать последнюю (одну) строку в подчиненной…. Придется вложенными селектами делать.
Как для подобной задачи реализовать подобие Join FirstOnly средствами аксапты? Может у кого появились идеи? Или всё также только вложенными циклами?
Старый 02.08.2007, 08:51   #7  
Vadik is offline
Vadik
Модератор
Аватар для Vadik
Лучший по профессии 2017
Лучший по профессии 2015
 
3,631 / 1849 (69) ++++++++
Регистрация: 18.11.2002
Адрес: гражданин Москвы
Цитата:
Сообщение от 3oppo Посмотреть сообщение
Как для подобной задачи реализовать подобие Join FirstOnly средствами аксапты? Может у кого появились идеи? Или всё также только вложенными циклами?
Аксапта не может реализовать в одном запросе того, чего не может реализовать СУБД. Т.о. - в морг (пишите вложенные запросы)
__________________
-ТСЯ или -ТЬСЯ ?
Старый 02.08.2007, 09:40   #8  
dns is offline
dns
Участник
 
19 / 13 (1) ++
Регистрация: 11.05.2007
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  
dns is offline
dns
Участник
 
19 / 13 (1) ++
Регистрация: 11.05.2007
Оно?
Старый 02.08.2007, 10:53   #10  
3oppo is offline
3oppo
Участник
Аватар для 3oppo
 
222 / 32 (2) +++
Регистрация: 30.06.2005
ОК Понял Спасибо.
В СУБД можно писать подзапросы в одном запросе.
Правдо не понятно сколько реальных селектов это пародит...

Последний раз редактировалось 3oppo; 02.08.2007 в 10:57.
Старый 02.08.2007, 11:12   #11  
3oppo is offline
3oppo
Участник
Аватар для 3oppo
 
222 / 32 (2) +++
Регистрация: 30.06.2005
Цитата:
Сообщение от dns Посмотреть сообщение
...

Вау!!! Похоже на правду, счас проверю
 

Похожие темы
Тема Автор Раздел Ответов Посл. сообщение
2 while select или join? _scorp_ DAX: Программирование 9 23.01.2009 16:02
AX UK: Join the Virtual Partner Community Blog bot DAX Blogs 0 26.03.2008 04:17
Глюки в Query с разными типами Join (в т.ч. NonExistsJoin) к одной таблице gl00mie DAX: Программирование 10 14.02.2007 13:22
2 join-а + CasheLookup = EntireTable vallys DAX: Программирование 1 10.03.2006 13:20
2 и более OUTER JOIN к одному паренту Ronin DAX: Программирование 21 19.12.2005 13:42

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход

Рейтинг@Mail.ru
Часовой пояс GMT +3, время: 07:11.