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

Параметр запроса Select из значений checklistbox

18.10.2025, 12:59. Показов 1223. Ответов 7
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Добрый день.

Изначально была задача делать select * from tab_prolongatsiya where otvetstvenniy = "значения (могут быть несколько)" из checklistbox. В checklistbox ФИО менеджеров.
На просторах инета нашел примерный код, адаптировал под свои нужны. Вроде заработал.
В последствии добавил еще один параметр отбора d_nachala >= DateToStr(DateTimePicker1.Date).
При выполнении запрос выдает ошибку "несоответствие типов..."
Посмотрите пжл, что не так? Как исправить?


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
28
29
30
31
procedure Tf_prolongatsiya.Button8Click(Sender: TObject);
var
s, d : STRING;
i, r : integer;
 
begin
  r := 0;
  s := '';
  d := (' d_nachala >= ' + '''' + DateToStr(DateTimePicker1.Date) + '''');
 
  for i := 0 to CheckListBox1.Items.Count - 1 do
  if CheckListBox1.Checked[i] then
    begin
    if r=0 then
    s := s + (' otvetstvenniy = ' + '''' + CheckListBox1.Items[i] + '''')
    else
    s := s + (' OR otvetstvenniy = ' + '''' + CheckListBox1.Items[i] + '''');
    r := 1;
    end;
 
  if s <> '' then
  begin
     DM_prolongatsiya.ADOQ_prolongatsiya.Close;
     DM_prolongatsiya.ADOQ_prolongatsiya.SQL.Clear;
     DM_prolongatsiya.ADOQ_prolongatsiya.SQL.Add('SELECT *');
     DM_prolongatsiya.ADOQ_prolongatsiya.SQL.Add(' FROM tab_prolongatsiya');
     DM_prolongatsiya.ADOQ_prolongatsiya.SQL.Add(' WHERE' + d + ' and' + s);
     DM_prolongatsiya.ADOQ_prolongatsiya.SQL.Add(' ORDER by d_okonchaniya');
     DM_prolongatsiya.ADOQ_prolongatsiya.Open;
  end;
end;
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
18.10.2025, 12:59
Ответы с готовыми решениями:

Передача нескольких значений в параметр запроса
Добрый день! Есть запрос который вытягивает из таблицы значения их может быть разное количество. И...

Фильтрация по нескольким значениям из нескольких CheckListBox
Есть таблица, заполнянемы по запросу SELECT * FROM ZAYAVKA; Есть несколько чеклистбоксов. По...

Запоминать значения checklistbox и после выводить в отчет на печать
Есть две формы одна открывается из другой по нажатию на кнопку. На второй форме два checklistbox в...

7
 Аватар для krapotkin
6849 / 4676 / 1464
Регистрация: 14.04.2014
Сообщений: 20,668
Записей в блоге: 21
18.10.2025, 14:56
1) используйте параметры, по крайней мере для даты
https://www.cyberforum.ru/blogs/469693/5254.html
2) вместо множественного OR я бы посоветовал 'in (x, y, z, u, v)'
0
0 / 0 / 0
Регистрация: 05.05.2023
Сообщений: 55
18.10.2025, 22:15  [ТС]
1. С параметрами пробоем нет.
Delphi
1
2
3
4
5
6
7
8
  
  DM_prolongatsiya.ADOQ_prolongatsiya.Close;
  DM_prolongatsiya.ADOQ_prolongatsiya.SQL.Clear;
  DM_prolongatsiya.ADOQ_prolongatsiya.SQL.Text := 'SELECT * FROM tab_prolongatsiya '+
                                                  'WHERE d_okonchaniya >= :d_start and d_okonchaniya <= :d_end';
  DM_prolongatsiya.ADOQ_prolongatsiya.Parameters.ParamByName('d_start').Value := DateToStr(DateTimePicker1.Date);
  DM_prolongatsiya.ADOQ_prolongatsiya.Parameters.ParamByName('d_end').Value := DateToStr(DateTimePicker2.Date);
  DM_prolongatsiya.ADOQ_prolongatsiya.Open;
Я не знаю как во все это добавить условия отбора по значениям из CheckListBox1.
Delphi
1
'WHERE d_okonchaniya >= :d_start and d_okonchaniya <= :d_end and otvetstvenniy in (значение "чекнутой" строки 1, значение "чекнутой" строки 10, значение "чекнутой" строки 25, ...)'
Добавлено через 4 часа 46 минут
Попробовал так, но не работает
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
28
29
30
31
32
33
34
35
procedure Tf_prolongatsiya.Button8Click(Sender: TObject);
var
s : STRING;
i, r : integer;
begin
  if (f_prolongatsiya.Edit10.text = '')
  or (f_prolongatsiya.Edit11.text = '') then
  begin
    MessageBox(Application.Handle,'Не заполнены обязательные поля фильтра', 'Проверка...', MB_OK or MB_ICONINFORMATION);
    exit;
  end;
 
  r := 0;
  s := '';
 
  for i := 1 to CheckListBox1.Items.Count - 1 do
  if CheckListBox1.Checked[i] then
    begin
    s := s + ('''' + CheckListBox1.Items[i] + '''' + ', ');
    end;
 
  if s <> '' then
  begin
  DM_prolongatsiya.ADOQ_prolongatsiya.Close;
  DM_prolongatsiya.ADOQ_prolongatsiya.SQL.Clear;
  DM_prolongatsiya.ADOQ_prolongatsiya.SQL.Text := 'SELECT * FROM tab_prolongatsiya '+
                                                  'WHERE d_okonchaniya >= :d_start and d_okonchaniya <= :d_end '+
                                                  'and otvetstvenniy in (:otv)';
  DM_prolongatsiya.ADOQ_prolongatsiya.Parameters.ParamByName('d_start').Value := DateToStr(DateTimePicker1.Date);
  DM_prolongatsiya.ADOQ_prolongatsiya.Parameters.ParamByName('d_end').Value := DateToStr(DateTimePicker2.Date);
  DM_prolongatsiya.ADOQ_prolongatsiya.Parameters.ParamByName('otv').Value := s;
 
  DM_prolongatsiya.ADOQ_prolongatsiya.Open;
  end;
end;
Добавлено через 1 час 11 минут
А вот и еще одна проблема для меня, которую мне точно не решить самостоятельно.
CheckListBox1 (в нем перечень ответственных сотрудников) содержит строку "(Пусто)".
Пользователь может выбрать ФИО сотрудника(ков) + (Пусто). select должен вернуть все строки где столбец otvetstvenniy равен конкретному ФИО и те, где ничего не записано (=''). Я так понимаю что перечислить это в otvetstvenniy IN (ФИО1, ФИО2, (Пусто)) нельзя. Помогите, пожалуйста, решить задачу.
0
 Аватар для krapotkin
6849 / 4676 / 1464
Регистрация: 14.04.2014
Сообщений: 20,668
Записей в блоге: 21
19.10.2025, 12:29
не все SQL-сервера понимают параметр в выражении IN
поэтому там действительно лучше подставить значения прямо в строку

теперь вопрос - у вас в поле otvetstvenniy ФИО прямо в виде строки находится?
обычно так не делают, потому что это чаще всего ведет к ошибкам в учете - "Смирнов Иван Петрович", "Смирнов иван Петрович", "Смирнов Иван Петрович", "Иван Петрович Смирнов", "Смирнов И.П." и еще миллион вариаций
но если задача учебная, то в целом конечно фиг с ней

Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
fios := '';
 
for i := 0 to CheckListBox1.Items.Count - 1 do
begin
  if CheckListBox1.Checked[i] then
  begin
     if fios <> '' then
        fios := fios + ',';
    fios := fios + '''' + CheckListBox1.Items[i] + '''';
  end;
end;
 
if fios = '' then exit;
 
DM_prolongatsiya.ADOQ_prolongatsiya.Close;
DM_prolongatsiya.ADOQ_prolongatsiya.SQL.text := format('SELECT * FROM tab_prolongatsiya '+
  'WHERE d_okonchaniya between :d_start and :d_end  and and otvetstvenniy in (%s) ', [fios]);
DM_prolongatsiya.ADOQ_prolongatsiya.Parameters.ParamByName('d_start').Value := DateTimePicker1.Date;
DM_prolongatsiya.ADOQ_prolongatsiya.Parameters.ParamByName('d_end').Value := DateTimePicker2.Date;
DM_prolongatsiya.ADOQ_prolongatsiya.Open;
если напрямик не заведется, возможно, придется добавить еще задание типа параметров, как показано в статье из прошлой ссылки
0
0 / 0 / 0
Регистрация: 05.05.2023
Сообщений: 55
19.10.2025, 13:32  [ТС]
Мне не лень почитать и поискать, но я правда не понимаю.
Ранее я написал через параметр и это не сработало.
Delphi
1
2
3
4
5
6
7
8
9
  DM_prolongatsiya.ADOQ_prolongatsiya.Close;
  DM_prolongatsiya.ADOQ_prolongatsiya.SQL.Clear;
  DM_prolongatsiya.ADOQ_prolongatsiya.SQL.Text := 'SELECT * FROM tab_prolongatsiya '+
                                                  'WHERE d_okonchaniya >= :d_start and d_okonchaniya <= :d_end '+
                                                  'and otvetstvenniy in (:otv)';
  DM_prolongatsiya.ADOQ_prolongatsiya.Parameters.ParamByName('d_start').Value := DateToStr(DateTimePicker1.Date);
  DM_prolongatsiya.ADOQ_prolongatsiya.Parameters.ParamByName('d_end').Value := DateToStr(DateTimePicker2.Date);
  DM_prolongatsiya.ADOQ_prolongatsiya.Parameters.ParamByName('otv').Value := s;
  DM_prolongatsiya.ADOQ_prolongatsiya.Open;
Вы изменили на и написали что если не получится, то нужно пробовать через параметры.
Delphi
1
2
3
4
5
6
DM_prolongatsiya.ADOQ_prolongatsiya.Close;
DM_prolongatsiya.ADOQ_prolongatsiya.SQL.text := format('SELECT * FROM tab_prolongatsiya '+
  'WHERE d_okonchaniya between :d_start and :d_end and otvetstvenniy in (%s) ', [fios]);
DM_prolongatsiya.ADOQ_prolongatsiya.Parameters.ParamByName('d_start').Value := DateTimePicker1.Date;
DM_prolongatsiya.ADOQ_prolongatsiya.Parameters.ParamByName('d_end').Value := DateTimePicker2.Date;
DM_prolongatsiya.ADOQ_prolongatsiya.Open;
Оба собранных запросы прекрасно работают в Access и делают корректную выборку, а вот из программы не идет
Delphi
1
SELECT * FROM tab_prolongatsiya WHERE d_okonchaniya between :d_start and :d_end and otvetstvenniy in ('Иванов','Петров')
При запуске запроса из программы в обоих случаях одинаковая ошибка "не соответствие типов...".
0
 Аватар для krapotkin
6849 / 4676 / 1464
Регистрация: 14.04.2014
Сообщений: 20,668
Записей в блоге: 21
19.10.2025, 22:56
ну давайте подумаем. не привлекая знания программирования. просто подумаем

"Несоответствие типов" - это когда типы чего-то, чего вы задали, не соответствуют каким-то другим типам, ну, навскидку, тем что в базе

1) данные вы передаете через параметры. и из кода следует, что это типа дата
но в статье про это даже специально написано, что хорошо бы указывать тип параметров, чтобы прям точно
Delphi
1
2
ADOQuery1.Parameters.ParamByName('param1').Datatype := ftDate;
ADOQuery1.Parameters.ParamByName('param1').Value := date1;
в коде этого не видно

2) а как в базе хранятся ваши даты? этого мы совсем не знаем. может делфи передает дату, а в базе - строка

вот какбы и нехитрый набор рассуждений
1
0 / 0 / 0
Регистрация: 05.05.2023
Сообщений: 55
20.10.2025, 20:34  [ТС]
Спасибо.
Я изначально не разобрался что первой строй присваивается тип, а второй значение.

Сейчас работает и мой старый вариант:
Delphi
1
2
DM_prolongatsiya.ADOQ_prolongatsiya.Parameters.ParamByName('d_start').Value := DateToStr(DateTimePicker1.Date);
DM_prolongatsiya.ADOQ_prolongatsiya.Parameters.ParamByName('d_end').Value := DateToStr(DateTimePicker2.Date);
И указанный Вами:
Delphi
1
2
3
4
DM_prolongatsiya.ADOQ_prolongatsiya.Parameters.ParamByName('d_start').DataType := ftDateTime;
DM_prolongatsiya.ADOQ_prolongatsiya.Parameters.ParamByName('d_start').Value := DateTimePicker1.Date;
DM_prolongatsiya.ADOQ_prolongatsiya.Parameters.ParamByName('d_end').DataType := ftDateTime;
DM_prolongatsiya.ADOQ_prolongatsiya.Parameters.ParamByName('d_end').Value := DateTimePicker2.Date;
А как теперь сюда добавить и другие переменные: [stat], [hold]?

Delphi
1
2
3
DM_prolongatsiya.ADOQ_prolongatsiya.SQL.text := format('SELECT * FROM tab_prolongatsiya '+
  'WHERE d_okonchaniya between :d_start and :d_end and otvetstvenniy in (%s) ', [fio] +
  ' and rezultat in (%s) ', [stat] +  ' and holding in (%s) ', [hold]);
0
 Аватар для krapotkin
6849 / 4676 / 1464
Регистрация: 14.04.2014
Сообщений: 20,668
Записей в блоге: 21
20.10.2025, 22:12
Delphi
1
2
3
4
5
6
7
8
9
10
11
var
  Name: string;
  Age: Integer;
  S: string;
begin
  Name := 'Алиса';
  Age := 30;
  S := 'text';
  ShowMessage(Format('%s, ваш возраст: %d, %s, (%s)', [Name, Age, s,  '12345'])); 
  // Выведет: "Алиса, ваш возраст: 30, text, (12345)"
end;
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
20.10.2025, 22:12
Помогаю со студенческими работами здесь

При выборе из CheckListBox найти тоже самое значение в StringGrid
Нужно при выборе из CheckListBox найти тоже самое значение в StringGrid, как такое можно...

Возможен ли перенос текста, который не помещается в CheckListBox
Возможно ли перенос текста который не помещается в CheckListBox&amp; зарание спасибо))

CheckListBox
здравствуйте, не подскажите как сохранить информацию выбранную в CheckListBox в блокнот? для...

Заполнение CheckListBox
Всем доброго времени суток! Возникла проблема - нужно заполнить CheckListBox.Items с данной...

DBGrid И CheckListBox
народ пишу программу она открывает базы данных но мне надо что бы из дбгрида пересылалось в...


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

Или воспользуйтесь поиском по форуму:
8
Ответ Создать тему
Новые блоги и статьи
SDL3 для Web (WebAssembly): Реализация движения на Box2D v3 - трение и коллизии с повёрнутыми стенами
8Observer8 20.02.2026
Содержание блога Box2D позволяет легко создать главного героя, который не проходит сквозь стены и перемещается с заданным трением о препятствия, которые можно располагать под углом, как верхнее. . .
Конвертировать закладки radiotray-ng в m3u-плейлист
damix 19.02.2026
Это можно сделать скриптом для PowerShell. Использование . \СonvertRadiotrayToM3U. ps1 <path_to_bookmarks. json> Рядом с файлом bookmarks. json появится файл bookmarks. m3u с результатом. # Check if. . .
Семь CDC на одном интерфейсе: 5 U[S]ARTов, 1 CAN и 1 SSI
Eddy_Em 18.02.2026
Постепенно допиливаю свою "многоинтерфейсную плату". Выглядит вот так: https:/ / www. cyberforum. ru/ blog_attachment. php?attachmentid=11617&stc=1&d=1771445347 Основана на STM32F303RBT6. На борту пять. . .
Камера Toupcam IUA500KMA
Eddy_Em 12.02.2026
Т. к. у всяких "хикроботов" слишком уж мелкий пиксель, для подсмотра в ESPriF они вообще плохо годятся: уже 14 величину можно рассмотреть еле-еле лишь на экспозициях под 3 секунды (а то и больше),. . .
И ясному Солнцу
zbw 12.02.2026
И ясному Солнцу, и светлой Луне. В мире покоя нет и люди не могут жить в тишине. А жить им немного лет.
«Знание-Сила»
zbw 12.02.2026
«Знание-Сила» «Время-Деньги» «Деньги -Пуля»
SDL3 для Web (WebAssembly): Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 12.02.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами и вызывать обработчики событий столкновения. . . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 11.02.2026
Содержание блога Библиотека SDL3 содержит встроенные инструменты для базовой работы с изображениями - без использования библиотеки SDL3_image. Пошагово создадим проект для загрузки изображения. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru