![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Как поймать момент дублирования индекса? [D6, dBase, FoxPro]
Janbolat © (2004-08-24 09:10:00)У меня есть база в котором есть поле kod, я сделал это поле уникальным. Как сделать чтобы при вводе уже существующего значения выходило сообщение "Такой код уже существует"
Заранее благодарен!!!
s999 (2004-08-24 13:02:00) [1]В любом случае, инициатор топика работает с BDE. В хелпе читаем:
dBASE tables only support primary indexes and true unique indexes when the table level is 7 or higher (concurrent with Visual dBASE 7).
Таким образом, еще раз повторю. В DBase-семействе, понятие первичного ключа присутствует только в НЕКОТОРЫХ конкретных реализациях.
P.S. Что-то мне подсказывает, что инициатор топика работает с DBase-форматом, отличном от DBase7.
s999 (2004-08-24 12:21:00) [2]
> В Dbase в принципе есть понятие первичного ключа и есть
> уникальные индексы двух типов.
Dbase-совместимое семейство - понятие весьма обширное, что именно Вы имеете в виду?
Anatoly Podgoretsky (2004-08-24 11:52:00) [3]s999 (24.08.04 11:34) [15]
В Dbase в принципе есть понятие первичного ключа и есть уникальные индексы двух типов.
s999 (2004-08-24 11:34:00) [4]
> А что тип СУБД (т.е. Dbase) не поддерживает?
В Dbase в принципе нет понятия первичного или другого ключа. Вроде, только в поздних версиях Fox-а существует какая-то эмуляция на эту тему. Если индекс уникальный, то записи просто в этот индекс не попадают, попадая при этом в таблицу.
Janbolat (2004-08-24 11:26:00) [5]А что тип СУБД (т.е. Dbase) не поддерживает?
s999 (2004-08-24 11:09:00) [6]Ключевое слово в вопросе - dBase. Поэтому никаких ошибок первичного ключа обработать, конечно, не удастся. Правильный путь указан в [1]. Если приложение сетевое, то не забудь на время поиска блокирнуть таблицу.
сергей1 (2004-08-24 11:00:00) [7]bde что-ли ?
там-же есть компонент query, пользуйся им.
Кстати, забыл сказать, что onPostError канает только при перемещении по результирующему сету query, если надо обработать что-то типа
form1.ADOQuery1.SQL.Text:='insert into Table1 values 3, '+quotedstr('dfs')+')';
form1.ADOQuery1.ExecSQL;
надо обрабатывать так
try
form1.ADOQuery1.ExecSQL;
except on E:exception do
begin
if strpos(pchar(e.Message),pchar('PRIMARY'))<>nil then
begin
showmessage('Нарушение первичного ключа!');
end;
end;
vovchik (2004-08-24 10:53:00) [8]Используй Query и SQL запросы и тогда у тебя и проверки и ошибки и всё что хочешь смогёшь отловить, и при вставке записей в базу данных сможешь сделать любую проверку. Вставка данных и проверка будет умещаться в 4 строчки
Janbolat (2004-08-24 10:47:00) [9]Я ползуюсь dbase овской таблицей, компонентами table, дбгрид
я пробовал написать вместо primary слово название своего индекса
сергей1 (2004-08-24 10:40:00) [10]что куда не выходит ?
Это вариант для MSSQL, компоненты соответственно из вкладки ADO,
чем ты пользуешься ?
Janbolat (2004-08-24 10:26:00) [11]хм.....
А сообщение-то не выходит?
Если такая запись существует она просто скрывает
сергей1 (2004-08-24 10:07:00) [12]вот почти один в один из моей программы
procedure TForm1.ADOQuery1PostError(DataSet: TDataSet; E: EDatabaseError;
var Action: TDataAction);
begin
if strpos(pchar(e.Message),pchar('PRIMARY'))<>nil then
begin
showmessage('Нарушение первичного ключа !');
abort;
end;
if strpos(pchar(e.Message),pchar('FOREIGN'))<>nil then
begin
showmessage('Нарушение внешнего ключа !');
abort;
end;
end;
Janbolat (2004-08-24 09:59:00) [13]А подробнее можно пожалуйста
Sergey13 (2004-08-24 09:54:00) [14]Истребителем перехватчиком. 8-)
Janbolat (2004-08-24 09:51:00) [15]Как сделать перехват?
сергей1 (2004-08-24 09:50:00) [16]>Не делай поиска. 8-) Сделай перехват ошибки на Post.
событие называется onPostError, там параметр E содержит всю инфу об ошибке, для отмены действия пользуйся abort
Sergey13 (2004-08-24 09:40:00) [17]Не делай поиска. 8-) Сделай перехват ошибки на Post.
Сергей Бастрыгин (2004-08-24 09:37:00) [18]сделай поиск твоего значения по этому полю, если найдешь то и выдашь сообщение "Такой код уже существует"