Форум: "Базы";
Текущий архив: 2002.08.22;
Скачать: [xml.tar.bz2];
ВнизОТМЕНА последнего действия ! Найти похожие ветки
← →
NDR (2002-08-02 13:56) [0]надо написать процедурку! я меня получается полная фигня.
несовсем то,что нужно. а нужно вот что:
Отмена последнего действия.
Например лазил, лазил в табле и случайно что-то удалил или изменил. жмешь "отменить" . и твои последние действия (по удалению,изменению) отменяются! ну как в Excele
\ Правка \ Отменить
я незнаю как зопоминать координаты ячейки в которой произошли последние изменения. (в Excele есть координаты например A3 или B1)
← →
IlyaA (2002-08-02 14:03) [1]Запоминай Table.RecNo - номер текущей записи и обрабатывай событие AfterEdit, где запоминай старое значение.
← →
Mike Kouzmine (2002-08-02 14:06) [2]Если с DBF, то перед удалением запоминаешь номер записи, потом, при необходимости, восстанавливаешь. Ну а что касается восстановления значений полей, то используй механизм BeforeEdit получение значений полей, AfterPost - запись их в лог. Соответственно при желании можно восстановить значения. Но, вообще, для этого, лучше использовать SQL сервера.
← →
DiamondShark (2002-08-02 14:08) [3]При прямой работе с таблицами не получится.
Здесь нужна идеология работы с документом. Суть: пользователь работает не с самими данными, а со своей локальной копией, а когда он уверен, что вся работа закончена, то сохраняет свои художества все разом.
Просто такой подход не реализовать.
Можно попробовать использовать ClientDataset. Там есть методы UndoLastChange, CancelUpdates. А самое главное, изменения не пишутся сразу в базу, а только при явном вызове ApplyUpdates
← →
IlyaA (2002-08-02 14:08) [4]Извиняюсь. Mike Kouzmine (02.08.02 14:06) прав. BeforEdit
← →
Val (2002-08-02 14:09) [5]>IlyaA © (02.08.02 14:03)
старое значение нужно запоминать до редактирования.
>NDR (02.08.02 13:56)
есть обработчики, BeforeInsert, BeforeEdit, BeforeDelete - в них и пишите свои действия перед операциями над данными.
← →
DiamondShark (2002-08-02 14:10) [6]
> Но, вообще, для этого, лучше использовать SQL сервера.
Не надо вводить народ в заблуждение: для ЭТОГО SQL сервера не помогут.
← →
Val (2002-08-02 14:11) [7]отвлекся на минутку и уже написал все зря :)
← →
Nikolay M. (2002-08-02 14:11) [8]Какие, на фиг, в "табле" координаты?!
Я бы делал так: поскольку обычно у пользователя есть 3 способа манипулирования над данными: добавить, удалить, изменить, то можно завести три таблицы, в которых последовательно (номерация действий должна быть сквозная для всех трех таблиц) будут идти совершенные пользователем действия (INSERT_LOG, DELETE_LOG, UPDATE_LOG). Например, если удалена строка из таблицы, делается запись в DELETE_LOG, что удалены такие-то данные (естественно, нужно написать, какие именно, чтобы можно было откатить удаление). Аналогично вставка и модификация.
Конечно, грамотнее делать транзакции, Commit/Rollback, но вопрос задан так, что, IMHO, ими обойтись не удастся.
← →
Val (2002-08-02 14:13) [9]>DiamondShark © (02.08.02 14:08)
свойство CashedUpdates имеют также и TTable и TQuery.
← →
Val (2002-08-02 14:15) [10]>Nikolay M. © (02.08.02 14:11)
сорри, может я не понял чего? откуда в dBase, FoxPro механизм транзакций?
← →
Johnmen (2002-08-02 14:17) [11]>DiamondShark © (02.08.02 14:10)
>Не надо вводить народ в заблуждение: для ЭТОГО SQL сервера не
>помогут.
Обоснуй...
← →
Nikolay M. (2002-08-02 14:19) [12]
> Val © (02.08.02 14:15)
> сорри, может я не понял чего? откуда в dBase, FoxPro механизм
> транзакций?
Сорьки, пропустил мимо ушей в чем БД. По поводу транзакций было просто лирическое отступление, а в голову сразу пришел вариант с тремя откатными таблицами.
← →
Val (2002-08-02 14:22) [13]>Nikolay M. © (02.08.02 14:19)
а чем плох классический вариант лога: одна таблица и в ней кроме полей записи, поле с флагом проведеной операции над записью?
← →
DiamondShark (2002-08-02 14:23) [14]
> свойство CashedUpdates имеют также и TTable и TQuery.
Зато умеют только ApplyUpdates и CancelUpdates
А нужно именно UndoLastChange
> Конечно, грамотнее делать транзакции, Commit/Rollback, но
> вопрос задан так, что, IMHO, ими обойтись не удастся
Э... Это... dBase, FoxPro. Какие транзакции? Да и обойтись ими не удастся не поэтому. Для другого они сделаны.
Грамотнее? Хотел бы я слышать те русские слова, которыми бы вас поминали пользователи многопользовательской системы, открой вы транзакцию минут так на 20 ;)
← →
Nikolay M. (2002-08-02 14:32) [15]
> Val © (02.08.02 14:22)
> а чем плох классический вариант лога: одна таблица и в ней
> кроме полей записи, поле с флагом проведеной операции над
> записью?
А последовательность действий? А если человек решит удалить 100 записей, тогда у них флажок "Удалено"? В принципе, возможно, но тогда придется перестраивать все селекты из этой таблицы, чтобы они учитывали флаги состояний. Да и физического удаления не будет - записи будут накапливаться. Опять же, как реализовать откат UPDATE и INSERT... Поэтому пока я за отдельные логовские таблицы.
> DiamondShark © (02.08.02 14:23)
> Э... Это... dBase, FoxPro. Какие транзакции?
КАЮСЬ, КАЮСЬ!!! :)))
Ну, пропустил я, какая БД. И транзакции упомянул просто к слову... :)
Ногами только не бейте!
← →
Johnmen (2002-08-02 14:35) [16]>DiamondShark © (02.08.02 14:23)
>Какие транзакции? Да и обойтись ими не удастся не поэтому. Для
>другого они сделаны.
Для чего ?
← →
DiamondShark (2002-08-02 14:38) [17]
> Обоснуй...
А нету у них средств запоминать последовательность действий.
Вот только не надо про транзакции и check pointы, ладно?
← →
DiamondShark (2002-08-02 14:40) [18]
> Для чего ?
Для оформления логически связанных действий (logical unit of work) в атомарные операции
← →
Johnmen (2002-08-02 14:48) [19]>DiamondShark © (02.08.02 14:38)
Почему не надо ?
← →
Val (2002-08-02 14:53) [20]>Nikolay M. © (02.08.02 14:32)
возможно, вы не поняли о чем речь, итак:
1.последовательность действий сохраняется, т.к. записи добавляются в конец таблицы. Конечно, хоть тысячу и т.д. удалил, вам ведь, возможно, захочется их восстановить?
2. какие селекты и перестраивания(кстати у вас-то нужно знать из какой таблицы выбирать, а тут флаг-вся разница)? ведь это лог, то есть нужно идти с конца таблицы вверх, чтобы восстановить последовательность действий пользователя.
3. почему не будет физического удаления? из таблицы записи удаляются. Записи будут накапливаться в таблице логов, а как же вы хотите восстановить события иначе, не имея данных на тот момент?
4. откат в общем случае: в зависимости от флага, нужно будет выполнить обратное действие. где тут проблема?
← →
Mike Kouzmine (2002-08-02 15:02) [21]Johmenу. Проконсультируй. Я не утаерждаю, я спрашиваю: запоминаются изменения проишедшие с записью, которые существуют параллельно с текущей версией записи (до сбора мусора), если это так, то вопрос - можно получить программно доступ к этим вариантам?
← →
Johnmen (2002-08-02 15:09) [22]>Mike Kouzmine (02.08.02 15:02)
Для какой СУБД ? И что значит "запоминаются" ?
← →
Mike Kouzmine (2002-08-02 15:11) [23]IB? Значит храняться
← →
Nikolay M. (2002-08-02 15:12) [24]
> >Nikolay M. © (02.08.02 14:32)
> возможно, вы не поняли о чем речь, итак:
Да, я почему-то решил, что предлагается завести флажок в той таблице, которую, собственно, оперируем. Теперь дошло. Согласен, при разумной организации хранить лог можно и в одной-единственной таблице (10Х за такой длинный постинг), просто я сначала подумал, что структуры данных для откатов трех операций будут разными, поэтому логично хранить три разных лога.
Если теперь закрыть вопрос о "записи добавляются в конец таблицы", то можно считать, что мы пришли к единому мнению :)
Надеюсь, под этим просто подразумевается, что в таблице-логе существует возможность определить очередность добавления записей. Потому как SELECT * FROM Log не вернет записи в том порядке, в каком они туда были записаны (хотя может для dbf это не так?). Если разночтений больше нет, тогда будем ждать новых озарений и что думают о проблеме остальные участники форума :)
← →
Johnmen (2002-08-02 15:22) [25]>Mike Kouzmine (02.08.02 15:02)
Если имеется в виду после коммита, то это и есть тек.версия записи.
Можно ли получить предыдущие версии записи в IB - нет...
В Oracle - можно, извратившись...
← →
Mike Kouzmine (2002-08-02 15:32) [26]Johmenу Спасибо
← →
Val (2002-08-02 15:40) [27]Надеюсь, под этим просто подразумевается
естественно, всякий лог должен содержать дату и время операции.
А никто и не говорил, что будет работать с SQL :), поэтому "записи добавляются в конец таблицы" остается в силе.
← →
the-best-officeman (2002-08-04 17:24) [28]хммм.... ну просто загрузили =))
← →
the-best-officeman (2002-08-04 17:24) [29]хммм.... ну просто загрузили =))
с Уважением, the-best-officeman (aka NDR)
Страницы: 1 вся ветка
Форум: "Базы";
Текущий архив: 2002.08.22;
Скачать: [xml.tar.bz2];
Память: 0.51 MB
Время: 0.007 c