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

 



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

Ответ
 
Опции темы Поиск в этой теме Опции просмотра
  #1  
Старый 16.10.2019, 19:43
APTEMKA APTEMKA вне форума
Прохожий
 
Регистрация: 28.09.2019
Сообщения: 7
Версия Delphi: Delphi 7
Репутация: 10
Восклицание Поиск по базе данных, созданной в 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  
Старый 16.10.2019, 20:32
Аватар для Guaho
Guaho Guaho вне форума
Начинающий
 
Регистрация: 27.08.2017
Сообщения: 101
Версия Delphi: Delphi7
Репутация: 10
По умолчанию

Использовать конструкции вроде DBGrid6.Columns[3] - плохая примета. В случае, если столбец грида будет перемещён (методом перетаскивания) - получите неверный результат. Лучше работать с датасетом, откуда берутся данные для грида (это может быть ADOTable или ADOQuery), следующим образом:
Код:
Query1.FieldByName('Имя_поля_откуда_надо_получить_данные').AsString
Кроме того, использование имён, не несущих информации (вроде "DBGrid6") - дурной тон. Если будете продолжать в том же духе, даже в средней своей программе быстро запутаетесь и будете тратить кучу времени, чтобы вспомнить, что есть что. Правильнее будет давать осмысленные имена с префиксом, например qClients для Query или tClients для Table. Да, это займёт чуть больше времени на написание имён, но существенно облегчит процесс разработки, поверьте! Префиксы к именам Вы используете, но ставьте их не сзади, а спереди, так будет удобнее.
Теперь по сути вопроса. Если часть базы, расположенная на других формах, функционирует нормально, тогда смотрим приведённый код.
Первое: не нужно засовывать в текст запроса конструкции вроде DBGrid6.Columns[3], он этого не поймёт. Введите ещё одну текстовую переменную и сделайте присвоение. Второе: DBGrid6.Columns[3] имеет тип TColumn, с текстовым типом несовместим. Вытащить данные конечно оттуда можно, но это через ...опу, гораздо правильнее делать так, как я описал выше, через датасет.
Третье: закрывать датасет не нужно, он автоматически закроется сам после команды "SQL.Clear".
Четвёртое: тщательно проверьте текст запроса, не допущены ли ошибки в алгоритме (это касается слова "AND" в запросе в разных ситуациях, проверьте!). Оперативная проверка текста запроса с отменой его выполнения такова:
Код:
ShowMessage(DataModule1.FindKlientsQ.SQL.CommaText);
Exit;
Ответить с цитированием
  #3  
Старый 17.10.2019, 06:34
APTEMKA APTEMKA вне форума
Прохожий
 
Регистрация: 28.09.2019
Сообщения: 7
Версия Delphi: Delphi 7
Репутация: 10
По умолчанию

Цитата:
Сообщение от Guaho
Использовать конструкции вроде DBGrid6.Columns[3] - плохая примета. В случае, если столбец грида будет перемещён (методом перетаскивания) - получите неверный результат. Лучше работать с датасетом, откуда берутся данные для грида (это может быть ADOTable или ADOQuery), следующим образом:
Код:
Query1.FieldByName('Имя_поля_откуда_надо_получить_данные').AsString
Кроме того, использование имён, не несущих информации (вроде "DBGrid6") - дурной тон. Если будете продолжать в том же духе, даже в средней своей программе быстро запутаетесь и будете тратить кучу времени, чтобы вспомнить, что есть что. Правильнее будет давать осмысленные имена с префиксом, например qClients для Query или tClients для Table. Да, это займёт чуть больше времени на написание имён, но существенно облегчит процесс разработки, поверьте! Префиксы к именам Вы используете, но ставьте их не сзади, а спереди, так будет удобнее.
Теперь по сути вопроса. Если часть базы, расположенная на других формах, функционирует нормально, тогда смотрим приведённый код.
Первое: не нужно засовывать в текст запроса конструкции вроде DBGrid6.Columns[3], он этого не поймёт. Введите ещё одну текстовую переменную и сделайте присвоение. Второе: DBGrid6.Columns[3] имеет тип TColumn, с текстовым типом несовместим. Вытащить данные конечно оттуда можно, но это через ...опу, гораздо правильнее делать так, как я описал выше, через датасет.
Третье: закрывать датасет не нужно, он автоматически закроется сам после команды "SQL.Clear".
Четвёртое: тщательно проверьте текст запроса, не допущены ли ошибки в алгоритме (это касается слова "AND" в запросе в разных ситуациях, проверьте!). Оперативная проверка текста запроса с отменой его выполнения такова:
Код:
ShowMessage(DataModule1.FindKlientsQ.SQL.CommaText);
Exit;
Да,здравствуйте,спасибо за замечания,обязательно учту это в следующей своей программе,ибо в этой нет ни желания,ни времени исправлять,с курсовой всегда так
Но у меня такой вопрос:а нельзя ли сделать легче-например,человек вводит в edit'ы фамилию,имя,отчество,в в DbGrid,например,просто выводятся все строки из таблицы с клиентами,удовлетворяющие условию поиска по ФИО?
Ответить с цитированием
  #4  
Старый 17.10.2019, 20:39
Аватар для Guaho
Guaho Guaho вне форума
Начинающий
 
Регистрация: 27.08.2017
Сообщения: 101
Версия Delphi: Delphi7
Репутация: 10
По умолчанию

Да проще простого всё это. В чём проблема-то? Сделать можно либо через запрос (Query), либо методом фильтрации (свойство Filter датасета). Если условий несколько, надо написать код без ошибок, чтобы не было синтаксических ошибок, независимо от количества условий и порядка их следования. Случай с SQL-запросом у Вас расписан (с ошибками, но это детали), а для фильтрации используйте свойства Filter и Filtered датасета. Не совсем понятен Ваш вопрос, слишком он общий. Нельзя ли конкретнее?
Ответить с цитированием
Ответ



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

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

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

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


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


 

Сайт

Форум

FAQ

RSS лента

Прочее

 

Copyright © Форум "Delphi Sources", 2004-2019

ВКонтакте   Facebook   Twitter