Форум программистов, компьютерный форум, киберфорум
Delphi: Базы данных
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.64/11: Рейтинг темы: голосов - 11, средняя оценка - 4.64
0 / 0 / 0
Регистрация: 18.06.2017
Сообщений: 9

Поиск по разным таблицам

18.06.2017, 21:02. Показов 2640. Ответов 37

Студворк — интернет-сервис помощи студентам
Здравствуйте! Написал программу для работы с БД, но нужно сделать так чтобы поиск осуществлялся не по одной таблице, а по нескольким. Выбрать таблицу в моей программе можно с помощью ComboBox1
Сейчас в моей программе есть такой код для поиска, но как я и говорил только по одной таблице
Delphi
1
2
3
4
5
6
7
procedure TForm2.Edit1Change(Sender: TObject);
begin
ADOTable1.Filtered:=false;
ADOTable1.Filter:='Блюда LIKE '+#39+Edit1.Text+'%'+#39;
if length(edit1.text)>0 then ADOTable1.Filtered:=true;
if Form2.ADOTable1.RecordCount <>0 then Form2.StatusBar1.SimpleText :='Записей: '+IntToStr(Form2.ADOTable1.RecordCount) else Form2.StatusBar1.SimpleText :='Нет записей удовлетворяющих поиску';
end;
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
18.06.2017, 21:02
Ответы с готовыми решениями:

Запрос для подсчета суммы по разным таблицам IBQuery
Нужна помощь с sql запросом. У меня есть 4 таблицы: Медикаменты (medications), Привоз(coming), Продажа(outgo) и Списание(write_off) и мне...

Поиск по таблицам
Итак Задание 2 таблицы, в 1 ФИО студента, во 2 его предметы и оценки. нужно осуществить поиск по таблице, переход к студенту по...

Поиск по нескольким таблицам
Здравствуйте. Нужно на SQL сделать следующее: Таблица x: Ключевое поле Код| Имя, Фамилия, Отчество, Телефон, E-Mail, и так далее... ...

37
Айлурофил
 Аватар для Massaraksh7
518 / 451 / 112
Регистрация: 27.05.2017
Сообщений: 2,738
Записей в блоге: 5
20.06.2017, 11:25
Студворк — интернет-сервис помощи студентам
Цитата Сообщение от krapotkin Посмотреть сообщение
SQL
1
SELECT * FROM MillionRecords
Соответственно RecordCount по документации отображает количество уже переданных на клиента записей
а не
SQL
1
SELECT COUNT(*)  FROM TABLE WHERE ...
А Вы проверьте не по документации, а по факту. Я вот только что проверил.
Миниатюры
Поиск по разным таблицам  
Изображения
 
0
5996 / 4571 / 1096
Регистрация: 29.08.2013
Сообщений: 28,231
Записей в блоге: 3
20.06.2017, 11:29
значит у вас стоит FetchAll
не все пользователи знают об этом и их цикл по RecordCount будет неправильный

Добавлено через 30 секунд
Цитата Сообщение от Massaraksh7 Посмотреть сообщение
А Вы проверьте не по документации, а по факту
очень смешно
0
Айлурофил
 Аватар для Massaraksh7
518 / 451 / 112
Регистрация: 27.05.2017
Сообщений: 2,738
Записей в блоге: 5
20.06.2017, 11:35
Цитата Сообщение от qwertehok Посмотреть сообщение
значит у вас стоит FetchAll
Миллион записей за 100мс? FetchAll? Вот это действительно смешно.
0
5996 / 4571 / 1096
Регистрация: 29.08.2013
Сообщений: 28,231
Записей в блоге: 3
20.06.2017, 11:45
а как вы время засекаете?
0
 Аватар для krapotkin
6851 / 4677 / 1465
Регистрация: 14.04.2014
Сообщений: 20,674
Записей в блоге: 21
20.06.2017, 11:47
просто никто не должен использовать Table если несколько пользователей. вот и все
поэтому никто и не смотрел что там в кишках
вы там над ADOTable эксперименты ставили?
у меня нет сейчас возможности проверить.
0
Айлурофил
 Аватар для Massaraksh7
518 / 451 / 112
Регистрация: 27.05.2017
Сообщений: 2,738
Записей в блоге: 5
20.06.2017, 12:03
а как вы время засекаете?
Обычно.
Delphi
1
2
3
t=Now;
...
t=Now-t;
Цитата Сообщение от krapotkin Посмотреть сообщение
просто никто не должен использовать Table если несколько пользователей. вот и все
поэтому никто и не смотрел что там в кишках
Так с Query то же самое.
Цитата Сообщение от krapotkin Посмотреть сообщение
вы там над ADOTable эксперименты ставили?
TSQLTable, но это неважно
0
0 / 0 / 0
Регистрация: 18.06.2017
Сообщений: 9
20.06.2017, 19:46  [ТС]
Всем привет и большое спасибо за ответы и как я понял мне просто надо ADOTable1 поменять на ADOQuery1 и поиск заработает через условия? Я вообще не могу понять почему даже использовав ADOTable1 не работает поиск по разным таблицам? Может я условия не так конструирую?
0
 Аватар для krapotkin
6851 / 4677 / 1465
Регистрация: 14.04.2014
Сообщений: 20,674
Записей в блоге: 21
20.06.2017, 20:08
условия являются составной частью запроса SQL
поэтому если пользоваться Query то вы просто будете строить запрос с заданными условиями и сортировкой
http://www.sql.ru/docs/sql/u_sql/
1
0 / 0 / 0
Регистрация: 18.06.2017
Сообщений: 9
21.06.2017, 00:01  [ТС]
А почему из всех условий выполняется только одно?
Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
procedure TForm2.Button1Click(Sender: TObject);
begin
if (ComboBox1.Text='№заказа№блюда') then
Adoquery1.Active:=False;
adoquery1.sql.clear;
adoquery1.sql.add('select * from №заказа№блюда');
adoquery1.Active:=True;
if (ComboBox1.Text='Блюда') then
Adoquery1.Active:=False;
adoquery1.sql.clear;
adoquery1.sql.add('select * from Блюда');
adoquery1.Active:=True;
if (ComboBox1.Text='Заказы') then
Adoquery1.Active:=False;
adoquery1.sql.clear;
adoquery1.sql.add('select * from Заказы');
adoquery1.Active:=True;
if (ComboBox1.Text='Меню') then
Adoquery1.Active:=False;
adoquery1.sql.clear;
adoquery1.sql.add('select * from Меню');
adoquery1.Active:=True;
if (ComboBox1.Text='Продукты') then
Adoquery1.Active:=False;
adoquery1.sql.clear;
adoquery1.sql.add('select * from Продукты');
adoquery1.Active:=True;
if (ComboBox1.Text='Служащие') then
Adoquery1.Active:=False;
adoquery1.sql.clear;
adoquery1.sql.add('select * from Служащие');
adoquery1.Active:=True;
if (ComboBox1.Text='Столики') then
Adoquery1.Active:=False;
adoquery1.sql.clear;
adoquery1.sql.add('select * from Столики');
adoquery1.Active:=True;
end;
0
Айлурофил
 Аватар для Massaraksh7
518 / 451 / 112
Регистрация: 27.05.2017
Сообщений: 2,738
Записей в блоге: 5
21.06.2017, 00:16
Цитата Сообщение от Smeshochek Посмотреть сообщение
А почему из всех условий выполняется только одно?
Потому что query достаточно одного, но ему нужно указывать полноценный sql-запрос. Напишите конкретнее, ЧТО вы хотите получить на выходе и вам помогут составить этот запрос.

Добавлено через 6 минут
UPD: Понял, что вы хотите. begin ... end проставьте внутри условий.
1
0 / 0 / 0
Регистрация: 18.06.2017
Сообщений: 9
21.06.2017, 00:59  [ТС]
Спасибо вам большое за помощь =)

Добавлено через 33 минуты
И ещё один вопрос, а почему если я ввожу в edit1 число, то мне выдаётся сообщение "Не удаётся включить фильтр" - ? Если что, то это таблица "№заказа№блюда"
А вот в таблице "Блюда" всё прекрасно ищется
Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
procedure TForm2.Edit1Change(Sender: TObject);
begin
if (ComboBox1.Text='№заказа№блюда')
then
begin
ADOQuery1.Filtered:=false;
ADOQuery1.Filter:='№заказа LIKE '+#39+Edit1.Text+'%'+#39;
if length(edit1.text)>0 then ADOQuery1.Filtered:=true;
if Form2.ADOQuery1.RecordCount <>0 then Form2.StatusBar1.SimpleText :='Записей: '+IntToStr(Form2.ADOQuery1.RecordCount) else Form2.StatusBar1.SimpleText :='Нет записей удовлетворяющих поиску';
end;
 
if (ComboBox1.Text='Блюда')
then
begin
ADOQuery1.Filtered:=false;
ADOQuery1.Filter:='Наименование LIKE '+#39+Edit1.Text+'%'+#39;
if length(edit1.text)>0 then ADOQuery1.Filtered:=true;
if Form2.ADOQuery1.RecordCount <>0 then Form2.StatusBar1.SimpleText :='Записей: '+IntToStr(Form2.ADOQuery1.RecordCount) else Form2.StatusBar1.SimpleText :='Нет записей удовлетворяющих поиску';
end;
end;
0
Айлурофил
 Аватар для Massaraksh7
518 / 451 / 112
Регистрация: 27.05.2017
Сообщений: 2,738
Записей в блоге: 5
21.06.2017, 01:16
С ходу не скажу. Вроде бы, никаких проколов нет. Единственно, знак № допустим ли в наименования поля?
0
0 / 0 / 0
Регистрация: 18.06.2017
Сообщений: 9
21.06.2017, 01:35  [ТС]
Убрал этот знак и всё равно ошибка
Миниатюры
Поиск по разным таблицам  
0
0 / 0 / 0
Регистрация: 18.06.2017
Сообщений: 9
21.06.2017, 02:13  [ТС]
Решил проблему, но теперь при удалении данных из edit1 не показываются все записи в таблице
Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
procedure TForm2.Edit1Change(Sender: TObject);
begin
if (ComboBox1.Text='№заказа№блюда')
then
begin
if Length(Edit1.Text) <> 0 then
    begin
      ADOQuery1.SQL.Clear;
      ADOQuery1.SQL.Add('SELECT * FROM №заказа№блюда WHERE [№заказа] LIKE' + QuotedStr(Edit1.Text + '%'));
      ADOQuery1.Active := True;
if Form2.ADOQuery1.RecordCount <>0 then Form2.StatusBar1.SimpleText :='Записей: '+IntToStr(Form2.ADOQuery1.RecordCount) else Form2.StatusBar1.SimpleText :='Нет записей удовлетворяющих поиску';
end;
 
if (ComboBox1.Text='Блюда')
then
begin
ADOQuery1.Filtered:=false;
ADOQuery1.Filter:='Наименование LIKE '+#39+Edit1.Text+'%'+#39;
if length(edit1.text)>0 then ADOQuery1.Filtered:=true;
if Form2.ADOQuery1.RecordCount <>0 then Form2.StatusBar1.SimpleText :='Записей: '+IntToStr(Form2.ADOQuery1.RecordCount) else Form2.StatusBar1.SimpleText :='Нет записей удовлетворяющих поиску';
end;
end;
end;
0
 Аватар для krapotkin
6851 / 4677 / 1465
Регистрация: 14.04.2014
Сообщений: 20,674
Записей в блоге: 21
21.06.2017, 07:00
зачем мешать в кучу Filter и условия в запросе
Where всяко лучше

если вы хотите видеть все записи, то не включайте where в запрос совсем
Delphi
1
2
3
4
5
s:='select field1, field2, field3 from table';
if ( not IWannaSeeAll ) then
  s:=s+' where field5 like '''+edit1.text+'''';
query.sql.text := s;
query.open;
0
 Аватар для ZfoxAK
670 / 560 / 242
Регистрация: 26.11.2012
Сообщений: 2,191
21.06.2017, 08:34
Цитата Сообщение от Smeshochek Посмотреть сообщение
if (ComboBox1.Text='№заказа№блюда')
Этот код лучше заменить на этот
Delphi
1
If ComboBox1.Items[ComboBox1.ItemIndex] = '№заказа№блюда'
Так как не всегда отображаемое в ComboBox1 содержится в свойстве Text. Ранее на этом форуме я выкладывал код и условия при которых это происходит. Так что код
Delphi
1
ComboBox1.Items[ComboBox1.ItemIndex]
выдаст тот элемент, что был выбран.
Цитата Сообщение от Smeshochek Посмотреть сообщение
нужно сделать так чтобы поиск осуществлялся не по одной таблице, а по нескольким. Выбрать таблицу в моей программе можно с помощью ComboBox1
ComboBox1 служит для выбора одного значения из многих. Для выполнения поиска в нескольких таблицах нужно использовать компонент в котором предусмотрен выбор нескольких вариантов. В вашем случае может подойти TCheckListBox. Вот здесь пример 19.rar
0
 Аватар для ZfoxAK
670 / 560 / 242
Регистрация: 26.11.2012
Сообщений: 2,191
21.06.2017, 09:12
Если все нужно осуществлять поиск по одной из выбранной таблице то :
Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
var s: string;
begin
 s:= 'select * from ' + ComboBox1.Items[ComboBox1.ItemIndex];
 if Length(Edit1.Text)<> 0 then
 case ComboBox1.ItemIndex of
  //№заказа№блюда
  0 : s:= s + ' where №заказа LIKE '+#39+Edit1.Text+'%'+#39;
  //Блюда
  1 : s:= s + ' where Наименование LIKE '+#39+Edit1.Text+'%'+#39;
  //Заказы
 // 2 :  и так далие
  //Меню
 // 3 : далие
  //Продукты
 // 4 : далие
  //Служащие
 // 5 :далие
  //Столики
 // 6 : и тому подобное
 end;
 
 ADOQuery1.Close;
 ADOQuery1.SQL.Clear;
 ADOQuery1.SQL.Text:=S;
 ADOQuery1.Open;
if Form2.ADOQuery1.RecordCount <>0
 then StatusBar1.SimpleText :='Записей: '+IntToStr(ADOQuery1.RecordCount)
 else StatusBar1.SimpleText :='Нет записей удовлетворяющих поиску';
end;
Добавлено через 3 минуты
Цитата Сообщение от Smeshochek Посмотреть сообщение
Form2.ADOQuery1.RecordCount
Если компонента находится на активной форме, то в коде указывать не нужно.
Delphi
1
ADOQuery1.RecordCount
1
0 / 0 / 0
Регистрация: 18.06.2017
Сообщений: 9
21.06.2017, 17:37  [ТС]
Спасибо большое за помощь) Действительно так намного удобнее)
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
21.06.2017, 17:37
Помогаю со студенческими работами здесь

Поиск по нескольким таблицам в БД
Добрый день! В базе данных присутствуют 7 таблиц. Организованно внесение данных, редактирование, поиск, и т.п. Работает это через...

Поиск по разным полям.
Приветствую. Подскажите такой вопрос. Есть база. В таблице 8 полей. По нажатию на кнопку открывается новая форма с 8-ю edit'ами. В них...

Поиск по двум таблицам с одинаковыми полями через ADOQuery
На данный момент есть база данных Access, в ней - две таблицы (Table1, Table2), в каждой из них есть одинаковые поля - &quot;IMEI&quot; и...

Суммирование по разным таблицам
У меня в базе данных на Access существует несколько таблиц. Нужно подсчитать суммы значений определенного столбца в каждой таблице, а также...

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


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
38
Ответ Создать тему
Новые блоги и статьи
Хитросплетение родственных связей пантеона греческих богов.
russiannick 14.05.2026
Однооконник, позволяющий узреть и изучить отдельных героев древней Греции. <!DOCTYPE html> <html lang="ru"> <head> <meta charset="UTF-8"> <meta http-equiv="X-UA-Compatible". . .
[golang] Угол между стрелками часов
alhaos 12.05.2026
По заданным значениям часа и минуты необходимо определить значение меньшего угла между стрелками аналогового циферблата часов. import "math" func angleClock(hour int, minutes int) float64 { . . .
Debian 13: Установка Lazarus QT5
ВитГо 09.05.2026
Эта инструкция моя компиляция инструкций volvo https:/ / www. cyberforum. ru/ blogs/ 203668/ 10753. html и его же старой инструкции по установке Lazarus с gtk2. . .
Нейросеть на алгоритме "эстафета хвоста" как перспектива.
Hrethgir 06.05.2026
На десерт, когда запущу сервер. Статья тут https:/ / habr. com/ ru/ articles/ 1030914/ . Автор я сам, нейросеть только помогает в вопросах которые мне не известны - не знаю людей которые знали-бы. . .
Асинхронный приём данных из COM-порта
Argus19 01.05.2026
Асинхронный приём данных из COM-порта Купил на aliexpress термопринтер QR701. Он оказался странным. Поключил к Arduino Nano. Был очень удивлён. Наотрез отказывается печатать русские буквы. Чтобы. . .
попытка написать игровой сервер на C++
pyirrlicht 29.04.2026
попытка написать игровой сервер на плюсах с открытым бесконечным миром. возможно получится прикрутить интерпретатор питон для кастомизации игровой логики. что есть на текущий момент:. . .
Контроль уникальности выбранного документа-основания при изменении реквизита
Maks 28.04.2026
Алгоритм из решения ниже разработан на примере нетипового документа "ЗаявкаНаРемонтСпецтехники", разработанного в КА2. Задача: уведомлять пользователя, если указанная заявка (документ-основание). . .
Благородство как наказание
Maks 24.04.2026
У хорошего человека отношения с женщинами всегда складываются трудно. А я человек хороший. Заявляю без тени смущения, потому что гордиться тут нечем. От хорошего человека ждут соответствующего. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru