Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Что за ошибка? [D7, 95/98]


dera ©   (2006-03-11 18:30:00) 

На форме Table, DBGrid, Datasorse, связанные между собой. При попытке двигать курсором в DBGrid-е вниз (для создания записи), выдает ошибку
Key violation
Paradox.


Desdechado   (2006-03-12 16:32:00) [1]

сорри, действительно дезу дал по поводу Post


API   (2006-03-12 15:48:00) [2]

[16] Desdechado ©   (12.03.06 15:18)

Вызов Table1.Edit - просто лишний, он ничегоне делает.


Desdechado   (2006-03-12 15:18:00) [3]

> после Append Edit лишний
Именно!
Append (для нечитающих справку) уже переводит датасет в режим редактирования. А Edit неявно вызывает Post, и только потом снова переводит в режим редактирования. В итоге имеем попытку запостить пустую запись, что, естественно, вызывает сопротивление со стороны датасета "Field 'N' must have a value"


API   (2006-03-12 13:29:00) [4]

[5] Anatoly Podgoretsky ©   (12.03.06 12:28)
Сушествует - по совокупности всех полей.


1. Совокупность всех полей (в случае отсутствия первичного или уникального ключа, которые могут быть искусственными) не во всех случаях уникальна.
2. Любое изменение записи влечет за собой изменение такого ключа, и как следствие - нарушение правила гарантированного доступа.

Посему, такая совокупность для первичного ключа - неприменима.
(Даже если и реализована в СУБД для исправления кривизны рук проектировщиков структуры БД).


sniknik   (2006-03-12 13:08:00) [5]

после Append Edit лишний


dera   (2006-03-12 13:07:00) [6]

а где и как это делается?


Anatoly Podgoretsky   (2006-03-12 13:04:00) [7]

dera   (12.03.06 12:58) [11]
Должно быть запрещено обязательное назначение для поля.


dera   (2006-03-12 12:58:00) [8]

ну а как сделать автозаполнение для поля N?


Anatoly Podgoretsky   (2006-03-12 12:51:00) [9]

Любую кроме этой.
Например dBase или Access из стандартных.
Absolute Database хороша для десктопного применения, может работать и с СД и в памяти.


dera   (2006-03-12 12:50:00) [10]

>Anatoly Podgoretsky ©   (12.03.06 12:47) [7]
а как сделать?

>И уйди от TTable в Tquery,  заодно и от Парадокс.
какую СУБД посоветуете создания для локальной базы?


Anatoly Podgoretsky   (2006-03-12 12:48:00) [11]

И уйди от TTable в Tquery,  заодно и от Парадокс.


Anatoly Podgoretsky   (2006-03-12 12:47:00) [12]

Оно автозаполняемое, а у тебя?


dera   (2006-03-12 12:42:00) [13]

>API ©   (12.03.06 12:23) [4]
Спасибо за граммотное объяснение

Есть Table. Кроме нижеуказаных полей, есть поле N типа (Autoincrement), которое я сделал ключевым. По ОнКликБатон пишу код:

  Table1.Append; Table1.Edit;
  Table1.FieldByName('ikar').AsInteger:=2;
  Table1.FieldByName('ib').AsInteger:=3;
  Table1.FieldByName('x').AsInteger:=x;
  Table1.FieldByName('y').AsInteger:=y;
  Table1.Post;  Table1.FlushBuffers;

Данные добавляются (в гриде видно), но пишет Field 'N' must have a value. Но ведь это автоматически заполняемое поле. Мне что, ручную ставить уникальный номер?


Anatoly Podgoretsky   (2006-03-12 12:28:00) [14]

API ©   (12.03.06 12:23) [4]
Сушествует - по совокупности всех полей.


API   (2006-03-12 12:23:00) [15]

для чего служит ключевое поле?

Первичный ключ служит для однозначной идентификации записи в таблице. При отсутствии первичного ключа, в общем случае не существует способа обратится к конкретной строке в таблице.

То есть, "на пальцах":
Таблица - список учеников в классе.
Не определив первичный ключ, невозможно идентифицировать конкретного ученика. Первый претендент на роль первичного ключа в данном случае - фамилия и имя ученика (хотя, могут буть тезки-однофамильцы). (Попробуйте закрыть в журнале колонку с фамилиями и именами учеников - и будет невозможно определить, у кого 2, а у кого 5).  Как только определен первичный ключ - все становится на свои места.

Рядом с первичными ключами стоят уникальные ключи, про которые говорит [2] Desdechado ©   (11.03.06 19:09). Например, уникальным ключом может быть номер свидетельства о рождении ученика. Его тоже можно использовать для идентификации ученика - но не столь удобно (попробовать только запомнить их :).

В Вашем случае, по причине отсутствия первичного/уникального ключа, СУБД не в состоянии определить, к какой записи Вы обращаетесь, поэтому и выдает сообщение "Key violation".

Вообще, понятие ключей - из теории реляционных баз данных.
Найдите книгу про БД - и почитайте на досуге. Полезно будет. :)


dera   (2006-03-12 12:05:00) [16]

для чего служит ключевое поле? Можна ли без него?


Desdechado   (2006-03-11 19:09:00) [17]

или уникальный
и, похоже, на afterinsert сразу Post стоит или что-то подобное


API   (2006-03-11 19:07:00) [18]

Первичный ключ в таблице задан?


Наверх

Титульная страница Поиск, карта сайта Написать письмо