С Новым годом! Форум программистов, компьютерный форум, киберфорум
Delphi: Базы данных
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.88/8: Рейтинг темы: голосов - 8, средняя оценка - 4.88
 Аватар для Comrade-Archer
0 / 0 / 1
Регистрация: 28.12.2018
Сообщений: 21
MS Access

Как лучше оформить/создать добавление нового значения в зависимые поля со списком?

14.03.2020, 17:56. Показов 1931. Ответов 21
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Всем доброго дня!
Делаю СУБД на основе access. Первоначально создал БД в самом access'e и там же сделал форму для нее форму для ввода данных. Выглядело это примерно вот так:

Там же в access'e настроил добавление зависимых друг от друга данных как видно на скриншоте сверху. Зависимые поля это Вид, специальность и задача, они выбираются поступательно, т.е. сначала выбирается вид, потом в зависимости от выбранного вида специальность, а затем в зависимости от специальности задача (ну, или по аналогии в интернете часто есть пример: страна и город, в зависимости от выбора страны) зависимость выглядит вот так:

В итоге получилось сделать форму в которой можно не только выбрать данные из выпадающего списка, но и добавить новые (как видно из первого скриншота с примером новой задачи)
Теперь, когда примерно представил как это все должно выглядеть, я начал разрабатывать форму в delphi. Но тут такое большое количество разных DBEdit'ов (DBLookUpComboBox, DBLookListBox), и читая описания к ним можно посчитать что каждый из них может подойти (некоторые ответы на форумах вообще предлагают работать с обычным Edit'ом)
Можете посоветовать, что и как лучше бы это оформить?
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
14.03.2020, 17:56
Ответы с готовыми решениями:

Добавление нового значения в поле со списком
Простейший случай! Есть две таблицы, одна "заказы", в которой через подстановку выбираются значения из второй - "агенты". ...

Добавление нового значения в зависимое поле со списком
Всем добрый день, возникла небольшая проблемка с добавлением нового значения в поле со списком в форме. Прописал уже готовую функцию для...

Как создать неизменяемый текстовый шаблон для каждого значения поля со списком?
Привет! прошу:sorry: помочь мне с решением данного вопроса. Я в этом мягко говоря "не специалист"... хотелось бы чтоб при выборе...

21
5958 / 4534 / 1094
Регистрация: 29.08.2013
Сообщений: 28,141
Записей в блоге: 3
14.03.2020, 20:13
Цитата Сообщение от Comrade-Archer Посмотреть сообщение
Можете посоветовать, что и как лучше бы это оформить?
использовать обычные компоненты без приставки DB + запросы в базу
стараться давать пользователю как можно меньше вводить что то руками (для ввода цифр - SpinEdit, для ввода даты DatePicker и тд)

для отображения использовать ListView, для добавления отдельную форму
0
 Аватар для Пытливый
3763 / 2267 / 705
Регистрация: 29.05.2013
Сообщений: 9,622
14.03.2020, 22:38
К сожалению не существует единого варианта на все случаи жизни. Частенько, новая задача порождает и новое решение. Судя по схеме, вам еще кое-что надо переделать и в первую очередь отказаться от названий полей типа "Орган/Лицо". И ваша реализация таблицы Клиент на мой взгляд несколько неудачна. Раз у вас возможны две разные сущности ФизЛицо/ЮрЛицо, то они должны быть реализованы отдельными таблицами, а таблица Клиент должна содержать только ссылку на одну из сущностей.
0
 Аватар для Comrade-Archer
0 / 0 / 1
Регистрация: 28.12.2018
Сообщений: 21
15.03.2020, 18:52  [ТС]
Цитата Сообщение от Пытливый Посмотреть сообщение
К сожалению не существует единого варианта на все случаи жизни. Частенько, новая задача порождает и новое решение. Судя по схеме, вам еще кое-что надо переделать и в первую очередь отказаться от названий полей типа "Орган/Лицо". И ваша реализация таблицы Клиент на мой взгляд несколько неудачна. Раз у вас возможны две разные сущности ФизЛицо/ЮрЛицо, то они должны быть реализованы отдельными таблицами, а таблица Клиент должна содержать только ссылку на одну из сущностей.
Таблица клиента подобна таблице с видом, просто на схеме выглядит неупорядочено.
Вложение 1121855
А так уже примерно начинаю делать форму добавления, выглядит она пока так:
Вложение 1121862Вложение 1121861
Использовал DBLookUpCpmbobox, а рядом разместил кнопку, на случай, если нужно будет добавить новый вид/специальность. При нажатии которой будет открываться окно с DBEdit'ом, но теперь возникает такая необходимость: чтобы при новой записи происходила проверка "есть ли уже такая запись в таблице", если есть, то не добавлять её в поле и вывести сообщение, иначе - добавить и выйти. ну т.е. выполнить проверку и запрет на повторение записи. Я понимаю что это должен быть sql запрос, но как он должен выглядеть?
Еще всё ищу, да никак не найду как можно сделать условие отбора у combobox'а, чтобы при выборе определенного вида, количество записей в "специальность" уменьшилось
0
 Аватар для Comrade-Archer
0 / 0 / 1
Регистрация: 28.12.2018
Сообщений: 21
15.03.2020, 19:03  [ТС]
Что-то картинки не загружаются.




0
 Аватар для Comrade-Archer
0 / 0 / 1
Регистрация: 28.12.2018
Сообщений: 21
16.03.2020, 19:45  [ТС]
Как настроить фильтр у DBLookUpCombobox'a?
Еще появилась проблема с добавлением нового значения с поле "Специальность": если с полем "вид" можно было просто ввести новое значение, то с полем специальность нужно чтобы оно еще и добавляло внешний ключ в зависимости от вида.


0
16.03.2020, 21:41

Не по теме:

вроде же писал что не надо использовать DB*, а надо использовать простые компоненты + sql

0
Модератор
 Аватар для D1973
9908 / 6445 / 2455
Регистрация: 21.01.2014
Сообщений: 27,363
Записей в блоге: 3
17.03.2020, 08:53

Не по теме:

Цитата Сообщение от qwertehok Посмотреть сообщение
вроде же писал что не надо использовать DB*
ТС не читатель, ТС - писатель...



Добавлено через 1 минуту
Цитата Сообщение от Comrade-Archer Посмотреть сообщение
Можете посоветовать, что и как лучше бы это оформить?
Мне всегда интересно, зачем спрашивать совета, если все равно потом делать по своему, через эти убогие DB-Aware компоненты?
0
пофигист широкого профиля
4769 / 3204 / 862
Регистрация: 15.07.2013
Сообщений: 18,609
18.03.2020, 02:42
Цитата Сообщение от D1973 Посмотреть сообщение
через эти убогие DB-Aware компоненты?
DB-Aware компоненты не настолько убогие.
Только ТС'у нужно забыть про
Цитата Сообщение от Comrade-Archer Посмотреть сообщение
создал БД в самом access'e и там же сделал форму для нее форму для ввода данных
И про
Цитата Сообщение от Comrade-Archer Посмотреть сообщение
Там же в access'e настроил добавление зависимых друг от друга данных как видно на скриншоте сверху.
0
18.03.2020, 07:12

Не по теме:

Цитата Сообщение от northener Посмотреть сообщение
DB-Aware компоненты не настолько убогие
Ну нет, конечно, инструмент как инструмент... Другое дело, что область применения этого инструмента уже практически нулевая: да, в стене можно отверстие бородком зафигачить, но вот почему-то все берут для этой цели перфоратор...

0
 Аватар для Comrade-Archer
0 / 0 / 1
Регистрация: 28.12.2018
Сообщений: 21
19.03.2020, 16:54  [ТС]
Понял что нужно использовать Master-detail. Прочитал про него везде, и даже создал отдельный проект, чтобы как-то на примерах воссоздать подобное, но что-то вообще уже совсем голова перестает работать от непонимания. http://cadhouse.narod.ru/artic... detail.htm по сути, здесь очень понятно объяснили, но когда я решил сделать что-то по аналогии – ничего не вышло:

Саму логику master-detail я еще в работе с access кое-как понял.
Можете, пожалуйста, объяснить как мне можно реализовать это на этом примере, или где тут ошибки? Т_Т
0
 Аватар для Пытливый
3763 / 2267 / 705
Регистрация: 29.05.2013
Сообщений: 9,622
19.03.2020, 22:57
В дельфи реализованы 2 механизма работы с мастер-деталь - через запросы и через таблицы. Оба варианта дадут одинаковый результат, но настраиваются по разному. У вас видимо используется вариант с запросами, там имя параметра должно совпадать с именем ключевого поля, по которому организована мастер-деталь связь. Для вашего примера будет видимо так:
Для мастера:
SQL
1
SELECT * FROM Страны
Для детали
SQL
1
SELECT * FROM Города WHERE Код_Страны=:Код_Страны
и для компонента Query_City надо присвоить свойство DataSource = DS_QueryCombo
1
 Аватар для Comrade-Archer
0 / 0 / 1
Регистрация: 28.12.2018
Сообщений: 21
20.03.2020, 07:17  [ТС]
Всё заработало!Все SQL запросы были и так прописаны как Вы написали, но все заработало после этой детальки:
Цитата Сообщение от Пытливый Посмотреть сообщение
и для компонента Query_City надо присвоить свойство DataSource = DS_QueryCombo
Спасибо.

А если я добавлю кнопку на добавление нового города, которого нет в списке, как можно сделать подобное, чтобы он привязывал новый город к определенной стране, которую выбрал до этого. Это аналогично связано с M-D, или надо что-то другое читать?
0
 Аватар для Пытливый
3763 / 2267 / 705
Регистрация: 29.05.2013
Сообщений: 9,622
20.03.2020, 19:08
Настроенный механизм мастер/деталь автоматом будет заполнять ключевое поле для Query_City. Вам надо просто добавить новый город, все остальное будет сделано без вашего участия.
0
 Аватар для Comrade-Archer
0 / 0 / 1
Регистрация: 28.12.2018
Сообщений: 21
21.03.2020, 08:12  [ТС]
Цитата Сообщение от Пытливый Посмотреть сообщение
Настроенный механизм мастер/деталь автоматом будет заполнять ключевое поле для Query_City. Вам надо просто добавить новый город, все остальное будет сделано без вашего участия.
Да, и правда сам заполняет поля. Спасибо.
У меня для добавление новой страны/города создана отдельная форма. Но как эту форму можно сделать шаблонной.

Т.е. принцип действия у нее для добавления нового поля для страны и города один, но запросы из таблиц разные. Просто не хочется для каждого поля (страна/город/улица) создавать отдельную скопированную форму лишь с разными запросами. Знаю в теории, что можно при нажатии кнопки "добавить новый город/страну" задать изменения на все ключевые запросы.
Delphi
1
2
3
4
5
6
7
8
procedure TForm4.SpeedButton1Click(Sender: TObject);
begin
Form5.Caption:= 'Добавление нового значения';
// Form5.DBLookupListBox1.ListSource.Edit  - очистить это поле и добавить новое
// Form5.DBLookupListBox1.ListField
Form4.Query_Add.Append;
Form5.ShowModal;
end;
Прошу прощения, что такие пробелы в элементарных вещах, сам понимаю это, просто учусь в этом деле сам без какой-либо определенной системности.
0
5958 / 4534 / 1094
Регистрация: 29.08.2013
Сообщений: 28,141
Записей в блоге: 3
21.03.2020, 09:42
вверху формы добавь combobox со своими сущностями - Город\Страна\Улица...
и анализируй - выбрал человек Город - лезь в таблицу Город и так далее
0
 Аватар для Comrade-Archer
0 / 0 / 1
Регистрация: 28.12.2018
Сообщений: 21
21.03.2020, 10:47  [ТС]
Это я понял, спасибо. Но не получается настроить изменение компонентов формы (Listbox,button'ы) при нажатии на предыдущей форме кнопки добавить "новый город". Я знаю как поменять их через object inspector, но как прописать изменения в коде кнопки

т.е. хочу прописать уже на следующей кнопки добавления нового города изменения на Form5. К примеру, при открытии изменить название предыдущей формы "добавление новой страны" на "добавление нового города"
Delphi
1
2
3
procedure TForm4.SpeedButton2Click(Sender: TObject);
begin
Form5.Caption:= 'Добавление нового города';
Это действие довольно простое. Сложность появилась при попытке изменить properties для DBLookUpListBox:
Мне нужно очистить все его предыдущие значения, в которых сейчас прописаны значения для страны, и ввести новые значения для города. Пока получилось только изменить ListSource
Delphi
1
Form5.DBLookupListBox1.ListSource:=Form4.DS_gorod;
А следующие ключевые поля не знаю как очистить (ListField и KeyField), пытался присвоить им значения таким же образом как с ListSource, но при запуске возникла ошибка что ListField "страна" не найдена, ну т.е. он не очищает данное поле.
0
5958 / 4534 / 1094
Регистрация: 29.08.2013
Сообщений: 28,141
Записей в блоге: 3
21.03.2020, 16:57
не помню как работать с DBLookupListBox1

я делал бы просто и деревянно - на любое изменение отправляешь запрос в базу
0
 Аватар для Comrade-Archer
0 / 0 / 1
Регистрация: 28.12.2018
Сообщений: 21
22.03.2020, 07:52  [ТС]
Ну думаю DBLookUpListBox не особо и важен, главное – это кнопки. Как можно прописать, чтобы при нажатии кнопки "добавить" он присвоил кнопке, которая находится на следующей форме (у которой все значения пустые) новые значения?
К примеру, у меня есть код этой кнопки:
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
procedure TForm4.SpeedButton1Click(Sender: TObject);
begin
Form5.Caption:= 'Добавление нового значения';
Form5.DBLookupListBox1.ListSource:=Form4.DS_vid;
Form5.DBLookupListBox1.ListField:='Вид экспертизы;Код';
Form5.DBLookupListBox1.KeyField:=('Код');
Form5.DBEdit1.DataSource:=Form4.DS_vid;
Form5.DBEdit1.DataField:=('Вид экспертизы');
                      Form5.Button1 (?????)
begin
 Form4.ADOQuery1.SQL.Clear;
Form4.ADOQuery1.SQL.Add('Select [Вид экспертизы] from ВИД WHERE [Вид экспертизы]='+#39+Form5.Edit1.Text+#39);
Form4.ADOQuery1.Open;
if Form4.ADOQuery1.IsEmpty then
  begin
  Form4.Query_vid.Insert;
  Form4.Query_vid.FieldByName('Вид экспертизы').AsString := Form5.Edit1.Text;
  Form4.Query_vid.Open;
  Form4.Query_vid.Post;
  MessageBox(Handle, 'Новые данные занесены','Добавление нового значения',MB_ICONINFORMATION);
  end
 else
  begin
  Form4.Query_vid.Cancel;
  Form4.ADOQuery1.Cancel;
  MessageBox(Handle,PChar(''+Form5.Edit1.text+' уже есть в списке!'),'Ошибка',MB_ICONWARNING);
  end;
end;
Вот, что мне нужно дописать на 9 строчке, чтобы button1 на следующей форме присвоил нижестоящий код?
0
 Аватар для Comrade-Archer
0 / 0 / 1
Регистрация: 28.12.2018
Сообщений: 21
24.03.2020, 20:03  [ТС]
В общем, нашел решение, спустя n-количество времени:
нужно прописать на главной форме процедуру этой кнопки (всё что после 9 строчки):
Delphi
1
procedure TForm4.MyButtonClick(Sender: TObject);
и на 9й строке прописать присвоение:
Delphi
1
Form5.Button1.Onclick := Form4.MyButtonClick;
Но как только разобрался с этим, застрял на предыдущем этапе:

Добавление новой страны работает все на "отлично", при том, что добавляю я через обычный TEdit, а не через DB, как и советовали ранее. НО, такое добавление перестает работать при добавлении нового Города или улицы, так как они осуществляют связь M-D. С DBEdit'ом получается добавить таким образом данные, так как он внешний ключ города автоматически привязывает к стране, но как прописать это с обычным TEdit'ом, что нужно прописать здесь, чтобы он добавлял также ключ от выбранной страны???
Delphi
1
2
3
4
5
 begin
  Form4.Query_City.Insert; // не выполняется: ошибка "Field 'ID' cannot be modified."
  Form4.Query_City.FieldByName('Вид экспертизы').AsString := Form5.Edit1.Text;
  Form4.Query_City.Open;
  Form4.Query_City.Post;
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
24.03.2020, 20:03
Помогаю со студенческими работами здесь

Одномоментное добавление нового поля и его значения в таблицу Access
Уважаемые форумчане, добрый вечер! Цель: иметь возможность из формы по необходимости создать новое поле для связанной с формой таблицы...

Зависимые поля (список значений одного поля зависит от значения другого поля)
Здравствуйте, Уважаемые участники форума, изучив множество подобных вопросов на разных форумах, не смог найти для себя нужный вариант....

как лучше сделать поля со списком?
в документе есть несколько полей, где данные выбираются из списка. беда в том, что список вероятно будет меняться. До меня все эти списки...

Выбор значения из поля со списком, исходя из предыдущего поля со списком
Дана БД. Форма на добавление данных. Необходимо сделать следующее: 1) В поле "Свободно велосипедов" выводить значение из...

Как на форме при выборе значения из Поля со списком сделать автоматическое выведение значения в другое Поле?
Вечер добрый, господа. :curtsy: Требуется помощь ваша в MS Access, ибо самостоятельное изучение чуда сего происходит семимильными шагами...


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

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Новые блоги и статьи
Изучаю kubernetes
lagorue 13.01.2026
А пригодятся-ли мне знания kubernetes в России?
Сукцессия микоризы: основная теория в виде двух уравнений.
anaschu 11.01.2026
https:/ / rutube. ru/ video/ 7a537f578d808e67a3c6fd818a44a5c4/
WordPad для Windows 11
Jel 10.01.2026
WordPad для Windows 11 — это приложение, которое восстанавливает классический текстовый редактор WordPad в операционной системе Windows 11. После того как Microsoft исключила WordPad из. . .
Classic Notepad for Windows 11
Jel 10.01.2026
Old Classic Notepad for Windows 11 Приложение для Windows 11, позволяющее пользователям вернуть классическую версию текстового редактора «Блокнот» из Windows 10. Программа предоставляет более. . .
Почему дизайн решает?
Neotwalker 09.01.2026
В современном мире, где конкуренция за внимание потребителя достигла пика, дизайн становится мощным инструментом для успеха бренда. Это не просто красивый внешний вид продукта или сайта — это. . .
Модель микоризы: классовый агентный подход 3
anaschu 06.01.2026
aa0a7f55b50dd51c5ec569d2d10c54f6/ O1rJuneU_ls https:/ / vkvideo. ru/ video-115721503_456239114
Owen Logic: О недопустимости использования связки «аналоговый ПИД» + RegKZR
ФедосеевПавел 06.01.2026
Owen Logic: О недопустимости использования связки «аналоговый ПИД» + RegKZR ВВЕДЕНИЕ Введу сокращения: аналоговый ПИД — ПИД регулятор с управляющим выходом в виде числа в диапазоне от 0% до. . .
Модель микоризы: классовый агентный подход 2
anaschu 06.01.2026
репозиторий https:/ / github. com/ shumilovas/ fungi ветка по-частям. коммит Create переделка под биомассу. txt вход sc, но sm считается внутри мицелия. кстати, обьем тоже должен там считаться. . . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru