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

Delphi Sources



Вернуться   Форум по Delphi программированию > Все о 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
Сообщения: 8,004
Версия Delphi: 7, XE3, 10.2
Репутация: 49089
По умолчанию

Вообще, тут 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,721
Репутация: 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)
Ответ


Delphi Sources

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

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

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

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


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


 

Сайт

Форум

FAQ

RSS лента

Прочее

 

Copyright © Форум "Delphi Sources" by BrokenByte Software, 2004-2023

ВКонтакте   Facebook   Twitter