Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2003.11.27;
Скачать: CL | DM;

Вниз

Редактирование 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;
Скачать: CL | DM;

Наверх




Память: 0.52 MB
Время: 0.027 c
3-89688
pool
2003-11-06 13:15
2003.11.27
sql server


14-90059
wl
2003-11-05 23:00
2003.11.27
элементы теории множеств


1-89904
Varelik
2003-11-13 13:55
2003.11.27
Разжуйте тему на счет


14-90110
Yuri Btr
2003-11-04 11:32
2003.11.27
Дата компиляции в файле


14-90109
Sergey_Masloff
2003-11-06 10:52
2003.11.27
Книжная ярмарка на просп. Мира - распродажа