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

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

Как поймать момент дублирования индекса? [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]

сделай поиск твоего значения по этому полю, если найдешь то и выдашь сообщение "Такой код уже существует"


Наверх

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