18.02.2010, 12:39 | #1 |
Участник
|
Как должен работать такой запрос
Хотелось бы услышать мнение большинства.
Как должен работать запрос вида 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; } Последний раз редактировалось kashperuk; 18.02.2010 в 12:57. Причина: Обновил код, чтобы ничего не поганить. |
|
18.02.2010, 13:08 | #2 |
----------------
|
должна получиться ошибка, так как 2 строки заказа с одинаковой номенклатурой
|
|
18.02.2010, 14:52 | #3 |
Участник
|
ОК. То есть все считают, что нормально, что notExist условие не учитывает вставляемых записей.
Я считаю, что да. Но вдруг кто-то считает иначе? |
|
18.02.2010, 15:20 | #4 |
Developer
|
При insert_recordset аксапта должна открыть транзакцию, поэтому из-за ошибки, описанной Wamr, в InventTable ничего не попадет... А по поводу notExist - аксапта грубо говоря сначала выбирает, а потом вставляет, хотя может я и не совсем прав...
Последний раз редактировалось vallys; 18.02.2010 в 15:25. |
|
18.02.2010, 15:29 | #5 |
Участник
|
Да. Помойму логично представлять себе работу этого запроса в два этапа.
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 |
----------------
|
Цитата:
Честно, я не знаю как работает insert_recordset в Аксапте (во что он превратится в SQL) Версия, которую стоит проверить - так как Аксапта получает не сразу всю выборку с SQL-сервера, а порциями, то при попадании новой вставленной записи в следующею порцию выборки она может учитываться. |
|
18.02.2010, 17:26 | #7 |
Участник
|
2 Wamr
Сначала происходит выборка во временную таблицу в SQL сервере по подзапросу, а, затем, перенос из этой временной таблицы в постоянную и удаление временной.
__________________
Axapta v.3.0 sp5 kr2 |
|
21.02.2010, 15:12 | #8 |
MCITP
|
Конечно, нормально. Есть же нормы SQL, здесь, на мой взгляд, всё должно быть аналогично - зачем изобретать велосипед?
__________________
Zhirenkov Vitaly |
|
|
Похожие темы | ||||
Тема | Ответов | |||
Не отрабатывает запрос EXISTS JOIN | 8 | |||
как сохранить запрос в таблице | 13 | |||
Возможен ли такой Query | 4 | |||
Как выполнить запрос созданный в переменной | 12 |
|