Форум по Delphi программированию

Delphi Sources



Вернуться   Форум по Delphi программированию > Все о Delphi > Базы данных
Ник
Пароль
Регистрация <<         Правила форума         >> FAQ Пользователи Календарь Поиск Сообщения за сегодня Все разделы прочитаны

Ответ
 
Опции темы Поиск в этой теме Опции просмотра
  #1  
Старый 19.11.2010, 23:59
jekahm jekahm вне форума
Новичок
 
Регистрация: 01.06.2009
Сообщения: 54
Репутация: 27
По умолчанию Уникальность поля в DBGrid

Общие сведения о проге:
У меня есть DbGrid, который подсоединён к БД Oracle через ADOTable. Добавление записи совершается при помощи вызова новой формы, на которой используются компоненты DBEdit.
И, наконец-то, сам вопрос:
Как мне сделать проверку на уникальность поля? То есть, мне надо, чтобы при создании новой записи выводилось сообщение, что такое "Имя" уже есть!
Заранее благодарен!
Ответить с цитированием
  #2  
Старый 20.11.2010, 01:40
roamer roamer вне форума
Активный
 
Регистрация: 15.04.2009
Сообщения: 369
Репутация: 93
По умолчанию

Проверять нужно (наверное) не уникальность поля, а значение какого-то
поля. И не в DBGrid, а в DataSet (скорее всего).
В зависимости от DataSet - можно или FindKey или Locate.
Код:
if Query1.Locate('ID', MyID, []) then begin
   ShowMessage('Значение ID='+IntToStr(MyID)+'  уже есть');
end;

Но это не оч.надежно (для Locate, во всяком случае), если таблица открыта с фильтрацией.
Надежнее завести отдельный TQuery и делать соотв.запрос, типа:
Код:
SELECT 
  ID
FROM 
  MyTable
WHERE
  ID = :MyID

или
Код:
SELECT 
  COUNT( * )
FROM 
  MyTable
WHERE
  ID = :MyID

И проверять результат.

А еще надежнее проверять уникальность на стороне сервера.

Последний раз редактировалось roamer, 20.11.2010 в 01:47.
Ответить с цитированием
  #3  
Старый 20.11.2010, 01:49
Аватар для Страдалецъ
Страдалецъ Страдалецъ вне форума
Гуру
 
Регистрация: 09.03.2009
Адрес: На курорте, из окна вижу теплое Баренцево море. Бррр.
Сообщения: 4,721
Репутация: 52347
По умолчанию

У вас клиент-серверное приложение. Принято все проверки проводить на стороне сервера. В вашем случае надо просто создать уникальный индекс для вашей таблицы. А на стороне клиента, обработать сообщение об ошибке сгенерированное сервером в случае нарушения уникальности.
Например так:
Код:
procedure TForm1.ADOTable1PostError(DataSet: TDataSet; E: EDatabaseError; var Action: TDataAction);
begin
 ShowMessage('Такое имя уже есть');
 Action := daAbort;
end;
Данный пример показывает как выдать собственное сообщение в случае ЛЮБОЙ ошибки при попытке записи в таблицу. При желании можете доработать код для обработки конкретной ошибки.
__________________
Жизнь такова какова она есть и больше никакова.
Помогаю за спасибо.
Ответить с цитированием
  #4  
Старый 20.11.2010, 02:03
jekahm jekahm вне форума
Новичок
 
Регистрация: 01.06.2009
Сообщения: 54
Репутация: 27
По умолчанию

Цитата:
Сообщение от Страдалецъ
У вас клиент-серверное приложение. Принято все проверки проводить на стороне сервера. В вашем случае надо просто создать уникальный индекс для вашей таблицы. А на стороне клиента, обработать сообщение об ошибке сгенерированное сервером в случае нарушения уникальности.
Например так:
Код:
procedure TForm1.ADOTable1PostError(DataSet: TDataSet; E: EDatabaseError; var Action: TDataAction);
begin
 ShowMessage('Такое имя уже есть');
 Action := daAbort;
end;
Данный пример показывает как выдать собственное сообщение в случае ЛЮБОЙ ошибки при попытке записи в таблицу. При желании можете доработать код для обработки конкретной ошибки.
C помощью вот такой команды?
CREATE UNIQUE INDEX <index_type> <index_name> ON <table_name> (
<column_name1> <index_order>,
<column_name2> <index_order>,
)
Ответить с цитированием
  #5  
Старый 20.11.2010, 02:21
Аватар для Страдалецъ
Страдалецъ Страдалецъ вне форума
Гуру
 
Регистрация: 09.03.2009
Адрес: На курорте, из окна вижу теплое Баренцево море. Бррр.
Сообщения: 4,721
Репутация: 52347
По умолчанию

Верно. Либо через скрипт, либо в режиме дизайнера таблицы.
__________________
Жизнь такова какова она есть и больше никакова.
Помогаю за спасибо.
Ответить с цитированием
  #6  
Старый 20.11.2010, 18:18
jekahm jekahm вне форума
Новичок
 
Регистрация: 01.06.2009
Сообщения: 54
Репутация: 27
По умолчанию

Цитата:
Сообщение от Страдалецъ
Верно. Либо через скрипт, либо в режиме дизайнера таблицы.
А Вы не могли бы мне помочь написать код для обработки ошибки (исключения) на существование определённой записи в поле? А то никак ничего придумать не могу!
Ответить с цитированием
  #7  
Старый 20.11.2010, 20:43
Аватар для Страдалецъ
Страдалецъ Страдалецъ вне форума
Гуру
 
Регистрация: 09.03.2009
Адрес: На курорте, из окна вижу теплое Баренцево море. Бррр.
Сообщения: 4,721
Репутация: 52347
По умолчанию

Код на проверку дубликата записи я вам уже дал. Если вы получаете исключение при запуске кода программы в Дельфи - это нормально. Можно выключить выдачу этих сообщений в настройках, но лучше не стоит. Запускайте исполняемый файл, там уже будет нормальное поведение в случае дубликата записи.
__________________
Жизнь такова какова она есть и больше никакова.
Помогаю за спасибо.
Ответить с цитированием
  #8  
Старый 22.11.2010, 01:42
jekahm jekahm вне форума
Новичок
 
Регистрация: 01.06.2009
Сообщения: 54
Репутация: 27
По умолчанию

Цитата:
Сообщение от Страдалецъ
Код на проверку дубликата записи я вам уже дал. Если вы получаете исключение при запуске кода программы в Дельфи - это нормально. Можно выключить выдачу этих сообщений в настройках, но лучше не стоит. Запускайте исполняемый файл, там уже будет нормальное поведение в случае дубликата записи.
Страдалецъ, спасибо большое!
Ответить с цитированием
Ответ


Delphi Sources

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск
Опции просмотра

Ваши права в разделе
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения

BB-коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход


Часовой пояс GMT +3, время: 02:34.


 

Сайт

Форум

FAQ

RSS лента

Прочее

 

Copyright © Форум "Delphi Sources" by BrokenByte Software, 2004-2023

ВКонтакте   Facebook   Twitter