Как можно сделать так чтобы при выходе из редактирования ячейки в DBGridEh или DBGrid, до посадки в базу можно было проверить что ввёл в ячейке пользователь?
Заранее спасибо!!
Проверка записи в DBGridEh
Модераторы: Duncon, Naeel Maqsudov, Игорь Акопян, Хыиуду
----------------------------------------
- Naeel Maqsudov
- Сообщения: 2570
- Зарегистрирован: 20 фев 2004, 19:17
- Откуда: Moscow, Russia
- Контактная информация:
Забудьте про гриды! Делайте это в обработчике BeforePost интересующего Вас набора данных (таблицы или запроса).
При обнаружении ошибки выводите сообшение и вызывайте процедуру Abort, чтобы сохранения не произошло.
При обнаружении ошибки выводите сообшение и вызывайте процедуру Abort, чтобы сохранения не произошло.
BeforePost не всегда помогает. Пример:
Я добавил строку в DBGrid. Стал поочередно редактировать Fields этой строки. Post происходит только тогда, когда я перемещусь на другой RecordSet. Итак, я отредактировал 3 Fields из 5. Перемещаюсь на другой RecordSet и получаю ошибку: "Не удается найти строку для обновления. Некоторые значения могли быть изменены со времени ее последнего чтения."
А если я после вставки строки изменяю ОДИН Field и перехожу на другой RecordSet, то ошибок не возникает.
Тут конечно, BeforePost можно применить и сказать пользователю, что "после того как вы добавили строку, нужно ввести одно поле данных, затем нажать Post, затем второе поле данных, затем опять Post...". Да еще обработчик загружать кодом.
Гораздо проще после введения пользователем данных, незаметно для него сделать Post. Это в случае применения DBNavigator.
Возможно существует способ попроще и рациональнее, подскажите.
Я добавил строку в DBGrid. Стал поочередно редактировать Fields этой строки. Post происходит только тогда, когда я перемещусь на другой RecordSet. Итак, я отредактировал 3 Fields из 5. Перемещаюсь на другой RecordSet и получаю ошибку: "Не удается найти строку для обновления. Некоторые значения могли быть изменены со времени ее последнего чтения."
А если я после вставки строки изменяю ОДИН Field и перехожу на другой RecordSet, то ошибок не возникает.
Тут конечно, BeforePost можно применить и сказать пользователю, что "после того как вы добавили строку, нужно ввести одно поле данных, затем нажать Post, затем второе поле данных, затем опять Post...". Да еще обработчик загружать кодом.
Гораздо проще после введения пользователем данных, незаметно для него сделать Post. Это в случае применения DBNavigator.
Возможно существует способ попроще и рациональнее, подскажите.
- Игорь Акопян
- Сообщения: 1440
- Зарегистрирован: 13 окт 2004, 17:11
- Откуда: СПБ
- Контактная информация:
TField.OnValidate для проверки правильности значения поля. Либо можно задать TField.CustomConstraint
А вообще, у меня была такая ошибка при работе с базой Access через ADO. Она происходит при рассогласовании свойств поля заданных в Access и в свойствах поля в Delphi.
А вообще, у меня была такая ошибка при работе с базой Access через ADO. Она происходит при рассогласовании свойств поля заданных в Access и в свойствах поля в Delphi.

- Naeel Maqsudov
- Сообщения: 2570
- Зарегистрирован: 20 фев 2004, 19:17
- Откуда: Moscow, Russia
- Контактная информация:
Эта ошибка означает следующее:и получаю ошибку: "Не удается найти строку для обновления. Некоторые значения могли быть изменены со времени ее последнего чтения."
В ходе изменения данных было изменено ключевое поле и ядро (движок базы) не может сконструировать UPDATE-оператор, чтобы занести изменения в таблицу.
При работе с *.DB+BDE+TTable - такая ошибка почти нонсенс, так как BDE использует какие-то фишки самого парадокса, а вот если TTable заменить на TQuery то при работе с *DBF+BDE то вполне вероятно... Т.е. эта ошибка (что лоично) зависит также и от используемого движка, и от базы. В последний раз натыкался на эту ошибку лет 8-9 назад, когда пытался перейти с Paradox на MS-Jet(Access), а позже на IB.
Что касается EhLib, то сам его никогда не использовал. Если в EhLib строит какие-нибудь промежуточные запросы (например, если в DBGridEh есть.... ну, фильтры, например), то вполне вероятно, что такую ошибку мы получим даже при работе с Paradox.