09.03.2018, 21:37 | #1 |
Участник
|
Обновить выделенные записи на форме
Задача - массово изменить несколько записей на форме.
То есть, пользователь выбирает несколько записей, нажимает кнопку, выбирает новое значение. Значение устанавливается во все записи Задача, вроде, это очень простая и реализовано так: Есть класс, он получает MultiSelectionHelper с формы и обновляет записи. В конце main, чтобы отразить изменения на форме, стоят в конце ds.reread() и ds.refreshEx(-2). Все хорошо работает Но.....если происходит в коде исключение и откатывается транзакция обновления всех этих строк, то почему-то все записи, которым был сделан update до исключения, так и продолжают показываться на форме с присвоенными значениями. То есть, тот факт , что транзакция откатилась, никак визуально не отражается, пока не нажмешь F5 В коде исключения отлавливаются и тут же вызывается ds.reread() и ds.refreshEx(-2) при исключении тоже. Дебаггер доходит до этих строчек. Видно, что ds присвоен.... Пробовала refreshEx (1) - не помогло. Research помогает, но использовать его не хочу, тк выделение на форме пропадет .... В чем может быть проблема? |
|
09.03.2018, 21:57 | #2 |
Участник
|
Как-то связано с кэшем/где буфер находится
Если ставлю на классе RunOn = server , то только последняя запись обновляется , если нет исключения в коде Если ставлю на классе RunOn = client, то все записи ообновляются , если нет исключения в коде. При этом достаточно вообще reread() refresh чтобы обновить все выделенные записи. То есть, refresh(-2) не принципиально писать. |
|
12.03.2018, 12:44 | #3 |
Участник
|
Помогите, пожалуйста, с букварем .....
|
|
12.03.2018, 12:56 | #4 |
Участник
|
Прочтите вот это
http://kashperuk.blogspot.se/2010/03...-research.html |
|
12.03.2018, 16:52 | #5 |
Участник
|
Как эта ссылка эта поможет для решения проблемы ?
Я не спрашиваю, что делают эти функции. В вышеприведенном моем описании все сделанно по "букварю" . Я сформулировала проблему, но, судя по данному ответу, Вы, уж простите, но ее даже не прочитали Последний раз редактировалось kitty; 12.03.2018 в 17:57. |
|
12.03.2018, 18:49 | #6 |
Участник
|
Извините, просто сложилось впечатление, что вы не на 100% понимаете, как все эти reread, refreshEx и т.п. методы работают, решил подбросить ссылку.
Если research работает, как насчет запомнить выделенные записи перед вызовом research, а потом выделить их из кода? X++: void clicked() { Table1 table1Local; Table1 table1ForUpdate; MultiSelectionHelper helper = MultiSelectionHelper::construct(); Set selectedRecords = new Set(Types::Record); SetEnumerator selectedRecordEnumerator; helper.parmDatasource(Table1_ds); table1Local = helper.getFirst(); while (table1Local.RecId != 0) { selectedRecords.add(table1Local.data()); ttsBegin; select firstonly forUpdate table1ForUpdate where table1ForUpdate.RecId == table1Local.RecId; table1ForUpdate.Field1 = 'some value'; table1ForUpdate.update(); ttsCommit; table1Local = helper.getNext(); } Table1_ds.research(); selectedRecordEnumerator = selectedRecords.getEnumerator(); while (selectedRecordEnumerator.moveNext()) { table1Local = selectedRecordEnumerator.current(); Table1_ds.findRecord(table1Local); Table1_ds.mark(true); } } |
|
12.03.2018, 19:11 | #7 |
Участник
|
Спасибо.
Я только обновляю записи, не добавляю/удаляю, поэтому reread&refresh дожен быть достаточен. Но почему-то , если транзакция успешна, то благополучно все изменения отображаются, а если откатывается - то частично данные обновляются на форме... Если reread стоит после отката, то, по идее, он должен "подхватить" актуальные уже записи ... и дело даже не в refresh (-2) ( и (-1) иже с ним), тк они тоже не помогают Кэширование на таблице уже даже поменяла, не помогло Стандартное решение должно работать, это же стандартный сценарий. Значит, где-то проблема, раз не работает, и желательно ее найти . Как вариант - да, промаркирую заново выбранные записи, но это все-таки будут костыли. |
|
|
|