|
|
Регистрация | << Правила форума >> | FAQ | Пользователи | Календарь | Поиск | Сообщения за сегодня | Все разделы прочитаны |
|
Опции темы | Поиск в этой теме | Опции просмотра |
#1
|
|||
|
|||
Поиск по базе данных, созданной в Access
Приветствую всех и прошу помощи. У меня есть база данных химчистки,созданная в access, по которой необходимо выполнить поиск по клиентам. Т.е. на отдельной форме я создал форму поиска:
1.png И набросал вот такой код,изменив найденный на просторах интернета: Код:
procedure TForm2.Button1Click(Sender: TObject); var s: string; n: integer; begin n := 0; s := 'SELECT * FROM '; if Checkbox1.Checked then Inc(n); if Checkbox2.Checked then Inc(n); if Checkbox3.Checked then Inc(n); if Checkbox4.Checked then Inc(n); if n > 0 then begin s := s + ' WHERE '; if Checkbox1.Checked then begin s := s + '(DBGrid6.Columns[0] = "' + Edit1.Text + '")'; if n > 1 then s := s + ' AND '; Dec(n); end; if Checkbox2.Checked then begin s := s + '(DBGrid6.Columns[1] = "' + Edit2.Text + '")'; if n > 1 then s := s + ' AND '; Dec(n); end; if Checkbox3.Checked then begin s := s + '(DBGrid6.Columns[2] = "' + Edit3.Text + '")'; if n > 1 then s := s + ' AND '; Dec(n); end; if Checkbox4.Checked then begin s := s + '(DBGrid6.Columns[3] = "' + Edit4.Text + '")'; if n > 1 then s := s + ' AND '; Dec(n); end; with DataModule1.FindKlientsQ do begin Close; SQL.Clear; SQL.Add(s); Open; end; end; Код:
s := 'SELECT * FROM '; P.S. DBGrid6.Columns[i]-это столбцы базы данных,которая расположена на другой форме.Соответсвенно DBGrid6.Columns[0]-это номер.DBGrid6.Columns[1]-фамилия и т.д. P.S.S. в DataModule1 расположены два компонента Query(FindKlientsQ) и DataSource(FindKlientsQDS). 12.png В Query пытался выбирать все DataBaseName,но ничего не работает. Возможно,что это можно сделать намного проще и я всё усложняю,поэтому и прошу помощи. |
#2
|
||||
|
||||
Использовать конструкции вроде DBGrid6.Columns[3] - плохая примета. В случае, если столбец грида будет перемещён (методом перетаскивания) - получите неверный результат. Лучше работать с датасетом, откуда берутся данные для грида (это может быть ADOTable или ADOQuery), следующим образом:
Код:
Query1.FieldByName('Имя_поля_откуда_надо_получить_данные').AsString Теперь по сути вопроса. Если часть базы, расположенная на других формах, функционирует нормально, тогда смотрим приведённый код. Первое: не нужно засовывать в текст запроса конструкции вроде DBGrid6.Columns[3], он этого не поймёт. Введите ещё одну текстовую переменную и сделайте присвоение. Второе: DBGrid6.Columns[3] имеет тип TColumn, с текстовым типом несовместим. Вытащить данные конечно оттуда можно, но это через ...опу, гораздо правильнее делать так, как я описал выше, через датасет. Третье: закрывать датасет не нужно, он автоматически закроется сам после команды "SQL.Clear". Четвёртое: тщательно проверьте текст запроса, не допущены ли ошибки в алгоритме (это касается слова "AND" в запросе в разных ситуациях, проверьте!). Оперативная проверка текста запроса с отменой его выполнения такова: Код:
ShowMessage(DataModule1.FindKlientsQ.SQL.CommaText); Exit; |
#3
|
|||
|
|||
Цитата:
Но у меня такой вопрос:а нельзя ли сделать легче-например,человек вводит в edit'ы фамилию,имя,отчество,в в DbGrid,например,просто выводятся все строки из таблицы с клиентами,удовлетворяющие условию поиска по ФИО? |
#4
|
||||
|
||||
Да проще простого всё это. В чём проблема-то? Сделать можно либо через запрос (Query), либо методом фильтрации (свойство Filter датасета). Если условий несколько, надо написать код без ошибок, чтобы не было синтаксических ошибок, независимо от количества условий и порядка их следования. Случай с SQL-запросом у Вас расписан (с ошибками, но это детали), а для фильтрации используйте свойства Filter и Filtered датасета. Не совсем понятен Ваш вопрос, слишком он общий. Нельзя ли конкретнее?
|