Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Базы";
Текущий архив: 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
3-89741
Smoker
2003-11-08 23:44
2003.11.27
Database Desktop Нужна помошь...


6-90044
Александр из Минска
2003-09-27 17:49
2003.11.27
Соединение удалённого доступа


1-89835
Мыш
2003-11-16 22:42
2003.11.27
Стратегический вопрос


1-89962
romeo
2003-11-13 22:42
2003.11.27
Не хватает памяти для печати (или у меня мозгов? :-)


7-90138
bosso
2003-09-17 13:15
2003.11.27
Динамическая загрузка процедуры





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский