Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Delphi: Базы данных и репортинг > Как передать значения колонки DBGrid ComboBox-у!?


Автор: Rodeon 29.1.2009, 21:29
Имееться база db1.mdb, в ней несколько таблиц T1, T2, T3 и т.д.
Список таблиц фиксированный, имена их тоже фиксированны!
В одних таблицах содержаться данные, в других параметры и списки для этих самых данных!
Сама таблица открываеться замечательно на редактирование, но встала проблемма, при добавлении новой записи к таблице данных не в ручную каждый раз вводить данные, а данные брались бы из этой же базы из таблицы параметров!
Таблица параметров как например!
---------------------------------------------------------------------------------------------
: Идентификатор : Поле : Цвет : Параметр : и. т.д.
---------------------------------------------------------------------------------------------
:             1             :  0.01 :   ГБ   :     СВД       : и т.д
---------------------------------------------------------------------------------------------
:             2             :  0.02 :   БГ   :     СВД       : и т.д
---------------------------------------------------------------------------------------------
:             3             :  0.02 :   ГЖ  :     СВД       : и т.д
---------------------------------------------------------------------------------------------
:             4             :  0.01 :   ЛБ   :     УМК       : и т.д
---------------------------------------------------------------------------------------------
:             5             :  0.03 :   МБ   :     ТГВ       : и т.д
и.т.д

Дохожу до заголовка заблицы:
ADOConnection.GetTableNames(ComboBox.Items);
...
ADOConnection.GetFieldNames(ComboBox.Text, ComboBox1.Items);
Пробую данные колонки передать в еще один Combobox:
adotable.TableName:='Etalon0';
adotable.Active:=true;
Пробую и так, но это лишь заголовки колонок выдает!
ComboBox2.Items:=adotable.FieldDefList;
А так вообще ничего не дает!?
ComboBox2.Items:=dbgrid.Columns.Items[1].PickList;

Подскажите плиз. как реализовать такое!

Автор: Akella 29.1.2009, 23:43
Как я понял, то у тебя есть таблица основная и таблицы-справочники?

Автор: Rodeon 30.1.2009, 00:57
Да, все правильно! и основная таблица, которых несколько и справочники к ним храняться в одной базе! заполняю их и сейчас, но многие данные повторяються и каждый раз их приходиться вбивать заново в новую строку в таблице, что нецелесообразно и времени тратиться больше! Хотелось бы что бы при открытии базы в нухные combobox-ы азгружались колонки данных с таблиц. Может есть какая нибудь функция натипо этих:
ADOConnection.GetTableNames(ComboBox.Items);
ADOConnection.GetFieldNames(ComboBox.Text, ComboBox1.Items);
только что бы саму колонку данных передавала в ComboBox!?

Автор: Akella 30.1.2009, 17:15
Есть основная таблица apart, в которой есть поля: ID, Input_Date, ID_TYPE

ID_TYPE - это поле справочника

Есть справочник TYPES, в котором только 2 поля ID и Name

Так вот, пользователь в выпадающем списке видит значения поля Name из таблицы TYPES.
Цитата

___ID_____|____NAME_____
10_____________|Первый тип___
11_____________|Второй тип___
12_____________|Третий тип___



Допустим, что пользователь выбрал какую-то строку из списка: id = 10, Name = 'Первый тип'. Теперь наша задача, как программистов присвоить основной таблице полю ID_TYPE какое значение?? Правильно - 10.

Выпадающий список соединяем с набором данных, в наборе данных такой запрос:
Код
select id, name from types


Теперь когда пользователь выберет что-то из списка, то будет видеть поле Name при соответствубщей настройке выпадающего списка - DBCombobox.

При редактировании основной таблицы мы присвоим значение поля ID справочной таблицы, полю ID_TYPE основной таблицы.

И в основной таблице будет запись
Цитата

ID |  Input_Date| ID_TYPE
----------------------------------
1  |  30.01.2009| 10

Автор: Rodeon 30.1.2009, 19:13
В принципе направление правильное, но немного не то, что я имел ввиду!
Вот таблица в архиве! db.mdb
Для уменьшения объема удалил несколько таблиц!
Таблица в базе T_18 - это таблица данных!
Поля в ней (балл, цвет и битумоид) можно заполнять вручную, а можно было бы из списка, заранее загруженного брать!
Для поля (балл) все возможные комбинации храняться в другой таблице D1_35 в колонке "код" комменты к ним в колонке "Наименнование"
Для поля (цвет) все возможные комбинации храняться в другой таблице D1_36 в колонке "код" комменты к ним в колонке "Наименнование"
Для поля (битумоид) все возможные комбинации храняться в другой таблице D1_37 в колонке "код" комменты к ним в колонке "Наименнование"
и вот когда будет создаваться новая запись в таблице T_18, указываеться вручную "кровля", "подошва" а (балл, цвет и битумоид) хотелось бы что-бы брались с выбранных в ComboBox-ах! А вот как в них загрузить данные из таблиц я не знаю!?
Т.е. как из таблиц D1_35, D1_36, D1_37 с колонок "код" передать все значения в соответствующие Combobox-ы!?

Автор: Akella 30.1.2009, 20:28
Ты уж извини, у меня нет времени да и желания (( разбираться в твоей базе.

Автор: Rodeon 30.1.2009, 20:34
Ну может есть тогда функция какая передать данные со всей колонки из таблицы и занести их в combobox или присвоить значение колонки combobox-у?

Автор: Akella 30.1.2009, 20:41
Цитата(Rodeon @  30.1.2009,  20:34 Найти цитируемый пост)
Ну может есть тогда функция какая передать данные со всей колонки из таблицы и занести их в combobox 

 smile  дык в цикле по таблице и заполняй комбобокс, в чём проблема-то?
это всего несколько строк кода

Добавлено через 5 минут и 31 секунду
Цитата(Rodeon @  30.1.2009,  20:34 Найти цитируемый пост)
присвоить значение колонки

Колонки чего? Грида? Советую работать не с гридом, а с набором данных.
http://forum.vingrad.ru/index.php?showtopic=245107&view=findpost&p=1767484

Автор: Данкинг 30.1.2009, 20:49
Цитата(Akella @  30.1.2009,  20:41 Найти цитируемый пост)
дык в цикле по таблице и заполняй комбобокс, в чём проблема-то?

Проблема тут в скорости будет, если число записей соответствующее. Но другого способа я лично не вижу...

Автор: Пикачу 30.1.2009, 22:03
Цитата(Rodeon @ 30.1.2009,  20:34)
Ну может есть тогда функция какая передать данные со всей колонки из таблицы и занести их в combobox или присвоить значение колонки combobox-у?

Rodeon У меня не много опыта в программировании, это больше хоби чем работа.
Я  поступил так.  Может это и не оптимальный код и при большом количестве данных займет много времени, не знаю. У меня заполняло около 600 значений довольно быстро. 

Код

 with QueryMark do begin   {Создадим SQL запрос для считавания маркировок}
      Active:=false; 
      ConnectionString:='Provider=MSDAORA.1;Password=*****;User ID=****;Data Source=dbsbase; Persist Security Info=True'; {Укажем строку подключения} 
        with SQL do begin 
          Clear; {Очистим SQL запрос}
          Add('SELECT MARK FROM SKU'); {Выберем поле маркировок}
        end;
      Active := True; {Активируем}
      First; {Укажем на первую запись}
  end;
    {Очистим комбобокс статуса и считаем в него данные и добавим свое значение}
    ComboS.Items.Clear; {Очищаем}
    ComboS.Items.Add('Все Маркировки'); {Дополняем своим значением}
  While not QueryMark.EOF do
    begin
      ComboS.Items.Add(QueryMark.FieldByName('MARK').AsString); {Заполняем комбобокс значениями}
      QueryMark.Next;
    end;
      ComboS.ItemIndex :=0; {Установим в комбобоксе первое значение}
    

Автор: Rodeon 30.1.2009, 22:30
Забыл сказать, я в грид только вывожу данные а работаю как раз с набором!
Akella спасибо большое за ответ, то что нужно было!
ComboBox2.Items.Add(ADOTable.FieldList.Fields[1].asString);
Я оказываеться путал местами:
писал ADOTable.Fields[1] и пытался подобрать дальше метод...

Спасибо всем:
вот что вышло в итоге:
Код

For i:= 0 to Adotable.RecordCount-1 do begin
ComboBox2.Items.Add(ADOTable.Fields[0].AsString);
adotable.Next;
end;


Пикачу, вам также спасибо, но пока я писал свое сообщение вы уже опубликовали свое!  smile 

Akella правильно? Вы про эти несколько строк писали?

Автор: Akella 30.1.2009, 22:32
Цитата(Данкинг @  30.1.2009,  20:49 Найти цитируемый пост)
Проблема тут в скорости будет, если число записей соответствующее. Но другого способа я лично не вижу...

Не будет проблем в скорости.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)