Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Базы";
Текущий архив: 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
14-71344
Anatoly Podgoretsky
2002-07-24 21:15
2002.08.22
На землю летит двухграммовый астероид


7-71392
Chakchir
2002-06-10 10:09
2002.08.22
Как определить весь объем оперативки и сколько из нее свободно.


1-71147
Cr@sh
2002-08-13 13:21
2002.08.22
Помоготи с использованием процедуры.


3-71032
Enig
2002-08-01 12:28
2002.08.22
ATTENTION!!! HELP ME!!!


1-71234
V.Turecky
2002-08-11 17:41
2002.08.22
Диалог выбора значка...





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский