|
02.06.2010, 11:22 | #1 |
Участник
|
Блокировать Select
Делаю примерно такую выборку со вставкой:
X++: ttsbegin; while select forUpdate markupTrans where markupTrans.transTableId == vendInvoiceJour.tableId && markupTrans.transRecId == vendInvoiceJour.recId { markupTransNew.clear(); markupTransNew.data(markupTrans); markupTransNew.Value = ( ); markupTransNew.lineNum = MarkupTrans::lastLineNum(markupTransNew.transTableId, markupTransNew.transRecId) + 1; markupTransNew.insert(); markupTrans.delete(); } } Так вот под разными пользователями аксапта ведет себя по разному на одних и тех же данных. У одних зацикливается, а под моим делает вставку удаление и выходит нормально. Я конечно перепишу код учитывая глюк, но всетаки интересно знать что на этот счет говорить теория? |
|
02.06.2010, 11:46 | #2 |
Участник
|
а почему просто не проапдейтить?
|
|
02.06.2010, 12:00 | #3 |
Участник
|
Я говорю, что вариантов переписать много. Дело не в этом.
Просто на самом деле у меня всталяется много записей в туже таблицу. Среди них может появиться та которая удовлетворит внешнему запросу. Что бы не писать всякие провеки где инсерт, а где апдейт я решил сделать более внятно на мой взгляд. Вставить все что нужно и убрать лишнее в конце. На самом деле удаление можно и убрать, но вставленная запись всеравно попадет в выборку и вызовет зацикливание. |
|
02.06.2010, 12:01 | #4 |
Модератор
|
X++: while select forUpdate markupTrans order by RecId desc
__________________
-ТСЯ или -ТЬСЯ ? |
|
|
За это сообщение автора поблагодарили: Logger (3), S.Kuskov (3). |
02.06.2010, 18:34 | #5 |
Axapta
|
Цитата:
Да даже не обязательно во время. Если в выбору попадут и положительные и отрицательные recId, то такой селект уже не сработает в том плане, что вновь создаваемые записи будут попадать в "середину". Или я чего-то не понял? |
|
02.06.2010, 12:16 | #6 |
Участник
|
Вот ещё похожая тема Как должен работать такой запрос
|
|
02.06.2010, 17:39 | #7 |
Участник
|
Две ошибки в коде1. markupTransNew.data(markupTrans); - после такой команды надо сделать markupTransNew.recid = 0; - это мелочь, но советую эту команду применять наравне с markupTransNew.clear();2. Зацикливание неизбежно. Условие выборки включает вновь создаваемые записи. Можно конечно ловить новые записи разными ухищрениями, но лучше делать по рекомендациям поставщика программы - см ниже
X++: void copyBOM(BOMId _FromBOM, BOMId _ToBOM) { RecordInsertList BOMList; BOM BOM, newBOM; ; BOMList = new RecordInsertList(tableNum(BOM)); while select BOM where BOM.BOMId == _FromBOM { newBOM.data(BOM); newBOM.BOMId = _ToBOM; BOMList.add(newBOM); } BOMList.insertDatabase(); } |
|
03.06.2010, 07:58 | #8 |
Участник
|
Цитата:
RecordInsertList в моем случае не совсем подходит потому как add() тоже вставляет в базу записи. Не сразу, пачками както, но тем неменее в общем случае не подходит. |
|
03.06.2010, 09:56 | #9 |
MCTS
|
Цитата:
Это как если бы для цикла for(i) внутри самого цикла присваивать i новое значение, а потом удивляться и обсуждать странное поведение цикла.
__________________
Dynamics AX Experience Последний раз редактировалось CDR; 03.06.2010 в 10:05. |
|
03.06.2010, 14:40 | #10 |
Участник
|
Цитата:
Ну в общем спасиба, понял, что никаих заклинаний для курсоров нет. будем писать правильно)) |
|