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

Delphi Sources



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

Ответ
 
Опции темы Поиск в этой теме Опции просмотра
  #1  
Старый 14.01.2009, 18:32
MycTafa MycTafa вне форума
Прохожий
 
Регистрация: 14.01.2009
Сообщения: 5
Репутация: 10
Вопрос Поиск

Вот делаю квалифу на тему АДО. Столкнулся с такой проблемой - широкий поиск. Идея была такова : открываю базу мдб своей программой, выбираю поиск и на форме появляется дбгрид(отображение результатов) и лэйблы с эдитами. В лэйблы идут все названия полей из текущей открытой таблицы, а в эдиты мы вводим наши критерии поиска,и по событию onchange эдитов, создавать запрос на выбор нужной информации. Столкнулся с проблемой - как создать на форме определённое количество лэйблов,а рядом с ними и эдитов, учитывая, что открываем любую базу данных. Помню, был какой-то метод динамеческого построения объектов, но не помню его Если кто разбирается в этих делах - попомгите пожалуйста,хотя бы с алгоритмом.
Заранее спасибо.
Ответить с цитированием
  #2  
Старый 14.01.2009, 18:47
lmikle lmikle вне форума
Модератор
 
Регистрация: 17.04.2008
Сообщения: 8,023
Версия Delphi: 7, XE3, 10.2
Репутация: 49089
По умолчанию

Заводишь массив типа

Код:
type
  TMyContols = record
    ALabel : TLabel;
    AEdit : TEdit;
  end;

var
  AMyControls = array of TMyControls;

Это динамический массив.
Далее после открытия таблицы делаешь такую штуку:

Код:
var
  I : Integer;
begin
  For I := 0 To ADOQuesr1.Fields.Count-1 Do
    Begin
       setLength(AMyControls,Length(AMyControls)+1); // Добавляем 1 элемент
       AMyControls[High(AMyControls)].ALabel := TLabel.Create(Self);
       AMyControls[High(AMyControls)].ALabel.Parent := Self;
       AMyControls[High(AMyControls)].ALabel.Top := 10 * I;
       AMyControls[High(AMyControls)].ALabel.Left := 100;
       AMyControls[High(AMyControls)].ALabel.Caption :=  ADOQuesr1.Fields[i].FieldName;
       AMyControls[High(AMyControls)].AEdit := TEdit.Create(Self);
       AMyControls[High(AMyControls)].AEdit.Parent := Self;
       AMyControls[High(AMyControls)].AEdit.Top := I * 10;
       AMyControls[High(AMyControls)].AEdit.Left := 300;
       AMyControls[High(AMyControls)].AEdit.OnChange := EditChangeEvent;
    End;
end;

EventChangeEvent - обработчик изменения контрола.
Как собирать данные - циклом по массиву - из метки берешь имя поля, из эдита - данные.
Очистка массива - сначала удалить сами контролы, потом поставить массиву длинну 0.

ЗЫ. Я бы делал запуск запроса не по изменению значения в эдите, а по кнопке, т.к. выборки могут быть большие и ты учухаешься ждать, пока после нажатия любой клавиши у тебя выполнится новый зпрос.
Ответить с цитированием
  #3  
Старый 14.01.2009, 20:39
MycTafa MycTafa вне форума
Прохожий
 
Регистрация: 14.01.2009
Сообщения: 5
Репутация: 10
По умолчанию

Огромное спасибо.
Созрел второй,он же,кажется, последний
Вот даже пусть по кнопке,но как мне собрать все данные в 1 SQL запрос? Располагаю тэйблнэймом,массивом, где есть и названия полей таблицы, и критерии отбора, вот кажется уже всё есть,но никак не могу додумать последней мысли. Помогите, пожалуйста
Ответить с цитированием
  #4  
Старый 14.01.2009, 21:24
lmikle lmikle вне форума
Модератор
 
Регистрация: 17.04.2008
Сообщения: 8,023
Версия Delphi: 7, XE3, 10.2
Репутация: 49089
По умолчанию

Ну так и собирай!!!

Код:
var
  I : Integer;
  S : String;
begin
  S := 'SELECT * FROM ' + YourTableName + #13#10;
  For I := Low(AMyControls) To High(AMyControls) Do
    Begin
      If I <> Low(AMyControls) Then S := S + ' AND ';
      S := S + AMyControls.ALabel.Caption + ' = ''' +  AMyControls.AEdit.Text + '''';
    End;

Собирает условие по 'равно'. Нет проверки на пустое значение. Рассматривает все поля как текстовые. Все это доделаешь сам.
Ответить с цитированием
  #5  
Старый 14.01.2009, 22:34
MycTafa MycTafa вне форума
Прохожий
 
Регистрация: 14.01.2009
Сообщения: 5
Репутация: 10
По умолчанию

На примере небольшой таблички формирую таким образом запрос :
SELECT * FROM Таблица1 WHERE ((Номер) LIKE "%") AND ((Ім'я) LIKE "%") AND ((Прізвище) LIKE "%") AND ((Посада) LIKE "%") но в нём синтаксическая ошибка
Ответить с цитированием
  #6  
Старый 15.01.2009, 19:43
MycTafa MycTafa вне форума
Прохожий
 
Регистрация: 14.01.2009
Сообщения: 5
Репутация: 10
По умолчанию

Появился следующий вопрос - как проверить тип данного поля? каким методом? И как при этом поменять тип текстового поля в тип этого поля? нужно для сравнения в запросе...
Ответить с цитированием
Ответ


Delphi Sources

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

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

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

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


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


 

Сайт

Форум

FAQ

RSS лента

Прочее

 

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

ВКонтакте   Facebook   Twitter