Показать полную графическую версию : Строка БД (таблицы) - ссылка
Student00
05-12-2007, 21:13
Есть БД на делфи
Компоненты:
ADOConnection1 - цепанули к БД Accsess
ADOTable1 - Активировали таблицу
ADOQuery1 - сделали запрос к полю naimen, нашей таблицы
DataSource1 - все подконнектили.
Кроче при запуске программы все выводит в DBGridEh1 правильно.
Но возникла необходимость сделать следующее:
Алгоритм:
1) Выделяешь (или как еще можно реализовать это?) некоторую строку(ячейку) из таблицы (DBGridEh1).
2) Жмешь кнопку "Перейти".
3)Происходит переходит на другую форму соответствующую выбранному полю. Но фишка в том, что каждое поле будет иметь СВОЮ форму!
Т.е. проблема в том: Как сделать так чтобы любая строка таблицы (DBGridEh1) была некоторой ссылкой?
Чтобы срабатывала команда типа form2.show;
Ребята, подскажите пожалуйста.
BlackEric
05-12-2007, 21:45
Вамнужно просто показать пустую форму? Подробнее распишите, что должно быть в результате перехода.
Student00
05-12-2007, 22:27
Как я уже сказал, нужно чтобы либо сама любая строка в DBGridEh1 была кнопкой, либо нужно сделать так, чтобы была возможность каким-либо образом пометить её, что выбрана ТАКАЯ-ТО строка и по средством обычного БуттонКлик Перейти на другую пустую форму
Если фигурально выражаться д/б такая конструкция:
1 строка = 1 форма
2 строка = 2 форма
и.т.д
Как сделать так чтобы любая строка таблицы (DBGridEh1) была некоторой ссылкой? »
Это невыполнимое требование с точки зрения реляционной алгебры.
Работать вы должны с атомарным значением, т. е. с "пересечением" определенной строки и столбца.
Т. е. вы должны веделить отдельный столбец который будет хранить значения, представляющее собой ссылку (ForignKey)
на строку в отдельной таблице.
В просетйшем случае та таблица будет содержать всего два столбца:
- Первичный ключ.
- Значение.
Как вы "оформите значение" - это уже Ваше дело.
Хотите это будет просто имя формы, хотите ссылка на внешнюю процедуру, хотите BLOB-объект.
Вобще, мой совет, уделите свое время прочтению книги по реляционной математике. Если нет времени на прочтение талмуда типа "Введение в реляционные базы данных", то прочтите какую либо книжку по MS SQL. ваша беда что вы начинаете оперировать в терминах среды програмирования, а это не правильно. Сначала проектируется ЧТО и КАК нужно сделать, а ЧЕМ это дело десятое
Student00
08-12-2007, 17:11
Ребят, собственно что мне нужно в итоге?
Создаю Экспертную систему на тему "Выбор бытовой техники".
Алгоритм работы такой:
Пользователь, посредством, меню выбирает варианты ответов на поставленные наводящие вопросы и в итоге получает рекомендацию к покупке того или иного товара.
И ладно бы на пихать Радио кнопок и через 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
Идея не верна.
Если будет 10000 записей, то вы будете создавать 10000 кнопок?
Вам нужно создать 2 таблицы
и при выборе записей в одной (мастер) отображать соответствующие ей данные в другой (деталь).
Т.е. гуглите по словам мастер-деталь и смотрите что это такое.
ADOTable1, ADOQuery1 »
Лучше использовать ADODataSet.
Dyvne Nihto
02-02-2008, 22:48
как сделать так, чтобы при запуске приложения, программа автоматически осуществляла запрос к указанной таблице в БД и динамически создавала радио кнопки в зависимости от количества записей в таблице, т.е. 1 запись = 1 кнопка с соответствующим наименованием »
В Access проще всего сделать форму с заведомо достаточным количеством радокнопок, установить свойство visible в false, а при открытии делать видимыми только нужные.
3)Происходит переходит на другую форму соответствующую выбранному полю. Но фишка в том, что каждое поле будет иметь СВОЮ форму! »
В Access команда DoCmd.OpenForm требует имя формы как строку. Добавь в таблицу строковое поле "Имя Формы" и передавай его значение.
Student00
03-02-2008, 13:14
Спасибо конечно, но все уже реализовано посредством запроса к файлам ini ))
Student00
04-02-2008, 10:41
Ребят, все что выше это ерунда.
*.ini - идея тоже практически провалилась.
Вобще делаю экспертную систему. Выбор бытовой техники.
Просьба скачать файл прежде чем читать дальше
1) Как видно на первой странице мы в компонент DBLookupComboBox1 из BD.mdb присваиваем значения из таблицы "kat".
2) Переходим на следующую страницу и начинаются проблемы:
Компонент DBLookupListBox1 должен отображать список вопросов, соответствующих выбранной на первом шаге категории. Для этого он обращается к таблице "vopros", но выводятся все вопросы какие есть в таблице.
Подскажите пожалуйста что нужно сделать чтобы было как должно быть. Возможно нужно подругому организовать БД, возможно нужно что-то сделать (прописать в коде, либо может компонент какой бросить или заменить) - я не знаю.
BlackEric
04-02-2008, 12:37
1. DBLookupComboBox1 - убрать. LookUpы - зло и на больших объемах тормозят. Используйте обычный ComboBox.
2. При выборе значения в Combobox открываете запрос к таблице вопрос ручками с where kat='что нужно' и отбображаете результат запроса .
P.S. Rara нет. Хотите чтобы смотрел - перепакуйте в zip или другой свободный формат.
Student00
04-02-2008, 13:37
Сделал. Теперь есть нормальная связь между компонентами DBLookupComboBox1 и DBLookupListBox1.
В компоненте DBLookupListBox1 выводиться список. В перспективе д/б так. Пользователь выбирает строку (вопрос), т.е. совершает событие onClick
Согласно выделенному вопросу подгружаются варианты ответов (DBRadioGroup1).
Но проблема возникла на первом этапе - компонент DBLookupListBox1 выделяет сразу все строки (все вопросы).
Как сделать так, что бы выделялась каждая строка я незнаю. Ребят, подскажите плз!
ПС.
БД будет не большая (учебная), DBLookupComboBox1 уже настроил подключил (да и легче его настроить) так что пусть будет он.
BlackEric
04-02-2008, 14:09
Вечером дома если до компа доберусь то посмотрю, но по чтению исходников - мама!!!!!!!!!
Student00
04-02-2008, 15:15
И опять решил проблему, оказывается в KeyField не то ключевое поле поставил.
Правда вопрос с тем, чтобы:
Согласно выделенному вопросу подгружаются варианты ответов (DBRadioGroup1).
попрежнему висит в воздухе
Student00
04-02-2008, 16:11
Тоесть проблема в том, чтобы при клике на одну из строк DBLookupListBox1
Происходил запрос в БД в таблицу otvet и от туда брались ответы соответствующие вопросам.
И в компоненте DBRadioGroup1 динамически добалялось то количество кнопок, которое соответствовало бы ответом на выбранный вопрос.
Student00
04-02-2008, 21:17
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
Вопрос, был решен так:
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
Ребят, подскажите плз как сделать так, чтобы на событие DBRadioGroup1Click
Значения записывались в указанную таблицу в БД.
Т.е. Кинул на форму компонент ADOTable1, который связан с этой таблицей. Теперь НАВЕРНОЕ надо найти метод этого компонента, который бы позволил при совершении указанного события записать значение (индекс) в таблицу log в БД.
Возможно нужно использовать другой компонент...
procedure TForm1.DBRadioGroup1Click(Sender: TObject);
begin
//ADOTable1. ??????????????
//DBRadioGroup1.??????????????
end;
BlackEric
07-02-2008, 18:43
SQL : Insert Into....
Вызываете...
Это курсак или реальная програ? Если реальная о не используйте DB-aware компоненты. Намучаетесь.
Dyvne Nihto
07-02-2008, 20:09
SQL : Insert Into....
»
Это если нужной записи еще нет. Если есть, то либо Update..., либо Insert Into.... в комбинации с Delete From....
В любом случае
DoCmd.RunSQL "текстзапроса; "
А кстати: что - у этого DBRadioGroup нету свойства DataSource - ее нельзя просто привязать к полю в таблице?
Student00
07-02-2008, 20:11
Это курсак или реальная програ? Если реальная о не используйте DB-aware компоненты. Намучаетесь.
Это даже не курсак - а лаба. )) А вообще - TBRadioGroup, TDBLookupListBox, TDBLookupComboBox, ... именно такие компоненты лучше не использовать?
А почему? ))
SQL : Insert Into....
Вызываете...
Могли бы пожалуйста уточнить:
Нужно бросить на форуму компонент ТADOQuery? Запрос прописывать в свойстве SQL или в коде? Или и там и там?
© OSzone.net 2001-2012
vBulletin v3.6.4, Copyright ©2000-2025, Jelsoft Enterprises Ltd.