Форум по программированию Delphi Sources

 



Вернуться   Форум по программированию Delphi Sources > Все о Delphi > Базы данных
Ник
Пароль
Регистрация <<         Правила форума         >> FAQ Пользователи Календарь Поиск Сообщения за сегодня Все разделы прочитаны

Ответ
 
Опции темы Поиск в этой теме Опции просмотра
  #1  
Старый 19.12.2011, 23:23
beeline09 beeline09 вне форума
Прохожий
 
Регистрация: 19.12.2011
Сообщения: 6
Репутация: 10
Вопрос Проблема с поиском по БД Access

Я начинающий. Сильно прошу не пинать. Читал книжки, но особо не понял как мне сделать следующее. Есть БД в ACCESS. Что-то на подобие инвентаризации. Т.е. При выборе фирмы, выбираем отдел. При выборе отдела, выбираем сотрудника отдела, выбрав сотрудника мы видим список оргтехники, которая на нем числится и инвентаризационный номер.
Смог получить список фирм в DBLookUpComboBox, но как мне сделать, чтоб при выборе определенной фирмы в DBLookUpComboBox1, в DBLookUpComboBox2 можно было видеть отделы, которые находятся в этой фирме и так далее? БД прилагаю. Просьба-помогите пожалуйста сделать поиск такого рода. Бд вроде правильно написана. А очень надо....
Вложения
Тип файла: rar baza.rar (17.1 Кбайт, 6 просмотров)
Ответить с цитированием
  #2  
Старый 20.12.2011, 01:19
lmikle lmikle вне форума
Модератор
 
Регистрация: 17.04.2008
Сообщения: 7,497
Версия Delphi: 7, XE3, 10.2
Репутация: 49088
По умолчанию

Вообще, тут 2 варианта.
Вариант 1. Для каждого DBLookup есть свой DataSource и все это выстраивается в цепочку Master-Detail. Для небольшой БД вполне сойдет.
Вариант 2. Делаем лукапы на основе обычных ComboBox и получаем данные по мере того, как пользователь выбирает. Кода писать больше, но зато система получается независящая от реального объема данных, т.к. всегда грузится небольшое кол-во данных

Ну и еще есть третий вариант... DevExpress cxGrid (и схожие с ним компоненты). Там фильтрация уже встроена и не надо думать над этим вообще.
Ответить с цитированием
Этот пользователь сказал Спасибо lmikle за это полезное сообщение:
beeline09 (22.12.2011)
  #3  
Старый 20.12.2011, 07:39
beeline09 beeline09 вне форума
Прохожий
 
Регистрация: 19.12.2011
Сообщения: 6
Репутация: 10
По умолчанию

Цитата:
Сообщение от lmikle
Вообще, тут 2 варианта.
Вариант 1. Для каждого DBLookup есть свой DataSource и все это выстраивается в цепочку Master-Detail. Для небольшой БД вполне сойдет.
Вариант 2. Делаем лукапы на основе обычных ComboBox и получаем данные по мере того, как пользователь выбирает. Кода писать больше, но зато система получается независящая от реального объема данных, т.к. всегда грузится небольшое кол-во данных

Ну и еще есть третий вариант... DevExpress cxGrid (и схожие с ним компоненты). Там фильтрация уже встроена и не надо думать над этим вообще.

А можешь подробнее? Что где в каких действиях сделать? Я пока еще плохо себе это представляю. Но на примерах быстро научусь. Вариант 1 вроде бы я и использовал, только не получилось во втором лукапе отобразить в зависимости от первого. Второй вариант мне нравится, но как получать данные по мере того, как пользователь выбирает? Надо какое-то событие прописать. А какое? Как вообще это организовать?
Ответить с цитированием
  #4  
Старый 20.12.2011, 08:13
Аватар для Ildar-tsr
Ildar-tsr Ildar-tsr вне форума
Местный
 
Регистрация: 09.08.2011
Адрес: г.Сургут, ХМАО
Сообщения: 453
Репутация: 7402
По умолчанию

Быстро накидал, чтоб ты принцип понял, но если изловчиться можно ошибку спровоцировать, необходимо чтоб поэтапно выбирались записи (фирма - отдел - сотрудник).
Вложение 2705
P.S. Обратить внимание нужно на события DBLookUpCombobox'a и на свойство filter компонента ADOQuery.
__________________
Google в помощь

Последний раз редактировалось Ildar-tsr, 03.05.2012 в 13:16.
Ответить с цитированием
Этот пользователь сказал Спасибо Ildar-tsr за это полезное сообщение:
beeline09 (22.12.2011)
  #5  
Старый 20.12.2011, 10:53
beeline09 beeline09 вне форума
Прохожий
 
Регистрация: 19.12.2011
Сообщения: 6
Репутация: 10
По умолчанию

Цитата:
Сообщение от Ildar-tsr
Быстро накидал, чтоб ты принцип понял, но если изловчиться можно ошибку спровоцировать, необходимо чтоб поэтапно выбирались записи (фирма - отдел - сотрудник).
Вложение 2705
P.S. Обратить внимание нужно на события DBLookUpCombobox'a и на свойство filter компонента ADOQuery.

Спасибо огромное! Это как раз то, что нужно. Только вопросик еще один напросился :-) Вот выбрал я сотрудника...и тут у меня в dbgrid должны отобразиться данные из таблицы oborudovanie ACCESS. Там по ходу тоже фильтр нужен. Или нет? Что мне допилить надо для этого?

И еще вопросик. Что делает вот этот код?
Код:
for i:= 0 to ComponentCount-1 do
    if Components[i] is TADOQuery then
      TADOQuery(Components[i]).Open;
Разве нельзя сразу открыть query?

Последний раз редактировалось beeline09, 20.12.2011 в 10:58. Причина: Добавил вопрос
Ответить с цитированием
  #6  
Старый 20.12.2011, 11:03
Аватар для Страдалецъ
Страдалецъ Страдалецъ вне форума
Гуру
 
Регистрация: 09.03.2009
Адрес: На курорте, из окна вижу теплое Баренцево море. Бррр.
Сообщения: 4,714
Репутация: 52347
По умолчанию

Цитата:
И еще вопросик. Что делает вот этот код?
for i:= 0 to ComponentCount-1 do
if Components[i] is TADOQuery then
TADOQuery(Components[i]).Open;
Если кратко, то просто открывает все запросы на форме. Удобство в том, что код универсален, можно использовать в любой программе не изменив ни строчки кода. А уж надо ли вам такое удобство решайте сами.
__________________
Жизнь такова какова она есть и больше никакова.
Помогаю за спасибо.
Ответить с цитированием
Этот пользователь сказал Спасибо Страдалецъ за это полезное сообщение:
beeline09 (22.12.2011)
  #7  
Старый 20.12.2011, 11:36
Аватар для Ildar-tsr
Ildar-tsr Ildar-tsr вне форума
Местный
 
Регистрация: 09.08.2011
Адрес: г.Сургут, ХМАО
Сообщения: 453
Репутация: 7402
По умолчанию

Цитата:
Сообщение от beeline09
Вот выбрал я сотрудника...и тут у меня в dbgrid должны отобразиться данные из таблицы oborudovanie ACCESS. Там по ходу тоже фильтр нужен. Или нет? Что мне допилить надо для этого?
На closeUp cbSotrudnik повесить еще (например грид использует данные ADOQuery1):
Код:
ADOQuery1.Filtered:= false;
ADOQuery1.Filter:= 'id_oborud = ' + IntToStr(cbSotrudnik.KeyValue);
ADOQuery1.Filtered:= true;
Просто я в cbSotrudnik в KeyFiled вставил id_oborud, так как по-моему такая конструкция и подразумевалась при проектировании БД.
__________________
Google в помощь
Ответить с цитированием
Этот пользователь сказал Спасибо Ildar-tsr за это полезное сообщение:
beeline09 (22.12.2011)
  #8  
Старый 20.12.2011, 11:45
beeline09 beeline09 вне форума
Прохожий
 
Регистрация: 19.12.2011
Сообщения: 6
Репутация: 10
По умолчанию

Цитата:
Сообщение от Ildar-tsr
На closeUp cbSotrudnik повесить еще (например грид использует данные ADOQuery1):
Код:
ADOQuery1.Filtered:= false;
ADOQuery1.Filter:= 'id_oborud = ' + IntToStr(cbSotrudnik.KeyValue);
ADOQuery1.Filtered:= true;
Просто я в cbSotrudnik в KeyFiled вставил id_oborud, так как по-моему такая конструкция и подразумевалась при проектировании БД.

Спасибо за столь быстрые ответы. Я уже даже опередил тебя :-) Но сделал не много по другому. Просто dbgrid подрубил к query, сделал его выключеным, а по closeup он включается просто :-) Вот теперь сижу парюсь над тем, чтоб данные эти в dbgrid редактировать по нажатию Enter. Вроде нашел инфу. Щас буду пробовать :-)
Ответить с цитированием
  #9  
Старый 20.12.2011, 13:28
beeline09 beeline09 вне форума
Прохожий
 
Регистрация: 19.12.2011
Сообщения: 6
Репутация: 10
По умолчанию

Не могу никак добавить в dbgrid столбцы из другой связанной таблицы :-( В данном случае: у меня в dbgrid отображаются все столбцы из таблицы Oborudovanie. Мне нужно добавить туда столбец Imya из таблицы сотрудники, Imya_otdela из таблицы Otdel и Imya_firmy из таблицы фирма. Делал через sql запрос в в qOborudovanie, но не получается. Подозреваю, что это из-за фильтра, который стоит на CloseUp cb Sotrudnik. Как это сделать? Никто не подскажет?
Ответить с цитированием
  #10  
Старый 20.12.2011, 19:39
Аватар для Страдалецъ
Страдалецъ Страдалецъ вне форума
Гуру
 
Регистрация: 09.03.2009
Адрес: На курорте, из окна вижу теплое Баренцево море. Бррр.
Сообщения: 4,714
Репутация: 52347
По умолчанию

Сделать запрос типа:
Код:
select Ob.*,сотрудники.Imya,Otdel.Imya_otdela,фирма.Imya_firmy from Oborudovanie Ob
 inner join Ob.ID = сотрудники.Ib_id
 inner join Ob.ID = Otdel.Ib_id
 inner join Ob.ID = фирма.Ib_id
Но редактировать в гриде уже не получится так просто
__________________
Жизнь такова какова она есть и больше никакова.
Помогаю за спасибо.
Ответить с цитированием
Этот пользователь сказал Спасибо Страдалецъ за это полезное сообщение:
beeline09 (22.12.2011)
  #11  
Старый 22.12.2011, 10:31
beeline09 beeline09 вне форума
Прохожий
 
Регистрация: 19.12.2011
Сообщения: 6
Репутация: 10
По умолчанию

Цитата:
Сообщение от Страдалецъ
Сделать запрос типа:
Код:
select Ob.*,сотрудники.Imya,Otdel.Imya_otdela,фирма.Imya_firmy from Oborudovanie Ob
 inner join Ob.ID = сотрудники.Ib_id
 inner join Ob.ID = Otdel.Ib_id
 inner join Ob.ID = фирма.Ib_id
Но редактировать в гриде уже не получится так просто

Вот спасибо огромное! Никогда бы не додумался до такого сам ))) Два вопроса:
1. Где можно начитаться об этом? Ни одной нормальной книги не нашел в нете или плохо искал...
2. Как после этого можно отредактировать данные в гриде или хотя без добавления в него столбцов из других таблиц. Или хотя бы данные из определенной ячейки в грид положить в какие-нибудь текст боксы и уже из них изменять соответствующий элемент в таблице?
Ответить с цитированием
  #12  
Старый 22.12.2011, 12:12
Аватар для Страдалецъ
Страдалецъ Страдалецъ вне форума
Гуру
 
Регистрация: 09.03.2009
Адрес: На курорте, из окна вижу теплое Баренцево море. Бррр.
Сообщения: 4,714
Репутация: 52347
По умолчанию

Начитаться можно в инете по самое немогу. Ищите информацию по SQL.
Насчет редактирования данных по такому запросу очень много надо тут расписать. Вот для начала почитайте про ADO
__________________
Жизнь такова какова она есть и больше никакова.
Помогаю за спасибо.
Ответить с цитированием
Этот пользователь сказал Спасибо Страдалецъ за это полезное сообщение:
beeline09 (29.12.2011)
Ответ



Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск
Опции просмотра

Ваши права в разделе
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения

BB-коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход


Часовой пояс GMT +3, время: 06:57.


 

Сайт

Форум

FAQ

RSS лента

Прочее

 

Copyright © Форум "Delphi Sources", 2004-2019

ВКонтакте   Facebook   Twitter