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

 
 
Опции темы Поиск в этой теме Опции просмотра
Старый 18.02.2010, 12:39   #1  
kashperuk is offline
kashperuk
Участник
Аватар для kashperuk
MCBMSS
Соотечественники
Сотрудники Microsoft Dynamics
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии 2011
Лучший по профессии 2009
 
4,361 / 2084 (78) +++++++++
Регистрация: 30.05.2004
Адрес: Atlanta, GA, USA
? Как должен работать такой запрос
Хотелось бы услышать мнение большинства.
Как должен работать запрос вида

X++:
static void Job13(Args _args)
{
    InventTable inventTable;
    InventTable inventTableNotExists;
    SalesLine   salesLine;
    int item1 = 1, item2 = 2;
    ;
    salesLine.skipDataMethods(true);
    salesLine.skipDeleteActions(true);
    delete_from salesLine
        where salesLine.ItemId like "item*";

    inventTable.skipDataMethods(true);
    inventTable.skipDeleteActions(true);
    delete_from inventTable
        where inventTable.ItemId like "item*";

    salesLine.ItemId = "Item"+int2str(item1);
    salesLine.SalesId = int2str(item1);
    salesLine.InventTransId = int2str(item1);
    salesLine.doInsert();

    salesLine.ItemId = "Item"+int2str(item1);
    salesLine.SalesId = int2str(item2);
    salesLine.InventTransId = int2str(item2);
    salesLine.doInsert();

    inventTable.skipDataMethods(true);
    insert_recordset inventTable (ItemId)
        select ItemId from salesLine
            notexists join inventTableNotExists
                where inventTableNotExists.ItemId == salesLine.ItemId;
}
Сколько записей, если вообще хоть одна, должны попасть в InventTable?

Последний раз редактировалось kashperuk; 18.02.2010 в 12:57. Причина: Обновил код, чтобы ничего не поганить.
Старый 18.02.2010, 13:08   #2  
Wamr is offline
Wamr
----------------
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
 
1,737 / 858 (32) +++++++
Регистрация: 15.01.2002
Адрес: Москва
Записей в блоге: 7
должна получиться ошибка, так как 2 строки заказа с одинаковой номенклатурой
Старый 18.02.2010, 14:52   #3  
kashperuk is offline
kashperuk
Участник
Аватар для kashperuk
MCBMSS
Соотечественники
Сотрудники Microsoft Dynamics
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии 2011
Лучший по профессии 2009
 
4,361 / 2084 (78) +++++++++
Регистрация: 30.05.2004
Адрес: Atlanta, GA, USA
ОК. То есть все считают, что нормально, что notExist условие не учитывает вставляемых записей.
Я считаю, что да. Но вдруг кто-то считает иначе?
Старый 18.02.2010, 15:20   #4  
vallys is offline
vallys
Developer
 
146 / 108 (0) +++++
Регистрация: 18.01.2005
При insert_recordset аксапта должна открыть транзакцию, поэтому из-за ошибки, описанной Wamr, в InventTable ничего не попадет... А по поводу notExist - аксапта грубо говоря сначала выбирает, а потом вставляет, хотя может я и не совсем прав...

Последний раз редактировалось vallys; 18.02.2010 в 15:25.
Старый 18.02.2010, 15:29   #5  
S.Kuskov is offline
S.Kuskov
Участник
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
 
3,440 / 1775 (66) ++++++++
Регистрация: 28.04.2007
Адрес: Калуга
Да. Помойму логично представлять себе работу этого запроса в два этапа.
1 - сначала выборка данных
2 - потом вставка уже выбранных данных

Кстати, обратное поведение наблюдается в случае временных таблиц. Например такой код уйдёт в бесконечный цикл:
X++:
    TmpABC TmpABC_1, TmpABC_2;
    ;
 
    TmpABC_1.clear();
    TmpABC_1.doInsert();
    TmpABC_2.setTmpData(TmpABC_1);
    while select TmpABC_2
    {
        info("!!!");
        TmpABC_1.clear();
        TmpABC_1.RefRecId = TmpABC_2.RefRecId + 1;
        TmpABC_1.doInsert();
    }
    info("???");
Старый 18.02.2010, 15:59   #6  
Wamr is offline
Wamr
----------------
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
 
1,737 / 858 (32) +++++++
Регистрация: 15.01.2002
Адрес: Москва
Записей в блоге: 7
Цитата:
Сообщение от kashperuk Посмотреть сообщение
То есть все считают, что нормально, что notExist условие не учитывает вставляемых записей.
Я считаю, что да. Но вдруг кто-то считает иначе?
Я так не считаю Думаю, это вопрос который можно исследовать.
Честно, я не знаю как работает insert_recordset в Аксапте (во что он превратится в SQL)

Версия, которую стоит проверить - так как Аксапта получает не сразу всю выборку с SQL-сервера, а порциями, то при попадании новой вставленной записи в следующею порцию выборки она может учитываться.
Старый 18.02.2010, 17:26   #7  
AndyD is offline
AndyD
Участник
КОРУС Консалтинг
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
 
2,560 / 2479 (88) +++++++++
Регистрация: 20.08.2005
2 Wamr

Сначала происходит выборка во временную таблицу в SQL сервере по подзапросу, а, затем, перенос из этой временной таблицы в постоянную и удаление временной.
__________________
Axapta v.3.0 sp5 kr2
Старый 21.02.2010, 15:12   #8  
ZVV is offline
ZVV
MCITP
MCP
Oracle
MCBMSS
 
1,006 / 246 (11) ++++++
Регистрация: 13.02.2004
Адрес: Минск
->
Цитата:
Сообщение от kashperuk Посмотреть сообщение
ОК. То есть все считают, что нормально, что notExist условие не учитывает вставляемых записей.
Я считаю, что да. Но вдруг кто-то считает иначе?
Конечно, нормально. Есть же нормы SQL, здесь, на мой взгляд, всё должно быть аналогично - зачем изобретать велосипед?
__________________
Zhirenkov Vitaly
 

Похожие темы
Тема Автор Раздел Ответов Посл. сообщение
Не отрабатывает запрос EXISTS JOIN Paul_ST DAX: База знаний и проекты 8 21.03.2008 17:21
как сохранить запрос в таблице kitty DAX: Программирование 13 19.11.2007 20:16
Возможен ли такой Query kalex DAX: Программирование 4 07.05.2007 13:13
Как выполнить запрос созданный в переменной ddadream DAX: Программирование 12 27.02.2002 14:57

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

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

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