Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > БД в Delphi
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 08.06.2010, 23:19   #1
Stranger333
Пользователь
 
Аватар для Stranger333
 
Регистрация: 19.05.2009
Сообщений: 98
По умолчанию Проверка записей в DBGrid

У меня есть БД покдлючена через ADOQuery. Проблема состоит в том что мне надо сделать перехвачивание если будет вводится код в таблицу который не может повторятся. Например А99 - первая запись, значит остальные записи не могут быть А99, тоесть мне надо поставить здесь перехватчик или проверку на уникальность. Помогите чем можете пожайлуста.
Stranger333 вне форума Ответить с цитированием
Старый 08.06.2010, 23:30   #2
vovk
!=
Участник клуба
 
Аватар для vovk
 
Регистрация: 08.09.2008
Сообщений: 1,751
По умолчанию

А если просто поле ключевым сделать? и пусть бд этим занимается
vovk вне форума Ответить с цитированием
Старый 09.06.2010, 09:10   #3
Kemperok
Пользователь
 
Регистрация: 04.06.2010
Сообщений: 25
По умолчанию

Делай запрос Q1 проверки типа
select * from tb1
where pole1 = :text (для проверки вводимого значения)
перед открытием запроса просто передаешь ему переменную (:text), которую ты хочешь проверить.

а перед сохранением своих записей просто напиши проверку
Q1.open;
if Q1.recordcount.value > 0 then begin
(Сообщение об ошибке типа "Данные поля Pole1 - не уникальны, измените их, ну или что-то в таком духе);
end else begin
(Сохранение вводимых данных, т.е. все впорядке);
end;
Q1.close;

Последний раз редактировалось Kemperok; 09.06.2010 в 09:13.
Kemperok вне форума Ответить с цитированием
Старый 09.06.2010, 09:57   #4
rdama
Форумчанин
 
Аватар для rdama
 
Регистрация: 25.07.2009
Сообщений: 533
По умолчанию

Все же лучше ключ. Чем городить огород.
А на чем у тебя БД?
Маразм крепчал. Еноты пели...
R-style Dataknowlege Access Member Account (RDAMA)
rdama вне форума Ответить с цитированием
Старый 09.06.2010, 12:39   #5
Stranger333
Пользователь
 
Аватар для Stranger333
 
Регистрация: 19.05.2009
Сообщений: 98
По умолчанию

БД на Access, мне всеравно чем ее подключить ADOTable или ADOQuery. Пhосто я эту таблицу связал с другой талицей по этому полю (MasterFields). Тоесть в первой таблице значение не должно повторятся, а в другой для этого значения заполняем даные.

Kemperok, попробую твой вариант хотя SQL не знаю
Stranger333 вне форума Ответить с цитированием
Старый 10.06.2010, 06:42   #6
rdama
Форумчанин
 
Аватар для rdama
 
Регистрация: 25.07.2009
Сообщений: 533
По умолчанию

Всеже такой вариант который ты решил использовать не совсем правильный.
Для аксеса он сойдет.
Но если попытаться его использовать с большими объемами данных.
Да еще и удаленно от БД.
Ьез индекса то этому полю
То есть шанс вообще не дождаться результата проверки.

Так что все же стоит разобраться с ключами.
Ты сам говоришь что в таблице может существовать только одна запись с таким значением.
Ну и создай ключ по этому полю.
И все.
Маразм крепчал. Еноты пели...
R-style Dataknowlege Access Member Account (RDAMA)
rdama вне форума Ответить с цитированием
Старый 10.06.2010, 08:52   #7
Kemperok
Пользователь
 
Регистрация: 04.06.2010
Сообщений: 25
По умолчанию

Цитата:
Сообщение от rdama Посмотреть сообщение
Всеже такой вариант который ты решил использовать не совсем правильный.
Для аксеса он сойдет.
Но если попытаться его использовать с большими объемами данных.
Да еще и удаленно от БД.
Ьез индекса то этому полю
То есть шанс вообще не дождаться результата проверки.

Так что все же стоит разобраться с ключами.
Ты сам говоришь что в таблице может существовать только одна запись с таким значением.
Ну и создай ключ по этому полю.
И все.
Так то оно так, но если ключевое поле - не счетчик, то при вводе в поле уже существующего значения юзер просто напросто будет получать от БД непонятное ему сообщние. В таком случае прийдется еще и описывать ошибку для разъяснения пользователю что у него есть совпадения записей...
Аксесс и большой объем данных - это слова антонимы...
Kemperok вне форума Ответить с цитированием
Старый 10.06.2010, 09:35   #8
rdama
Форумчанин
 
Аватар для rdama
 
Регистрация: 25.07.2009
Сообщений: 533
По умолчанию

Цитата:
Аксесс и большой объем данных - это слова антонимы...
Ну так я и пишу
Цитата:
Для аксеса он сойдет
Ну а что сложного написать обработчик возвращаемой ошибки.
Код:
try 
  сюда действия по добавлению записи
except on e:exception do
begin
  ну а сюда обработчик исключения
  проверка что вернулось с БД.
  и сообщение для пользователя.  
end;
end;
Просто я считаю что так правильнее...
Маразм крепчал. Еноты пели...
R-style Dataknowlege Access Member Account (RDAMA)
rdama вне форума Ответить с цитированием
Старый 10.06.2010, 16:09   #9
Stranger333
Пользователь
 
Аватар для Stranger333
 
Регистрация: 19.05.2009
Сообщений: 98
По умолчанию

rdama если не сложно напишы код.
Код:
procedure TForm1.ADOQuery2BeforePost(DataSet: TDataSet);
begin
  try
    ADOQuery2.Insert;
    ADOQuery2.FieldByName('Kod_proektu').AsString;
  except on e:exception do
  begin
  ShowMessage('!');
  end;
  end;
end;
Я сделал так ещ так

Код:
procedure TForm1.ADOQuery2BeforePost(DataSet: TDataSet);
begin
ADOQuery2.FieldByName('Kod_proektu').AsString;
ADOQuery2.Open;
ADOQuery2.Insert;
if ADOQuery2.recordcount > 0 then begin
ShowMessage('1');
end;
ADOQuery2.close;
end;
Мой меседж выводит но потом выдает системный меседж. Тоесть мне нужно сделать здесь исключение, но не знаю как.

Последний раз редактировалось Stranger333; 10.06.2010 в 16:43.
Stranger333 вне форума Ответить с цитированием
Старый 11.06.2010, 05:49   #10
rdama
Форумчанин
 
Аватар для rdama
 
Регистрация: 25.07.2009
Сообщений: 533
По умолчанию

Код:
  try
    ADOQuery1.ExecSQL;
  except on e:exception do
  begin
    if  e.HelpContext = 5003022 then
      ShowMessage('Вы пытаетесь ввести дублирующее значение в поле');
  end;
  end;
Только тут есть небольшая проблема в том у Access'а похоже нет кодов ошибок либо он их не возвращает.
Поэтому обработчик построен на возврате e.HelpContext.
И еще у exception есть поля ClassName и Message.
Ты можешь их использовать

И еще при отлове ошибки в IDE ты в любом случае получишь сообщение Access'a.
Т.к. её тебе плюнет дебагер.

А вот если запустишь программу без IDE, то ошибки Acces'a уже не будет.
Маразм крепчал. Еноты пели...
R-style Dataknowlege Access Member Account (RDAMA)

Последний раз редактировалось rdama; 11.06.2010 в 05:59.
rdama вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Добавление записей в DBGrid без сохранения Hypermaster БД в Delphi 3 23.04.2010 08:46
Выделение записей в DBGrid (многопользовательский вариант ) Paul Hindenburg БД в Delphi 14 29.09.2009 10:19
Добавление записей в DBGrid с помощью Query Droid БД в Delphi 5 21.06.2009 03:02
Выбор записей в DBGrid-e artemavd БД в Delphi 12 16.05.2009 19:45
Сохранение нескольких записей из DbGrid в базу Canadec БД в Delphi 5 06.09.2007 14:26