Форум программистов, компьютерный форум, киберфорум
Delphi: Базы данных
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск  
 
 
Рейтинг 4.78/32: Рейтинг темы: голосов - 32, средняя оценка - 4.78
 Аватар для Deemc
4 / 4 / 4
Регистрация: 05.05.2009
Сообщений: 91

Не допустить совпадений в бд

09.01.2010, 20:42. Показов 7487. Ответов 53
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Мне нужно, чтобы при добавлении записи в бд проверялось на наличие такой же записи и если такая уже есть выводилось сообщение об ошибке.
пытаюсь сделать таким образом:
Delphi
1
2
if DataModule25.ADONOUT.Locate('model_nout',dbEdit1.Text) then
if DataModule25.ADONOUTmodel_nout.AsString:=dbEdit1.Text then Showmessage('Уже есть такая запись');
Ничего не получается, что я делаю неправильно?
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
09.01.2010, 20:42
Ответы с готовыми решениями:

Сравнить два бинарных файла и вывести в label количество не совпадений, или что нет не совпадений
Добрый день ! Прошу помощи в реализации задачи. В программе нужно сравнить два файла (разной длины, или одинаковой). Количество...

Поиск совпадений и действия в зависимости от наличия совпадений
Попытаюсь вкратце описать суть. Приходит список позиций с ценами. Необходимо проверить артикул на наличие совпадений с базой и 1) Если...

Не допустить перенос блока
Имеется четыре блока в строку. Находятся они внутри колонки равной половине страницы. Если увеличить отступ между ними, четвертый сползает...

53
 Аватар для Deemc
4 / 4 / 4
Регистрация: 05.05.2009
Сообщений: 91
10.01.2010, 21:50  [ТС]
Студворк — интернет-сервис помощи студентам
Цитата Сообщение от arni Посмотреть сообщение
ALTER TABLE TABLE1 ADD constraint UNQ1_TABLE1 UNIQUE (FIELD1
Undeclared identifier: 'ALTER'
0
 Аватар для arni
914 / 879 / 62
Регистрация: 06.01.2010
Сообщений: 2,367
Записей в блоге: 6
11.01.2010, 08:08
Цитата Сообщение от Deemc Посмотреть сообщение
Undeclared identifier: 'ALTER'
Я в аксес ни в зуб ногой, но все же полагаю, что он должен поддерживать стандартные команды DDL. Может не в той консоли набираете? Впрочем ограничения целостности с успехом должны мастером создаваться в среде аксеса. Прости, не могу посоветовать, что-то конкретное, т.к. специализируюсь на других СУБД. Если не справишься - спроси помощи в разделе по своей СУБД.
0
Техник
 Аватар для DenProx
318 / 176 / 27
Регистрация: 09.10.2009
Сообщений: 3,109
11.01.2010, 12:29
Deemc, выше приведеный пример, нужно использовать с ADOQuery, т.к. он работает с SQL, через ADOTable, работать не будет...
0
 Аватар для Deemc
4 / 4 / 4
Регистрация: 05.05.2009
Сообщений: 91
11.01.2010, 14:47  [ТС]
Цитата Сообщение от DenProx Посмотреть сообщение
Deemc, выше приведеный пример, нужно использовать с ADOQuery, т.к. он работает с SQL, через ADOTable, работать не будет...
Но у меня вся программа построенна на Adotable и сроки уже подходят, переделывать очень много придется. Может все таки можно как-то сделать через адотабл?
0
23 / 23 / 1
Регистрация: 20.12.2009
Сообщений: 74
11.01.2010, 15:11
Цитата Сообщение от Deemc Посмотреть сообщение
Но у меня вся программа построенна на Adotable и сроки уже подходят, переделывать очень много придется. Может все таки можно как-то сделать через адотабл?
Вы в чем таблицы делали? В конструкторе MS Access. Правильно? Так вот найдите там кнопочку "Индексы" и создайте уникальный индекс на таблицу по нужному полю. Это надо сделать однократно.

ЗЫ. Ведь не поленился, акцесс запустил впервые за последние 10 лет. Нашел за минуту. А с чем у Вас трудности?

ЗЗЫ. Кстати, синтаксис DDL-запроса, предложенного arni, тоже работает. Проверил через TADOCommand, который вобщем-то и следует применять для таких целей.
1
Техник
 Аватар для DenProx
318 / 176 / 27
Регистрация: 09.10.2009
Сообщений: 3,109
11.01.2010, 15:35
Deemc, вы для ввода что используете? Edit или DBEdit или .... что то еще?
0
 Аватар для Deemc
4 / 4 / 4
Регистрация: 05.05.2009
Сообщений: 91
12.01.2010, 07:39  [ТС]
Цитата Сообщение от DenProx Посмотреть сообщение
Deemc, вы для ввода что используете? Edit или DBEdit или .... что то еще?
При нажатии на добавить, открывается форма.На ней дбедиты
0
Техник
 Аватар для DenProx
318 / 176 / 27
Регистрация: 09.10.2009
Сообщений: 3,109
12.01.2010, 09:13
Цитата Сообщение от Deemc Посмотреть сообщение
На ней дбедиты
Замени DBEdit на Edit'ы .. должно все заработать...
1
 Аватар для Deemc
4 / 4 / 4
Регистрация: 05.05.2009
Сообщений: 91
12.01.2010, 12:45  [ТС]
Цитата Сообщение от DenProx Посмотреть сообщение
Замени DBEdit на Edit'ы .. должно все заработать...
Спасибо, попробую. Вечером отпишусь
0
Техник
 Аватар для DenProx
318 / 176 / 27
Регистрация: 09.10.2009
Сообщений: 3,109
12.01.2010, 13:13
Deemc, только учти, что при использовании обычного Edit'a запись надо делать вручную...
0
 Аватар для Deemc
4 / 4 / 4
Регистрация: 05.05.2009
Сообщений: 91
12.01.2010, 22:15  [ТС]
Цитата Сообщение от DenProx Посмотреть сообщение
Deemc, только учти, что при использовании обычного Edit'a запись надо делать вручную...
А поконкретнее?
0
 Аватар для Deemc
4 / 4 / 4
Регистрация: 05.05.2009
Сообщений: 91
12.01.2010, 22:41  [ТС]
Использую данный программный код:
Delphi
1
2
3
4
5
6
7
8
p:=vartostr(datamodule25.ADONOUT.Lookup('model_nout',edit1.Text,'model_nout'));
if edit1.Text=p
then  begin
MessageBox(0,'Запись уже существует в БД','',MB_OK+MB_ICONEXCLAMATION);
DataModule25.adonout.Cancel;
end
else
DataModule25.adonout.Post;
Если запись существует, выдает ошибку(т.е работает), но... при добавлении любой другой выдает вот такую ошибку:
Миниатюры
Не допустить совпадений в бд  
0
Техник
 Аватар для DenProx
318 / 176 / 27
Регистрация: 09.10.2009
Сообщений: 3,109
13.01.2010, 07:30
Deemc, в общем ошибка говорит что БД закрыта для редактирования, т.е. тебе нужно на обработчик кнопки которая вызывает окно для добавления, нужно написать - DataModule25.adonout.Insert;

а в коде который выше, примерно так изменить:

Delphi
1
2
3
4
5
6
7
8
9
10
11
12
p:=vartostr(datamodule25.ADONOUT.Lookup('model_nout',edit1.Text,'model_nout'));
if edit1.Text=p
then  begin
MessageBox(0,'Запись уже существует в БД','',MB_OK+MB_ICONEXCLAMATION);
DataModule25.adonout.Cancel;
end
else
begin
DataModule25.adonout.Edit //Не уверен
DataModule25.adonout['имя поля']:=Edit1.text;
DataModule25.adonout.Post;
end;
0
 Аватар для arni
914 / 879 / 62
Регистрация: 06.01.2010
Сообщений: 2,367
Записей в блоге: 6
13.01.2010, 08:28
Я не понимаю, каким образом выбор DBAware-компонентов или рядовых TEdit'ов решает проблему проверки уникальности. Я тоже не сторонник TDBEdit, но к данному вопросу это никакого отношения не имеет. Чем раньше топикстартер поймет, что ограничение уникальности должны выноситься на уровень базы, а не болтаться в приложении (в котором надо лишь сделать обработку исключения, генерируемого при нарушении уникальности), тем меньше шишек он набьет в своей трудовой карьере.
При том, что уже все разжевано, необходимые команды даны и явно и намеками ...
0
Почетный модератор
 Аватар для Lord_Voodoo
8785 / 2538 / 144
Регистрация: 07.03.2007
Сообщений: 11,873
13.01.2010, 09:00
arni, не вижу ничего плохого с точки зрения педагогики, чтобы он все же побольше шишек понабивал с реализацией ограничений, чтобы понимал сам механизм...
0
Техник
 Аватар для DenProx
318 / 176 / 27
Регистрация: 09.10.2009
Сообщений: 3,109
13.01.2010, 10:13
Lord_Voodoo, полностью с вами согласен ))
0
 Аватар для Deemc
4 / 4 / 4
Регистрация: 05.05.2009
Сообщений: 91
13.01.2010, 13:05  [ТС]
DenProx, все равно выдает эту же ошибку...

Добавлено через 14 минут
Цитата Сообщение от Deemc Посмотреть сообщение
DenProx, все равно выдает эту же ошибку...
Delphi
1
p:=vartostr(datamodule25.ADONOUT.Lookup('model_nout',edit1.Text,'model_nout'));
Ошибка где-то в этом коде , т.к даже напрямую не добавляет значения.
0
Техник
 Аватар для DenProx
318 / 176 / 27
Регистрация: 09.10.2009
Сообщений: 3,109
13.01.2010, 13:07
Deemc, попробуй так:
Delphi
1
p:=datamodule25.ADONOUT.Lookup('model_nout',edit1.Text,'model_nout');
Добавлено через 42 секунды
Deemc, если хочешь, кинь исходник, я посмотрю...
0
 Аватар для Deemc
4 / 4 / 4
Регистрация: 05.05.2009
Сообщений: 91
13.01.2010, 19:28  [ТС]
На кнопку ОК
Delphi
1
2
3
4
5
6
7
8
begin
p:=datamodule25.ADONOUT.Lookup('model_nout',edit1.Text,'model_nout');
if p<>Null then
MessageBox(0,'Запись уже существует в БД','',MB_OK+MB_ICONINFORMATION)
else
DataModule25.ADONOUT.post;
form27.Hide;
end;
На кнопку добавить
Delphi
1
2
3
4
5
begin
DataModule25.ADONOUT.insert;
form27.Caption:='Добавление записи';
form27.show;
end;
Теперь выдает вот такую ошибку:
Миниатюры
Не допустить совпадений в бд  
0
1 / 1 / 0
Регистрация: 09.01.2010
Сообщений: 6
13.01.2010, 20:09
Цитата Сообщение от Deemc Посмотреть сообщение
На кнопку ОК
Delphi
1
2
3
4
5
6
7
8
begin
p:=datamodule25.ADONOUT.Lookup('model_nout',edit1.Text,'model_nout');
if p<>Null then
MessageBox(0,'Запись уже существует в БД','',MB_OK+MB_ICONINFORMATION)
else
DataModule25.ADONOUT.post;
form27.Hide;
end;
На кнопку добавить
Delphi
1
2
3
4
5
begin
DataModule25.ADONOUT.insert;
form27.Caption:='Добавление записи';
form27.show;
end;
Теперь выдает вот такую ошибку:
Проверь таблицу в базе, скорее всего у тебя там уже одинаковых записей полно и Lookup уже не срабатывает т.к. он ориентирован на уникальный ключ. Так что попробуй удалить все старые записи и вернись к p:=vartostr(datamodule25.ADONOUT.Lookup( 'model_nout',edit1.Text,'model_nout'));
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
13.01.2010, 20:09

Как не допустить перегрузку бд
Как удалять первые записи при превышении лимита в 255 (или как убрать лимит), чтобы id сдвигался? Имеются ввиду сообщения в чате и записи...

Не допустить пустой Edit
Здравствуйте! Немножко описания. Есть эдит в который пользователь вводит число кратное 4 или 8 в зависимости от положения в чекбоксе...

Допустить ввод только чисел
Есть работа с структурами, надо ввести номер аудитории и вывести на экран, но можно вводить только числа, можете помочь как сделать? ...

Допустить ввод только цифр
Так и не нашел удобных функций контроля ввода. Вводится символьная строка (до 7 символов) Надо проверить что все символы цифры. ...

Допустить ввод только цифр
Обработка ошибок ввода вывода‎ Pascal. вообщем надо сделать так чтоб можно было вводить только цифры... если вводишь буквы чтоб выдовало...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
40
Ответ Создать тему
Новые блоги и статьи
GitHub Copilot в JetBrains: модель по умолчанию, Fix и контроль MCP
and_y87 12.10.2026
10 октября 2026 года GitHub обновил Copilot для JetBrains: добавил настройки стартовой модели, исправления из диагностики и управление автозапуском MCP. Поддержка IDE 2025. 1 прекращена — требуется. . .
День 5 из 28: Codex подсказывает следующий запрос
and_y87 12.10.2026
9 октября 2026 года OpenAI запустила бету Composer predictions — подсказок следующего сообщения в текущем диалоге Codex. Это помощь с формулировкой запроса, а не автоматическое продолжение задачи. . . .
Запустил конкурс "тем и промптов для текстовых квестов созданных почти чисто ИИ"
Adler 06.10.2026
Всем привет! За последние три-четыре дня я создал более 16 текстовых квестовых игр используя преимущественно по одному запросу к ИИ на игру. Мне так понравилось смотреть все ветки/ сцены во всех. . .
ИИ не может найти нужный язык в списке
Supersumestria 05.10.2026
Я ему даю вот такое изображение и прошу найти и подчеркнуть немецкий язык. Возвращает он вот это: https:/ / i. **********/ vqBWLe2. png Нужную строчку в 3й колонке просто выдумал. . Это. . .
Новая последняя моя музыка в SUNO
zorxor 05.10.2026
Здравствуйте, дорогие мои друзья! С большой радостью я хотел бы представить вам свою новую последнею музыку, которую сгенерировала мне по моей просьбе нейросеть SUNO. С уважением, zorxor. Это. . .
Программный домашний кинотеатр
russiannick 27.09.2026
Сподобился на программный домашний кинотеатр. В качестве ЯВУ по традиции выбрал js. В помощники взял Яндекс-Алису. Было создано три зала на разные интересы. исторические и ретро сериал Хичкок. . .
Беседа с ИИ о программистах, недопускающих к созданию и правке кода генеративные ИИ и причины этого
zorxor 21.09.2026
Раньше я радовался или получал некоторые эмоции, пусть небольшие, но всё же, от самого процесса написания кода, рекомпиляции и запуска, видя постепенное развитие программы и прочее. А теперь лень. . .
Мобильное приложение ColorStep
pavlinmavlin 17.09.2026
Реализовал приложение Красный, Зеленый, Синий в Unity3d + c#. Название изменил на ColorStep. Приложение прошло модерацию и теперь доступно для скачивания. Делал его сам, шаг за шагом — и вот,. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru