Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > БД в Delphi
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 29.09.2015, 15:51   #1
Scorpuha
Форумчанин
 
Регистрация: 10.10.2013
Сообщений: 177
По умолчанию Фильтр SringGrid`a

На форме есть edit и StringGrid. StrinGrid заполняется данными из двух таблиц. Все ОК. Но есть еще задача, нужно что при вводе данных в едит grid фильтровался по одному из столбцов значению равному введенное в едит.
вот код заполнения grid

Код:
 LoadF.ADOQuery1.SQL.Clear;
  LoadF.ADOQuery1.SQL.Add('SELECT rabotniki.id, rabotniki.tabnum, rabotniki.familiya, rabotniki.imya, rabotniki.otchestvo, 
            rabotniki.dolzhnost_id, dolzhnosti.gruppa, dolzhnosti_napryazh.napryazh');
  LoadF.Adoquery1.sql.add('FROM sluzhby INNER JOIN ((dolzhnosti_personal INNER JOIN (dolzhnosti_napryazh 
            INNER JOIN dolzhnosti ON dolzhnosti_napryazh.id_napryazh = dolzhnosti.id_napryazh) 
                      ON dolzhnosti_personal.id_personal = dolzhnosti.id_personal)');
  LoadF.Adoquery1.sql.add(' INNER JOIN rabotniki ON dolzhnosti.dolzhnost_id = rabotniki.dolzhnost_id) 
            ON sluzhby.sluzhba_id = rabotniki.sluzhba_id');
  LoadF.ADOQuery1.Active:=True;
  LoadF.ADOQuery1.First;
  i := 0;
WorkerF.StringGrid1.ColWidths[0]:=-1;
WorkerF.StringGrid1.Cells[1,0]:='Таб.№';
  WorkerF.StringGrid1.Cells[2,0]:='Фамилия';
  WorkerF.StringGrid1.Cells[3,0]:='Группа по электробез.';
  WorkerF.StringGrid1.RowCount:=2;
  WorkerF.StringGrid1.ColWidths[1]:=100;
  WorkerF.StringGrid1.ColWidths[2]:=348;
  WorkerF.StringGrid1.ColWidths[3]:=200;
  while not LoadF.ADOQuery1.Eof do begin
      i := i+1;
      if i>1 then WorkerF.StringGrid1.RowCount:=WorkerF.StringGrid1.RowCount+1;
      WorkerF.StringGrid1.Cells[1,i]:=LoadF.ADOQuery1.FieldByName('tabnum').AsString;
      WorkerF.StringGrid1.Cells[2,i]:=LoadF.ADOQuery1.FieldByName('familiya').AsString+' '
                  +LoadF.ADOQuery1.FieldByName('imya').AsString+' '+LoadF.ADOQuery1.FieldByName('otchestvo').AsString;;
      WorkerF.StringGrid1.Cells[3,i]:=LoadF.ADOQuery1.FieldByName('gruppa').AsString;
      LoadF.ADOQuery1.Next;
     end;

Последний раз редактировалось Stilet; 29.09.2015 в 16:02.
Scorpuha вне форума Ответить с цитированием
Старый 29.09.2015, 16:03   #2
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Оформи этот код в функцию, и в качестве ее параметра передавай то, что фильтруется. Функцию вызывай чтоб она перечитывала в Грид данные.
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 29.09.2015, 16:06   #3
Scorpuha
Форумчанин
 
Регистрация: 10.10.2013
Сообщений: 177
По умолчанию

тоже думал что нужно как то обращаться к этой процедурке по мере ввода данных в едит, а вот как это сделать не знаю
Scorpuha вне форума Ответить с цитированием
Старый 29.09.2015, 16:10   #4
Scorpuha
Форумчанин
 
Регистрация: 10.10.2013
Сообщений: 177
По умолчанию

вообще думал заполнять сначала DBGrid, но не знаю аналог свойства dbgrida как у stringrid`a.cells и StringGrid1.RowCount
Scorpuha вне форума Ответить с цитированием
Старый 30.09.2015, 11:38   #5
Scorpuha
Форумчанин
 
Регистрация: 10.10.2013
Сообщений: 177
По умолчанию

вот код для заполнения DBGrida. Закинул на форму дополнительно DBGrid2 у которого свойство Datasource=DataSouce4 у которого в свою очередь DataSet=ADOQuery1, расположенный на другой форме. Код не работает, выдает ошибку "ADOquery1: Dataset not in edit or insert mode". Пожалуйста, укажите на ошибку.

Код:
LoadF.ADOQuery1.SQL.Clear;
  LoadF.ADOQuery1.SQL.Add('SELECT rabotniki.id, rabotniki.tabnum, rabotniki.familiya, rabotniki.imya, rabotniki.otchestvo, rabotniki.dolzhnost_id,
 dolzhnosti.gruppa, dolzhnosti_napryazh.napryazh');
  LoadF.Adoquery1.sql.add('FROM sluzhby INNER JOIN ((dolzhnosti_personal INNER JOIN (dolzhnosti_napryazh INNER JOIN dolzhnosti ON 
dolzhnosti_napryazh.id_napryazh = dolzhnosti.id_napryazh) ON dolzhnosti_personal.id_personal = dolzhnosti.id_personal)');
  LoadF.Adoquery1.sql.add(' INNER JOIN rabotniki ON dolzhnosti.dolzhnost_id = rabotniki.dolzhnost_id) ON sluzhby.sluzhba_id = rabotniki.sluzhba_id');
  LoadF.ADOQuery1.Active:=True;
  LoadF.ADOQuery1.First;
  i := 0;
   WorkerF.DBGrid2.Columns[0].title.caption:='№';
  WorkerF.DBGrid2.Columns[1].title.caption:='Название';
  WorkerF.DBGrid2.Columns[2].title.caption:='Полное название';
  WorkerF.DBGrid2.COLUMNS[1].Width:=100;
  WorkerF.DBGrid2.Columns[2].Width:=348;
  while not LoadF.ADOQuery1.Eof do begin
      i := i+1;
      if i>1 then WorkerF.DBGrid2.DataSource.DataSet.RecNo:=WorkerF.DBGrid2.DataSource.DataSet.RecNo+1;
      WorkerF.DBGrid2.DataSource.DataSet.Fields[0].AsString:=LoadF.ADOQuery1.FieldByName('tabnum').AsString;
      WorkerF.DBGrid2.DataSource.DataSet.Fields[1].AsString:=LoadF.ADOQuery1.FieldByName('familiya').AsString;
      WorkerF.DBGrid2.DataSource.DataSet.Fields[2].AsString:=LoadF.ADOQuery1.FieldByName('gruppa').AsString;
      LoadF.ADOQuery1.Next;
    end;
Scorpuha вне форума Ответить с цитированием
Старый 30.09.2015, 11:45   #6
Аватар
Старожил
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Сообщений: 18,922
По умолчанию

Цитата:
Код не работает, выдает ошибку "ADOquery1: Dataset not in edit or insert mode". Пожалуйста, укажите на ошибку.
Написано же в сообщении - статус датасета не эдит и не инсерт. Что значит - поля можно обновлять только после метода Edit, Insert или Append. Иначе не видать удачи. Другое дело - а нужно ли та галиматья, что показана?
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию
Аватар вне форума Ответить с цитированием
Старый 30.09.2015, 12:29   #7
Scorpuha
Форумчанин
 
Регистрация: 10.10.2013
Сообщений: 177
По умолчанию

Цитата:
Сообщение от Аватар Посмотреть сообщение
Написано же в сообщении - статус датасета не эдит и не инсерт. Что значит - поля можно обновлять только после метода Edit, Insert или Append. Иначе не видать удачи. Другое дело - а нужно ли та галиматья, что показана?
с аппендом не выдает ошибок, но и грид остается пустым, а вот с едитом или инсертом выдает ошибку "field id cannot modified"

Цитата:
Сообщение от Аватар Посмотреть сообщение
Другое дело - а нужно ли та галиматья, что показана?
Ваши предложения
Scorpuha вне форума Ответить с цитированием
Старый 30.09.2015, 12:31   #8
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Цитата:
Ваши предложения
Заполнять подключенную к WorkerF.DBGrid2 таблицу одним запросом INSERT INTO...SELECT, а не этим циклом.
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 30.09.2015, 12:47   #9
Scorpuha
Форумчанин
 
Регистрация: 10.10.2013
Сообщений: 177
По умолчанию

не понимаю, в моем коде уже есть запрос данных из НЕСКОЛЬКИХ таблиц.
Scorpuha вне форума Ответить с цитированием
Старый 30.09.2015, 13:09   #10
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Имею ввиду не просто SELECT а комбинацию INSERT и SELECT.
Хотя в твоем слчучае похоже на комбинацию UPDATE и SELECT...
I'm learning to live...
Stilet вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Работа с компонентом SringGrid (Delphi) McSullivan Помощь студентам 4 10.11.2012 23:11
Фильтр leno4ka_09 Microsoft Office Excel 2 13.05.2010 14:39
Фильтр БД Ma4balaka БД в Delphi 3 12.05.2010 12:15
Фильтр Машенька Microsoft Office Access 1 16.12.2009 20:27