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