Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > БД в Delphi
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 06.11.2012, 22:14   #1
Dux
Delphi Master
Форумчанин Подтвердите свой е-майл
 
Аватар для Dux
 
Регистрация: 31.03.2008
Сообщений: 803
По умолчанию Поиск в базе данных Access - во всех таблицах

Всем добрый вечер.. опять я со своими базами данных..

Есть база данных Data.mdb, в ней, к примеру, 10 таблиц (компаний - Company1, Company2, Company3 и т.д.), в каждой из таблиц - данные по сотрудникам (Имя, должность, адрес и т.д.)

Необходимо организовать поиск по имени во всех таблицах, и если сотрудник присутствует - отображать всю таблицу этой компании в DBGrid и в ней выделить искомого.

Если пробовать так:
Код:
ADOQuery1.Active:=false;
  ADOQuery1.SQL.Clear;
  ADOQuery1.SQL.Add('SELECT *');
  ADOQuery1.SQL.Add('FROM Company1');
  ADOQuery1.SQL.add('WHERE Name like ''' +'%'+Edit1.Text + '%''');
  ADOQuery1.Active:=true;
то отображается только искомая запись, а необходимо, чтобы она просто выделялась в общем списке.

Подскажите, как правильно организовать такой поиск, причем по всем таблицам?
Dux вне форума Ответить с цитированием
Старый 06.11.2012, 22:57   #2
Yurk@
Участник клуба
 
Аватар для Yurk@
 
Регистрация: 19.12.2007
Сообщений: 1,100
По умолчанию

1. получаем список всех таблиц (напр в StringGrid)
2. в цыкле идем по этому гриду - берем имя таблицы и пихаем ее в
Код:
ADOQuery1.Close;
ADOQuery1.SQL.Text:='SELECT * FROM '+SG.Text+' WHERE Name LIKE ''' +'%'+Edit1.Text + '%''';
ADOQuery1.Open;
3. если всё-же нашли где-то - получаем ID (для примера) этой записи и делаем Locate по этой ADOQuery1

^ и тут же вопрос: если в результате запроса найдется больше 1й записи - куда в гриде будем идти?
На форуме: Помогаю за спасибо
ICQ\Skype: Это моё личное время ...

Последний раз редактировалось Yurk@; 06.11.2012 в 22:59.
Yurk@ вне форума Ответить с цитированием
Старый 06.11.2012, 22:59   #3
Аватар
Старожил
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Сообщений: 18,922
По умолчанию

Для выделения (прорисовки) в гриде есть метод OnDrawColumnCell. А вот и проблемы с кучей однотипных таблиц, нет бы в одной таблице, добавив поле ID компании. А так или поиск в цикле, или попробовать запрос с использованием UNION. Коряво все как-то
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию
Аватар вне форума Ответить с цитированием
Старый 06.11.2012, 23:07   #4
Dux
Delphi Master
Форумчанин Подтвердите свой е-майл
 
Аватар для Dux
 
Регистрация: 31.03.2008
Сообщений: 803
По умолчанию

Цитата:
Сообщение от Yurk@ Посмотреть сообщение
1. получаем список всех таблиц (напр в StringGrid)
2. в цикле идем по этому гриду - берем имя таблицы и пихаем ее
В принципе я так и делаю, но мне показалось что это -

Цитата:
Сообщение от Аватар Посмотреть сообщение
Коряво все как-то
Думал есть какие-то "мудрые" процедуры или функции, которые берут на себя перебор всех таблиц... но насколько я понимаю придется продолжать через банальный цикл.
Dux вне форума Ответить с цитированием
Старый 06.11.2012, 23:09   #5
Yurk@
Участник клуба
 
Аватар для Yurk@
 
Регистрация: 19.12.2007
Сообщений: 1,100
По умолчанию

Цитата:
Думал есть какие-то "мудрые" процедуры или функции, которые берут на себя перебор всех таблиц
есть ... но не в акцесса))))))
На форуме: Помогаю за спасибо
ICQ\Skype: Это моё личное время ...
Yurk@ вне форума Ответить с цитированием
Старый 06.11.2012, 23:14   #6
Аватар
Старожил
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Сообщений: 18,922
По умолчанию

Код:
SELECT 1 AS NumTable FROM Company1 WHERE Name LIKE '%абсд%'
UNION
SELECT 2  AS NumTable FROM Company2 WHERE Name LIKE '%абсд%'
UNION
...
UNION
SELECT 999  AS NumTable FROM Company999 WHERE Name LIKE '%абсд%'
Выполить примерно такой запрос, если в результате есть записи, берете первую из них, в NumTable номер таблицы, на основании которого можно сделать запрос ко всем данным этой таблицы. Вот и нет цикла по всем таблицам. Только все равно это не Рио-де-Жанейро
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию
Аватар вне форума Ответить с цитированием
Старый 06.11.2012, 23:42   #7
Dux
Delphi Master
Форумчанин Подтвердите свой е-майл
 
Аватар для Dux
 
Регистрация: 31.03.2008
Сообщений: 803
По умолчанию

Спасибо за советы, буду пробовать!
Dux вне форума Ответить с цитированием
Старый 07.11.2012, 11:17   #8
_SERGEYX_
Участник клуба
 
Аватар для _SERGEYX_
 
Регистрация: 07.07.2007
Сообщений: 1,518
По умолчанию

Цитата:
в ней, к примеру, 10 таблиц (компаний - Company1, Company2, Company3 и т.д.), в каждой из таблиц - данные по сотрудникам
Мне кажется, что база изначально плохо спроектирована. Может, пока не поздно пересмотреть ее структуру, а то в дальнейшем появятся действительно серьезные проблемы.
В данном случае само напрашивается: должен быть "Справочник всех компаний", а ОДНА!!! таблица сотрудников должна иметь поле ID_COMPANY. И все вопросы решатся сами собой.
_SERGEYX_ вне форума Ответить с цитированием
Старый 07.11.2012, 22:33   #9
Dux
Delphi Master
Форумчанин Подтвердите свой е-майл
 
Аватар для Dux
 
Регистрация: 31.03.2008
Сообщений: 803
По умолчанию

Цитата:
Сообщение от _SERGEYX_ Посмотреть сообщение
Мне кажется, что база изначально плохо спроектирована. Может, пока не поздно пересмотреть ее структуру, а то в дальнейшем появятся действительно серьезные проблемы.
В данном случае само напрашивается: должен быть "Справочник всех компаний", а ОДНА!!! таблица сотрудников должна иметь поле ID_COMPANY. И все вопросы решатся сами собой.
Ув. _SERGEYX_, задумался над вашим предложением...
Интересует один вопрос, если все поместить в одну базу данных Access, не будет ли возникать конфликтов при одновременном обращении к ней 5-ти операторов?
Dux вне форума Ответить с цитированием
Старый 22.11.2012, 20:05   #10
opv88
Новичок
Джуниор
 
Регистрация: 14.02.2010
Сообщений: 2
По умолчанию

Цитата:
Сообщение от Dux Посмотреть сообщение
Есть база данных Data.mdb, в ней, к примеру, 10 таблиц (компаний - Company1, Company2, Company3 и т.д.), в каждой из таблиц - данные по сотрудникам (Имя, должность, адрес и т.д.)
Нарушение нормализации налицо. Как уже сказано, создаем две сущности:
Company(ID, Name) и Workers(ID, Name, SurName, Patronymic... CompanyID). Добавляем внешний ключ и получаем правильно спроектированную БД, из которой простеньким запросом дергаем что угодно.

P.S. Какие еще конфликты? :-) В Access реализован механизм блокировок.
opv88 вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
поиск дублей в нескольких таблицах Access (Access +SQL) Delphi_developer Помощь студентам 3 26.09.2012 16:46
надо привязать php сайт к базе данных Access и что бы при заполнение формы на сайте данные сохранялись в базе Алёна_))) Microsoft Office Access 2 20.06.2012 12:24
Помогите пожалуйста сделать поиск по базе данных в форме! Access 2003 LilijaSt Microsoft Office Access 19 25.12.2010 10:13
Delphi. Поиск по базе данных Access... hohol90 Помощь студентам 1 08.06.2010 08:14
Поиск данных в нескольких таблицах a_n_n_a БД в Delphi 10 23.04.2010 11:33