Форум программистов, компьютерный форум, киберфорум
Delphi: Базы данных
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.83/18: Рейтинг темы: голосов - 18, средняя оценка - 4.83
 Аватар для poreeff
3 / 3 / 3
Регистрация: 28.06.2015
Сообщений: 211
MySQL

Связанные таблицы - в ComboBox и CheckListBox

30.05.2016, 11:53. Показов 4151. Ответов 32
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Есть две таблицы связанные между собой "главный-подчиненный"

При загрузке формы заполняю ComboBox1 полем "name" из первой таблицы:

Delphi
1
2
3
4
5
6
7
8
procedure TForm1.FormShow(Sender: TObject);
begin
  while not MyQuery1.Eof do
    begin
      ComboBox1.Items.Add(MyQuery1.fieldByName('name1').AsString);
      MyQuery1.Next
    end;
end;
Теперь при выборе "name1" в ComboBox1 надо отобразить поля "name2" в CheckListBox1 из второй таблицы.
Но, что бы не выбирал - всегда в CheckListBox1 попадают данные самой последней записи...



Код:

Delphi
1
2
3
4
5
6
7
8
9
procedure TForm1.ComboBox1Change(Sender: TObject);
begin
  CheckListBox1.Items.Clear;
  while not MyQuery2.Eof do
    begin
      CheckListBox1.Items.Add(MyQuery2.fieldByName('name2').AsString);
      MyQuery2.Next
    end;
end;
Подскажите, что не так делаю?
Обе таблицы связаны между собой правильно и выборка в DBGrid`ах работает правильно.
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
30.05.2016, 11:53
Ответы с готовыми решениями:

Выборочная отправка полей таблицы в MS Word, отмеченных в CheckListBox
Допустим, мы имеем одну таблицу, в которой, к примеру, 3 поля. (используем ADOConnection + ADOQuery +DataSource + DBGrid) Есть форма, на...

Связанные таблицы
Здравствуйте. Помогите плиз чайнику. У меня 2 таблицы связанные друг с другом(один ко многим). И я через форму добавляю данные. Фото: ...

Связанные таблицы
Сделал связанные таблицы все работает но когда выходишь из программы он выдает ошибку перевод: Нарушение прав доступа по адресу...

32
 Аватар для krapotkin
6851 / 4677 / 1465
Регистрация: 14.04.2014
Сообщений: 20,676
Записей в блоге: 21
31.05.2016, 13:51
Студворк — интернет-сервис помощи студентам
да, там должно быть id
поле name пытается привести слово Первый к integer и дает ошибку

попробуйте так:
Delphi
1
2
3
4
id := integer(Combo1.items.Objects[Combo1.ItemIndex]);
showMessage('ID='+inttostr(ID));
MyQuery2.Parameters.ParamByName('p1').datatype := pfInteger;
MyQuery2.Parameters.ParamByName('p1').Value := id;
вообще до сюда доходит??
0
 Аватар для poreeff
3 / 3 / 3
Регистрация: 28.06.2015
Сообщений: 211
31.05.2016, 14:41  [ТС]
Цитата Сообщение от krapotkin Посмотреть сообщение
попробуйте так:
1) Зачем для ComboBox1Change если ошибка в строке у FormShow?
2) Что такое pfInteger;?))

Добавлено через 6 минут


Разобрался)) Сижу уже втыкаю... Все таки сутки уже тут.
Без этого
Delphi
1
//  MyQuery2.Params.ParamByName('p1').datatype := pfInteger;
Показывает ID выбранной записи в ComboBox1
Но CheckListBox1 по прежнему пуст

Добавлено через 11 минут
И выборка в гридах работать перестала...
0
 Аватар для krapotkin
6851 / 4677 / 1465
Регистрация: 14.04.2014
Сообщений: 20,676
Записей в блоге: 21
31.05.2016, 14:55
тут-то очевидно ж, заведите отдельные Query для заполнения комбо и чеклиста
и ваши гриды останутся в покое

теперь ловим ошибку
Delphi
1
MyQuery2.SQL.Text:='SELECT id, name2, z_id FROM b where z_id=:p1');
заменяем на
Delphi
1
MyQuery2.SQL.Text:='SELECT id, name2, z_id FROM b where z_id=126');
закомментим
Delphi
1
2
//MyQuery2.Parameters.ParamByName('p1').Datatype := pfinteger;
//MyQuery2.Parameters.ParamByName('p1').Value := id;
должны получить выборку по 126 - Первый
0
 Аватар для poreeff
3 / 3 / 3
Регистрация: 28.06.2015
Сообщений: 211
01.08.2016, 17:20  [ТС]
Возникла необходимость сделать опять тоже самое, вернулся к тому же - с чего начинал; как выборка не работала, так и не работает до сих пор...
Удивительно, но за два месяца так никто в теме и не отписался больше... печально
0
5997 / 4572 / 1096
Регистрация: 29.08.2013
Сообщений: 28,238
Записей в блоге: 3
01.08.2016, 17:51
а что тут писать?
в чем сложность?
0
 Аватар для poreeff
3 / 3 / 3
Регистрация: 28.06.2015
Сообщений: 211
03.08.2016, 15:01  [ТС]
Цитата Сообщение от qwertehok Посмотреть сообщение
в чем сложность?

В базе (MySQL) две таблицы "Категории" и "Товары".
Необходимо в CheckListBox отобразить все товары из выбранной категории в ComboBox.

Проблема вся в том, что у меня не получается их связать между собой.
0
5997 / 4572 / 1096
Регистрация: 29.08.2013
Сообщений: 28,238
Записей в блоге: 3
03.08.2016, 15:11
Цитата Сообщение от poreeff Посмотреть сообщение
Проблема вся в том, что у меня не получается их связать между собой.
я и спрашиваю

Цитата Сообщение от qwertehok Посмотреть сообщение
в чем сложность?
0
 Аватар для poreeff
3 / 3 / 3
Регистрация: 28.06.2015
Сообщений: 211
03.08.2016, 15:50  [ТС]
Цитата Сообщение от qwertehok Посмотреть сообщение
я и спрашиваю
Так я и отвечаю:
Цитата Сообщение от poreeff Посмотреть сообщение
в том, что у меня не получается их связать между собой.
0
5997 / 4572 / 1096
Регистрация: 29.08.2013
Сообщений: 28,238
Записей в блоге: 3
03.08.2016, 16:06
не получается потому что неправильно что-то делаете
что бы узнать что неправильно нужно знать что именно вы делаете
0
 Аватар для poreeff
3 / 3 / 3
Регистрация: 28.06.2015
Сообщений: 211
04.08.2016, 02:00  [ТС]
Цитата Сообщение от qwertehok Посмотреть сообщение
что бы узнать что неправильно нужно знать что именно вы делаете
Так именно поэтому тут и расписано уже две страницы)))
Ещё раз:

OnShow формы:
SQL
1
2
3
4
5
6
7
8
PROCEDURE TForm1.FormShow(Sender: TObject);
BEGIN
  while NOT MyQuery1.Eof do
    BEGIN
      ComboBox1.Items.Add(MyQuery1.fieldByName('name1').AsString);
      MyQuery1.Next
    END;
END;
OnChange у ComboBox:
SQL
1
2
3
4
5
6
7
8
9
PROCEDURE TForm1.ComboBox1Change(Sender: TObject);
BEGIN
  CheckListBox1.Items.Clear;
  while NOT MyQuery2.Eof do
    BEGIN
      CheckListBox1.Items.Add(MyQuery2.fieldByName('name2').AsString);
      MyQuery2.Next
    END;
END;
Цитата Сообщение от poreeff Посмотреть сообщение
Но, что бы не выбирал - всегда в CheckListBox1 попадают данные самой последней записи...
0
 Аватар для krapotkin
6851 / 4677 / 1465
Регистрация: 14.04.2014
Сообщений: 20,676
Записей в блоге: 21
04.08.2016, 07:51
ну так на первой же странице все и объяснено уже
если датасеты (НЕ КОМБО/ЛИСТ-БОКСЫ) связаны как главный-подчиненный, через DataSource,
то для переоткрытия подчиненного датасета нужно всего лишь переместиться по главному.
First/Last/Next/Prior/Locate на выбор
но, в любом случае, ваши датасеты никак не связаны автоматически с вашими компонентами
следовательно после каждого переоткрытия подчиненного датасета нужно заново перестроить ваш листбокс

если честно, я в таком случае не вижу вообще необходимости связывать датасеты через DataSource

алгоритм представлен в посте 9;
1.заполняем комбо бокс
2. в комбобокс.onchange заполняем параметр в датасете2. переоткрываем его и заполняем листбокс
что тут непонятно?
0
 Аватар для poreeff
3 / 3 / 3
Регистрация: 28.06.2015
Сообщений: 211
05.08.2016, 00:43  [ТС]
Цитата Сообщение от krapotkin Посмотреть сообщение
что тут непонятно?
В том, что у меня это не получается.
Вы можете дать РАБОЧИЙ код - что бы показать, что эта действительно работает, без теории...
Или Вы думаете я просто так в этой теме пишу уже третий месяц, от нечего делать???
0
 Аватар для krapotkin
6851 / 4677 / 1465
Регистрация: 14.04.2014
Сообщений: 20,676
Записей в блоге: 21
05.08.2016, 06:45
да. я думаю именно так. весь код есть в посте 13
а если у вас что-то не получается, то где ваш код? нечем помочь
давайте еще раз. по вашей картинке

допустим, где-то на dm1:TDataModule есть q1,q2:TMyQuery и свойство SQL у них заполнено таким образом
q1.sql.text = select id, name from a
q2.sql.text = select id, name2 from b where z_id=:id

а еще ds1:TDatasource
ds1.dataset = q1
q2.datasource=ds1
т.е. q2 - подчиненный датасет

на форме
combo1:TComboBox
lb1:TListBox
combo1.style = csDropDownList
тогда вот весь код, который понадобится
Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
procedure TForm1.FillCombo(q:TMyQuery);
begin
  combo1.items.clear;
  q.first;
  while not q.eof do
  begin
    combo1.items.addObject(q.fieldByName('name').asString, TObject(q.FieldByName('id').AsInteger));
    q.next;
  end
end;
procedure TForm1.FillList(q:TMyQuery);
begin
  lb1.items.Clear;
  q.first;
  while not q.eof do
  begin
    lb1.items.addObject(q.fieldByName('name2').asString, TObject(q.FieldByName('id').AsInteger));
  end;
end;
 
procedure TForm1.FormCreate(...);
begin
//предполагаем, что оба датасета мы открыли уже где-то. Но можно и тут открыть
  FillCombo(dm1.q1);
end;
 
procedure TForm1.Combo1Change(...);
begin
  if combo1.itemIndex=-1 then exit;
  q1.locate('id', integer( combo1.items.Objects[combo1.itemIndex]), []);
  FillList(q2);
end;
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
05.08.2016, 06:45
Помогаю со студенческими работами здесь

ADOQery + связанные таблицы
Здравствуйте, подскажите как добавлять/изменять записи с помощью адо со связанными таблицами? допустим есть 2 таблицы: 1) id, name,...

Связанные таблицы access
Здравствуйте! Подскажите пожалуйста как сделать так чтобы таблица сначала подчинялась одной таблице а потом другой?Mastersourse один, и две...

В Excel - связанные таблицы
Здравствуйте! Подскажите, пожалуйста, как выгрузить в Excel данные из двух связанных таблиц? или, хотя бы - одну строку родительской...

QReport связанные таблицы
Добрый день. Есть две таблицы Водитель и Груз. Как создать отчет чтобы он выводил ФИО водителя и все заказы(груз) этого водителя на...

Добавление в связанные таблицы.
Всем привет. Пытаюсь добавить записи в связанные таблицы, но выходит ошибка "Feild ID cant be modifed". Связь 1 ко 1 через ID...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
33
Ответ Создать тему
Новые блоги и статьи
Транскрипция 55-минутного видео через Whisper: WhisperDesktop облажался, спас Google Colab[
anaschu 01.06.2026
Понадобилось получить текст из свежезагруженного видео на YouTube. Казалось бы, задача на пять минут. Заняла полтора часа. Делюсь опытом — может кому пригодится последовательность решений. . . .
21 мат мед. Планы на развитие модели здравоСохранения
anaschu 01.06.2026
AnyLogic: план развития симуляционной модели рабочего коллектива — динамический абсентеизм, реальные данные, три сценария сравнения Продолжаю серию постов о дискретно-событийной модели рабочего. . .
20. Мат мед. Абсентеизм как отдельный тип простоя
anaschu 29.05.2026
Апдейт модели: исправленные баги, абсентеизм и новые механизмы Продолжаю развивать ранее описанную модель рабочего коллектива на AnyLogic. За последние несколько дней был проведён серьёзный. . .
19. здоровье, усталость и психотип работника влияют на производительность предприятия, и наоборот, производительность на здоровье, усталось и психотип
anaschu 28.05.2026
Дискретно-событийная модель рабочего коллектива на AnyLogic: здоровье, выгорание, психотипы и микростимуляция Привет, коллеги. Хочу поделиться итогами нескольких недель работы над симуляционной. . .
"Прокси" для последовательного порта
Eddy_Em 28.05.2026
Эту штуку написал я достаточно давно. Но сейчас вот понадобилось настроить датчик грозы, но при этом не отключать его от "метеодемона". Соответственно, надо запустить этот "прокси": метеодемон будет. . .
Рефакторинг программы уравнивания.
Massaraksh7 26.05.2026
Пример по предыдущей записи в блоге. Но, надо заметить, что, во-первых, там оптимизация не только математики, но и работы с базой данных, и с графами, а во-вторых, это ещё не всё.
Использование TThread в Lazarus для математических вычислений.
Massaraksh7 25.05.2026
Производя рефакторинг своих программ на предмет ускорения их работы, обратил внимание на такой аспект, как сокращение времени матвычислений. Дело в том, что приходится работать с большими матрицами. . .
Модель здравосохранения 18. Чем здоровее работник, тем быстрее выгорает
anaschu 24.05.2026
Имитационная модель корпоративного здравоохранения: что показывает математика Сегодня в модели рабочего коллектива на AnyLogic появились три новые механики — выгорание через накопленную усталость,. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru