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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 25.12.2013, 14:15   #1
Teror4uks
Пользователь
 
Регистрация: 28.10.2013
Сообщений: 34
По умолчанию Проверка записи в БД

Доброго времени суток!

Имеется таблица(DBGrid) куда заносится название группы и факультета(с помощью Edit'ов), но т.к. оба этих значения являются первичными ключами и через эти поля связаны с другими таблицами, при вводе одинаковой группы и факультета, прога выдаёт ошибку, что такие поля уже есть... и прога закрывается, подскажите пожалуйста как сделать проверку перед вводом новых значений в таблицу.

Ввод новых значений в таблицу (происходит на новой форме)
dmSchedule.dstSchedule.Insert;
dmSchedule.dstSchedule.FBN('NAME_FA KULT').AsString := Edit1.Text;
dmSchedule.dstSchedule.FBN('NAME_GR OUPE').AsString := Edit2.Text;
Teror4uks вне форума Ответить с цитированием
Старый 25.12.2013, 14:29   #2
Teror4uks
Пользователь
 
Регистрация: 28.10.2013
Сообщений: 34
По умолчанию

получилось ввести проверку :
If fmAddF.Edit2.Text = dmSchedule.dstSchedule.FBN('NAME_GR OUPE').AsString
then begin
ShowMessage('qwe');
dmSchedule.dstSchedule.Cancel;
end;

но всё равно после нажатия на ОК вылетает критическая ошибка
Teror4uks вне форума Ответить с цитированием
Старый 25.12.2013, 14:50   #3
evg_m
Старожил
 
Регистрация: 20.04.2008
Сообщений: 5,526
По умолчанию

If fmAddF.Edit2.Text = dmSchedule.dstSchedule.FBN('NAME_GR OUPE').AsString
это проверка только одной (текущей) строки и только по одному "ключу".
Вам надо ВСЕ записи
Код:
dataset.first;
while dataset.not EOF do
// здесь надо проверить ВСЕ ключи этой записи
  dataset.Next; 
end;
Если хочешь проще смотри Locate.

Цитата:
название группы и факультета(с помощью Edit'ов), но т.к. оба этих значения являются первичными ключами
Наименование задаваемое пользователем в качестве первичного ключа (поля связи) самое неправильное, что только может быть в БД.
программа — запись алгоритма на языке понятном транслятору
evg_m вне форума Ответить с цитированием
Старый 25.12.2013, 15:25   #4
Teror4uks
Пользователь
 
Регистрация: 28.10.2013
Сообщений: 34
По умолчанию

Цитата:
Сообщение от evg_m Посмотреть сообщение
If fmAddF.Edit2.Text = dmSchedule.dstSchedule.FBN('NAME_GR OUPE').AsString
это проверка только одной (текущей) строки и только по одному "ключу".
Вам надо ВСЕ записи
Код:
dataset.first;
while dataset.not EOF do
// здесь надо проверить ВСЕ ключи этой записи
  dataset.Next; 
end;
Если хочешь проще смотри Locate.


Наименование задаваемое пользователем в качестве первичного ключа (поля связи) самое неправильное, что только может быть в БД.
Не могли бы вы тогда подсказать как можно объединить между собой таблицы, если по заданию нужно просматривать расписание студентов по группе и факультету и создавать новое расписание + видеть список студентов определённой группы
Teror4uks вне форума Ответить с цитированием
Старый 25.12.2013, 19:38   #5
evg_m
Старожил
 
Регистрация: 20.04.2008
Сообщений: 5,526
По умолчанию

перво-наперво показать здесь структуру таблиц.
с указанием типов полей и ключей
т.к. телепатия подсказывает ту же проблему
программа — запись алгоритма на языке понятном транслятору
evg_m вне форума Ответить с цитированием
Старый 25.12.2013, 23:51   #6
Teror4uks
Пользователь
 
Регистрация: 28.10.2013
Сообщений: 34
По умолчанию

Спасибо, что откликнулся) скидываю модель БД, не нашёл как пометить внешние ключи так что напишу что в таблицах это поля(NAME_FAKULT и NAME_GROUPE), которые являются первичными в таблице (FAKULT)
задание звучит так :
Приложение должно осуществлять следующие основные функции:
– добавление нового расписания;
– редактирование существующего расписания;
– просмотр расписания студентов заданного факультета и группы;


П.С. то что везде стоит варчар как тип, эт я просто не заморачивался хотя там не везде он подходит
Изображения
Тип файла: jpg qweqqwe.jpg (73.7 Кб, 98 просмотров)
Teror4uks вне форума Ответить с цитированием
Старый 26.12.2013, 09:39   #7
evg_m
Старожил
 
Регистрация: 20.04.2008
Сообщений: 5,526
По умолчанию

позвольте спросить
для чего в каждой таблице поле ID.
ну там где оно PrimaryKey еще как-то (на самом деле очень смутно) понятно, но вот для FACULT ее смысл полностью отсутствует (в представленном виде).

вы правы в том что внешние ссылки должны быть на PrimayKey, но кто вам сказал, что при этом надо полностью ПОВТОРЯТЬ всю информацию (полное название группы/факультета).
Ключом м.б. и другое поле (более короткое и более удобное для внутренней работы СУБД).
А для защиты от повторов существуют и другие механизмы (Unique Index).


Цитата:
Не могли бы вы тогда подсказать как можно объединить между собой таблицы, если по заданию нужно просматривать расписание студентов по группе и факультету и создавать новое расписание + видеть список студентов определённой группы
Код:
select  predmet_name, prepod_FIO, rasisanie.time, raspisanie.date
from raspisanie 
inner join facult on facult.<primarykey> =raspisanie.<foregnkeyoffacultet>
where facult.name=....
  and facult.group=....
order by date, time
НО хорошо было бы если в раcписании ТАКЖЕ не повторялась ни ФИО, ни название предмета
(для этого должны быть отдельные таблицы наподобие FACULT) (PREDMET, PREPOD)

Код:
select  predmet.name, prepod.FIO, rasisanie.time, raspisanie.date
from raspisanie 
inner join predmet on predmet.<primarykey> =raspisanie.<foregnkeyofpredmet>
inner join facult on facult.<primarykey> =raspisanie.<foregnkeyoffacultet>
inner join prepod on prepod.<primarykey> =raspisanie.<foregnkeyofprepod>
where facult.name=....
  and facult.group=....
order by date, time
P.S. использовать не табличные компоненты доступа (TADOTable, TSQLTable, и т.п.) а SQL ориентированные (TADODataSet, TADOQuery, TSQLQuery, и т.п.)
программа — запись алгоритма на языке понятном транслятору

Последний раз редактировалось evg_m; 26.12.2013 в 09:46.
evg_m вне форума Ответить с цитированием
Старый 26.12.2013, 12:49   #8
Teror4uks
Пользователь
 
Регистрация: 28.10.2013
Сообщений: 34
По умолчанию

Цитата:
Сообщение от evg_m Посмотреть сообщение
позвольте спросить
для чего в каждой таблице поле ID.
ну там где оно PrimaryKey еще как-то (на самом деле очень смутно) понятно, но вот для FACULT ее смысл полностью отсутствует (в представленном виде).

вы правы в том что внешние ссылки должны быть на PrimayKey, но кто вам сказал, что при этом надо полностью ПОВТОРЯТЬ всю информацию (полное название группы/факультета).
Ключом м.б. и другое поле (более короткое и более удобное для внутренней работы СУБД).
А для защиты от повторов существуют и другие механизмы (Unique Index).



Код:
select  predmet_name, prepod_FIO, rasisanie.time, raspisanie.date
from raspisanie 
inner join facult on facult.<primarykey> =raspisanie.<foregnkeyoffacultet>
where facult.name=....
  and facult.group=....
order by date, time
НО хорошо было бы если в раcписании ТАКЖЕ не повторялась ни ФИО, ни название предмета
(для этого должны быть отдельные таблицы наподобие FACULT) (PREDMET, PREPOD)

Код:
select  predmet.name, prepod.FIO, rasisanie.time, raspisanie.date
from raspisanie 
inner join predmet on predmet.<primarykey> =raspisanie.<foregnkeyofpredmet>
inner join facult on facult.<primarykey> =raspisanie.<foregnkeyoffacultet>
inner join prepod on prepod.<primarykey> =raspisanie.<foregnkeyofprepod>
where facult.name=....
  and facult.group=....
order by date, time
P.S. использовать не табличные компоненты доступа (TADOTable, TSQLTable, и т.п.) а SQL ориентированные (TADODataSet, TADOQuery, TSQLQuery, и т.п.)
Ну ID я использую как генератор в этой табличке, он просто считает записи, для вывода таблиц в приложении использую DBGRID, для связи приложения и БД использую FIBPlus, но у меня КАКАЯ ТО ЧЁРНАЯ МАГИЯ не знаю как но после того как я добавляю данные через команду dmSchedule.dstSchedule.Insert(DataM odule1.FIBDataSet.Insert);(данные пишутся сначала в эдитах) и подтверждаю транзакцию dmSchedule.dstSchedule.Post;
dmSchedule.dstSchedule.Transaction. Commit; данные появляются в DBGride, но почему то не заносятся в базу, а вот если в FIBDataSet поставить свойство AutoCommit в значение TRUE то всё отлично заносится, но хотелось бы чтобы он не автоматом заносил а только с моей подачи... вы случайно не в курсе где косяк?

Последний раз редактировалось Teror4uks; 26.12.2013 в 13:09.
Teror4uks вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Проверка существования записи StudentMarat Помощь студентам 4 13.11.2011 20:26
Проверка существования записи NikkMih C/C++ Базы данных 3 19.10.2011 11:26
Проверка на дублирующиеся записи MySQL g04 БД в Delphi 3 18.03.2011 14:31
Проверка на совпадение записи Lokos БД в Delphi 4 29.04.2010 08:55
Проверка на совпадение записи Lokos БД в Delphi 0 29.04.2010 03:51