Форум программистов, компьютерный форум, киберфорум
Delphi: Базы данных
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.50/6: Рейтинг темы: голосов - 6, средняя оценка - 4.50
0 / 0 / 1
Регистрация: 20.10.2011
Сообщений: 47
Interbase

Поиск по CheckListBox

28.01.2016, 16:11. Показов 1286. Ответов 9
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Всем доброго времени суток.
Работаю в Delphi XE6, БД FireBird.
Необходимо выполнить поиск по таблице, в которой есть поле God типа varchar. В этом поле хранятся года. Год может быть один (2005), может быть несколько (2005, 2007, 2015). В БД они хранятся в виде одной строки, через запятую. Перед нажатием на кнопку «Поиск» указывается в CheckListBox интересующие нас года. Отмеченных годов в CheckListBox так же может быть 1 или несколько. Пока получилось реализовать поиск, если в CheckListBox выбрали только одну строку. А как допилить код, чтоб искало по двум и более выбранным строкам в CheckListBox. Заранее спасибо!

Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
DM.QPerson.Close;
DM.QPerson.SQL.Clear;
 
//поиск по другим полям
DM.QPerson.SQL.Add('SELECT * FROM person ……');
 
//если включили поиск по полю год
if CheckBox1.Checked=True then
begin
 
//проходимся по списку
for I := 0 to FormYear.CheckListBox1.Items.Count - 1 do
  begin
    
    //если строка выбрана
    if FormYear.CheckListBox1.Checked[i] then
 
    //в переменную s типа string заносим значение года
    s :=FormYear.CheckListBox1.Items[i];
  end;
 
//ищем в поле год строку s
DM.QPerson.SQL.Add('and god like ' + QuotedStr ('%' + s + '%'));
end;
 
DM.QPerson.SQL.Add('order by lname, fname, patronymic');
DM.QPerson.Open;
Например,

Фамилия Год

Петров1 2010
Петров2 2015
Петров3 2010,2009
Петров4 2009
Петров5 2015,2002,2008
Петров6 2009

при выборе в CheckListBox 2010 и 2015 год должен вывести 1, 2, 3 и 5 Петровых
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
28.01.2016, 16:11
Ответы с готовыми решениями:

Поиск в CheckListBox
Здравствуйте, заполняю ChekListbox данными из DBGrid procedure TAddDB.FormShow(Sender: TObject); begin checklistbox1.items.clear; ...

CheckListBox аналог делфийского и CheckState для 1го CheckBox в CheckListBox
Здравствуйте. 1. Проблема в том что в c# CheckListBox не похож на делфийский. Например нельзя получить индекс элемента где была...

Отмеченные строки ChecklistBox'a вывести в другой ChecklistBox
Собственно вопрос в заголовке. Код по сути написан: void __fastcall TForm1::CheckListBox1ClickCheck(TObject *Sender) { int i; ...

9
5986 / 4561 / 1096
Регистрация: 29.08.2013
Сообщений: 28,202
Записей в блоге: 3
28.01.2016, 16:14
вы из отмеченных элементов сформируйте список вот такой '2010, 2015'

тогда в запросе можно сделать так

SQL
1
'select * from table where year in ('+список+')'
0
 Аватар для notsliva
15 / 15 / 7
Регистрация: 25.06.2012
Сообщений: 95
28.01.2016, 16:42
Цитата Сообщение от qwertehok Посмотреть сообщение
'select * from table where year in ('+список+')'
Там же в поле строка вида "1, 2, 3...", а IN по точному вхождению работает.

Первое, что приходит на ум - это в зависимости от количества выбранных пунктов формировать конец запроса по типу:
SQL
1
AND (god LIKE "%1990%" OR god LIKE "%1991%"...)
Но это всё бред, очевидно же, что база изначально спроектирована неверно.
0
5986 / 4561 / 1096
Регистрация: 29.08.2013
Сообщений: 28,202
Записей в блоге: 3
28.01.2016, 16:45
Цитата Сообщение от notsliva Посмотреть сообщение
Но это всё бред, очевидно же, что база изначально спроектирована неверно.
бред
в колонках значений через запятую не должно быть
0
 Аватар для notsliva
15 / 15 / 7
Регистрация: 25.06.2012
Сообщений: 95
28.01.2016, 16:52
Цитата Сообщение от qwertehok Посмотреть сообщение
в колонках значений через запятую не должно быть
Чур, Вы отвечаете, как было нужно, когда ТС спросит об этом
0
5986 / 4561 / 1096
Регистрация: 29.08.2013
Сообщений: 28,202
Записей в блоге: 3
28.01.2016, 16:54
Цитата Сообщение от notsliva Посмотреть сообщение
Чур, Вы отвечаете, как было нужно,
без проблем, это не моя база
0
 Аватар для krapotkin
6851 / 4677 / 1465
Регистрация: 14.04.2014
Сообщений: 20,674
Записей в блоге: 21
28.01.2016, 20:58
Цитата Сообщение от flogiston Посмотреть сообщение
поле God
уже наводит на мысли )))

при проектировании нужно помнить, что одно поле должно содержать одно значение
в качестве ИСКЛЮЧЕНИЯ при ОЧЕНЬ обоснованном выборе встречается загрузка строк типа
~1999~2000~2003~2004~2005~
и тогда поиск можно осуществлять так:
SQL
1
SELECT f1,f2,f3 FROM table1 WHERE f4 containing '~'||:year_param||'~'
0
0 / 0 / 1
Регистрация: 20.10.2011
Сообщений: 47
29.01.2016, 10:06  [ТС]
Спасибо всем откликнувшимся за советы. Сделал по-своему, может быть не совсем правильно, но работает, как положено:

Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
if CheckBox1.Checked=True then
begin
for i := 0 to FormYear.CheckListBox1.Items.Count - 1 do
  begin   
    if FormYear.CheckListBox1.Checked[i] then
    begin
    inc (kolvogodov);
    s :=FormYear.CheckListBox1.Items[i];
    if kolvogodov=1 then
    dopzapr:=' god like ' + QuotedStr ('%' + s + '%');
    if kolvogodov>1 then
    dopzapr:=dopzapr + ' or god like ' + QuotedStr ('%' + s + '%');
    end;
  end;
if kolvogodov<>0 then
DM.QPerson.SQL.Add('and (' + dopzapr + ')');
end;

PS.
Цитата Сообщение от krapotkin Посмотреть сообщение
Цитата Сообщение от flogiston Посмотреть сообщение
поле God
уже наводит на мысли )))
Поле обозвал god, потому что year в Firebird вроде как зарезервированное слово.
0
5986 / 4561 / 1096
Регистрация: 29.08.2013
Сообщений: 28,202
Записей в блоге: 3
29.01.2016, 10:38
Цитата Сообщение от flogiston Посмотреть сообщение
может быть не совсем правильно
совсем неправильно

Цитата Сообщение от flogiston Посмотреть сообщение
работает, как положено
это не показатель
когда у вас будет Х миллионов строк - вы будете убивать за такие запросы
0
 Аватар для krapotkin
6851 / 4677 / 1465
Регистрация: 14.04.2014
Сообщений: 20,674
Записей в блоге: 21
29.01.2016, 11:49
если посадить начитанного китайца и дать ему телефон, он тоже сможет отвечать на OK, Google
но это не считается что все работает "как положено"
если это боевая задача, то
Цитата Сообщение от qwertehok Посмотреть сообщение
когда у вас будет Х миллионов строк - вы будете убивать
если учебная - вы учитесь делать неправильно и в будущем
Цитата Сообщение от qwertehok Посмотреть сообщение
когда у вас будет Х миллионов строк
...
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
29.01.2016, 11:49
Помогаю со студенческими работами здесь

CheckListBox
Не могу добиться чтобы нельзя было юзать кнопку если не выбран ни один вариант в CheckListBox и выбрано больше двух ответов.К тому же не...

ChecklistBox
Вообщем, я что то туплю. procedure TForm3.PropuskClickCheck(Sender: TObject); var i:integer; p:string; begin ...

CheckListBox
Народ мне так и не удалось доделать прогу! у меня есть программа для просмотра DB там только строки и колонки нужно добавить компонент...

CheckListBox
В CheckListBox загрузил список активных окон. Как сделать, чтобы при снятии галочки это окно скрывалось, и наоборот отображалось если её...

CheckListBox
В компоненте CheckListBox выбрать строку(вопрос) и вывести в Edit(ответ на тот вопрос). Как это сделать????


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
10
Ответ Создать тему
Новые блоги и статьи
Контроль заполнения и очистка дат в зависимости от значения перечислений
Maks 12.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "ПланированиеПерсонала", разработанного в конфигурации КА2. Задача: реализовать контроль корректности заполнения дат назначения. . .
Архитектура слоя интернета для сервера-слоя.
Hrethgir 11.04.2026
В продолжение https:/ / www. cyberforum. ru/ blogs/ 223907/ 10860. html Знаешь что я подумал? Раз мы все источники пишем в голове ветки, то ничего не мешает добавить в голову такой источник, который сам. . .
Подстановка значения реквизита справочника в табличную часть документа
Maks 10.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "ПланированиеПерсонала", разработанного в конфигурации КА2. Задача: при выборе сотрудника (справочник Сотрудники) в ТЧ документа. . .
Очистка реквизитов документа при копировании
Maks 09.04.2026
Алгоритм из решения ниже применим как для типовых, так и для нетиповых документов на самых различных конфигурациях. Задача: при копировании документа очищать определенные реквизиты и табличную. . .
модель ЗдравоСохранения 8. Подготовка к разному выполнению заданий
anaschu 08.04.2026
https:/ / github. com/ shumilovas/ med2. git main ветка * содержимое блока дэлэй из старой модели теперь внутри зайца новой модели 8ATzM_2aurI
Блокировка документа от изменений, если он открыт у другого пользователя
Maks 08.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа, разработанного в конфигурации КА2. Задача: запретить редактирование документа, если он открыт у другого пользователя. / / . . .
Система безопасности+живучести для сервера-слоя интернета (сети). Двойная привязка.
Hrethgir 08.04.2026
Далее были размышления о системе безопасности. Сообщения с наклонным текстом - мои. А как нам будет можно проверить, что ссылка наша, а не подделана хулиганами, которая выбросит на другую ветку и. . .
Модель ЗдрввоСохранения 7: больше работников, больше ресурсов.
anaschu 08.04.2026
работников и заданий может быть сколько угодно, но настроено всё так, что используется пока что только 20% kYBz3eJf3jQ
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru