Форум программистов, компьютерный форум, киберфорум
Delphi: Базы данных
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.87/15: Рейтинг темы: голосов - 15, средняя оценка - 4.87
0 / 0 / 0
Регистрация: 22.04.2017
Сообщений: 20
1

Организация поиска через DBGrid

22.04.2017, 09:47. Показов 2750. Ответов 19
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Компонент DBGrid показывает значения из БД SQL Servera Таблицу школьник. При вводе в Edit1 должно искать по всем перечисленным полям. Но программа выдает ошибку : не правильный синтаксис возле конструкции 'like'.
Прошу исправить ошибки или предложить другой вариант кода, для поиска по всему компоненту DBGrid.

Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
14
procedure TForm19.Edit1Change(Sender: TObject);
var
h1, h2: string;
begin
h1:='%'+Form19.Edit1.Text+'%';
h2:=QuotedStr(h1);
with Form19.ADOQuery1 do
begin
close;
sql.Clear;
sql.Add('select*from ШКОЛЬНИК where ФИО_шк_ка like'+ h2 +' or Адрес_шк_ка like'+ h2 +' or Тел_шк_ка like'+ h2 +' or Класс likе);
open;
end;
end;
Выдает ошибку like
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
22.04.2017, 09:47
Ответы с готовыми решениями:

Организация подгрузки данных в DBGrid
Всем привет, ребята. Delphi 7, MySQL - localhost. Сабж: - есть форма; - на ней 5 кнопок;...

Организация поиска
Здравствуйте уважаемые эксперты, я в делфи на уровне среднего ламера помогите реализовать такую...

Организация поиска по БД (Paradox7)
Доброго времени суток! Есть программа для работы с базами данных. Вышло так, что уже подключила...

Организация поиска по базе данных
Всем, привет. Тут вот какое дело... занимаюсь курсовой, и надо мне сделать поиск по имени в BDE....

19
500 / 346 / 200
Регистрация: 20.10.2016
Сообщений: 1,101
22.04.2017, 10:05 2
А пробелы кто ставить будет между LIKE h2?

Добавлено через 5 минут
И после последнего LIKE ничего нет.
1
0 / 0 / 0
Регистрация: 22.04.2017
Сообщений: 20
22.04.2017, 10:20  [ТС] 3
Если ввожу так:
Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
procedure TForm19.Edit2Change(Sender: TObject);
var
h1, h2: string;
begin
if Edit1.Text = '' then Exit;
h1:='%'+Form19.Edit2.Text+'%';
h2:=QuotedStr(h1);
with Form19.ADOQuery1 do
begin
close;
sql.Clear;
sql.text:='select*from ШКОЛЬНИК where Инд_ном_шк_ка like'+ h2;
open;
end;
end;
То все норм. Но мне нужен поиск по нескольким столбцам.

а ввожу :
Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
procedure TForm19.Edit1Change(Sender: TObject);
var
h1, h2: string;
begin
if Edit1.Text = '' then ShowMessage ('Введите значение !');
h1:='%'+Form19.Edit1.Text+'%';
h2:=QuotedStr(h1);
with Form19.ADOQuery1 do
begin
close;
sql.Clear;
sql.text:='select*from ШКОЛЬНИК where ФИО_шк_ка like'+ h2 +' or Адрес_шк_ка like'+ h2 +' or Тел_шк_ка like'+ h2 +' or Класс likе';
open;
end;
end;
Выводит ту же ошибку:
Рядом с like в контексте где ожидается условие указано выражение типа отличного от логического.
0
500 / 346 / 200
Регистрация: 20.10.2016
Сообщений: 1,101
22.04.2017, 10:24 4
Цитата Сообщение от TFullControl Посмотреть сообщение
И после последнего LIKE ничего нет.
!!!
1
0 / 0 / 0
Регистрация: 22.04.2017
Сообщений: 20
23.04.2017, 07:47  [ТС] 5
Разобралась.
Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
procedure TForm19.Edit2Change(Sender: TObject);
var
h1, h2: string;
begin
if Edit2.Text = '' then Exit;
h1:='%'+Form19.Edit2.Text+'%';
h2:=QuotedStr(h1);
with Form19.ADOQuery1 do
begin
close;
//sql.Clear;
sql.text:='select*from ШКОЛЬНИК where Инд_ном_шк_ка like'+ h2;
open;
end;
end;
Такой код работает. Как сделать чтобы при вводе значений в одно поле Эдит происходил поиск по нескольким полям таблицы?

Добавлено через 7 минут
Спасибо, что помогли! Разобралась. Теперь работает .

Добавлено через 21 час 0 минут
Хочу применить данный поиск к компоненту DBGrid который связан в делфи 7 через диаграмму с другим DBGrid.
Почему то данный поиск не работает. На данной форме есть только два компонента DataSourse и ADOTable-два компонента. Добавила ADOQuery и соединила его c ADOConnection.
Код тот же:
Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
procedure TForm10.Edit1Change(Sender: TObject);
var
h1, h2: string;
begin
if Edit1.Text = '' then Exit;
h1:='%'+Form10.Edit1.Text+'%';
h2:=QuotedStr(h1);
with Form10.ADOQuery1 do
begin
close;
//sql.Clear;
sql.text:='select*from ШКОЛЬНИК where Инд_ном_шк_ка like'+ h2+' or Тел_шк_ка like'+ h2+' or ФИО_шк_ка like'+ h2+' or Адрес_шк_ка like'+ h2+' or Класс like'+ h2+' or Буква_кл like'+ h2;
open;
end;
end;
Как сделать поиск рабочим в данной форме?
0
1040 / 856 / 335
Регистрация: 08.12.2016
Сообщений: 3,283
23.04.2017, 07:58 6
Цитата Сообщение от Ppz Посмотреть сообщение
Добавила ADOQuery и соединила его c ADOConnection.
от того, что запрос выполнится и выберет нужные записи кому станет легче? Гриды как отображали данные из ADOTable так и отображают. Надо у DataSource заменить DataSet c ADoTableX на ADOQuery1, чтобы в гриде отображались результаты вашего запроса
1
0 / 0 / 0
Регистрация: 22.04.2017
Сообщений: 20
23.04.2017, 08:11  [ТС] 7
Выдает ошибку : ADOQuery1 : СommandText does not return a result set.
0
1040 / 856 / 335
Регистрация: 08.12.2016
Сообщений: 3,283
23.04.2017, 08:17 8
в дизайне? Ну так запишите и туда SQL хотя бы select * from ШКОЛЬНИК предже, чем начнете править в рантайм
1
0 / 0 / 0
Регистрация: 22.04.2017
Сообщений: 20
23.04.2017, 10:00  [ТС] 9
Разобралась, потому что в sql запросе не чего не было... Спасибо. Теперь работает данный поиск.

Добавлено через 1 час 40 минут
Есть компонент DBGrid, в нем происходит поиск ( Но поиск может производиться по всему компоненту DBGrid через компонент Edit) .Курсор стоит на одном конкретном человеке, с конкретным индивидуальным номером, при нажатии на кнопку удалить-происходить удаление выбранного чел-ка из БД, но хочется чтобы еще и удалялась другая информация из другого DBGrid.
Т.е. в одной таблице информация о человеке, она удаляется. А в другой таблице выдача книг, дата выдачи, дата возврата кн инд ном читателя и др. поля.

При нажатии на кнопку хочется, чтобы удалялась не только информация о читателе, но и данные из другой таблицы (вся информация с выбранным индивид ном читателя).

Добавлено через 1 минуту
есть вариант удалять по одной записи, но это очень долго.
0
1040 / 856 / 335
Регистрация: 08.12.2016
Сообщений: 3,283
23.04.2017, 10:37 10
Цитата Сообщение от Ppz Посмотреть сообщение
при нажатии на кнопку удалить-происходить удаление выбранного чел-ка из БД, но хочется чтобы еще и удалялась другая информация из другого DBGrid.
значит совсем неважная у вас структура данных, если из главной таблицы запись удалилась, а из подчиненных - нет. Да
Цитата Сообщение от Ppz Посмотреть сообщение
есть вариант удалять по одной записи, но это очень долго.
если удалять не из грида, а из таблицы, то можно одним запросом
0
0 / 0 / 0
Регистрация: 22.04.2017
Сообщений: 20
23.04.2017, 11:35  [ТС] 11
Напишите пожалуйста код, как можно сделать запрос через удаление из таблицы. (Это же через компонент ADOTable?)

Добавлено через 18 минут
А на счет того что при удалении школьника из БД его информация о выдаче книги не удаляется, так и должно быть. Нельзя чтобы шуольника удалили из БД если у него есть не возвращенные книги.
0
1040 / 856 / 335
Регистрация: 08.12.2016
Сообщений: 3,283
23.04.2017, 12:12 12
Цитата Сообщение от Ppz Посмотреть сообщение
Это же через компонент ADOTable?
нет это компонент ADOQuery, где должен быть записан запрос на удаление из связных таблиц, типа
SQL
1
2
3
DELETE FROM НесданныеКниги WHERE Школьник = :Id
DELETE FROM ВзятыеКниги WHERE Школьник = :Id
DELETE FROM ЗаказанныеКниги WHERE Школьник = :Id
и перед удалением записи из главной таблицы, в BeforeDelete подставить значения параметра и выполнить (ExecSQL)
0
0 / 0 / 0
Регистрация: 22.04.2017
Сообщений: 20
23.04.2017, 13:31  [ТС] 13
есть запрос но он на другой форме и нужен он для удаления,изменения добавления. Можно же через этот же запрос сделать так чтобы при нажатии кнопки удалялись данные из таблицы ШКОЛЬНИК и из таблицы АБОНЕМЕНТ . Можно сделать такой код (указанный ниже) для кнопки ?

Delphi
1
2
3
4
5
6
7
8
9
if Edit3.Text = '' then Exit; 
Form8.adoquery2.Delete;
 
withe Form_.ADOQuery_ do
begin
close;
sql.text:='delete from АБОНЕМЕНТ where Инд_ном_шк_ка=: ' Form_.Edit3';
open;
end;
0
1040 / 856 / 335
Регистрация: 08.12.2016
Сообщений: 3,283
23.04.2017, 13:46 14
Цитата Сообщение от Ppz Посмотреть сообщение
Можно же через этот же запрос сделать
если вы ограничены в количестве ADOQuery, можете. Это же так удобно
тогда уж
Delphi
1
2
3
4
5
6
  withe TADOQuery.Create do begin
    Connection := ...
    SQL := ...
    ExecSQL; 
    Free;
  end
1
0 / 0 / 0
Регистрация: 22.04.2017
Сообщений: 20
23.04.2017, 13:57  [ТС] 15
withe TADOQuery.Create do begin
Connection := ...
SQL := ...
ExecSQL;
Free;
end

SQL :=delete from АБОНЕМЕНТ where Инд_ном_шк_ка=: Form_.Edit3
Такое же не прокатит .
а Connection какое значение присваивать?
0
1040 / 856 / 335
Регистрация: 08.12.2016
Сообщений: 3,283
23.04.2017, 14:08 16
Цитата Сообщение от Ppz Посмотреть сообщение
а Connection какое значение присваивать?
такое же, как и во всех остальных ADOQuery и ADOTable. Или оно у всех разное
параметрический запрос в таком случае тоже будет уже не нужен, можно будет
Delphi
1
SQL :='delete from АБОНЕМЕНТ where Инд_ном_шк_ка=' + DataSet.FieldByName('имя ключевого поля').AsString;
0
0 / 0 / 0
Регистрация: 22.04.2017
Сообщений: 20
24.04.2017, 14:14  [ТС] 17
А если в другой форме у меня связано с компонентом DataSoerse Что делать?
0
1040 / 856 / 335
Регистрация: 08.12.2016
Сообщений: 3,283
25.04.2017, 15:06 18
Цитата Сообщение от Ppz Посмотреть сообщение
А если в другой форме у меня связано с компонентом DataSoerse Что делать?
Если вы его удалите, что что пойдете его рассматривать на другой форме? На другую форму вы уже зайдете с другим школьником, ещё не удаленным. Или вы вываливаете таблицы целиком? безо всякой фильтрации и отбора?
0
0 / 0 / 0
Регистрация: 22.04.2017
Сообщений: 20
25.04.2017, 17:44  [ТС] 19
вываливаю таблицы целиком =(.

Как написать запрос sql , удалять из таблица Абонемент , пока инд_ном_школьника = Едиту 1 с другой формы???

SQL.Text:='delete from АБОНЕМЕНТ where Инд_ном_шк_ка...
0
0 / 0 / 0
Регистрация: 28.04.2017
Сообщений: 4
28.04.2017, 21:17 20
Цитата Сообщение от Ppz Посмотреть сообщение
Как написать запрос sql , удалять из таблица Абонемент , пока инд_ном_школьника = Едиту 1 с другой формы???
соедините с формой в которой находится Adoquery
0
28.04.2017, 21:17
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
28.04.2017, 21:17
Помогаю со студенческими работами здесь

Установка DBGrid columns при выводе через запрос SQLquery (обычный вывод в editing DBGrid Columns все настраивается)
procedure TForm1.Button33Click(Sender: TObject); //Кнопка Все вывести begin...

вывод резултатов поиска в dbgrid
Помогите пожалуйста вывести результаты поиска в dbgrid2. Вот код поиска: qry1.close;...

DBGrid подсветка результата поиска
Всем добрый день, я уже задавал похожий вопрос) Есть проблема, как вывести результат поиска в...

Ошибка в результате поиска в dbgrid
Есть обработчик события нажатия кнопки: procedure TForm1.Button1Click(Sender: TObject); begin...


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

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru