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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 05.11.2013, 22:51   #1
Sheeby
Пользователь
 
Регистрация: 21.04.2011
Сообщений: 20
Печаль Изменения не были успешно внесены из за повторяющихся значений в индексе

Доброго времени суток!
Наткнулся на траблу с добавлением в базу новых данных. В самой базе у меня на это поле стоит запрет на совпадения... Когда добавляю новую запись, которой в базе нет, то реакция нормальная. И добавляются эти данные. А если пытаюсь добавить данные, которые уже содержатся в таблице, то выскакивает ошибка
01.jpg
и отключается dataset. когда тыркаю на таблицу вылезает еще одна ошибка
02.png

даю код
Код:
procedure TForm2.BitBtn1Click(Sender: TObject);
begin
try
  if (Trim(Edit1.Text)='') then
begin
    exit;
end;
  if form1.ADOQuery1.Locate('Марка',Edit1.Text,[]) then
begin
    form3.show;
    form2.Enabled:=false;
    form3.Label1.Caption:='Запись уже существует!';
end
else begin
    form1.ADOQuery1.Insert;
    form1.ADOQuery1.FieldByName('Марка').AsString:=Edit1.Text;
    form3.show;
    form2.Enabled:=false;
    form3.Label1.Caption:='Запись успешно добавлена';
    Edit1.Clear;
end;
except
  on e:Exception do
end;
form1.ADOTable1.Active:=false;
form1.ADOTable1.Active:=true;
form1.DBGrid2.Columns[0].Visible := False;
form1.DBGrid3.Columns[0].Visible := False;
end;
я так понимаю каким-то макаром пропускается целый кусок кода. а конкретно вот этот:
Код:
  if form1.ADOQuery1.Locate('Марка',Edit1.Text,[]) then
begin
    form3.show;
    form2.Enabled:=false;
    form3.Label1.Caption:='Запись уже существует!';
end
что не так, подскажите, пожалуйста. спасибо заранее!

Последний раз редактировалось Sheeby; 06.11.2013 в 05:29.
Sheeby вне форума Ответить с цитированием
Старый 06.11.2013, 00:49   #2
Dozent
Форумчанин
 
Регистрация: 21.05.2008
Сообщений: 495
По умолчанию

ни совсем понятно, какое поле у вас ключевое? что за база какая структура таблицы?
Dozent вне форума Ответить с цитированием
Старый 06.11.2013, 05:23   #3
Sheeby
Пользователь
 
Регистрация: 21.04.2011
Сообщений: 20
По умолчанию

Цитата:
Сообщение от Dozent Посмотреть сообщение
ни совсем понятно, какое поле у вас ключевое? что за база какая структура таблицы?
в таблице поле всего одно. и оно без ключа. просто оно индексированное и в нем не допускаются совпадения.
Гляньте, если интересует
Курсач каталог запчастей.rar

Последний раз редактировалось Sheeby; 06.11.2013 в 05:27.
Sheeby вне форума Ответить с цитированием
Старый 06.11.2013, 09:10   #4
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,792
По умолчанию

Цитата:
что не так, подскажите
Все не так. У тебя есть ADOQuery, а ты оперируешь методами, вместо того чтоб работать SQL командами. Зачем?
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 06.11.2013, 10:37   #5
evg_m
Старожил
 
Регистрация: 20.04.2008
Сообщений: 5,515
По умолчанию

form1.ADOQuery1.Locate ищет не во всей таблице (базе), а только среди тех которые были получены (отобраны) при ADOQuery1.SQL.Text:='select....wher e .....'.

В отобранных (select ...where ... ) нет, Locate не находит. идем на добавление
в базе есть, получаем ... то что получаем.

что делать
1. проверять именно БД.

Код:
query2.SQL.text:='select ... where  ...=:mrk';
query2.parameters.paramterbyname('mrk').value:=Edit1.Text;
query2.open;
if query2.isempty then begin
  query2.insert;
  ....
  query2.Post;
end
else 
  showmessage('уже есть');
2. вообще не проверять и положиться на проверку БД (получать правильное exception) которое правильно обрабатывать.
Код:
try
  adoquery1.insert;
.................
  adoquery1.post;
except
on e: ??? EADOError   do begin
  adoquery1.Cancel;
end;
программа — запись алгоритма на языке понятном транслятору

Последний раз редактировалось evg_m; 06.11.2013 в 10:56.
evg_m вне форума Ответить с цитированием
Старый 06.11.2013, 13:07   #6
Sheeby
Пользователь
 
Регистрация: 21.04.2011
Сообщений: 20
По умолчанию

если так, то снова ошибка вылетает
Код:
try
  Form1.ADOQuery1.insert;
  form1.ADOQuery1.FieldByName('Марка').AsString:=Edit1.Text;
  form3.show;
  form2.Enabled:=false;
  form3.Label1.Caption:='Запись успешно добавлена';
  Edit1.Clear;
  Form1.ADOQuery1.post;
except
on e: EADOError   do begin
  Form1.ADOQuery1.Cancel;
end;
познаний в области БД у меня не столь много, конечно... поясните, пожалуйста, что ставить вместо точек и что такое "mrk" в ('select ... where ...=:mrk')

Последний раз редактировалось Sheeby; 06.11.2013 в 13:45.
Sheeby вне форума Ответить с цитированием
Старый 06.11.2013, 14:44   #7
Sheeby
Пользователь
 
Регистрация: 21.04.2011
Сообщений: 20
По умолчанию

все. спасибо за помощь, товарищи!) добавил всего строчку, но без Вас сам не догадался бы. работает как нужно и без ошибок)


хотя не... чет я погорячился... сперва работало, потом расхотело почему-то....

Последний раз редактировалось Sheeby; 06.11.2013 в 14:50.
Sheeby вне форума Ответить с цитированием
Старый 06.11.2013, 14:55   #8
Sheeby
Пользователь
 
Регистрация: 21.04.2011
Сообщений: 20
По умолчанию

понял почему работало. если сначала добавить новую запись, которой нет в базе, а потом ту, которая есть, то все норм, а если сразу пытаться добавить существующую, то сразу выдает ошибку
Sheeby вне форума Ответить с цитированием
Старый 06.11.2013, 16:08   #9
eval
Подтвердите свой е-майл
 
Регистрация: 29.08.2012
Сообщений: 4,022
По умолчанию

зачем же добавлять существующую?
eval вне форума Ответить с цитированием
Старый 06.11.2013, 18:19   #10
Sheeby
Пользователь
 
Регистрация: 21.04.2011
Сообщений: 20
По умолчанию

Цитата:
Сообщение от eval Посмотреть сообщение
зачем же добавлять существующую?
ну судя по Вашим рассуждениям - зачем тогда вообще добавлять новые записи?
Sheeby вне форума Ответить с цитированием
Ответ


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

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

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Макрос повторяющихся значений Artem_85 Microsoft Office Excel 6 07.11.2012 13:49
как проверить, были ли изменения в БД? kate158 БД в Delphi 13 16.05.2012 11:15
заполнение ячеек, если внесены изменения johny_03 Microsoft Office Excel 0 08.02.2012 16:10
удаление из таблицы повторяющихся значений CodeNOT PHP 2 28.03.2011 12:01
Поиск повторяющихся значений Flangini Microsoft Office Excel 23 22.02.2008 15:57