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

Вниз

Что за ошибка?   Найти похожие ветки 

 
dera   (2006-03-11 18:30) [0]

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


 
API ©   (2006-03-11 19:07) [1]

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


 
Desdechado ©   (2006-03-11 19:09) [2]

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


 
dera   (2006-03-12 12:05) [3]

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


 
API ©   (2006-03-12 12:23) [4]

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

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

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

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

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

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


 
Anatoly Podgoretsky ©   (2006-03-12 12:28) [5]

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


 
dera   (2006-03-12 12:42) [6]

>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:47) [7]

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


 
Anatoly Podgoretsky ©   (2006-03-12 12:48) [8]

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


 
dera   (2006-03-12 12:50) [9]

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

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


 
Anatoly Podgoretsky ©   (2006-03-12 12:51) [10]

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


 
dera   (2006-03-12 12:58) [11]

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


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

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


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

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


 
sniknik ©   (2006-03-12 13:08) [14]

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


 
API ©   (2006-03-12 13:29) [15]

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


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

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


 
Desdechado ©   (2006-03-12 15:18) [16]

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


 
API ©   (2006-03-12 15:48) [17]

[16] Desdechado ©   (12.03.06 15:18)

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


 
Desdechado ©   (2006-03-12 16:32) [18]

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



Страницы: 1 вся ветка

Текущий архив: 2006.03.26;
Скачать: CL | DM;

Наверх




Память: 0.51 MB
Время: 0.042 c
15-1141647688
Новичоккк
2006-03-06 15:21
2006.03.26
Подмена DLL


9-1127161901
Morf
2005-09-20 00:31
2006.03.26
Формулы для рисования 3д примитивов.


3-1139147979
OldNick
2006-02-05 16:59
2006.03.26
Удаленные записи в paradox


15-1140941984
Mozart
2006-02-26 11:19
2006.03.26
СПАМ


15-1141570417
Lomant
2006-03-05 17:53
2006.03.26
Тональность