Вопрос № 94444: Здравствуйте, помогите мне пожалуйста решить вот такую проблему: я создаю БД в первый раз и потому много не знаю, у меня есть задача: ввод новой строки одновременно в два поля (dbgrid1,BDGrid2), которые отображают данные разных таблиц. и причем если ...
Вопрос № 94.444
Здравствуйте, помогите мне пожалуйста решить вот такую проблему: я создаю БД в первый раз и потому много не знаю, у меня есть задача: ввод новой строки одновременно в два поля (dbgrid1,BDGrid2), которые отображают данные разных таблиц. и причем если в какой либо таблице уже есть такая запись (которую мы ввели), то нужно вывести сообщение ругательное и заново предложить ввести данные.
Пояснения: Моя база связана с Access через палитру ADO
Вывод в DBGrid2 осуществляется через ADOQuery
Тк я в первый раз делаю подобную работу, то я обсалютный новичек в SQL запросах, да и вообще во всем этом:)
Подскажите плиз правильный запрос по которому бы осуществлялись описанные выше действия. Заранее спасибо.
Отвечает: 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
буду писать как код? но это на самом деле нужно будет просто выставить в свойствах компонентов
все настройка компонентов произведена далее к запросам
Предположим что у вас 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