Форум программистов, компьютерный форум, киберфорум
Delphi: Базы данных
Войти
Регистрация
Восстановить пароль
 
Рейтинг 5.00/15: Рейтинг темы: голосов - 15, средняя оценка - 5.00
0 / 0 / 0
Регистрация: 07.02.2016
Сообщений: 13
1

DBComboBox заполнение из таблицы

25.02.2016, 21:12. Просмотров 2975. Ответов 18
Метки нет (Все метки)

Здравствуйте. Занимаюсь разработкой кабельного журнала. При тестировании столкнулся с проблемой, что у некоторых пользователей возникают трудности при добавлении записи в журнал, через Edit. Поэтому я подумал попробовать заполнение полей из DBComboBox.
Таблица следующая: корпус, этаж, кабинет, розетка .... вот основные. Возникает проблема в том, что в списке DBComboBox записи такие, что если мы выбрали корпус, то в списке DBComboBox должны отображаться только этажи выбранного корпуса, соответственно, если выбран этаж, то кабинеты только этого этажа.
Конечно, без связанных таблиц не обойтись! Подскажите пожалуйста, какие мне таблицы нужно сделать какими полями, как связать?
В программе работают две таблицы: при выборе кабинета в основной табл, в дочерней таблице хранится схема этого кабинета.
Но в случае DBComboBox, поле связано с предыдущим полем.
0
Миниатюры
DBComboBox заполнение из таблицы  
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
25.02.2016, 21:12
Ответы с готовыми решениями:

Заполнение DbCombobox данными одного из столбцов таблицы БД
Вот у меня имеется DBCombobox я хочу чтобы в его выпадающий список образовывался из поля которое...

Заполнение DBComboBox!
Надо чтобы у каждого товара был свой собственный набор цен в DBComboBox (прилагаю небольшую прогу,...

Связь DBComboBox и DBGrid - в DBComboBox только одна запись
Всем привет) я сделала связь DBComboBox и DBGrid. Но почему то у меня в DBComboBox появилась только...

Выборка строк таблицы по значениям столбца через начения в DBComboBox
Задача в следующем(возможно банальна(не судите строго)): 1) Есть таблица DBGrid 'Ispolnenie' в ней...

18
2040 / 1203 / 426
Регистрация: 29.05.2013
Сообщений: 5,402
25.02.2016, 21:33 2
Что-бы что-то умное посоветовать, надо быть в вашей теме. Я только предположить могу, что, где, как и скока.
1. Предполагаю, что есть таблица с перечнем помещений (Здание,Этаж,Кабинет)
2. Логика подсказывает, что по кабинетам проложены кабели (Кабинет, Кабель№)
3. Та же логика говорит, что кабель имеет хвост на котором висит какой-то оконечник-розетка. (Кабель,Розетка)
3.1. Допускаю, что на одном кабеле может быть несколько розеток, тогда (Кабель,Провод,Розетка)

Вот пока все мои предположения
1
0 / 0 / 0
Регистрация: 07.02.2016
Сообщений: 13
25.02.2016, 22:15  [ТС] 3
Мне хотя бы первые 4 поля чтобы работали. А остальные они так в ручную заполнить можно. После выбора корпуса в dbcombobox1, далее в dbcombobox2 в списке выбираем уже этажи из этого корпуса, далее кабинеты dbcombobox3, они уже из этажа который выбрали в dbcombobox2
0
2040 / 1203 / 426
Регистрация: 29.05.2013
Сообщений: 5,402
26.02.2016, 00:39 4
Ну для здания то я сделаю, там не сложно - связь понятна. А вот с чем связана розетка? Что это за обозначение, оно имеет какое-то отношение к конкретному кабинету?
0
0 / 0 / 0
Регистрация: 07.02.2016
Сообщений: 13
26.02.2016, 04:27  [ТС] 5
Да, получается есть корпуса, они разные ( к примеру, в одном 2 этажа в другом 3). Мы выбираем корпус в dbcombobox1, а в dbcombobox2 мы выбираем этажи(к выбранному корпусу), далее выбираем кабинет в dbcombobox3. Кабинет также из выбранного этажа в dbcombobox2. В каждом кабинете имеются компьютерные и телефонные розетки. У которых маркировка даже отличается. В dbcombobox4 мы выбираем розетку соответствующего кабинета. Если Вы мне это покажете как и что, и с чего начинать. Дальше я бы сам его доделал.
0
660 / 552 / 240
Регистрация: 26.11.2012
Сообщений: 2,181
26.02.2016, 08:16 6
Цитата Сообщение от Asylguzin Посмотреть сообщение
Подскажите пожалуйста, какие мне таблицы нужно сделать какими полями, как связать?
Одна таблица - одна сущность.
Например таблица корпус - housing или Korpus
Наименовать таблиц и полей рекоменуется именовать в инглише без пробелов

Не по теме:


Анекдот
-уменянеработаетпробел
-настоящему_программисту_пробел_не_нужен



ID_housing : Integer - индификатор таблицы или попростому нумерация
Name_housing : varchar - название корпуса
count_floors : integer - кол-во этажей
prim : varchar - примечание

теперь следующая таблица этажи - floors
ID_floors :integer
ID_housing : integer - поле для связи с таблицей housing
count_rooms : integer - кол-во комнат на этаже
и т.д.
в коде программы останется использовать так называемую связку master-detail. По этому поводу много пример в инете.
1
0 / 0 / 0
Регистрация: 07.02.2016
Сообщений: 13
26.02.2016, 10:07  [ТС] 7
В программе работают две таблицы: при выборе кабинета в основной табл, в дочерней таблице хранится схема этого кабинета.
Но в случае DBComboBox, поле связано с предыдущим полем.

Тоже самое что и Вы написали. Но в случае с DBComboBox. на одной форме их будет несколько около 7. и каждый из них связан спредыдущей. Items заполняется у каждого из разных таблиц, которые между собой связаны. При помощи этой формы, и выбранных значений DBComboBox заполняется основная таблица.
0
3479 / 2970 / 799
Регистрация: 29.08.2013
Сообщений: 19,885
Записей в блоге: 1
26.02.2016, 10:56 8
форма показывает что вы уже отошли от принципа "1 действие - 1 форма"
и это хорошо
но до "отлично" еще далеко
представьте что вы пользователь и вам нужно в день забить 200 чего-то там.
каждый раз кликать по вашим эдитам и комбобоксам, читать подписи и прочее и прочее - просто посчитайте сколько раз пользователю нужно нажать на комбобокс для выбора значения что бы полностью заполнить форму. А потом еще клинуть в эдит, перенести руку с мышки на клаву и ввести данные. А если у него еще английский включается каждый раз...

вы должны не заставлять пользователя вводить данные, а только помогать ему их вводить
в соответствии с эти м и надо разрабатывать дизайн и используемые компоненты
1
0 / 0 / 0
Регистрация: 07.02.2016
Сообщений: 13
26.02.2016, 11:44  [ТС] 9
Что не так? что предлагаете?
заполнять таблицу пользователи этой программы не будут. его нужно заполнить один раз. далее программа будет использоваться только как "справочник". единственное пользователю может быть придется поменять розетки местами (т.е. значения всех остальных полей будет оставаться, а значение номер розетки меняться)
0
2040 / 1203 / 426
Регистрация: 29.05.2013
Сообщений: 5,402
26.02.2016, 11:55 10
В общем все примерно так. Вот скажем схема данных и код формы с элементами, которые дадут вам нужное подчинение:
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
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
object Form4: TForm4
  Left = 0
  Top = 0
  Caption = 'Form4'
  ClientHeight = 336
  ClientWidth = 470
  Color = clBtnFace
  Font.Charset = DEFAULT_CHARSET
  Font.Color = clWindowText
  Font.Height = -11
  Font.Name = 'Tahoma'
  Font.Style = []
  OldCreateOrder = False
  PixelsPerInch = 96
  TextHeight = 13
  object Label1: TLabel
    Left = 8
    Top = 8
    Width = 37
    Height = 13
    Caption = #1047#1076#1072#1085#1080#1077
    FocusControl = DBLookupComboBox1
  end
  object Label2: TLabel
    Left = 8
    Top = 43
    Width = 27
    Height = 13
    Caption = #1069#1090#1072#1078
    FocusControl = DBLookupComboBox1
  end
  object Label3: TLabel
    Left = 89
    Top = 43
    Width = 43
    Height = 13
    Caption = #1050#1072#1073#1080#1085#1077#1090
    FocusControl = DBLookupComboBox1
  end
  object Label4: TLabel
    Left = 158
    Top = 43
    Width = 41
    Height = 13
    Caption = #1056#1086#1079#1077#1090#1082#1072
    FocusControl = DBLookupComboBox1
  end
  object DBLookupComboBox1: TDBLookupComboBox
    Left = 8
    Top = 22
    Width = 254
    Height = 21
    KeyField = 'BuildingId'
    ListField = 'Building'
    ListSource = dsBuilding
    TabOrder = 0
  end
  object DBLookupComboBox2: TDBLookupComboBox
    Left = 8
    Top = 56
    Width = 70
    Height = 21
    KeyField = 'FloorId'
    ListField = 'Floor'
    ListSource = dsFloor
    TabOrder = 1
  end
  object DBLookupComboBox3: TDBLookupComboBox
    Left = 84
    Top = 56
    Width = 68
    Height = 21
    KeyField = 'RoomId'
    ListField = 'Room'
    ListSource = dsRoom
    TabOrder = 2
  end
  object DBLookupComboBox4: TDBLookupComboBox
    Left = 158
    Top = 56
    Width = 73
    Height = 21
    KeyField = 'SocketId'
    ListField = 'Socket'
    ListSource = dsSocket
    TabOrder = 3
  end
  object AppDB: TADOConnection
    Connected = True
    ConnectionString = 
      'Provider=Microsoft.Jet.OLEDB.4.0;Data Source=C:\Users\Master\Doc' +
      'uments\Embarcadero\Studio\Projects\DataBase.mdb;Persist Security' +
      ' Info=False'
    LoginPrompt = False
    Mode = cmShareDenyNone
    Provider = 'Microsoft.Jet.OLEDB.4.0'
    Left = 304
    Top = 16
  end
  object tblBuilding: TADOTable
    Active = True
    Connection = AppDB
    CursorType = ctStatic
    TableName = 'Building'
    Left = 360
    Top = 16
  end
  object dsBuilding: TDataSource
    DataSet = tblBuilding
    Left = 424
    Top = 16
  end
  object tblFloor: TADOTable
    Active = True
    Connection = AppDB
    CursorType = ctStatic
    IndexFieldNames = 'BuildingID'
    MasterFields = 'BuildingId'
    MasterSource = dsBuilding
    TableName = 'Floor'
    Left = 360
    Top = 64
  end
  object dsFloor: TDataSource
    DataSet = tblFloor
    Left = 424
    Top = 64
  end
  object tblRoom: TADOTable
    Active = True
    Connection = AppDB
    CursorType = ctStatic
    IndexFieldNames = 'FloorID'
    MasterFields = 'FloorId'
    MasterSource = dsFloor
    TableName = 'Room'
    Left = 360
    Top = 112
  end
  object dsRoom: TDataSource
    DataSet = tblRoom
    Left = 424
    Top = 112
  end
  object tblSocket: TADOTable
    Active = True
    Connection = AppDB
    CursorType = ctStatic
    IndexFieldNames = 'RoomId'
    MasterFields = 'RoomId'
    MasterSource = dsRoom
    TableName = 'Socket'
    Left = 360
    Top = 160
  end
  object dsSocket: TDataSource
    DataSet = tblSocket
    Left = 424
    Top = 160
  end
end
1
Миниатюры
DBComboBox заполнение из таблицы  
3479 / 2970 / 799
Регистрация: 29.08.2013
Сообщений: 19,885
Записей в блоге: 1
26.02.2016, 11:58 11
предлагаю использовать ListBox
когда от пользователя нужно что то выбрать, то нужно по максимуму убрать самостоятельный ввод

Открывается форма на ListBox выводим площадку, пользователь кликает
далее так же выводим список этажей
далее список кабинетов

пара на плинте - можно - список пар (вы ведь можете вести полный список и пользователю отдавать только свободные?)
так же и все остальное

один, максимум 2 ListBox
вместо эдитов для ввида цифр использовать SpinEdit
когда пользователь нажимает Сохранить (кнопки должны быть ВНИЗУ, если вверху, то нужно их отделить - поместить на панель, лучше придумать горячие клавиши)
1
0 / 0 / 0
Регистрация: 07.02.2016
Сообщений: 13
27.02.2016, 10:28  [ТС] 12
Пытливый, спасибо за подробный ответ. опишите пожалуйста схему таблиц. Rolmld и roomId чем отличаются? как заполнять таблицы?
0
2040 / 1203 / 426
Регистрация: 29.05.2013
Сообщений: 5,402
27.02.2016, 12:45 13
Ну да, базу я забыл приложить. Вот держите все в комплекте.
1
Вложения
Тип файла: rar DataBase.rar (13.8 Кб, 19 просмотров)
0 / 0 / 0
Регистрация: 07.02.2016
Сообщений: 13
27.02.2016, 15:19  [ТС] 14
Все что Вы отправили это все подробно и все понятно, все работает. спасибо. Но ведь есть 5 таблица которая заполняется при помощи этих DBLookupBox. Сами они DBLookupBox -ы берут значения из разных таблиц, но при этом заполняется 5 таблица - основная, которую видят пользователи. как их еще привязать к определенным полям 5 таблицы.
0
Миниатюры
DBComboBox заполнение из таблицы   DBComboBox заполнение из таблицы  
3479 / 2970 / 799
Регистрация: 29.08.2013
Сообщений: 19,885
Записей в блоге: 1
27.02.2016, 15:26 15
Лучший ответ Сообщение было отмечено Asylguzin как решение

Решение

ужас
все это можно заменить на один AdvStringGrid
0
2040 / 1203 / 426
Регистрация: 29.05.2013
Сообщений: 5,402
27.02.2016, 16:58 16
Лучший ответ Сообщение было отмечено Asylguzin как решение

Решение

Да все элементарно. После того как пользователь сделал выбор Корпуса,Этажа,Кабинета,Розетки вы просто вносите в итоговую таблицу текущие значения для Корпуса,Этажа,Кабинета,Розетки. В моей базе этой итоговой таблицы нет, но она может выглядеть так:
Abonent(BuildingID,FloorID,RoomID,SocketID и еще какие-то ваши поля). И на кнопку "Сохранить" вешаем событие:
Delphi
1
2
3
4
5
6
7
8
9
procedure TForm4.Button1Click(Sender: TObject);
begin
 tblAbonent.Append;
 tblAbonent['BuildingId'] := tblBuilding['BuildingId'];
 tblAbonent['FloorId'] := tblFloor['FloorId'];
 tblAbonent['RoomId'] := tblRoom['RoomId'];
 tblAbonent['SocketId'] := tblSocket['SocketId'];
 tblAbonent.Post;
end;
Добавлено через 19 минут
И еще если вы не в курсе, то в стандартном гриде есть поддержка лукап-полей. Так-что если вас смущают коды, то их можно вполне красиво оформить с помощью этого инструментария.
1
0 / 0 / 0
Регистрация: 07.02.2016
Сообщений: 13
27.02.2016, 17:32  [ТС] 17
Да, это я потом понял. Спасибо.
Перед запуском проекта выходит "Аргументы имеют неверный тип, выходят за пределы допустимого значения, или вступают в конфликт друг с другом"
Как мне настроить ADOConnection, чтобы базу он искал в той папке где проект?
0
3479 / 2970 / 799
Регистрация: 29.08.2013
Сообщений: 19,885
Записей в блоге: 1
27.02.2016, 17:45 18
Asylguzin, ConnectionString редактируйте
1
2040 / 1203 / 426
Регистрация: 29.05.2013
Сообщений: 5,402
27.02.2016, 21:46 19
Я обычно подключение к БД делаю так:
Delphi
1
2
3
4
5
6
7
8
Const
  ConnectionString = 'Provider=Microsoft.Jet.OLEDB.4.0;Persist Security Info=False;Data Source=%s\' + DatabaseFileName;
begin
 AdoDB := TAdoConnection.Create(nil);
 AdoDB.LoginPrompt := False;
 AdoDB.CursorLocation := clUseServer;
 AdoDB.ConnectionString := Format(ConnectionString, [ExtractFileDir(ParamStr(0))]);
...
1
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
27.02.2016, 21:46

Заказываю контрольные, курсовые, дипломные и любые другие студенческие работы здесь.

Как сделать Чтобы При выборе строчки в DBComboBOx в переменную присваивалось значение из другой таблицы
Есть таблица tube_int (с полями id, radius,id_material1,opus) и таблица material ( с полями...

Заполнение детальной таблицы, не имея мастер таблицы
Здравствуйте. Столкнулся при разработке со следующей проблемой. Пользователь нажимает кнопку...

Заполнение таблицы
Здравствуйте я заполняю таблицу данными из бд через запрос Query7.SQL.Clear; ...

заполнение таблицы
Есть диапазон номеров билетов 000127-000210. Как внести в таблицу БД(Paradox) эти номера в таком...


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

Или воспользуйтесь поиском по форуму:
19
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2021, vBulletin Solutions, Inc.