Форум программистов, компьютерный форум, киберфорум
C++ Builder: Базы данных
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.65/34: Рейтинг темы: голосов - 34, средняя оценка - 4.65
6 / 6 / 0
Регистрация: 16.05.2010
Сообщений: 98

Связать таблицы

22.05.2011, 12:45. Показов 6430. Ответов 20
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Здравствуйте! Подскажите пожалуйста как можно связать две таблицы (Access), подключаемые через ADOTable.
Имеется одна таблица с полями: Код, Наименование
И вторая таблица с полями: Код, Дата, Наименование
Для заполнения второй таблицы у меня стоит Два BDEdit`а и один DBComboBox.
Как сделать чтобы в DBComboBox можно было выбрать данные из первой таблицы(пункт наименование) и при их выборе внести во вторую таблицу?
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
22.05.2011, 12:45
Ответы с готовыми решениями:

Связать 2 таблицы
БД подключена с помощью ADOConnection, таблицы через ADOQuery. Есть 2 таблицы с полями: Табл 1: Организация, УНП, АДР. Табл 2:...

Связать две таблицы Access
Здравствуйте. Есть две таблицы Access: 1. device с полями: UID DevType DevName DevInv DevZav

Не могу связать две таблицы
Ошибка при обработчике ADOTable2=true

20
 Аватар для Neo_AVE
89 / 36 / 5
Регистрация: 04.05.2011
Сообщений: 239
22.05.2011, 13:20
Plug, лучше всего используйте обычный ComboBox и ADOQuery - в этом запрос SQL пишите связывая две таблицы, сначала попробуйте в access составить запрос, затем скопировать полученный запрос вставить в дизайне SQL и обязательно прописать Close(); Clear(); Add(SELECT...); Open(); First();
1
6 / 6 / 0
Регистрация: 16.05.2010
Сообщений: 98
22.05.2011, 13:42  [ТС]
Спасибо, но уже нашел компонент DBLookupComboBox, как раз то что мне нужно!=)

Добавлено через 4 минуты
Еще один вопросик, как сделать чтобы при добавлении данных, нельзя было добавить данные с уже имеющимся таким же ключевым полем таблицы.
Например у меня в таблице Код=1 Код, Наименование=гитара
Тут ключевое поле код. И я пытаюсь ввести:
Код=1, Наименование=Скрипка
В результате программа вылетает с ошибкой. Как сделать чтобы просто показывало сообщение о том что введены не верные данные?
0
 Аватар для Sasha
4956 / 2420 / 531
Регистрация: 05.06.2008
Сообщений: 7,518
Записей в блоге: 3
22.05.2011, 13:55
Проверять существует ли такое значение ключевого поля

Добавлено через 52 секунды
Для поиска значения восполльзоваться функцией Locate()
1
6 / 6 / 0
Регистрация: 16.05.2010
Сообщений: 98
22.05.2011, 15:22  [ТС]
Locate сразу сбивает новую запись(Insert)... По этому не могу проверить...

Кстати о locate. Как сделать чтобы при нахождении записи через него, запись выделялась(RowSelect стоит), а при повторном нажатии на кнопку переходило на следующую найденную запись?
0
 Аватар для Sasha
4956 / 2420 / 531
Регистрация: 05.06.2008
Сообщений: 7,518
Записей в блоге: 3
22.05.2011, 15:28
Цитата Сообщение от Plug Посмотреть сообщение
сразу сбивает
Что значит сбивает?
0
6 / 6 / 0
Регистрация: 16.05.2010
Сообщений: 98
22.05.2011, 15:40  [ТС]
Удаляет пустую строку в которую я хочу внести данные...
0
 Аватар для Sasha
4956 / 2420 / 531
Регистрация: 05.06.2008
Сообщений: 7,518
Записей в блоге: 3
22.05.2011, 16:06
так, а ты перед внесением данных проверь существует ли такая трока в базе, если есть вноси даннные
C++
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
 int ID = ADOQuery1->FieldByName("Invent_Number")->AsInteger;
 AnsiString st = ADOQuery1->SQL->Text,s = ADOQuery1->Sort;
 
  if(ADOQuery1->Locate("Invent_Number",ValueListEditor1->Cells[1][1],Options))
         {
          AnsiString bw = "Такой инвентарный номер уже есть в базе данных!!! \n\n" + IntToStr(ADOQuery1->FieldByName("Invent_Number")->AsInteger)+" - "
          +ADOQuery1->FieldByName("Number_in_Lan")->AsString+" - "
          +ADOQuery1->FieldByName("Department")->AsString+" - "
          +ADOQuery1->FieldByName("Processor")->AsString+" - "
          +ADOQuery1->FieldByName("Memory")->AsString+" - "
          +ADOQuery1->FieldByName("HDD")->AsString+" - "
          +ADOQuery1->FieldByName("Room")->AsString+"\n\n"
          + "Введите другой инвентарный номер";
 
          if(Application->MessageBox(bw.c_str(),"Внимание",MB_ICONWARNING)==IDOK)
         {
          ADOQuery1->Close();
          ADOQuery1->SQL->Clear();
          ADOQuery1->SQL->Text = st;
          ADOQuery1->Open();
          ADOQuery1->Sort = s;
          ADOQuery1->Locate("Invent_Number",ID,Options);
          ADOQuery1->EnableControls();
          ValueListEditor1->SetFocus();
          ValueListEditor1->Row = 1;
         }
         }
Добавлено через 16 минут
Цитата Сообщение от Sasha Посмотреть сообщение
так, а ты перед внесением данных проверь существует ли такая трока в базе, если есть вноси даннные
Не правильно написал, если она есть то выведи сообщение, что строка такая существует с просьбой ввести новую
1
6 / 6 / 0
Регистрация: 16.05.2010
Сообщений: 98
22.05.2011, 16:33  [ТС]
А как сделать чтобы при повторномнажатии на клавишу Поиск(ищет через Locate) указатель перемещался на вторую найденную запись?
0
 Аватар для Sasha
4956 / 2420 / 531
Регистрация: 05.06.2008
Сообщений: 7,518
Записей в блоге: 3
22.05.2011, 16:53
Я тебе советую тогда вывести повторяющиеся строки запросом, потому как я Locate() использовал сугубо для одного повторения в таблице
0
6 / 6 / 0
Регистрация: 16.05.2010
Сообщений: 98
22.05.2011, 22:42  [ТС]
Извиняюсь за глупый вопрос, но как можно поменять текст тайтлов(title) таблицы dbGrid? В смысле чтобы только отображались по другому...

Добавлено через 1 час 19 минут
Возможно я не так выразился...
В общем мне надо изменить вот это:
[img]http://i082.***********/1105/a4/0c682fc25d75.jpg[/img]
0
 Аватар для Sasha
4956 / 2420 / 531
Регистрация: 05.06.2008
Сообщений: 7,518
Записей в блоге: 3
23.05.2011, 09:18
C++
1
DBGrid1->Columns->Items[0]->Title->Caption = "Привет";
1
1497 / 1238 / 245
Регистрация: 04.04.2011
Сообщений: 4,363
23.05.2011, 13:38
Для того, чтобы в базу нельзя было добавить запись с повторяющимися значениями используют уникальные индексы. Это много универсальнее, грамотнее и надежнее, чем проверка на клиенте.
Просто запрос на обновление (добавление) проверяйте на возникновение исключения, о котором сигнализирует сервер и информируйте о нем пользователя.
При редактировании в сетке нельзя выполнять проверку на повтор "ключей" ДО вставки записи.
Такая проверка должна выполняться непосредственно перед выполнением запроса на вставку(изменение), причем (ВАЖНО !) в контексте одной транзакции

Поиск записей. Чтобы найти первую используют Locate, чтобы найти следующую годится FindNext, то только ив том случае, если Вы ищете по индексам. Для любого поиска - только сканирование, пересмотр записей.
Для того, чтобы после поиска пользователь не терял "своей" записи, используйте UID записей, предварительно запоминая его в переменной, а затем используя в locate.
Если в датесете нет UID, испоьлзуйте закладки (TBookMark), но при этом помните, что закладки имеют "привычку" терять валидность например при перечитке датасета или изменения его на клиенте
1
6 / 6 / 0
Регистрация: 16.05.2010
Сообщений: 98
26.05.2011, 21:47  [ТС]
Как можно занести данные из DateTimePicker в DBEdit?
Пробовал так -
C++
1
DBEditData->Text=FormatDateTime("dd.mm.yy", dtp1->Date);
Текст в DBEdit появляется, но не добавляется в таблицу и при нажатии на DBEdit сразу исчезает...
0
 Аватар для Sasha
4956 / 2420 / 531
Регистрация: 05.06.2008
Сообщений: 7,518
Записей в блоге: 3
26.05.2011, 21:55
А как ты добавляешь данные в таблицу?
1
6 / 6 / 0
Регистрация: 16.05.2010
Сообщений: 98
26.05.2011, 22:10  [ТС]
Извиняюсь уже все исправил)) Работает))
0
6 / 6 / 0
Регистрация: 16.05.2010
Сообщений: 98
29.05.2011, 13:14  [ТС]
Еще один вопрос: У меня есть два поля с типами Счетчик и Текстовый.
когда я вначале добавляю записи то все отлично поле Счетчик идет по порядку - 1,2,3,4...
Но вот если удалю одно поле(например №3), то следующее добавление не становится на его место, а идет так 1,2,4,5...
Можно как нибудь это исправить?
0
4217 / 3059 / 583
Регистрация: 21.01.2011
Сообщений: 13,203
30.05.2011, 09:38
Автоинкремент не предназначен для заполнения дыр. Еслу нужно - делаешь ручками.
Хотя как правило, от PK требуется только уникальность, но не непрерывность
1
6 / 6 / 0
Регистрация: 16.05.2010
Сообщений: 98
30.05.2011, 17:37  [ТС]
Может глупый вопрос, но можно ли как нибудь кинуть переменную в базу данных?
У меня например есть таблица с записью Фамилия - текстового типа, и в программе есть переменная S типа string, можно как нибудь перенести ее в базу?
0
1497 / 1238 / 245
Регистрация: 04.04.2011
Сообщений: 4,363
30.05.2011, 18:01
SQL:
SQL
1
2
  UPDATE MYTABLE SET FAM='Иванов' WHERE ID=...
  INSERT INTO MYTABLE (FAM) VALUES('Иванов')
TADOTable:
C++
1
2
3
  TADOTable->Edit(); //Insert()
  TADOTable->Fields->FieldByName('FAM')->AsString = 'Иванов';
  TADOTable->Post();
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
30.05.2011, 18:01
Помогаю со студенческими работами здесь

Связать две таблицы через dbedit
Если кто сталкивался, подскажите как адаптировать данный delphi код для borland c++ procedure Tzakazchik.DBEdit1Change(Sender:...

как связать две таблицы БД в билдере
как сделать чтобы при добавлении записи в строку таблицы DBGrid1, в таблице DBGrid2 появлялась строчка и в соответвующем поле была запись...

Связать две таблицы (главную и подчиненную)
Народ! Help! Облазил все форумы (можете поверить)... Задача банальная:связать две таблицы по принципу master-detail (т.е. при нахождении...

Как связать две таблицы. Что бы выделив сотрудника в DBGrid1 увидет его медосмотры в DBGrid2?
БД MSAccess подключена с помощью ADOConnection1 Таблицы подключены так: 1) ADOQuery1>DataSource1>DBGrid1 2)...

Связать колонку одной таблицы с колонкой другой таблицы
Добрый день! Как связать две ячейки двух таблиц: Из таблицы № 1 данные колонки "категория" ...


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

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Новые блоги и статьи
[Owen Logic] Поддержание уровня воды в резервуаре количеством включённых насосов: моделирование и выбор регулятора
ФедосеевПавел 14.03.2026
Поддержание уровня воды в резервуаре количеством включённых насосов: моделирование и выбор регулятора ВВЕДЕНИЕ Выполняя задание на управление насосной группой заполнения резервуара,. . .
делаю науч статью по влиянию грибов на сукцессию
anaschu 13.03.2026
прикрепляю статью
SDL3 для Desktop (MinGW): Создаём пустое окно с нуля для 2D-графики на SDL3, Си и C++
8Observer8 10.03.2026
Содержание блога Финальные проекты на Си и на C++: hello-sdl3-c. zip hello-sdl3-cpp. zip Результат:
Установка CMake и MinGW 13.1 для сборки С и C++ приложений из консоли и из Qt Creator в EXE
8Observer8 10.03.2026
Содержание блога MinGW - это коллекция инструментов для сборки приложений в EXE. CMake - это система сборки приложений. Здесь описаны базовые шаги для старта программирования с помощью CMake и. . .
Как дизайн сайта влияет на конверсию: 7 решений, которые реально повышают заявки
Neotwalker 08.03.2026
Многие до сих пор воспринимают дизайн сайта как “красивую оболочку”. На практике всё иначе: дизайн напрямую влияет на то, оставит человек заявку или уйдёт через несколько секунд. Даже если у вас. . .
Модульная разработка через nuget packages
DevAlt 07.03.2026
Сложившийся в . Net-среде способ разработки чаще всего предполагает монорепозиторий в котором находятся все исходники. При создании нового решения, мы просто добавляем нужные проекты и имеем. . .
Модульный подход на примере F#
DevAlt 06.03.2026
В блоге дяди Боба наткнулся на такое определение: В этой книге («Подход, основанный на вариантах использования») Ивар утверждает, что архитектура программного обеспечения — это структуры,. . .
Управление камерой с помощью скрипта OrbitControls.js на Three.js: Вращение, зум и панорамирование
8Observer8 05.03.2026
Содержание блога Финальная демка в браузере работает на Desktop и мобильных браузерах. Итоговый код: orbit-controls-threejs-js. zip. Сканируйте QR-код на мобильном. Вращайте камеру одним пальцем,. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru