![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Редактирование DBGrid [D6, Access]
pashaz © (2003-11-05 01:31:00)
Прочитал много постов, но так до меня и дошло (тупею наверное).
Нужно: Изменили ячейку в DBGrid. требуется сохранить изменения в BD.
1. по какому событию это делать?
2. при изменении номера текущей строки в DBGrid изменяется ли текущий номер строки в DataSet? и как правильно его узнать ?
3. как изменять значение - запросом?
Всем спасибо.
JibSkeart (2003-11-09 15:39:00) [1]
А ты напиши как ты удаляешь данные ...
и что мешает пользоватся DBNavigator
что бы сильно не мучится ?
pashaz (2003-11-09 15:02:00) [2]
Удалено модератором
Примечание: Offtopic
pashaz (2003-11-09 01:23:00) [3]
А почему так получается, и как с этим бороться?
MsGuns (2003-11-08 23:48:00) [4]
В орбщем случае нет.
pashaz (2003-11-08 23:22:00) [5]
Добавил ключевое поле в запрос и в Grid, ошибка пропала. Спасибо.
Ещё вопрос: При удалении какой нибудь строки из базы, ключевое поле не удаляется, т.е остаётся пустая строка. Это нормально?
sniknik (2003-11-07 16:05:00) [6]
pashaz (07.11.03 12:07) [13]
после этого сообщения.
pashaz (07.11.03 00:12) [6]
> Но когда я изменяю любую другую строку, при переходе выдаётся ошибка "Key column information insufficient or incorrect. Too many rows were affected by update".
> почему так происходит?
если в гриде при изменении записи выдало это, смотри в access-е что получилось.
MsGuns (2003-11-07 14:27:00) [7]
Событие OnKeyDown надо ловить "на лету", т.е. в процессе посимвольного ввода или простого нажатия клавиш (например, навигации) для жесткого контроля за действием узера.
В данном же случае предпочтительнее (и грамотнее) использовать соотв. события объектов: TdataSet, TFiled, TDBGrid и т.д.
Во-первых потому, что это существенно прозрачнее с т.зр. читабельности кода, а во-вторых, не ведет к лишним хукам (ведь вышеперечисленные события тоже "ловят" клавиши) и упрощает отладку + не влияют на производительность проги.
Denisiy (2003-11-07 13:54:00) [8]
А почему, если не секрет?
MsGuns (2003-11-07 13:42:00) [9]
>Denisiy © (07.11.03 13:33) [14]
>Обработай ОnKeyDown -
А вот этого делать категорически не советую
Denisiy (2003-11-07 13:33:00) [10]
Обработай ОnKeyDown -
if Key=VK_Return then <твори что надо>
pashaz (2003-11-07 12:07:00) [11]
sniknik © (07.11.03 11:38) [12]
то после него все записи с повторяющимися полями будут изменены на новое значение.
После кого? после запроса?
А как насчёт событий? неужто никаких?
sniknik (2003-11-07 11:38:00) [12]
pashaz (07.11.03 09:03) [8]
это легко проверить, если так ругается то после него всезаписи с повторяющимися полями будут изменены на новое значение. (у меня так по крайней мере, как будет вести себя другой драйвер ... естно) посмотри в access.
pashaz (07.11.03 09:17) [11]
> (Скажем человек меняет только одну ячейку и переходит к другой.)
при переходе на ячейках ничего не пишется, только на переходе между записями. события BeforePost и AfterPost если запись новоя то BeforeInsert ... вобще посмотри на компоненте dataset-а (ADODataSet, ADOQuery...).
в свете этого (если ты первый раз имел ввиду именно переход между ячейками а не записями) то у тебя это происходит именно с первой записи.
pashaz (2003-11-07 09:17:00) [13]
Я специально ничего не записываю. Это как раз DBGrid и делает.
(Скажем человек меняет только одну ячейку и переходит к другой.)
Да, кстати, а какие события возникает когда я нажимаю Enter после окончания редактирования ячейки?
Anatoly Podgoretsky (2003-11-07 09:10:00) [14]
Некрасиво записывать в таблицу при изменении каждого поля, оптимимально это делать после изменения всей строки, стандартно GRid так и делает, а ты же создаешь лишнюю нагрузку на систему
chtr (2003-11-07 09:09:00) [15]
Дк добавь его в запрос
pashaz (2003-11-07 09:03:00) [16]
Если имеется в виду добавить в базу, то в базе есть ключевое поле. Но в запросе его нет и соответственно в GRid оно не выводится.
sniknik (2003-11-07 01:52:00) [17]
нет ключа (главного индекса), и много повторяющихся значений записей (первая наверняка унмкальна), когда неизвестно какую строку редактировать (одинаковые идентификаторы записей), выдает именно такую ошибку.
добавь ключ.
pashaz (2003-11-07 00:12:00) [18]
Помогите. Когда редактирую значения ячеек первой строки в DBGrid - всё нормально и при переходе на другую изменения сохраняются в базе.
Но когда я изменяю любую другую строку, при переходе выдаётся ошибка "Key column information insufficient or incorrect. Too many rows were affected by update".
почему так происходит?
ЮЮ (2003-11-05 08:06:00) [19]
1) Если начинаешь редактировать какое-либо поле записи в первый раз, то TDataSet.BeforeEdit и TDataSet.AfterEdit. При редактировании других полей этой же записи никаких событий у DataSeta уже не возникает.
Измкенение DataSet.State можно также обрабатывать в TDataSource.OnStateChange
2) Да. И наоборот: если перемещаться по НД "со стороны", то и текущей записью в DBGrid будет текущая запись в DataSet.
3) DB-Aware компоненты на то и заточены, чтобы не делать ничего лишнего. Все запросы генерируются движком (свой ты, кстати, не указал). Единственное место, где требуется вмешательство: выход из программы(закрытие формы), следует сделать Post(Cancel), если НД остался в режиме вставки(редактирования)
gek (2003-11-05 07:35:00) [20]
> 1. И какое событие происходит у DataSet при изменении значения
> ячейки DBGrid?
Before..., After...
> 2. при изменении номера текущей строки в DBGrid изменяется
> ли текущий номер строки в DataSet? и как правильно его узнать
> ?
RecNo
> 3. как изменять значение - запросом?
использовать SQL