Компьютерный форум OSzone.net  

Компьютерный форум OSzone.net (http://forum.oszone.net/index.php)
-   Программирование и базы данных (http://forum.oszone.net/forumdisplay.php?f=21)
-   -   Строка БД (таблицы) - ссылка (http://forum.oszone.net/showthread.php?t=95506)

Student00 05-12-2007 21:13 691338

Строка БД (таблицы) - ссылка
 
Есть БД на делфи
Компоненты:
ADOConnection1 - цепанули к БД Accsess
ADOTable1 - Активировали таблицу
ADOQuery1 - сделали запрос к полю naimen, нашей таблицы
DataSource1 - все подконнектили.

Кроче при запуске программы все выводит в DBGridEh1 правильно.

Но возникла необходимость сделать следующее:
Алгоритм:
1) Выделяешь (или как еще можно реализовать это?) некоторую строку(ячейку) из таблицы (DBGridEh1).
2) Жмешь кнопку "Перейти".
3)Происходит переходит на другую форму соответствующую выбранному полю. Но фишка в том, что каждое поле будет иметь СВОЮ форму!

Т.е. проблема в том: Как сделать так чтобы любая строка таблицы (DBGridEh1) была некоторой ссылкой?
Чтобы срабатывала команда типа form2.show;

Ребята, подскажите пожалуйста.

BlackEric 05-12-2007 21:45 691359

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

Student00 05-12-2007 22:27 691388

Как я уже сказал, нужно чтобы либо сама любая строка в DBGridEh1 была кнопкой, либо нужно сделать так, чтобы была возможность каким-либо образом пометить её, что выбрана ТАКАЯ-ТО строка и по средством обычного БуттонКлик Перейти на другую пустую форму
Если фигурально выражаться д/б такая конструкция:
1 строка = 1 форма
2 строка = 2 форма
и.т.д

kim-aa 06-12-2007 11:34 691691

Цитата:

Цитата Student00
Как сделать так чтобы любая строка таблицы (DBGridEh1) была некоторой ссылкой? »

Это невыполнимое требование с точки зрения реляционной алгебры.
Работать вы должны с атомарным значением, т. е. с "пересечением" определенной строки и столбца.
Т. е. вы должны веделить отдельный столбец который будет хранить значения, представляющее собой ссылку (ForignKey)
на строку в отдельной таблице.
В просетйшем случае та таблица будет содержать всего два столбца:
- Первичный ключ.
- Значение.

Как вы "оформите значение" - это уже Ваше дело.
Хотите это будет просто имя формы, хотите ссылка на внешнюю процедуру, хотите BLOB-объект.

Вобще, мой совет, уделите свое время прочтению книги по реляционной математике. Если нет времени на прочтение талмуда типа "Введение в реляционные базы данных", то прочтите какую либо книжку по MS SQL. ваша беда что вы начинаете оперировать в терминах среды програмирования, а это не правильно. Сначала проектируется ЧТО и КАК нужно сделать, а ЧЕМ это дело десятое

Student00 08-12-2007 17:11 693369

Ребят, собственно что мне нужно в итоге?
Создаю Экспертную систему на тему "Выбор бытовой техники".

Алгоритм работы такой:
Пользователь, посредством, меню выбирает варианты ответов на поставленные наводящие вопросы и в итоге получает рекомендацию к покупке того или иного товара.

И ладно бы на пихать Радио кнопок и через if then else реализовать механизм.
Но вся проблема в том, что нужно чтобы пользователь мог во время работы программы редактировать вопросы, ответы. Т.е. мне нужно создать админку к экспертке.

Для этого нужно использовать БД. Я создал БД на Microsoft Office Access (к счастью с этим проблем не возникло).

Далее я хотел сделать следующее (поскольку хоть как-то могу сам это реализовать):
На первой страницы добавить компонент DBGridEh1 в качестве списка-пунктов меню. И посредством ADOConnection1, ADOTable1, ADOQuery1, DataSource1 вывести данные и БД в DBGridEh1 - это мне удалось. Следующим шагом планировал одну запись в таблице БД=как пункт меню, но по некоторым причинам отказался от этого.

Решил попытаться создать меню через компонент RadioGroup1.

И вот тут возникли проблемы:
1) В свойствах этого компонента я не нашел DataSource через который бы я смог подконнектится к АDO.
2) Как реализовать динамически добавляемые радио кнопки в зависимости от количества записей в соответствующей таблице в БД.

Тоесть собственно вопрос состоит в том:
Ребята, подскажите, пожалуйста, как сделать так, чтобы при запуске приложения, программа автоматически осуществляла запрос к указанной таблице в БД и динамически создавала радио кнопки в зависимости от количества записей в таблице, т.е. 1 запись = 1 кнопка с соответствующим наименованием.

ПС. Объяснил как смог ))

BlackEric 09-12-2007 13:20 693754

Идея не верна.
Если будет 10000 записей, то вы будете создавать 10000 кнопок?
Вам нужно создать 2 таблицы
и при выборе записей в одной (мастер) отображать соответствующие ей данные в другой (деталь).
Т.е. гуглите по словам мастер-деталь и смотрите что это такое.

Цитата:

Цитата Student00
ADOTable1, ADOQuery1 »

Лучше использовать ADODataSet.

Dyvne Nihto 02-02-2008 22:48 731721

Цитата:

Цитата Student00
как сделать так, чтобы при запуске приложения, программа автоматически осуществляла запрос к указанной таблице в БД и динамически создавала радио кнопки в зависимости от количества записей в таблице, т.е. 1 запись = 1 кнопка с соответствующим наименованием »

В Access проще всего сделать форму с заведомо достаточным количеством радокнопок, установить свойство visible в false, а при открытии делать видимыми только нужные.

Цитата:

Цитата Student00
3)Происходит переходит на другую форму соответствующую выбранному полю. Но фишка в том, что каждое поле будет иметь СВОЮ форму! »

В Access команда DoCmd.OpenForm требует имя формы как строку. Добавь в таблицу строковое поле "Имя Формы" и передавай его значение.

Student00 03-02-2008 13:14 731912

Спасибо конечно, но все уже реализовано посредством запроса к файлам ini ))

Student00 04-02-2008 10:41 732442

Ребят, все что выше это ерунда.
*.ini - идея тоже практически провалилась.

Вобще делаю экспертную систему. Выбор бытовой техники.
Просьба скачать файл прежде чем читать дальше

1) Как видно на первой странице мы в компонент DBLookupComboBox1 из BD.mdb присваиваем значения из таблицы "kat".
2) Переходим на следующую страницу и начинаются проблемы:
Компонент DBLookupListBox1 должен отображать список вопросов, соответствующих выбранной на первом шаге категории. Для этого он обращается к таблице "vopros", но выводятся все вопросы какие есть в таблице.

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

BlackEric 04-02-2008 12:37 732510

1. DBLookupComboBox1 - убрать. LookUpы - зло и на больших объемах тормозят. Используйте обычный ComboBox.
2. При выборе значения в Combobox открываете запрос к таблице вопрос ручками с where kat='что нужно' и отбображаете результат запроса .

P.S. Rara нет. Хотите чтобы смотрел - перепакуйте в zip или другой свободный формат.

Student00 04-02-2008 13:37 732547

Сделал. Теперь есть нормальная связь между компонентами DBLookupComboBox1 и DBLookupListBox1.

В компоненте DBLookupListBox1 выводиться список. В перспективе д/б так. Пользователь выбирает строку (вопрос), т.е. совершает событие onClick
Согласно выделенному вопросу подгружаются варианты ответов (DBRadioGroup1).

Но проблема возникла на первом этапе - компонент DBLookupListBox1 выделяет сразу все строки (все вопросы).
Как сделать так, что бы выделялась каждая строка я незнаю. Ребят, подскажите плз!


ПС.
БД будет не большая (учебная), DBLookupComboBox1 уже настроил подключил (да и легче его настроить) так что пусть будет он.

BlackEric 04-02-2008 14:09 732573

Вечером дома если до компа доберусь то посмотрю, но по чтению исходников - мама!!!!!!!!!

Student00 04-02-2008 15:15 732618

И опять решил проблему, оказывается в KeyField не то ключевое поле поставил.
Правда вопрос с тем, чтобы:
Цитата:

Согласно выделенному вопросу подгружаются варианты ответов (DBRadioGroup1).
попрежнему висит в воздухе

Student00 04-02-2008 16:11 732662

Тоесть проблема в том, чтобы при клике на одну из строк DBLookupListBox1
Происходил запрос в БД в таблицу otvet и от туда брались ответы соответствующие вопросам.
И в компоненте DBRadioGroup1 динамически добалялось то количество кнопок, которое соответствовало бы ответом на выбранный вопрос.

Student00 04-02-2008 21:17 732902

Код:

procedure TForm1.DBLookupListBox1Click(Sender: TObject);
begin
while ADOTableRadio1.Eof <> true do
begin
DBRadioGroup1.Items.Add('select count(*) from otvet where id_vopros = :id_vopros');
end;
end;

Вроде бы программа запускается, но когда совершаю указанное событие - зависает и в месте, где д/б радио кнопки - что-то похожее на вкл/выкл - мерцание.

Student00 05-02-2008 18:17 733637

Вопрос, был решен так:
Код:

procedure TForm1.DBLookupListBox1Click(Sender: TObject);
begin
  DBRadioGroup1.Items.Clear;
        ADOTableRadio1.First;
  while not ADOTableRadio1.Eof do
  begin
        DBRadioGroup1.Items.Add(ADOTableRadio1.FieldValues['otvet']);
        ADOTableRadio1.Next;
  end;
end;


Student00 07-02-2008 17:52 735139

Ребят, подскажите плз как сделать так, чтобы на событие DBRadioGroup1Click
Значения записывались в указанную таблицу в БД.

Т.е. Кинул на форму компонент ADOTable1, который связан с этой таблицей. Теперь НАВЕРНОЕ надо найти метод этого компонента, который бы позволил при совершении указанного события записать значение (индекс) в таблицу log в БД.
Возможно нужно использовать другой компонент...

Код:

procedure TForm1.DBRadioGroup1Click(Sender: TObject);
begin
//ADOTable1. ??????????????
//DBRadioGroup1.??????????????
end;


BlackEric 07-02-2008 18:43 735160

SQL : Insert Into....
Вызываете...

Это курсак или реальная програ? Если реальная о не используйте DB-aware компоненты. Намучаетесь.

Dyvne Nihto 07-02-2008 20:09 735224

Цитата:

Цитата BlackEric
SQL : Insert Into....
»

Это если нужной записи еще нет. Если есть, то либо Update..., либо Insert Into.... в комбинации с Delete From....

В любом случае
DoCmd.RunSQL "текстзапроса; "

А кстати: что - у этого DBRadioGroup нету свойства DataSource - ее нельзя просто привязать к полю в таблице?

Student00 07-02-2008 20:11 735228

Цитата:

Это курсак или реальная програ? Если реальная о не используйте DB-aware компоненты. Намучаетесь.
Это даже не курсак - а лаба. )) А вообще - TBRadioGroup, TDBLookupListBox, TDBLookupComboBox, ... именно такие компоненты лучше не использовать?
А почему? ))

Цитата:

SQL : Insert Into....
Вызываете...
Могли бы пожалуйста уточнить:
Нужно бросить на форуму компонент ТADOQuery? Запрос прописывать в свойстве SQL или в коде? Или и там и там?

Student00 07-02-2008 20:37 735262

Цитата:

Цитата Dyvne Nihto
А кстати: что - у этого DBRadioGroup нету свойства DataSource - ее нельзя просто привязать к полю в таблице? »

Есть но оно уже занято для того чтобы динамически добавлять кнопки - из другой таблицы берет ответы и добавляет.

Да кстати я пробовал отдельно создал одну таблицу, бросил радио подцепил у этой таблице и нихрена

BlackEric 07-02-2008 23:33 735415

1. Используйте не ADOQuery или Table, а ADODataSet.
2. Запрос можно прописать в конструкторе, а можно и в коде
3. Вы можете динамически изменять значение свойства DataSource.
4. Лучше использовать обычные компоненты и весь SQL прописывать ручками.


Время: 02:01.

Время: 02:01.
© OSzone.net 2001-