Редактиране на 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 клетки?Преди. след.> 2. при промяна на номера на текущия ред в DBGrid, > текущия номер на ред в DataSet? и как да го разпознаете правилно > ?RecNo> 3. как се променя стойността - по заявка?използвайте SQL
1) Ако започнете да редактирате което и да е поле на запис за първи път, тогава TDataSet.BeforeEdit и TDataSet.AfterEdit. Когато редактирате други полета от същия запис, DataSet няма събития. Промяната на DataSet.State може също да се обработва в TDataSource.OnStateChange 2) Да. И обратното: ако се движите по ND "отстрани", тогава текущият запис в DBGrid ще бъде текущият запис в DataSet. 3) DB-Aware компонентите са проектирани да не правят нищо допълнително. Всички заявки се генерират от двигателя (ваш собствен, между другото,неопределено). Единственото място, където е необходима намеса: излизане от програмата (затваряне на формуляра), Post(Cancel) трябва да се направи, ако ND е оставен в режим на вмъкване (редактиране)
Помогне. Когато редактирам стойностите на клетките на първия ред в DBGrid, всичко е наред и при превключване към друг промените се запазват в базата данни.
Но когато променя всеки друг ред, преходът дава грешка „Информацията за ключовата колона е недостатъчна или неправилна. Твърде много редове бяха засегнати от актуализация“.
защо се случва това?
няма ключ (основен индекс) и много дублирани стойности на запис (първият вероятно не може да се изчисли), когато не се знае кой ред да се редактира (едни и същи идентификатори на записи), дава точно такава грешка.
Ако искате да добавите към базата данни, тогава базата данни има ключово поле. Но го няма в заявката и съответно не се показва в GRid.
Dk го добавете към заявката
Грозно е да пишете в таблицата, когато всяко поле се променя, оптимално е това да се прави след промяна на целия ред, GRid го прави по подразбиране, но създавате допълнително натоварване на системата
Нарочно не записвам нищо. Точно това прави DBGrid. (Да кажем, че човек променя само една клетка и преминава към друга.)
Между другото, какви събития се случват, когато натисна Enter след приключване на редактирането на клетка?
pashaz (07.11.03 09:03) [8] това е лесно за проверка, ако псува, след неговсичкизаписи с дублиращи се полета ще бъдат променени на новата стойност. (поне за мен как ще се държи друг драйвер. Естествено) погледнете в access.
pashaz (11/07/03 09:17) [11] > (Да речем, че човек променя само една клетка и преминава към друга.) нищо не се изписва на клетките при движение, само на прехода междузаписи. събития BeforePost и AfterPost, ако записът е нов, тогава BeforeInsert. Просто погледнете компонента за набор от данни (ADODataSet, ADOQuery. ). в светлината на това (ако за първи път имате предвид преход между клетки вместо записи), че при вас това се случва от първия запис.
Ами събитията? наистина нито един?
Обработка на OnKeyDown - ако Key=VK_Return тогава
И защо, ако не е тайна?
Събитието OnKeyDown трябва да бъде уловено в движение, т.е. в процеса на въвеждане на символ по знак или просто натискане на клавиши (например навигация) за строг контрол върху действията на потребителя. В този случай е за предпочитане (и по-компетентно) да използвате съгл. обектни събития: TdataSet, TFiled, TDBGrid и др. Първо, защото е много по-прозрачен по отношение на четимост на кода, и второ, не води до ненужни кукички (в края на краищата горните събития също "хващат" ключове) и опростява отстраняването на грешки + не влияе на производителността на програмата.
pashaz (07.11.03 12:07) [13] след това съобщение.
pashaz (11/07/03 00:12) [6] > Но когато променя всеки друг ред, преходът дава грешка „Информацията за ключовата колона е недостатъчна или неправилна. Твърде много редове бяха засегнати от актуализация“.
> защо се случва това?
ако в мрежата при промяна на записа е показал това, вижте какво се е случило в access.
Добавено е ключово поле към заявката и към мрежата, грешката изчезна. Благодаря ти.
Друг въпрос: При изтриване на някакъв низ от базата данни ключовото поле не се изтрива, тоест остава празен низ. Това е добре?
В общия случай не.
Защо се случва това и как да се справим с него?
Изтрито от модераторЗабележка:Извън темата
И пишеш как изтриваш данните.
и какво пречи на използванетоDBNavigator какво няма да страда много?