Форум программистов, компьютерный форум, киберфорум
Delphi: Базы данных
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск  
 
 
Рейтинг 4.54/56: Рейтинг темы: голосов - 56, средняя оценка - 4.54
1 / 1 / 1
Регистрация: 09.06.2020
Сообщений: 125
MS Access

Создание приложения, подключаемое к БД Access

04.11.2020, 10:57. Показов 11667. Ответов 69
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Здравствуйте. Возможно я не правильно сформулировал Заголовок темы, по пробую разъяснить здесь. Необходимо создать курсовую работу по БД. Создал таблицы, сущности, сделал связь между таблицами. Начал создавать приложение, формы на Delphi которые связанны с БД Access. Связь идет, с программы могу записать данные в Access и так же увидеть то, что находится в таблицах. Но остановился на том, что необходимо ли создавать SQL запросы в Access? На пример для создания отчета который будет отображаться в приложении Delphi? Опыта в данной тематике мало, по этому возможно какие то вещи написал не верно, либо суть не смог до конца донести.
0
Лучшие ответы (1)
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
04.11.2020, 10:57
Ответы с готовыми решениями:

Создание приложения в СУБД MS Access
Не могу разобраться как сделать отчет по данной работе. Наработки есть.

Создание приложения для работы с БД MS Access
Здравствуйте, ребята! Я хочу создать приложение в Visual Studio 2019 для работы с БД MS Access (SQL-запросы, создание отчетов), но в...

Разработка базы данных в СУБД Access и создание приложения «Принтеры»
Разработка базы данных в СУБД Access и создание приложения «Принтеры» с использованием внешнего компонента Data Decktop Delphi и...

69
1 / 1 / 1
Регистрация: 09.06.2020
Сообщений: 125
17.11.2020, 17:09  [ТС]
Студворк — интернет-сервис помощи студентам
Получается в этот контейнер я складываю на пример ADOQuery, DataSource и уже в этом контейнере настраиваю перечисленные ранее компоненты?
0
1 / 1 / 1
Регистрация: 09.06.2020
Сообщений: 125
17.11.2020, 17:25  [ТС]
Изменил название атрибутов на латинские. И все таки обратно добавил по отдельности ФИО. По читал по поводу нормализации, сводится все к тому что бы атрибуты в таблице были таким образом то есть фамилия, имя, отчество. По поводу отелей, в таблице отели добавил атрибут страны, тем самым думаю будет связь отеля с определенной страной.
Миниатюры
Создание приложения, подключаемое к БД Access  
0
 Аватар для Пытливый
3764 / 2272 / 705
Регистрация: 29.05.2013
Сообщений: 9,622
17.11.2020, 18:21
Модуль данных это действительно не более чем контейнер. Основное его назначение вынести все не визуальные компоненты в одно место, для освобождения места на форме от кучи лишних иконок и сделать единообразное обращение к данным, а это позволяет легко подстраивать приложение под разные типы баз данных, просто заменив модуль.

Добавлено через 6 минут
Уже лучше, растете на глазах
Почти не к чему придраться, за исключением двух схожих таблиц Client и Personal. Зачем вам отдельная таблица Personal, если Client уже содержит аналогичные поля? Что мешает использовать одну и ту-же таблицу для Хранения данных туристов и персонала?
1
1 / 1 / 1
Регистрация: 09.06.2020
Сообщений: 125
17.11.2020, 21:58  [ТС]
Спасибо! Ну так с вашей помощью Видите, когда я буду якобы оформлять путевку, мне необходимо будет указать клиента которого я внес в таблицу клиенты, и менеджера кто оформлял эту путевку. Если я объединю таблицы, то думаю тогда мне необходимо будет добавлять атрибут который будет идентификатором своего рода, типа это клиента я добавил, или менеджера. Вот как то так)
0
 Аватар для Пытливый
3764 / 2272 / 705
Регистрация: 29.05.2013
Сообщений: 9,622
17.11.2020, 23:04
Цитата Сообщение от zwerw Посмотреть сообщение
необходимо будет добавлять атрибут который будет идентификатором своего рода, типа это клиента я добавил, или менеджера
Этот идентификатор в неявном виде у вас и так есть. Наличие связи по полю Menedger даст ответ, что это Менеджер, а по полю Turist что это Клиент
Выбрать всех менеджеров тогда можно так:
SQL
1
SELECT * FROM Client INNER JOIN OformitPutevki ON OformitPutevki.Menedjer=Client.KodKlienta
Ну а клиентов так:
SQL
1
SELECT * FROM Client INNER JOIN OformitPutevki ON OformitPutevki.Turist=Client.KodKlienta
А если добавить связь по KodTura с туром, то получите конкретных менеджера и клиента:
SQL
1
2
3
4
SELECT * FROM Tur 
INNER JOIN OformitPutevki ON OformitPutevki.KodTura=Tur.KodTura 
LEFT JOIN Client ON OformitPutevki.Menedjer=Client.KodKlienta
LEFT JOIN Client ON OformitPutevki.Turist=Client.KodKlienta
Писал на коленке, по схеме, должно вроде работать, но если прикрепите последний вариант БД будет проще.
1
1 / 1 / 1
Регистрация: 09.06.2020
Сообщений: 125
18.11.2020, 06:37  [ТС]
Тогда я так понимаю, объединить таблицы и создать атрибут на пример Status. В котором буду указывать клиент или менеджер? По поводу SQL запроса спасибо большое, буду изучать!
0
 Аватар для Пытливый
3764 / 2272 / 705
Регистрация: 29.05.2013
Сообщений: 9,622
18.11.2020, 11:54
Не надо ничего добавлять. Наличие или отсутствие связи это и есть неявный атрибут. Какая разница что проверять, поле Status или связь по полю OformitPutevki? Под связью подразумевается наличие хотя-бы одной записи в таблице Client совпавшей по OformitPutevki
0
1 / 1 / 1
Регистрация: 09.06.2020
Сообщений: 125
19.11.2020, 17:44  [ТС]
Вот хоть убейте, но не могу разобраться по поводу объединения таблиц.
SQL
1
SELECT * FROM Client INNER JOIN OformitPutevki ON OformitPutevki.Menedjer=Client.KodKlienta
Вот ваш код, как я понимаю выбираем все колонки из таблицы Client и подключаем вторую таблицу OformitPutevki где проверяем условие где менеджер из таблицы оформить путевку будет равен коду клиента из таблицы клиенты, и если истинно условие то таблицы сформируются. Каким образом я буду добавлять менеджера если у меня не будет таблицы Personal? Из таблицы клиенты добавлять менеджера который оформлял путевку? Если я оставлю без изменения эти две таблицы, будет ли считаться грубой ошибкой? Как я думал изначально в таблице оформить путевку я должен был из выпадающего списка выбрать ФИО менеджера(которого я добавил из таблицы Персонал), далее ФИО клиента (которого я добавил из таблицы клиенты) и сформировать путевку. Вот как то так...
0
Житель Земли
 Аватар для DenNik
3004 / 3026 / 390
Регистрация: 26.07.2011
Сообщений: 11,465
Записей в блоге: 1
23.11.2020, 11:59
Цитата Сообщение от zwerw Посмотреть сообщение
не могу разобраться по поводу объединения таблиц.
https://function-x.ru/sql_join.html
1
1 / 1 / 1
Регистрация: 09.06.2020
Сообщений: 125
24.11.2020, 11:43  [ТС]
Ребят, по поводу Join, я понимаю что этот запрос объединяет таблицы по какому либо условию. Но вот таблицу которую он создал, она должна куда то сохраняться в Access, или BDGrid? Здесь у меня не понятки, лыжи не едут. Сделал я быстренько форму, как примерно должна выглядеть для таблицы Оформить путевку. Схему данных скрин тоже прикрепил, пока таблицы не объединял, причину написал выше. Вот задумка такая что бы с помощью DB LookUpCombobox выбрать тур из таблицы Туры, выбрать клиента из таблицы Клиенты и выбрать менеджера из таблицы Персонал и все это должно сохраниться в таблицу Оформить путевку. Как видно на картинке Связь есть с таблицей Менеджер (заполнил ее на скорую руку для проверки). Такая же связь есть и других элементов с соответствующими таблицами. И если такой вариант имеет место быть, то каким образом мне сохранить данные которые я выбираю в Combobox в таблицу Оформить путевку в соответствующие поля. Ребят делаю курсовую, возможно много глупостей пишу и не по теме, но спросить не у кого, информацию по кускам собираю так как если садиться за учебник и все от и до учить времени не хватит. А оно ограниченно. Учусь на фдо. Да, и хотел написать спасибо пользователю с ник Пытливый, реально хорошо помог и направил в нужное русло!
Миниатюры
Создание приложения, подключаемое к БД Access   Создание приложения, подключаемое к БД Access  
0
28 / 24 / 11
Регистрация: 11.11.2009
Сообщений: 101
24.11.2020, 14:04
Данные, которые вы получите в результате запроса к базе, будут храниться в DataSource. У датасорс в свойствах есть поле DataSet там должен быть указан запрос который вы выполняете. DBGrid исключительно отображает данные которые храняться в датасорс.

Добавлено через 7 минут
Цитата Сообщение от zwerw Посмотреть сообщение
помощью DB LookUpCombobox выбрать тур из таблицы Туры
ИМХО. Не специалист, но сделал бы так:
1. К каждому DBLookUpCombobox добавляем адоквери и датасоурс
2. У каждого DBLookUpCombobox в свойстве ListSource указываем соответствующий датасоурс, в свойстве KeyField вписываем имя поля - уникального идентификатора(id,guid) в вашем случае - kod или nomer, в свойстве ListField указываем имя столбца в таблице которые хотим отображать в DBLookUpCombobox
2. В событии при активации формы выполняем каждый запрос с необходимыми параметрами

Добавлено через 6 минут
Например. Для того чтобы выбрать тур, допустим это будет DbLookUpComboBox5. Его свойства:
-ListSource (DataSource5)
-KeyField (KodTura)
-ListField (NazvanieTura)
В событии при активации формы добавляем строки :
Delphi
1
2
3
ADOQuery5.Clear;
ADOQuery5.SQL.Add('Select * from Tur');
ADOQuery5.Active:=True;
Добавлено через 1 минуту
При это в свойствe DataSet у DataSource5 будет указано - ADOQuery5

Добавлено через 11 минут
Цитата Сообщение от zwerw Посмотреть сообщение
каким образом мне сохранить данные которые я выбираю в Combobox
В событии кнопки сохранить:
Delphi
1
2
3
4
5
6
7
8
9
10
if DBLookupComboBox5.KeyValue='' then ShowMessage('Не выбран тур!') else
if DBLookupComboBox6.KeyValue='' then ShowMessage('Не выбран турист!') else
begin
  ADOQuery1.SQL.Clear;
  ADOQuery1.SQL.Add('INSERT INTO OformitPutevku (KodTura,Turist,DataOformlenia,Menejer) values(:KodTura,:Turist,:DataOformlenia,:Menejer)');
  ADOQuery1.Parameters.ParamByName('KodTura').AsInteger:=DBLookupComboBox5.KeyValue; 
  ADOQuery1.Parameters.ParamByName('Turist').AsInteger:=DBLookupComboBox6.KeyValue;
//и т.д. изучите запрос с параметром, станет понятней
  ZQuery3.ExecSQL;
end;
Добавлено через 26 минут
zwerw обратите внимание, весь код написан для примера, там достаточно опечаток и неточностей. Пытался
указать направление в котором копать
1
1 / 1 / 1
Регистрация: 09.06.2020
Сообщений: 125
25.11.2020, 14:46  [ТС]
Спасибо за код и направление. По копался я, и произвел изменения в коде.
Delphi
1
2
3
4
5
6
7
8
9
10
11
begin
  if DBLookupComboBox1.Text='' then ShowMessage('Вы не заполнили поля!') else
 
begin
  Form1.ADOQuery2.SQL.Clear;
  Form1.ADOQuery2.SQL.Add('INSERT INTO OformitPutevku (Data) values(:Data)');
  Form1.ADOQuery2.Parameters.ParamByName('Data').Value:=DBLookupComboBox1.Text;
//комментарий
  Form1.ADOQuery2.ExecSQL;
end;
end;
Изменил форму, пока на одном компоненте DBLookupComboBox1 проверяю. Добавил ADOQuery1 и DataSource1 для соединения с таблицей Client. Добавил ADOQuery2 и DataSource2 для связи с таблицей OformitPutevku.
Когда в строке
Delphi
1
Form1.ADOQuery2.SQL.Add('INSERT INTO OformitPutevku (Data) values(:Data)');
Столбец был Turist values Turist а в коде
Delphi
1
ADOQuery1.Parameters.ParamByName('Turist').AsInteger:=DBLookupComboBox1.KeyValue;
Был тоже Turist то выходила ошибка связанная с тем как я понял, что разные типы данных. И ведь действительно так, для строки Фамилия в таблице клиенты был тип текст, а в таблице Оформить путевку был тип числовой. После того как создал в таблице поле Data с типом текстовый то все пошло, все работает. Фамилия сохраняется из таблицы Клиент в таблицу Оформить путевку в поле Data. Можно ли в таблице Оформить путевку для строки Турист поменять на текстовый? Ведь это поле связывает с таблицей Клиенты.
0
1 / 1 / 1
Регистрация: 09.06.2020
Сообщений: 125
26.11.2020, 06:55  [ТС]
Суть в том, что с помощью DBLookUpCombobox1 я же выбираю Фамилия из таблицы Client строка Familie, тип этой строки в Access текстовый, переношу его в таблицу OformitPutevku строка Turist у которой тип числовой. Соответственно и выходила ошибка по поводу разных типов. Когда создал строку(столбец) Data в таблицу OformitPutevku с типом текстовый то записи выбранные с таблицы Client (Familie) сохранились в OformitPutevku (Data) без каких либо ошибок. И снова остановился, каким то образом с помощью Combobox выбирать фамилия из таблицы клиент, и его ключ сохранять в таблицу Оформить путевку в столбец турист? Но каким образом? А если тип столбца Turist изменю на текстовый, то связи не будет же.
Миниатюры
Создание приложения, подключаемое к БД Access  
0
1 / 1 / 1
Регистрация: 09.06.2020
Сообщений: 125
26.11.2020, 07:15  [ТС]
Либо выбирать ключ, но уже не с помощью LookUpCombobox? Хотя нет, сейчас уже проверил, если поставить DBCombobox то для этих целей он не пойдет.
0
28 / 24 / 11
Регистрация: 11.11.2009
Сообщений: 101
26.11.2020, 11:39
В таблице оформить путевку, столбец Turist у Вас числовой, было бы правильнее него назвать KodTurist и хранить в нем KodClienta из таблицы Client и получиться, что при необходимости узнать все данные клиента который указан в таблице ОформитьПутевку вы делается запрос на выборку из таблицы Client(Select From Where) с условием что KodClienta = KodTurist

Добавлено через 8 минут
Необходимо понимать, что для Вас как разработчика главное работать с Уникальными идентификаторами(KodClienta, ID, GUID - например), т.е. DBLookupComboBox1.KeyValue приоритетный параметр, второстепенный - ListField, это тот который будет видеть пользователь программы в компоненте DBLookupComboBox, но основная работа будет проходить с идентификаторами. Использовать DBLookupComboBox1.Text не совсем корректно. Для проверки на то выбрано ли значение или нет можно проверять так:
Delphi
1
if DBLookUpComboBox1.ListFieldIndex<>-1 then ShowMessage('Вы не заполнили поля!') else
Добавлено через 1 минуту
Цитата Сообщение от zwerw Посмотреть сообщение
Либо выбирать ключ, но уже не с помощью LookUpCombobox?
Именно с помощью DBLookupComboBox выбирается ключ (Уникальными идентификатор, ID, GUID).

Добавлено через 2 минуты
Еще раз.
-ListSource (DataSource5) указывает на объект который хранит данные DBLookupComboBox
-KeyField (KodTura) указывает на уникальный идентификатор
-ListField (NazvanieTura) указывает на поле, которое будет отображаться пользователю
1
1 / 1 / 1
Регистрация: 09.06.2020
Сообщений: 125
26.11.2020, 12:15  [ТС]
В компоненте DBLookUpCombobox в свойстве ListField поставил значение KodKlienta. Для того что бы видно было когда выбираю код какой клиент под этим кодом добавил DBGrid. Теперь то конечно сохраняется код клиента в таблицу OformitPutevku, но выглядит конечно колхозно, и понимаю что это не решение моей проблемы.
Миниатюры
Создание приложения, подключаемое к БД Access   Создание приложения, подключаемое к БД Access  
Изображения
 
0
28 / 24 / 11
Регистрация: 11.11.2009
Сообщений: 101
26.11.2020, 13:17
Выбираем DBGrid, кликаем по нему 2 раза левой кнопкой мыши. Отроется окно полей - скинь скрин

Добавлено через 8 минут
Если там пусто жми на кнопку Add all fields и добавятся поля после выбираешь поле KodClienta и в его свойствах Visible переводим в false. Если кнопка Add all fields не активна, с помощью кнопки Add new добавляем все поля которые необходимы и меняем их название на то, что указано в таблице БД. Свойство каждого поля Caption в разделе Title отвечает за то, что увидит пользователь, чтобы ему не читать на транслите.

Добавлено через 26 минут
Пользователю не нужно видеть идентификатор, пользователю нужны установочные данные - в Вашем случае я так понял фамилия. Мы должны показывать исключительно необходимые пользователю вещи, идентификаторы ему ни к чему. Возьмем двух клиентов с фамилией "Иванов" клиентов два, а фамилия одна, для этого есть идентификатор для каждого Иванова он будет индивидуален.
0
561 / 230 / 88
Регистрация: 11.07.2015
Сообщений: 817
26.11.2020, 13:59
А нафига в DBLookupComboBox показывать ключевое поле таблицы. Тут должна отображаться информация, к примеру ФИО.
Миниатюры
Создание приложения, подключаемое к БД Access  
1
28 / 24 / 11
Регистрация: 11.11.2009
Сообщений: 101
26.11.2020, 14:32
Цитата Сообщение от UR1004SWL Посмотреть сообщение
А нафига в DBLookupComboBox показывать ключевое поле таблицы. Тут должна отображаться информация, к примеру ФИО.
Именно это я и пытаюсь донести в т.ч. в DBGrid.
1
1 / 1 / 1
Регистрация: 09.06.2020
Сообщений: 125
30.11.2020, 19:08  [ТС]
Наконец то получилось) Сохранился код клиента из таблицы клиенты в таблицу оформить путевку)
Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
14
begin
 
if DBLookUpComboBox1.KeyValue = null then ShowMessage('Ничего не выбрали') else
//Если текущее значение ключевого поля DBLookUpCombobox1 не имеет значения то вывести диалоговое окно с 
//сообщением иначе
 
      begin
  ADOQuery2.SQL.Clear;//Отчистить запросы которые были ранее как я понял
  ADOQuery2.SQL.Add('INSERT INTO OformitPutevku (turist) values(:turist)');
  ADOQuery2.Parameters.ParamByName('turist').Value:=DBLookupComboBox1.KeyValue;
//комментарий
  ADOQuery2.ExecSQL;
end;
end;
вот таким образом изменил код. Конечно до завершения курсовой еще далеко, но ваша помощь ребята очень помогла мне. Спасибо!
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
30.11.2020, 19:08

Создание приложения "список дел" на основе БД Access
Добрый день гуру, если не возражаете попрошу несколько общих советов. Создаю примитивное приложение сугубо на базе учебной программы -...

Подключаемое оборудование
Здравствуйте. 1с предприятие 8.3 релиз 8.3.17.1549, розница 2.3 релиз 2.3.5.35. На рабочем месте подключили кассу и сканер.. когда...

Windows 7 не видит оборудование, подключаемое на передней панели
Установил windos7,не видит оборудование подключаемое на передней понели,к аудио вход-выход.

Проброс USB устройств, подключённых к ПК, через отладчик VS на подключаемое физическое устройство
Добрый день. Подскажите пожалуйста, как через Visual Studio пробросить, подключённому для отладки устройству, USB накопители, подключенные...

Создание приложения Bitrix 24. Бесконечная загрузка при установке своего приложения
Учусь создавать приложения для Bitrix 24 по видеокурсам Возникла проблема с установкой приложения. Пробую создавать приложение 2го...


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

Или воспользуйтесь поиском по форуму:
40
Ответ Создать тему
Новые блоги и статьи
сукцессия 31: модель микоризы - это модель ещё нескольких явлений, социальных и экономических
anaschu 18.07.2026
Теория «Всего»: апдейт v1. 1. 2 — 28‑мерное ядро стабилизировано Коллеги, фиксирую разбор инженерных правок и их изоморфную проекцию на экономику, меметику и половой отбор. Модель теперь не. . .
сукцессия 30. Массив проверяющих друг друга моделей
anaschu 18.07.2026
Архитектура сети взаимопроверяющих моделей микоризной сукцессии (v2. 0) Развитие тензорного ОДУ-ядра и создание кросс-платформенного калибровочного полигона Уважаемые коллеги! В продолжение. . .
Грибы - это женщины, деревья - это мужчины. Анти инь янь для союза мужчины и женщины.
anaschu 18.07.2026
ГЛАВНЫЙ НАУЧНО-ФИЛОСОФСКИЙ ВЫВОД: Сексуально-Репродуктивный Капитализм против Государства Моногамии Коллеги, мы вышли на финишную прямую 20-мерного ОДУ-моделирования вековой сукцессии (ветка. . .
Текстовый слайдер с нумерацией страниц и кроссбраузерность.
russiannick 18.07.2026
Один мой друг написал текстовый слайдер с нумерацией страниц. Сегодня я расскажу как он умудрился подружить его с кроссбраузерностью. Очевидно сложно угодить с шириной каждому браузеру. Один крадет. . .
Грибы - это мемы, дерево - это человек. Применение микоризной модели к теории меметики Докинза.
anaschu 18.07.2026
Меметический изоморфизм теории «всего»: Грибная сукцессия как модель эволюции идей Докинза Базовый код системы ОДУ микоризной сукцессии описывает не просто биологию, а универсальную. . .
Грибы - это корпорации, деревья - это государства. Механизм массонского захвата власти
anaschu 18.07.2026
Макроэкономический изоморфизм теории «всего»: Грибная сукцессия как модель транснационального капитализма Базовый код системы ОДУ микоризной сукцессии описывает не просто биологию, а. . .
Расчёт периметра прямоугольника по координатам вершин
Maks 18.07.2026
Решение задачи по прикладной информатике средствами 1С. Задача: Вычислить периметр прямоугольника, заданного координатами своих вершин на плоскости. Решение: Создан документ со следующими. . .
Подсчёт частоты трёхбуквенных слов в тексте
Maks 18.07.2026
Решение задачи по прикладной информатике средствами 1С. Задача: Выясните, сколько раз в предложенном тексте встречается каждое трехбуквенное слово. Решение: Создан документ с единственным. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru