18.07.2006, 12:00 | #1 |
Участник
|
RecordSortedList forUpdate
Как-то можно присобачить RecordSortedList, чтобы хранить записи, с возможностью их последующего обновления?
делаю вот-так: Код: ttsbegin; loop = _recSortedList.first(table1); while (loop) { table1.selectForUpdate(true); table1.FieldCheckBox = NoYes::Yes; table1.update(); loop = _recSortedList.next(table1); } ttscommit; Как сие починить? |
|
18.07.2006, 12:20 | #2 |
MCTS
|
Я эту проблему решал так:
- удалял из сорт листа запись (которую надо обновить) - обновлял курсор записи - вставлял запись в сорт лист ttsbegin/ttscommit не нужны - работа идет с памятью а не с БД Или можно еще курсор таблицы объявить временным, Table.SetTmp() и работать с ним как с сорт листом, в таком случае и update() будет возможен. |
|
18.07.2006, 12:20 | #3 |
Administrator
|
А что мешает сделать так?:
X++: loop = _recSortedList.first(table1); while (loop) { table1.FieldCheckBox = NoYes::Yes; _recSortedList.ins(table1, true); loop = _recSortedList.next(table1); } 2 e@gle: Удалять записи необязательно, если новая запись заведомо (настроен параметр sortOrder) заменит исходную запись
__________________
Возможно сделать все. Вопрос времени Последний раз редактировалось sukhanchik; 18.07.2006 в 12:23. |
|
18.07.2006, 12:28 | #4 |
Участник
|
Похоже я плохо объяснил.
У меня есть набор записей (грубо говоря, RecId), которые мне нужно обновить - проставить, допустим, галку в поле FieldCheckBox (для всех записей из RSL) Именно обновить, в БД. А после этого мне RSL уже не нужен. То есть, я не хочу заново перевыбираться запись из таблицы и при этом ее обновить. Возможно, я просто плохо понимаю работаю с RecordSortedList. insertDatabase() - он обновит записи? или попрбует их вставить? И вообще, у меня этот объект на клиенте, там insertDatabase() делать нельзя. Ну, это не проблема вообще - можно перенести и на сервер. |
|
18.07.2006, 12:45 | #5 |
NavAx
|
Цитата:
Сообщение от kashperuk
Возможно, я просто плохо понимаю работаю с RecordSortedList.
insertDatabase() - он обновит записи? или попрбует их вставить?
__________________
Isn't it nice when things just work? |
|
18.07.2006, 13:10 | #6 |
Участник
|
Более того, попробовал написать вот так:
Код: ttsbegin; loop = _recSortedList.first(table1); while (loop) { table1.selectForUpdate(true); table1.MarginDocuReceived = NoYes::Yes; _recSortedList.ins(table1, true); loop = _recSortedList.next(table1); } loop = _recSortedList.first(table1); //Вот здесь в дебаггере видим, что table1 выбрана для обновления (в Watch Recid = 2323322, forUpdate) while (loop) { table1.update(); //Но все равно вот здесь вылетает та же ошибка loop = _recSortedList.next(table1); } ttscommit; |
|
18.07.2006, 13:12 | #7 |
Роман Долгополов (RDOL)
|
Цитата:
Сообщение от kashperuk
Похоже я плохо объяснил.
У меня есть набор записей (грубо говоря, RecId), которые мне нужно обновить - проставить, допустим, галку в поле FieldCheckBox (для всех записей из RSL) Именно обновить, в БД. А после этого мне RSL уже не нужен. То есть, я не хочу заново перевыбираться запись из таблицы и при этом ее обновить. Если транзакция одна и курсор из которого набивались записи в лист был forupdate, то никаких глюков не будет Последний раз редактировалось db; 18.07.2006 в 13:14. |
|
18.07.2006, 14:11 | #8 |
Участник
|
а если так :
Добавляем в глобал статический метод, а затем при работе с RecordSortedList просто вызываем этот метод с уже переданной отредактированной записью. Он сам перевыберет из базы обновит значения и запишет. Одно неудобство - метод предполагает что есть индекс по RecId - иначе очень долго выборка пойдет. Ну это можно довинтить... PHP код:
|
|
18.07.2006, 14:32 | #9 |
Роман Долгополов (RDOL)
|
Цитата:
Сообщение от Logger
а если так :
Добавляем в глобал статический метод, а затем при работе с RecordSortedList просто вызываем этот метод с уже переданной отредактированной записью. Он сам перевыберет из базы обновит значения и запишет. Одно неудобство - метод предполагает что есть индекс по RecId - иначе очень долго выборка пойдет. Ну это можно довинтить... Курсор это не какая то волшебная конструкция, которая обновляет запись непонятным образом минуя SQL. Когда вы пишете update(), то просто генерится команда update .. set .. where критерии по уникальному индексу. У каждой таблицы аксапты есть уникальный индекс, даже если он явно не указан (аксапта создаст его сама, приделав RecId к какому нибудь индексу или просто создаст индекс по RecId) Соответсвенно вышеописанный способ с глобальным методом попытка закодить то что уже в ядре и так есть Про forupdate. Сервер БД не запрещает выбирать записи без forupdate, а потом изменять их. Это лишь определяет момент наложения блокировки - сразу при выборке или потом при обновлении. Кому интересно - читайте доки по вашей СУБД Авторы аксапты решили (начиная с 3.0) что хорошим тоном будет являться накладывать блокировку сразу при выборке. Поэтому и появилась проверка на транзакцию и на forupdate. Но возможность выключить проверку осталась - skipTTSCheck(true) |
|
18.07.2006, 14:32 | #10 |
Участник
|
Цитата:
Сообщение от kashperuk
Как-то можно присобачить RecordSortedList, чтобы хранить записи, с возможностью их последующего обновления?
делаю вот-так: Код: ttsbegin; loop = _recSortedList.first(table1); while (loop) { table1.selectForUpdate(true); table1.FieldCheckBox = NoYes::Yes; table1.update(); loop = _recSortedList.next(table1); } ttscommit; Как сие починить? Код: ttsbegin; loop = _recSortedList.first(table1); while (loop) { table1.selectForUpdate(true); table1.reread(); table1.FieldCheckBox = NoYes::Yes; table1.update(); loop = _recSortedList.next(table1); } ttscommit;
__________________
Функциональное тестирование сайтов |
|
18.07.2006, 14:45 | #11 |
Участник
|
Цитата:
Сообщение от db
Когда вы пишете update(), то просто генерится команда update .. set .. where критерии по уникальному индексу. У каждой таблицы аксапты есть уникальный индекс, даже если он явно не указан (аксапта создаст его сама, приделав RecId к какому нибудь индексу или просто создаст индекс по RecId)
Соответсвенно вышеописанный способ с глобальным методом попытка закодить то что уже в ядре и так есть Проблема может возникнуть при выборке по условию locCommon.RecId == _common.RecId; |
|
18.07.2006, 14:56 | #12 |
Роман Долгополов (RDOL)
|
Цитата:
Сообщение от Logger
Мне кажется вы невнимательно прочитали мое сообщение.
Проблема может возникнуть при выборке по условию locCommon.RecId == _common.RecId; У Вас в методе, если запись по RecId не нашлась, то ничего и не делается. В стандарте сформируется SQL команда Update с критериями по уникальному индексу. Если в базе к тому моменту записи с такими критериями не будет, то update просто "пролетит" мимо - результат то же самый - ничего не изменится |
|
18.07.2006, 15:42 | #13 |
Участник
|
Цитата:
Сообщение от db
Может я действительно чего не втыкаю, тогда пжл проясните
У Вас в методе, если запись по RecId не нашлась, то ничего и не делается. В стандарте сформируется SQL команда Update с критериями по уникальному индексу. Если в базе к тому моменту записи с такими критериями не будет, то update просто "пролетит" мимо - результат то же самый - ничего не изменится А вообще изначально этот код был написан чтоб не делать большую транзакцию при обрбаотке здоровой таблицы. Я попробовал использщовать для обсуждаемой задачи. db, а почему вы так агрессивно реагируете на сообщения ? На вас тут никто не наезжал. Погода хорошая... В чем дело-то ? |
|
18.07.2006, 16:32 | #14 |
Роман Долгополов (RDOL)
|
Цитата:
Сообщение от Logger
db, а почему вы так агрессивно реагируете на сообщения ? На вас тут никто не наезжал. Погода хорошая... В чем дело-то ?
А, насчет агрессивно. Хм. Если бы видели мою агрессивную реакцию, то поняли бы что в данной ситуации я просто молчу ... Характер у меня такой, стервозный Спросите, например, у Recoilme. Он видел |
|
18.07.2006, 16:48 | #15 |
злыдень
|
db - аццкий сотона, однако(-)
(-)
__________________
Ибо зло есть лучшая сила человека. "Человек должен становиться все лучше и злее" -- так учу я. /Ф. Ницше/ |
|
18.07.2006, 18:59 | #16 |
Участник
|
Цитата:
Сообщение от Red Stranger
Если я правильно понял Вашу проблему, то
Код: ttsbegin; loop = _recSortedList.first(table1); while (loop) { table1.selectForUpdate(true); table1.reread(); table1.FieldCheckBox = NoYes::Yes; table1.update(); loop = _recSortedList.next(table1); } ttscommit; Ну, уже не суть важно Забил, и сделал через Set - правда теперь приходится искать запись перед обновлением - по RecId, индекс по RecId есть, так что довольно быстро. Всем спасибо |
|
28.08.2006, 16:37 | #17 |
Участник
|
столкнулся с такой же проблемой... следующий вариант мне помог
Table1 table1; Table1 table1update; ... ttsbegin; for (loop = _recSortedList.first(table1); loop; loop = _recSortedList.next(table1)) { table1update.selectForUpdate(true); table1update.data(table1); table1update.FieldCheckBox = NoYes::Yes; table1update.update(); } ttscommit; |
|