1 (edited by Andrei 2019-07-31 05:53:33)

Topic: Фильтрация в ComboBox

Здравствуйте.
Есть переменные

sUser: string = '';
   idUser: integer;
   idDepartament: integer;
   isAdmin: boolean = False;

Заполнение
idDepartament := SQLExecute('SELECT IFNULL(id_departament, 0) FROM users WHERE id = '+IntToStr(idUser));

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

procedure FrmAddSch_OnShow (Sender: TObject; Action: string);
begin
  FrmAddSch.ComboBox2.dbsqlexecute (select KOD from departament where='idDepartament');
  end;
begin
end.

Re: Фильтрация в ComboBox

Andrei wrote:

Здравствуйте.
Есть переменные

sUser: string = '';
   idUser: integer;
   idDepartament: integer;
   isAdmin: boolean = False;

Заполнение
idDepartament := SQLExecute('SELECT IFNULL(id_departament, 0) FROM users WHERE id = '+IntToStr(idUser));

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

procedure FrmAddSch_OnShow (Sender: TObject; Action: string);
begin
  FrmAddSch.ComboBox2.dbsqlexecute (select KOD from departament where='idDepartament');
  end;
begin
end.

по какому условию Вы хотите получить id?
 
select KOD from departament where='idDepartament'
запрос не имеет смысла

Re: Фильтрация в ComboBox

Нужно чтобы в ComboBox2 отображалось ТОЛЬКО значение из таблицы departament  для столбца KOD  вошедшего пользователя
структура таблица Users:
id
login
password
admin
id_Departament
структура таблица Departament:
id
KOD
значение ComboBox2 для записи в таблицу print:
ForeignKey - print.id_departament
FieldName - KOD

Re: Фильтрация в ComboBox

у ComboBox есть свойство dbFilter, в котором вы можете указать условие для фильтрации записей в нем

idDepartament := SQLExecute('SELECT IFNULL(id_departament, 0) FROM users WHERE id = '+IntToStr(idUser));
Form1.ComboBox1.dbFilter := 'id='+IntToStr(idDepartament);
Form1.ComboBox1.dbUpdate;
Dmitry.

Re: Фильтрация в ComboBox

Работает.
Огромное Спасибо!!!

Re: Фильтрация в ComboBox

Добрый день.
Подскажите как правильно написать в фильтр ComboBox Запрос SQL чтобы в фильтр попали записи по условию id_rab = (1)
ForeingKey для ComboBox print.id_mod_print

procedure frmAddSch_OnMouseEnter (Sender: TObject);
begin
       frmAddSch.ComboBox2.dbFilter := SQLExecute('SELECT id_mod_print FROM print WHERE id_rab = (1)');
       frmAddSch.ComboBox2.dbUpdate;
end;

Re: Фильтрация в ComboBox

Andrei wrote:

Добрый день.
Подскажите как правильно написать в фильтр ComboBox Запрос SQL чтобы в фильтр попали записи по условию id_rab = (1)
ForeingKey для ComboBox print.id_mod_print

procedure frmAddSch_OnMouseEnter (Sender: TObject);
begin
       frmAddSch.ComboBox2.dbFilter := SQLExecute('SELECT id_mod_print FROM print WHERE id_rab = (1)');
       frmAddSch.ComboBox2.dbUpdate;
end;

procedure frmAddSch_OnMouseEnter (Sender: TObject);
begin
       frmAddSch.ComboBox2.dbFilter := SQLExecute('SELECT id_mod_print FROM print WHERE id_rab =1');
       frmAddSch.ComboBox2.dbUpdate;
end;

8 (edited by Andrei 2019-07-30 08:19:26)

Re: Фильтрация в ComboBox

procedure frmAddSch_OnMouseEnter (Sender: TObject);
begin
       frmAddSch.ComboBox2.dbFilter := SQLExecute('SELECT id_mod_print FROM print WHERE id_rab =1');
       frmAddSch.ComboBox2.dbUpdate;
end;

Пробовал. Не работает.
Для проверки синтаксиса, по подобию ранее предложенного ответа Дмитрием, создал фильтр - работает захватывая первое значение с id_rab=1

 procedure frmAddSch_OnMouseEnter (Sender: TObject);
begin
     idrab := SQLExecute('SELECT id_mod_print FROM print WHERE id_rab = (1)');
    frmAddSch.ComboBox2.dbFilter := 'id='+IntToStr(idrab);
end;

Но мне нужен список в ComboBox всех принтеров с  id_rab = (1).
Не знаю, такой фильтр вообще можно делать?

Re: Фильтрация в ComboBox

id_mod_print
это ссылка на другую таблицу?

Re: Фильтрация в ComboBox

sibprogsistem wrote:

id_mod_print
это ссылка на другую таблицу?

Да.
На связанную таблицу mod_print.
Сам ComboBox выводит информацию (FieldName) mod_print.name по (ForeignKey) print.id_mod_print

В итоге должны увидеть в раскрывшемся ComboBox список моделей принтеров (mod_print.name) у которых в таблице print id_rab=1

Re: Фильтрация в ComboBox

в данном случае

SELECT id_mod_print FROM print WHERE id_rab =1

будет не верно, это скрипт запроса в одну таблицу

дайте хотябы скрин этих баз, а то так сложно все понять

12 (edited by Andrei 2019-07-30 12:57:24)

Re: Фильтрация в ComboBox

https://a.radikal.ru/a23/1907/b8/9d1930cca401.jpg

https://a.radikal.ru/a37/1907/03/e38c6edb1c34.jpg

https://b.radikal.ru/b43/1907/6b/1b06c73f52bb.jpg

https://c.radikal.ru/c21/1907/30/89f3a4758598.jpg

Re: Фильтрация в ComboBox

попробуйте, это

SQLExecute('SELECT name FROM mod_print LEFT OUTER JOIN print ON mod_print.id=print.id_mod_print WHERE print.id_rab=1');

Re: Фильтрация в ComboBox

sibprogsistem wrote:

попробуйте, это

SQLExecute('SELECT name FROM mod_print LEFT OUTER JOIN print ON mod_print.id=print.id_mod_print WHERE print.id_rab=1');

Как только открывается форма на которой расположен ComboBox  - возникает ошибка.
https://b.radikal.ru/b03/1907/76/255d89449ae7.jpg

https://a.radikal.ru/a00/1907/ce/a15ad5d4a376.jpg

Из второго скрина видно, что вытянулось название принтера Canon i-SENSYS MF4018 (столбец name) из таблички mod_print для первой строки таблицы print c id_rab=1.

т.е. отрабатывается Sql запрос (Select), а не компонент ComboBox с фильтром (Select)...

15 (edited by sibprogsistem 2019-07-31 06:00:14)

Re: Фильтрация в ComboBox

frmAddSch.ComboBox2.dbSQLExecute('SELECT name FROM mod_print LEFT OUTER JOIN print ON mod_print.id=print.id_mod_print WHERE print.id_rab=1');

Re: Фильтрация в ComboBox

sibprogsistem wrote:
frmAddSch.ComboBox2.dbSQLExecute('SELECT name FROM mod_print LEFT OUTER JOIN print ON mod_print.id=print.id_mod_print WHERE print.id_rab=1');

Спасибо sibprogsistem. Отработало... Но легче от этого не стало
https://d.radikal.ru/d21/1907/f4/0c90008810f2.jpg
Хотел увидеть "немножко" другое, а именно, перечень моделей (в единственном числе) без учета моделей у которых id_rab<>1.
Наверное в ComboBoxe такую фильтрацию сделать не возможно, так как в таблице print могут быть разные записи print.id c одинаковыми print.id_mod_print...
Буду накладывать фильтр id_rab=1 на TableGrid для таблицы print.

Только не знаю как наложить такой фильтр на Grid, заполняемый:

idPrint := formOth_printDisplay.TableGrid1.dbItemID;
      FrmOth.Button3.dbSQL := 'select distinct с.name, b.kab, a.sch, a.data, '+
                                            ' from sch a '+
                                            ' join print b on a.id_print=b.id '+
                                            ' join mod_print с on b.id_mod_print=d.id '+
                                            ' where b.id = '+ IntToStr(idprint) +
                                            ' order by a.data DESC';
                      FrmOth.Button3.Click;

17 (edited by sibprogsistem 2019-07-31 08:48:04)

Re: Фильтрация в ComboBox

у Вас ошибка в Формировании БД
имя принтера всегда должно быть одно, и наче говоря у Вас в записях таблицы mod_print есть много id c  одним и тем же именем принтера ..

Re: Фильтрация в ComboBox

sibprogsistem wrote:

у Вас ошибка в Формировании БД
имя принтера всегда должно быть одно, и наче говоря у Вас в записях таблицы mod_print есть много id c  одним и тем же именем принтера ..

sibprogsistem Вы не так поняли.
Как раз mod_print вынесена как справочник (модели уникальны), а вот таблица print, так как принтеров одной модели может (и есть) много, является рабочей. Работает БД с конкретным принтером (id) из print.
Компонент ComboBox (ForeignKey) print.id_mod_print  (FieldName) mod_print.name работает без проблем.
https://a.radikal.ru/a23/1907/3c/90bf3fe81a37.jpg
Как видите выводятся уникальные наименования принтеров в ComboBox
И правильно заполняется Grid - мы видим 6 принтеров MF4018
https://a.radikal.ru/a10/1907/8e/5224a2760db0.jpg
Вопрос возник по возможности фильтрации в ComboBox...

Re: Фильтрация в ComboBox

Проще говоря моя задумка ошибочна и неисполнима.
Я хотел наложить фильтр на ComboBox, что если id_print <> 1 то не отображать модель принтера. Но принтеров одной модели много и у кого-то может быть id_print = 1...

20 (edited by sibprogsistem 2019-07-31 09:43:09)

Re: Фильтрация в ComboBox

Andrei wrote:

Проще говоря моя задумка ошибочна и неисполнима.
Я хотел наложить фильтр на ComboBox, что если id_print <> 1 то не отображать модель принтера. Но принтеров одной модели много и у кого-то может быть id_print = 1...

тогда попробуйте дополнить коким-либо полем которое будет делить эти принтеры

типа.. офис №  или испольуйте инвентаризационные номера

Re: Фильтрация в ComboBox

sibprogsistem wrote:
Andrei wrote:

Проще говоря моя задумка ошибочна и неисполнима.
Я хотел наложить фильтр на ComboBox, что если id_print <> 1 то не отображать модель принтера. Но принтеров одной модели много и у кого-то может быть id_print = 1...

тогда попробуйте дополнить коким-либо полем которое будет делить эти принтеры

типа.. офис №  или испольуйте инвентаризационные номера

Это есть.
id_rab - состояния
1- работает
2- в ремонте
3- на списание
и т.д.
Я хотел что бы минимизировать работу пользователя с принтерами которые не используются, т.е. исключить работу с принтерами, у которых id_rab<>1.

Re: Фильтрация в ComboBox

Для того, чтобы убрать "не нужные" принтера в Grid-ах стандартной фильтрации достаточно.
Но не знаю, как убрать из Grida принтера id_rab<>1, заполненного Join-ом

idPrint := formOth_printDisplay.TableGrid1.dbItemID;
      FrmOth.Button3.dbSQL := 'select distinct с.name, b.kab, a.sch, a.data, '+
                                            ' from sch a '+
                                            ' join print b on a.id_print=b.id '+
                                            ' join mod_print с on b.id_mod_print=d.id '+
                                            ' where b.id = '+ IntToStr(idprint) +
                                            ' order by a.data DESC';
                      FrmOth.Button3.Click;

Re: Фильтрация в ComboBox

id_rab>1

24 (edited by Andrei 2019-07-31 10:46:02)

Re: Фильтрация в ComboBox

sibprogsistem wrote:
id_rab>1

Спасибо работатет. Только к idprint надо добавить условие  b.id_rab =1

' where b.id = '+ IntToStr(idprint) +' and (b.id_rab =1) ';    

Re: Фильтрация в ComboBox

Здравствуйте.
Выявилась проблема. Заключается в следующем:
Если заходит Администратор, то фильтр TableGrid1
https://a.radikal.ru/a41/1908/f1/6e0e54b6883a.jpg
чудесно отрабатывает.
Если заходит пользователь с правами своего департамента
if (not isAdmin) then FrmSch.TableGrid1.dbFilter := 'id_departament='+IntToStr(idDepartament);
то тот же фильтр на TableGrid1 не работает
https://c.radikal.ru/c28/1908/d1/87e599a848ff.jpg