Редагування DBGrid

Прочитав багато постів, але так до мене й дійшло (напевно, тупею).

Потрібно: Змінили комірку на DBGrid. потрібно зберегти зміни у BD.

1. за якою подією це робити? 2. при зміні номера поточного рядка DBGrid чи змінюється поточний номер рядка в DataSet? і як правильно його дізнатися? 3. як змінювати значення – запитом?

DataSet - ще не BD 1. це справа не DBGrid, а DataSet 2. так, RecNo 3. для DBGrid запит не потрібен (якщо мається на увазі зміна значення в базі, то потрібно корелювати базу і DataSet, часто DataSet робить це сам. якщо потрібно керувати оновленням, вводяться транзакції)

Ну ось знову нічого конкретного.

1. І яка подія відбувається у DataSet при зміні значення комірки DBGrid? 2. або CurrentRec? 3. мається на увазі зміна значення базі. І що означає, що DataSet робить це сам?

> 1. І яка подія відбувається у DataSet за зміни значення > комірки DBGrid?Before. Після.> 2. при зміні номера поточного рядка DBGrid змінюється > поточний номер рядка в DataSet? та як правильно його дізнатися > ?RecNo> 3. як змінювати значення – запитом?використовувати SQL

1) Якщо починаєш редагувати якесь поле запису вперше, то TDataSet.BeforeEdit і TDataSet.AfterEdit. У разі редагування інших полів цього ж запису ніяких подій у DataSeta вже не виникає. Змокнення DataSet.State можна також обробляти в TDataSource.OnStateChange 2) Так. І навпаки: якщо переміщатися НД "з боку", то і поточним записом в DBGrid буде поточний запис в DataSet. 3) DB-Aware компоненти на те і заточені, щоб не робити нічого зайвого. Всі запити генеруються двигуном (свій ти, до речі,не вказав). Єдине місце, де потрібне втручання: вихід із програми(закриття форми), слід зробити Post(Cancel), якщо НД залишився в режимі вставки(редагування)

Допоможіть! Коли редагую значення осередків першого рядка в DBGrid, все нормально і при переході на іншу зміни зберігаються в базі.

Але коли я змінюю будь-який інший рядок, при переході видається помилка "Key column information insufficient or incorrect. Too many rows affected by update".

чому так відбувається?

немає ключа (головного індексу), і багато значень записів, що повторюються (перша напевно унмкальна), коли невідомо який рядок редагувати (однакові ідентифікатори записів), видає саме таку помилку.

Якщо мається на увазі додати базу, то базі є ключове поле. Але в запиті його немає і відповідно до GRid воно не виводиться.

Дк додай його в запит

Некрасиво записувати в таблицю при зміні кожного поля, оптимально це робити після зміни всього рядка, стандартно GRid так і робить, а ти створюєш зайве навантаження на систему

Я спеціально нічого не записую. Це як раз DBGrid і робить. (2) (Скажімо, людина змінює тільки один осередок і переходить до іншого.)

Так, до речі, а які події виникає, коли я натискаю Enter після закінчення редагування осередку?

pashaz (07.11.03 09:03) [8] це легко перевірити, якщо так лається то після ньоговсезаписи з полями, що повторюються, будуть змінені на нове значення. (у мене так принаймні, як поводитиметься інший драйвер . естно) подивися в access.

pashaz (07.11.03 9:17) [11] > (Скажімо людина змінює тільки один осередок і переходить до іншого.) при переході на осередках нічого не пишеться, тільки на переході міжзаписами. події BeforePost і AfterPost якщо запис новий то BeforeInsert. взагалі подивися на компоненті dataset-а (ADODataSet, ADOQuery.). у світлі цього (якщо ти вперше мав на увазі саме перехід між осередками а не записами) то в тебе це відбувається саме з першого запису.

А як щодо подій? невже ніяких?

Оброби ОnKeyDown - if Key=VK_Return then

А чому, як не секрет?

Подія OnKeyDown треба ловити " на льоту " , тобто. у процесі посимвольного введення або простого натискання клавіш (наприклад, навігації) для жорсткого контролю за дією візерунка. У цьому випадку краще (і грамотніше) використовувати соотв. події об'єктів: TdataSet, TFiled, TDBGrid і т.д. По-перше тому, що це значно прозоріше з т.зр. читабельності коду, а по-друге, не веде до зайвих хуків (адже перераховані вище події теж "ловлять" клавіші) і спрощує налагодження + не впливають на продуктивність проги.

pashaz (07.11.03 12:07) [13] після цього повідомлення.

pashaz (07.11.03 00:12) [6] > Але коли я змінюю будь-який інший рядок, при переході видається помилка "Key column information insufficient or incorrect. Too many rows affected by update".

> чому так відбувається?

якщо в гриді при зміні запису видало це, дивися в access що вийшло.

Додав ключове поле на запит і в Grid, помилка зникла. Дякую.

Ще питання: При видаленні якогось рядка з бази, ключове поле не видаляється, тобто залишається порожній рядок. Це нормально?

В орбщому випадку немає.

А чому так виходить, і як із цим боротися?

Видалено модераторомПримітка:Offtopic

А ти напиши як ти видаляєш дані.

і що заважає користуватисяDBNavigator що б сильно не мучиться?