Задать вопрос
@sakhdoc

Как правильно использовать DBLookupComboBox для выборки данных из таблицы (Delphi 7)?

Есть приложение с бд на access из двух таблиц. В приложении две формы, каждая из которой ссылается на таблицу.
В первой таблице хранится основная информация (ID) с расшифровкой (Name).
Вторая таблица - подчиненная. В ней хранится информация о дополнительных данных, описанных в таблице 1.

Надо сделать так, чтобы во второй форме поле "ID" заполнялось не от руки, а подхватывало значение поле "ID" из первой таблицы.
Для этого использовал компонент DBLookupComboBox, напихал на форму дополнительно ADOTable2 и DataSource2 для связи с первой таблицей.

Столкнулся с проблемой. Когда заполняю выпадающим списком поле DBLookupComboBox, программа в таблице создает новую запись с этим ID. А оставшиеся 3 поля в которых просто текст, идут в следующую строку, т.е. в запись №2. Из-за этого не могу сделать связи в БД (из-за того что ключевое поле получается пустым).

Получается сдвиг на одну строчку. Как сделать так, чтобы запись всех полей происходила ТОЛЬКО по нажатию кнопки добавить?

код для заполнения прописан:
procedure TForm2.Button1Click(Sender: TObject);
begin
ADOTable1.Insert;
ADOTable1['id']:=DBLookupComboBox1.Text;
ADOTable1['test1']:=Edit1.Text;
ADOTable1['test2']:=Edit2.Text;
ADOTable1['test3']:=Edit3.Text;
ADOTable1.Post;
begin
  Edit1.clear;
  Edit2.clear;
  Edit3.clear;
end;
end;


Скрин и приложение прикрепляю.
P.s. приложение состряпал на скорую руку, возможно придется поправить пути в компонентах AdoTable.
956054aebb24411db02c6273f0b6819a.jpgПриложение
  • Вопрос задан
  • 5039 просмотров
Подписаться 1 Оценить Комментировать
Пригласить эксперта
Ответы на вопрос 1
@sakhdoc Автор вопроса
Проблему решил следующим образом:

1. создал отдельную кнопку, которая создает новую (пустую) строку, а заодно записывает значение из этого поля.
2. во второй кнопке оставил запись оставшихся полей. получился вот такой вот код:
procedure TForm2.Button3Click(Sender: TObject);
begin
ADOTable1.Insert;
end;

procedure TForm2.Button1Click(Sender: TObject);
begin
 if Edit3.Text = '' then Edit3.SetFocus;
 if Edit2.Text = '' then Edit2.SetFocus;
 if Edit1.Text = '' then Edit1.SetFocus;
 if (Edit1.Text = '') or (Edit2.Text = '') or (Edit3.Text = '') then begin
 ShowMessage('Не заполнено поле!');
 exit;
end;
ADOTable1['test1']:=Edit1.Text;
ADOTable1['test2']:=Edit2.Text;
ADOTable1['test3']:=Edit3.Text;
ADOTable1.Post;
begin
  Edit1.clear;
  Edit2.clear;
  Edit3.clear;
end;
end;


Принцип действия:
1. добавляем пустую строку;
2. выбираем значение в поле DBLookupComboBox1;
3. заполняем остальные поля;
4. нажимаем на кнопку "Записать". и получаем то, что требовалось.

Минуса два:
1. добавилась новая кнопка. Теперь чтобы внести новую запись, надо нажимать на две кнопки каждый раз, вместо одной:
2. Если внесли новые данные в таблицу 1, чтобы их подхватил компонент DBLookupComboBox1, требуется перезапустить программу.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы