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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 28.08.2015, 08:16   #1
Staziah2
Пользователь
 
Регистрация: 02.03.2015
Сообщений: 50
По умолчанию Проверка существующей записи из бд

Добрый день! Подскажите пожалуйста,как и где прописать проверку существующей записи перед добавлением новой записи.
Например,в бд есть запись № заказа 02619, Группа 123, Цех 01 и Номер 00, вот человек набирает данные(при этом не зная,что такая запись существует) ,нажимает на кнопку Записать новый документ и появляется сообщение "Такой номер существует,введите новый номер" и он вводит номер не 00,а 01 или 02(неважно,главное не повторялось).
Существующие записи в бд:
Безымянный1.JPG
а эта форма,которую будем записывать новую запись.
Безымянный.jpg
а вот событие кнопки.
Код:
procedure TForm5.Button1Click(Sender: TObject); //кнопка Записать новый документ
var N:string;
begin
N:=Edit1.Text;  // порядковый номер


if varisnull (dm.Group.Lookup('Gruppa',wwDBLookupCombo2.Text,'Gruppa'))  =  true   then  //номер группы
begin
  dm.Group.Close;
   dm.Query.SQL.Clear;
   dm.Query.SQL.Text:= 'insert into DMSR_Gruppa (Gruppa) Values ('''+wwDBLookupCombo2.Text+''')';
   dm.Group.Open;

end;

if VarIsNull (dm.vid_dok.Lookup('vid_dok',wwDBLookupCombo4.Text,'vid_dok')) = true then  //вид документа
begin
  dm.vid_dok.Close;
  dm.Query.SQL.Clear;
  dm.Query.SQL.Text:= 'insert into DMSR_tit_list (vid_dok) Values ('''+wwDBLookupCombo4.Text+''')';
  dm.vid_dok.Open;
end;






dm.Query1.SQL.Clear;  //вот как перед вставкой новой записи проверить,есть ли такая запись или нет, если нет,то 
//вставляем.
dm.Query1.SQL.Text:='Insert into DMSR_tit_list (N_zak,Gruppa,Cex,Obiem,Nai_otdela,Vid,Numer,vid_dok) Values ('''
+wwDBLookupCombo1.Text+''','''+wwDBLookupCombo2.Text+''','''+wwDBLookupCombo3.Text
+''','''+Memo1.Text+''','''+Edit2.Text+''','''+Memo2.Text+''','''+Edit1.Text+''','''+wwDBLookupCombo4.Text+''')';     //добавляю 
dm.Query1.ExecSQL;     // 



dm.tit_list.SQL.Clear;
dm.tit_list.SQL.Text:= 'select * from [DMSR_tit_list]';
dm.tit_list.Open;     //
dm.tit_list.Last;


form5.frReport2.LoadFromFile('print\tit_list.frf') ;
form5.frReport2.ShowReport;


Form1.Show;
Form5.Hide;

   
end;
Delphi7, MSSQL 2000
Подскажите пожалуйста. Спасибо.

Последний раз редактировалось Stilet; 28.08.2015 в 08:41.
Staziah2 вне форума Ответить с цитированием
Старый 28.08.2015, 08:42   #2
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

А может тебе стоит сделать то поле автоинкрементным?
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 28.08.2015, 09:26   #3
Staziah2
Пользователь
 
Регистрация: 02.03.2015
Сообщений: 50
По умолчанию

Цитата:
Сообщение от Stilet Посмотреть сообщение
А может тебе стоит сделать то поле автоинкрементным?
и как? ругаться не будет на цифры 00,01,02 и т.п.? Два поля-два ключа,как то не делала,стараюсь обходить.
Staziah2 вне форума Ответить с цитированием
Старый 28.08.2015, 09:31   #4
Аватар
Старожил
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Сообщений: 18,922
По умолчанию

Автоинкремент не поможет здесь, нужно запросом проверять при записи. Полной гарантии при многопользовательской работе не будет. Сделать еще составной уникальный индекс, как альтернативный ключ. При создании предварительно запросом определить следующий неиспользованный номер и предложить его юзеру. Нули не значащие зачем? Можно показывать только при отображении, тогда поле цифровое
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию

Последний раз редактировалось Аватар; 28.08.2015 в 09:38.
Аватар вне форума Ответить с цитированием
Старый 28.08.2015, 10:24   #5
syrj
 
Регистрация: 18.04.2013
Сообщений: 4
По умолчанию Я у себя в программе делаю примерно так

Код:
if not IBDViewHDD.Connected then IBDViewHDD.Connected:=true;
       IBTViewHDD.Active:=false; IBTViewHDD.Active:=true;

SelStr:='select VINT from TEXNIKA '
+'where VINT<>'''' order by VINT ' ;

With IBQViewHDD do begin
  Close;
    SQL.Clear;
     SQL.Add(SelStr);
  Open;
end;

if IBQViewHDD.Locate('VINT', Edit1.Text, [loCaseInsensitive]) then begin
i:=IBQViewHDD.RecNo;
ShowMessage('Такой вид жесткого диска уже существует в БД жестких дисков! ');
IBQViewHDD.First;
IBQViewHDD.MoveBy(i);
DBGrid1.SelectedRows.CurrentRowSelected:=true;
Edit1.SetFocus;
exit;
end;

IBTIns_New.Active:=false; IBTIns_New.Active:=true;

AddStr:='insert into TEXNIKA (PROC,MATHERB,OZU,VINT,PRINTER,MONITOR) '
+'values(:PROC,:MATHERB,:OZU,:VINT,:PRINTER,:MONITOR)';

with IBSQL_InsNew do begin
Close;
SQL.Clear;
SQL.Add(AddStr);
end;

IBSQL_InsNew.ParamByName('PROC').AsString:='';
IBSQL_InsNew.ParamByName('MATHERB').AsString:='';
IBSQL_InsNew.ParamByName('OZU').AsString:='';
IBSQL_InsNew.ParamByName('VINT').AsString:=Trim(Edit1.Text);
IBSQL_InsNew.ParamByName('PRINTER').AsString:='';
IBSQL_InsNew.ParamByName('MONITOR').AsString:='';

IBSQL_InsNew.ExecQuery;
IBTIns_New.Commit;
IBSQL_InsNew.Close;
IBTViewHDD.Active:=false; IBTViewHDD.Active:=true; FormShow(Self);
syrj вне форума Ответить с цитированием
Старый 28.08.2015, 10:35   #6
pu4koff
Старожил
 
Аватар для pu4koff
 
Регистрация: 22.05.2007
Сообщений: 9,065
По умолчанию

Данная задача решается путём настройки индексов в БД, чтобы в принципе в БД нельзя было записать дубликаты, пустые строки и т.д. и т.п.
При записи в БД нужно тупо ловить исключения (try catch). Если всё протекло хорошо, значит записалось. Если вывалилась ошибка, то что-то пошло не так.
И да. Вот такие места в программе:
Код:
dm.Query.SQL.Text:= 'insert into DMSR_Gruppa (Gruppa) Values ('''+wwDBLookupCombo2.Text+''')';
есть потенциальная уязвимость, привыкайте и в учебных проектах пользовать параметры.
pu4koff вне форума Ответить с цитированием
Старый 28.08.2015, 11:02   #7
xxbesoxx
Участник клуба
 
Регистрация: 10.08.2010
Сообщений: 1,389
По умолчанию

http://programmersforum.ru/showthrea...=216024&page=2
xxbesoxx вне форума Ответить с цитированием
Старый 31.08.2015, 03:55   #8
Staziah2
Пользователь
 
Регистрация: 02.03.2015
Сообщений: 50
По умолчанию

Цитата:
Сообщение от pu4koff Посмотреть сообщение
Данная задача решается путём настройки индексов в БД, чтобы в принципе в БД нельзя было записать дубликаты, пустые строки и т.д. и т.п.
При записи в БД нужно тупо ловить исключения (try catch). Если всё протекло хорошо, значит записалось. Если вывалилась ошибка, то что-то пошло не так.
И да. Вот такие места в программе:
Код:
dm.Query.SQL.Text:= 'insert into DMSR_Gruppa (Gruppa) Values ('''+wwDBLookupCombo2.Text+''')';
есть потенциальная уязвимость, привыкайте и в учебных проектах пользовать параметры.
А поточнее,просто здесь новые группы будут заполняться,чего нет в базе.
Staziah2 вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Проверка уникальности записи mixt73 Общие вопросы по Java, Java SE, Kotlin 2 10.11.2014 10:25
Проверка записи в БД Teror4uks БД в Delphi 7 26.12.2013 12:49
Как определить ключ добавленной или существующей записи? tumanovalex C# (си шарп) 10 08.05.2011 10:00
Удаление записи и редактирование существующей Cyber Общие вопросы C/C++ 3 16.02.2011 16:15
Проверка на совпадение записи Lokos БД в Delphi 4 29.04.2010 08:55