Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Перехват нажатия "Применить" в TDBNavigator [D6]


Страницы:   1 2

leonidus ©   (2005-09-21 09:19:00) 

Мастера подскажите как быть. Дело в том, что у меня с ADODataSet`ом связан компонент TDBNavigator, при добавлении в базу новой записи нужно предварительно по базе пройтись и проверить нет ли такой записи в базе, и если она есть то не разрешить ее добавление. В обработчике DBNavigator1BeforeAction я вызываю в этом случае метод Cancel:
ADODataSet.Cancel, при этом запись действительно не добавляется в базу, но получаю сообщение "ADODataSet: Dataset not in edit or insert mode", т.е. вроде ADODataSet не в режиме редактирования или вставки, но зачем ему находиться в этом режиме, я все равно отменяю действие? Или есть способы более элегантной отмены добавления записи?


Ukrainian   (2005-09-21 18:31:00) [1]


> В то же время таблиц і-сетки

Ukraine-forever


msguns   (2005-09-21 15:26:00) [2]

>ANB ©   (21.09.05 14:55) [18]
>- а для себя я завсегда пишу программы, где редактирование в гриде. А добавление - в отдельной форме.

Универсального правила быть не может. Все зависит от сорта данных, доступа к ним, внутренней структуры. А также от особенностей клиента, "под которого" разрабатывается интерфейс.

Категорически возражаю против редактирования в гриде данных, которые должны тотчас же отправляться на сервер дабы их наблюдали все остальные(т.е.публиковаться). Например, накладных в задачах, непредусматривающих понятие "отложенный/откаченный документ". Мало того, что "неявный" (т.е. юзер вроде ничего не сделал - только нажал кнопку "вниз") тормоз, так еще и велика вероятность непредумышленной коррекции (нажат нумлок, а юзер хотел перейти к след.записи с помощью кл "2", в рез-те чего цена стала не 0,2, а 0,22), для избежания последствий которых приходится писать массу ненужных обработчиков типа BeforePost.
В то же время таблиці-сетки (как пример-табель учета рабочего времени) очень удобно редактировать именно в гриде. Однако в таких случаях я использую объекты, не связанные напрямую с таблицей БД, например, стрингрид или CDS. В таком приложении коррекция делается за раз по кнопке.


Sergey13   (2005-09-21 15:04:00) [3]

2[18] ANB ©   (21.09.05 14:55)
А я пишу как удобнее и правильнее с точки зрения задачи (и с моей точки зрения разумеется 8-). Иногда так иногда эдак.


ANB   (2005-09-21 14:55:00) [4]


> Следующая ступень - отказ от редактирования в гриде.
- а для себя я завсегда пишу программы, где редактирование в гриде. А добавление - в отдельной форме.


Sergey13   (2005-09-21 14:55:00) [5]

2[15] msguns ©   (21.09.05 14:52)
Я просто смайлик забыл поставить. 8-)


Top   (2005-09-21 14:54:00) [6]

может просто это поле в базе сделать укальным?


msguns   (2005-09-21 14:52:00) [7]

>Sergey13 ©   (21.09.05 14:43) [14]

Опять кулачки зачесались, Серега ?
А я сегодня пушисто-добродушный, поэтому типа пас ;)


Sergey13   (2005-09-21 14:43:00) [8]

2 [13] msguns ©   (21.09.05 14:39)
Не отдадим святого! Ни щагу назад!


msguns   (2005-09-21 14:39:00) [9]

>leonidus ©   (21.09.05 11:14) [11]
>Пришлось отказаться от TDBNavigator

Следующая ступень - отказ от редактирования в гриде.


Плохиш   (2005-09-21 11:40:00) [10]


> leonidus ©   (21.09.05 09:19)

Правильное место для проверки записываемых данных TADODataSet.OnBeforePost, а правильная процедура для отмены сохранения Abort.

PS. Справка - рулез форева!


leonidus   (2005-09-21 11:14:00) [11]

Пришлось отказаться от TDBNavigator


Sergey13   (2005-09-21 10:19:00) [12]

2 [9] leonidus ©   (21.09.05 10:14)
А дебагером пройтись не пробовал для поика места возникновения исключения?


leonidus   (2005-09-21 10:14:00) [13]

>Sergey13 теперь понял в чем беда. уникальный индекс поставил, теперь получаю ошибку при добавлении записи с таким же содержимым поля, но где возникает ошибка не понятно, где и как теперь отавливать это исключение?


Anatoly Podgoretsky   (2005-09-21 10:09:00) [14]

Сколько вреда принес этот нафигатор начинающим программистам и как мало пользы он принес пользователям.


Sergey13   (2005-09-21 10:02:00) [15]

2 [4] leonidus ©   (21.09.05 09:53)
Когда ты вызываешь Lookup по редактируемому наборупроисходит переход на другую запись и соответственно вызывается Post. Далее при Cancel ты получаешь то, что и должен получить.
Проще, ИМХО, добавить (если нет еще) уникальный индекс на 'inv nomer' и ловить исключение.


ЮЮ   (2005-09-21 09:56:00) [16]

это не метод. Это как exit, только круче :)


leonidus   (2005-09-21 09:55:00) [17]

>ЮЮ
у TADODataSet нет метода Abort....


leonidus   (2005-09-21 09:53:00) [18]

>Desdechado ну почему же данных еще нет. Есть таблица, и есть набор TDBEdit`ов, а также TDBNavigator, все они привязаны к одному ADODataSet`у. В навигаторе жмем "+", TDBNavigator переводит ADODataSet в режим Edit мы начинаем в TDBEdit`ы вводить данные новой записи. Когда все ввели в TDBNavigator жмем "Применить" и попадаем в обработчик DBNavigator1BeforeAction где нужно пройтись по таблице (я использую Lookup: LookupResult:=ADODataSet1.Lookup('inv nomer',inv_nomer,'inv nomer')  ) и если в таблице существует запись в поле 'inv nomer' которой уже существует указанное только что в TDBEdit значение, то нужно вызвать метод Cancel, что бы эта запись не попала в таблицу и не создала в ней две записи с одинаковым значением поля inv nomer. Так что же я делаю не так?


ЮЮ   (2005-09-21 09:48:00) [19]

Потому что после выполнения DBNavigator1BeforeAction продолжается дальнейшее выполнение TDBNavigator.BtnClick(Index: TNavigateBtn), и в частности делается и попытка Post, хотя НД уже не в режиме втавки.
  Поэтому в DBNavigator1BeforeAction после Cancel следует сделать Abort, что должно прервать и дальнейшее выполнеие метода BtnClick


Johnmen   (2005-09-21 09:43:00) [20]

Есть более элегантные способы.
Самый-самый из них - не применять родного криворОжденного нафигатора.


Страницы:   1 2

Наверх

Титульная страница Поиск, карта сайта Написать письмо