![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Сохранение или отмена изменений [D7, Access]
KinnOk © (2006-05-18 09:53:00)Данные редактируются в гриде.
Задача - отследить, были ли изменения, если да - то спросить, нужно их сохранять или нет. Редактируются прям в гриде.
Beforescroll и Afterscroll - в них не видится состояние dsinsert, dsEdit.
В принципе подошел бы Beforepost, но :
procedure TDM.model_condBeforePost(DataSet: TDataSet);
begin
if mnForm.DBGridEh1.DataSource.DataSet.State in [dsinsert,dsEdit] then
begin
if MessageDlg('Данные изменились,
сохранить?',mtWarning,[mbYes,mbNo],0) = mrNo
then DM.model_cond.Cancel;
end;
в редактируемой записи по кнопке No ничего не изменяется, но в конец набора данных добавляется запись со значением редактируемого поля до редактирования.
Плохиш (2006-05-18 18:04:00) [1]
> Alexey_ (18.05.06 17:42) [21]
>
> > > А вот ето "DM." выкинуть нафик пока руки не оторвали
> >
> > согласен :) увлекся :) Действительно руки привыкли DM
> бить.
> > Обещаюсь выправить молотком и напильником.
>
> Я, похоже, что-то упустил... за что его выкидывать???
Потому что DM является переменной, хранящей указатель на что-то, в данном конкретном случае на конкретный экземпляр класса, а также может указывать в никуда. Вся обработка в методах класса подразумевает использование текущего экземпляра класса, ссылка на который передаётся с помощью неявного параметра self. Этот параметр по-умолчанию используется при обращении к методам/свойствам класса. Если Вы используете в программе имена конкретных переменных (DM), то тем самым Вы говорите, что в данном случае надо использовать не текущий экземпляр класса, для которого был произведён вызов метода, а конкретный ссылка на который храниться в переменной DM. Результатом таких ошибок является постоянное появление на делфимастер веток с вопросами об AV и про программы, делающие не то, что хотел создатель.
Плохиш (2006-05-18 17:52:00) [2]
> MsGuns © (18.05.06 17:47) [22]
> >Alexey_ (18.05.06 17:42) [21]
> >Я, похоже, что-то упустил... за что его выкидывать???
>
> Во-первых, дурной тон обращаться к экземпляру класса
Я бы сказал "к конкретномуэкземпляру класса"
MsGuns (2006-05-18 17:47:00) [3]>Alexey_ (18.05.06 17:42) [21]
>Я, похоже, что-то упустил... за что его выкидывать???
Во-первых, дурной тон обращаться к экземплярукласса
Во-вторых, неоправданное использование в кодовых конструкциях обращений в владельцам адресуемых объектах (в данном случае - экземпляру класса, к которому принадлежит процедура) загромождает код, делая его менее читабельным.
Alexey_ (2006-05-18 17:42:00) [4]
> > А вот ето "DM." выкинуть нафик пока руки не оторвали
>
> согласен :) увлекся :) Действительно руки привыкли DM бить.
> Обещаюсь выправить молотком и напильником.
Я, похоже, что-то упустил... за что его выкидывать???
KinnOk (2006-05-18 13:29:00) [5]2Плохиш -спасибо, то что надо и без лишней суеты
зы dm уже тоже вырезал
KinnOk (2006-05-18 13:22:00) [6]
> 1. "Локальная"
> Типа Экселя. "Все делает" грид. Проверки корректности изменений
> через события BeforePost/Insert/Delete датасета.
> Транзакции, логическая целостность БД "по боку". Применима
> для простых "баз" типа линейных справочников или "одномерных"
> объектов (один объект - одна таблица).
Именно.
Простейшая задача для простова справочника, и клиент-сервер городить для локальной однопользовательской программульки - нет смысла.
> А вот ето "DM." выкинуть нафик пока руки не оторвали
согласен :) увлекся :) Действительно руки привыкли DM бить. Обещаюсь выправить молотком и напильником.
> С "младенческих" лет не пользуюсь прямым редактированием
> в DB.
Повторюсь, задача слишком проста, чтоб городить клиент-сервер. Иначе б с акцессом вообще б не вязался.
> А что есть "прямое" и соответственно "НЕпрямое" (кривое?
> 8-) редактирование в БД? А то я на распутье стою. Вернее
> в раскоряку. 8-)
>
прямое - навигационными методами - append,edit,post и иже с ними.
не прямое - insert into, update, delete from...
суть такова:
1 основная таблица и около 30 - справочных,
связь - один ко многим,
lookup - сделаны, нормально все работает.
И вопрос скорее теоретического характера. В общем то подгоняется юзабилити, а не принцип работы с базой.
Просьба заказчика была такова - править прям в гриде, чисто принципиально - это возможно - тогда почему бы и нет?
Sergey13 (2006-05-18 13:14:00) [7]2 [17] Alexey_ (18.05.06 13:06)
Если помнить, что юзер не враг и пришел работать, то этим легко эту охоту работать отбить. ИМХО.
8-)
Alexey_ (2006-05-18 13:06:00) [8]
> Можно и без предупреждения все как есть оставить.
При попытке редактировать можно спрашивать :"будем редактировать или ну его нафиг" :)
Sergey13 (2006-05-18 12:49:00) [9]2[13] Jeer © (18.05.06 11:28)
А что есть "прямое" и соответственно "НЕпрямое" (кривое? 8-) редактирование в БД? А то я на распутье стою. Вернее в раскоряку. 8-)
Johnmen (2006-05-18 12:44:00) [10]
> MsGuns © (18.05.06 12:40) [14]
> >Jeer © (18.05.06 11:28) [13]
> >С "младенческих" лет не пользуюсь прямым редактированием
> в DB.
> "Верною дорогою идете, товарищи !" (В.Л.Ульянов-Ленин)
> ;)
Куда мы пришли по этой верной дороге - общеизвестно....
:)
MsGuns (2006-05-18 12:40:00) [11]>Jeer © (18.05.06 11:28) [13]
>С "младенческих" лет не пользуюсь прямым редактированием в DB.
"Верною дорогою идете, товарищи !" (В.Л.Ульянов-Ленин)
;)
Jeer (2006-05-18 11:28:00) [12]С "младенческих" лет не пользуюсь прямым редактированием в DB.
Одной головной болью навсегда стало меньше.
Чего и другим желаю.
Плохиш (2006-05-18 11:24:00) [13]
> Johnmen © (18.05.06 11:21) [11]
> Краеугольный вопрос - ГДЕ сохранять.
Ну судя по постaновке вопроса в [0], телепатор даже долго не думал над этим, он просто отбросил название конференции из исходных данных :-)
Johnmen (2006-05-18 11:21:00) [14]
> Плохиш © (18.05.06 11:17) [10]
> Но здесь уже поздно спрашивать, нужно ли их сохранять :-
> )
Краеугольный вопрос - ГДЕсохранять.
Плохиш (2006-05-18 11:17:00) [15]
> Johnmen © (18.05.06 11:15) [9]
> >Задача - отследить, были ли изменения
>
> AfterPost
Но здесь уже поздно спрашивать, нужно ли их сохранять :-)
Johnmen (2006-05-18 11:15:00) [16]>Задача - отследить, были ли изменения
AfterPost
Плохиш (2006-05-18 11:09:00) [17]О :-( А вот ето " DM." выкинуть нафик пока руки не оторвали.
Плохиш (2006-05-18 11:08:00) [18]
> KinnOk (18.05.06 09:53)
procedure TDM.model_condBeforePost(DataSet: TDataSet);
begin
if MessageDlg('Данные изменились,сохранить?',mtWarning,[mbYes,mbNo],0) = mrNo
then
begin
DM.model_cond.Cancel;
Abort;
end;
end;
MsGuns (2006-05-18 10:56:00) [19]Две технологии работы с таблицейБД:
1. "Локальная"
Типа Экселя. "Все делает" грид. Проверки корректности изменений через события BeforePost/Insert/Delete датасета.
Транзакции, логическая целостность БД "по боку". Применима для простых "баз" типа линейных справочников или "одномерных" объектов (один объект - одна таблица).
2. "Клиент-серверная".
Полнофункциональная технология работы с БД любой топологии. Изменения в БД проводятся комплексно. Максимально используется логика сервера и транзакции. "Клиент" лишь отсылает одиночные команды или пакеты изменений. Клиентский интерфейс можно организовать как через грид (с использованием управляемого кэширования изменений), так и через отдельные формы, полностью управляемые приложением.
Slym (2006-05-18 10:43:00) [20]BatchUpdates