Отправляет email-рассылки с помощью сервиса Sendsay

RFpro.ru: СУБД и Delphi/Lazarus

  Все выпуски  

RusFAQ.ru: СУБД и Delphi


РАССЫЛКИ ПОРТАЛА RUSFAQ.RU

/ КОМПЬЮТЕРЫ И ПО / Языки программирования / СУБД и Delphi

Выпуск № 364
от 14.07.2007, 10:35

Администратор:Gh0stik
В рассылке:Подписчиков: 331, Экспертов: 39
В номере:Вопросов: 1, Ответов: 2


Вопрос № 94444: Здравствуйте, помогите мне пожалуйста решить вот такую проблему: я создаю БД в первый раз и потому много не знаю, у меня есть задача: ввод новой строки одновременно в два поля (dbgrid1,BDGrid2), которые отображают данные разных таблиц. и причем если ...

Вопрос № 94.444
Здравствуйте, помогите мне пожалуйста решить вот такую проблему: я создаю БД в первый раз и потому много не знаю, у меня есть задача: ввод новой строки одновременно в два поля (dbgrid1,BDGrid2), которые отображают данные разных таблиц. и причем если в какой либо таблице уже есть такая запись (которую мы ввели), то нужно вывести сообщение ругательное и заново предложить ввести данные.
Пояснения: Моя база связана с Access через палитру ADO
Вывод в DBGrid2 осуществляется через ADOQuery
Тк я в первый раз делаю подобную работу, то я обсалютный новичек в SQL запросах, да и вообще во всем этом:)
Подскажите плиз правильный запрос по которому бы осуществлялись описанные выше действия. Заранее спасибо.
Отправлен: 09.07.2007, 10:20
Вопрос задал: Мишин Станислав Михайлович (статус: Посетитель)
Всего ответов: 2
Мини-форум вопроса >>> (сообщений: 9)

Отвечает: Sandy
Здравствуйте, Мишин Станислав Михайлович!
1. Переводите таблицу в режим добавления ADOQuery1.Insert
2. После ввода данных делаете запрос к таблице на предмет повтора записей - примерно так: SELECT * FROM Таблица WHERE (Поле1=[подставляете введенное значение из dbgrid]) and (Поле2=[подставляете введенное значение из dbgrid]) and ...
3. После выполнения этого запроса проверяете ADOQuery1.RecordCount и если равно нулю делаете ADOQuery1.Post, иначе ADOQuery1.Cancel.
Для обеспечения полноценной целостности данных следует на уровне базы данных создать уникальный ключ по одному/нескольким полям характеризующим "уже есть такая запись", что бы даже в случае программной ошибки записи не дублировались.
Ответ отправил: Sandy (статус: 7-ой класс)
Ответ отправлен: 09.07.2007, 11:14

Отвечает: Кэр Лаэда
Здравствуйте, Мишин Станислав Михайлович!

Первым делом нужно на форму бросить компонент ADOConnection1, в свойстве ConnectionString выбрать ваше соединение, для этого нажать Build выбрать поставщика Microsoft Jet 4.0 нажать далее потом выбрать ваш Access файл и проверить подключение, если все хорошо то жмете ОК (все строка подключения задана)

далее бросаете на форму всех компонентов по 2
DataSource из DataAccess
DBgrid из DataControls
ADOQuery из ADO

тут главное не запутаться, т.к. у вас каждого компонента по два, то просто ориентируйтесь что все компоненты в названии имеют одну цифру значит они у вас должны быть взаимосвязаны

DataSource1
DBgrid1
ADOQuery1
и
DataSource2
DBgrid2
ADOQuery2

далее в
ADOQuery1 и ADOQuery2 настроить Connection на ADOConnection1

буду писать как код? но это на самом деле нужно будет просто выставить в свойствах компонентов

DBgrid1.DataSourse:=DataSourse1
DBgrid2.DataSourse:=DataSourse2

DataSourse1.DataSet:=ADOQuery1
DataSourse2.DataSet:=ADOQuery2

все настройка компонентов произведена далее к запросам


Предположим что у вас 2 таблицы Table1 и Table2 c полями
Table1
id,name
Table2
id,telefon


Dbgrid1 отображает запрос из Table1
Dbgrid2 отображает запрос из Table2

по какому то событию (я часто делаю на форме кнопку "Обновить", это нужно для удобства, если используется сетевая база данных и базу могут менять много пользователей) пишете следующий запрос


with ADOQuery1 do
begin
Close;
SQL.Clear;
SQL.Add('select * from table1');
open;
end


это для первого DBGrid и


with ADOQuery2 do
begin
Close;
SQL.Clear;
SQL.Add('select * from table2');
open;
end


для второго

обращаю ваше внимание на то что я написал между select и from - * это означает выборку всех столбцов, но как правило в серьезных проектах так не делается, из за этого может произойти избыточность выбранных данных, следовательно лучше так не делать а перечислять те поля что вам нужны для запроса.

далее перейдем к вопросу как проверить если введенные данные уже в таблице
для этого кинем на форму еще одно ADOquery3 и будем работать с ним.
Предположим что вы вводите данные в Edit1 следовательно запрос будет выглядеть так


with ADOQuery3 do
begin
Close;
SQL.Clear;
SQL.Add('select id from table1 where name='+Edit1.Text);
open;
end
if ADOQuery3.RecordCount>0 then
begin
ShowMessage('Данные существуют');
end
else
begin
with ADOQuery3 do
begin
Close;
SQL.Clear;
SQL.Add('insert into table1 (name) values ('+Edit1.Text+')');//вставка данных в таблицу
open;
end



в принципе все если что то непонятно то в минифорум.
---------
Я знаю что ничего не знаю, но я знаю больше, чем тот кто думает что знает все
Ответ отправил: Кэр Лаэда (статус: Студент)
Ответ отправлен: 09.07.2007, 11:15


Отправить вопрос экспертам этой рассылки

Приложение (если необходимо):

* Код программы, выдержки из закона и т.п. дополнение к вопросу.
Эта информация будет отображена в аналогичном окне как есть.

Обратите внимание!
Вопрос будет отправлен всем экспертам данной рассылки!

Для того, чтобы отправить вопрос выбранным экспертам этой рассылки или
экспертам другой рассылки портала RusFAQ.ru, зайдите непосредственно на RusFAQ.ru.


Форма НЕ работает в почтовых программах The BAT! и MS Outlook (кроме версии 2003+)!
Чтобы отправить вопрос, откройте это письмо в браузере или зайдите на сайт RusFAQ.ru.


© 2001-2007, Портал RusFAQ.ru, Россия, Москва.
Авторское право: ООО "Мастер-Эксперт Про"
Email: support@rusfaq.ru, тел.: +7 (926) 535-23-31
Хостинг: "Московский хостер"
Поддержка: "Московский дизайнер"
Авторские права | Реклама на портале
Версия системы: 4.53 beta от 09.07.2007
Яндекс Rambler's Top100
RusFAQ.ru | MosHoster.ru | MosDesigner.ru | RusIRC.ru
Kalashnikoff.ru | RadioLeader.ru | RusFUCK.ru

В избранное