Форум программистов, компьютерный форум, киберфорум
C++ Builder: Базы данных
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.64/14: Рейтинг темы: голосов - 14, средняя оценка - 4.64
0 / 0 / 0
Регистрация: 11.05.2010
Сообщений: 38

как реализовать выборку?

21.07.2010, 10:22. Показов 2993. Ответов 22
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Есть ComboBox1, 2 и 3. Есть БД access, в ней поля House, Street, Apartment с соответствующими по смыслу типами. есть так же кнопочка
при запуске в SQL ADOQuery пишется запрос на вывод бд.
идея примитивная, необходимо выбирая нужные значения с помощью ComboBox1,2,3 произвести выборку из бд и отобразить в DBGrid.
Для простоты я пробовал назначить на кнопку:
C++
1
2
3
4
5
6
7
ADOQuery1->Close();
ADOQuery1->SQL->Clear();
ADOQuery1->SQL->Add("SELECT *");
ADOQuery1->SQL->Add("FROM Outgoings");
ADOQuery1->SQL->Add("WHERE Street='"+(ComboBox2->Text)+"'and House='"+(ComboBox3->Text)+"'");
ADOQuery1->SQL->Add("ORDER BY Date desc");
ADOQuery1->Open();
но тут возникает куча глюков.
В идеале хотелось бы по OnChange обрабатывать ComboBox-ы, но как реализовать мысль не доходит.
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
21.07.2010, 10:22
Ответы с готовыми решениями:

Как реализовать выборку?
Доброго времени суток, помогите пожалуйста с запросом. Есть БД: таблица "персоны" (персонаID, фамилияID, имяID, день_варенья,...

Как реализовать выборку на VisualBasic?
Доброго дня! Есть форма на которой расположено два переключателя и два выпадающих списка, в которых можно выбирать одно из значений из...

Как реализовать выборку и манипуляцию элементами сразу на трёх страницах?
Добрый день! Как реализовать выборку и манипуляцию элементами сразу на трёх страницах? Поясню. На главной есть список фото-ссылок,...

22
 Аватар для Cepera
55 / 55 / 5
Регистрация: 09.03.2009
Сообщений: 177
21.07.2010, 10:47
Цитата Сообщение от adonix Посмотреть сообщение
но тут возникает куча глюков.
Какая такая "куча глюков"? Что конкретно не получается? Какие ошибки происходят?
0
0 / 0 / 0
Регистрация: 11.05.2010
Сообщений: 38
21.07.2010, 10:54  [ТС]
ComboBox-ы в поле Text имеют подписи Улица, Дом и Квартира.
Если писать WHERE Street='"+(ComboBox2->Text)+"' то все работает.
Но если написать WHERE House='"+(ComboBox3->Text)+"' то выборка не идет без вывода ошибки (просто ничего не отображается)
Потому как при запуске ComboBox3->Text String а после выбора становится Int.
0
 Аватар для Cepera
55 / 55 / 5
Регистрация: 09.03.2009
Сообщений: 177
21.07.2010, 11:04
В ComboBox3 в значениях у тебя цифры? Так?
А если ты в запросе на прямую напишешь:
SQL
1
WHERE House='3'
или так
SQL
1
WHERE House=3
ну или какую либо другую цифру которая есть в базе.
А какой тип имеет поле House в базе?
0
0 / 0 / 0
Регистрация: 11.05.2010
Сообщений: 38
21.07.2010, 11:50  [ТС]
В ComboBox3 цифры
Если пишу:
SQL
1
WHERE House='3'
то работает
поле House имеет числовой тип.

Тут проблема в том, что подписан ComboBox3 как "ДОМ". т.е. ComboBox3->Text возвращает Str если ничего в ComboBox3 не выбирать.
Получается что если на поле имеется ComboBox2 и ComboBox3, а выбираю значение я только в ComboBox2,
и запускаю выборку, то выборки не происходит, а потом уже бесполезно менять значение в ComboBox3 или ComboBox2 потому как ничего уже не заработает.

Да и мне удобней было бы использовать OnChange ComboBox в динамике.
только приходят мысли по алгоритму не работающие.
0
 Аватар для Cepera
55 / 55 / 5
Регистрация: 09.03.2009
Сообщений: 177
21.07.2010, 12:25
Цитата Сообщение от adonix Посмотреть сообщение
Тут проблема в том, что подписан ComboBox3 как "ДОМ"
А какая разница как подписан комбобокс??? Какие у этого комбобокса значения? Там цифры или цифры с текстом (например ДОМ 1, ДОМ 2, и т.д.)
Цитата Сообщение от adonix Посмотреть сообщение
Получается что если на поле имеется ComboBox2 и ComboBox3, а выбираю значение я только в ComboBox2,
и запускаю выборку, то выборки не происходит
Почему это выборки не происходит, выборка происходит. Вот смотрите что получается:
Если вы выбираете только комбобокс2, то образуется запрос след. вида:
SQL
1
SELECT * FROM Outgoings WHERE Street='Название_улицы_из_комбобокс2' AND House='' ORDER BY DATE DESC
Т.е. запрос говорит следующее: Выбери все из Outgoings где улица равна 'Название_улицы_из_комбобокс2' и дом равен пустой строке...
Т.к. наверное в базе у Вас нет записей, где поле дом содержит пустую строку, то вы ничего и не видите.
Так понятно что происходит???
Вам нужно запрос формировать в зависимости от того, в каких комбобоксах выбраны значения и их включать уже в условие выбора (В WHERE в запросе).
Цитата Сообщение от adonix Посмотреть сообщение
Да и мне удобней было бы использовать OnChange ComboBox в динамике.
Ну так и делайте на ончейнж, кто запрещает???

Добавлено через 8 минут
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
bool and = false;
 
ADOQuery1->SQL->Add("SELECT *");
ADOQuery1->SQL->Add("FROM Outgoings");
ADOQuery1->SQL->Add("WHERE ");
if (ComboBox2->Text!="") 
{
ADOQuery1->SQL->Add("Street='"+ComboBox2->Text+"'");
and = true;
}
if (ComboBox3->Text!="") 
{
if (and) ADOQuery1->SQL->Add("AND");
ADOQuery1->SQL->Add("House='"+ComboBox3->Text+"'");
}
ADOQuery1->SQL->Add("ORDER BY Date desc");
0
0 / 0 / 0
Регистрация: 11.05.2010
Сообщений: 38
21.07.2010, 21:25  [ТС]
спасибо. понял что было.

тогда еще вопрос
C++
1
2
3
4
5
6
7
8
9
AnsiString max,min;
ADOQuery1->SQL->Add("Apartment BETWEEN ");
Memo1->Lines->Add("Apartment BETWEEN");
if (Edit1->Text=="")
{min=FloatToStr(0);} else {min=Edit1->Text;}
if (Edit2->Text=="")
{max=FloatToStr(65535);} else {max=Edit2->Text;}
ADOQuery1->SQL->Add("'"+min+"' AND '"+max+"'");
Memo1->Lines->Add("'"+min+"' AND '"+max+"'");
выборку не делает правильно. в чем дело?
0
 Аватар для Cepera
55 / 55 / 5
Регистрация: 09.03.2009
Сообщений: 177
22.07.2010, 10:01
Цитата Сообщение от adonix Посмотреть сообщение
выборку не делает правильно. в чем дело?
Что значит не правильно? Как делает и как должно быть?
0
0 / 0 / 0
Регистрация: 11.05.2010
Сообщений: 38
22.07.2010, 10:31  [ТС]
есть два поля. Edit1 для минимального значения и Edit1 для максимального.
после нажатия кнопочки выполняется код обсуждаемый чуть ранее и этот последний кусок.
должно:
смысл в выборке значений в диаппазоне между мин и макс указаными в полями.
если в поле мин ничего не введено то диапазон от 0
если в макс ничего не введено от диапазон до 655535
если вообще ничего не введено то ничего не происходит

происходит:
беспорядочная выборка.....ввожу от 50 до 100 а отображаются значения и 5 и 170
0
 Аватар для Cepera
55 / 55 / 5
Регистрация: 09.03.2009
Сообщений: 177
22.07.2010, 10:37
Какой тип имеет поле Apartment в базе? И что и как в нем храниться?
Цитата Сообщение от adonix Посмотреть сообщение
{min=FloatToStr(0);}
Зачем применяется такая конструкция? Не проще ли:
C++
1
{min="0";}
0
0 / 0 / 0
Регистрация: 11.05.2010
Сообщений: 38
22.07.2010, 10:48  [ТС]
Поле Apartment имеет текстовый тип. хотя хранятся числа.
C++
1
{min="0";}
проще вчера уже просто извращался с StrToFloat и обратно.
0
 Аватар для Cepera
55 / 55 / 5
Регистрация: 09.03.2009
Сообщений: 177
22.07.2010, 10:55
И вообще, покажите запрос, который получается в конечном итоге.

Добавлено через 2 минуты
Цитата Сообщение от adonix Посмотреть сообщение
Поле Apartment имеет текстовый тип. хотя хранятся числа.
Поля текстового типа имеют другую сортировку, т.е.
1
11
1111
2
22
23
235
24
3
3333
4
и т.д.
А числовые поля имеют сортировку
1
2
3
4
5
6
7
8
9
10
11
и т.д.
Т.е. between по текстовому полю с условием between 22 and 24 вернет и 23 и 235
0
0 / 0 / 0
Регистрация: 11.05.2010
Сообщений: 38
22.07.2010, 11:13  [ТС]
тип поля сменил на числовой
подковырял тут:
C++
1
2
3
4
5
6
7
8
9
10
if (Edit1->Text!=""||Edit1->Text!="")
{
int max,min;
if (Edit1->Text=="")
{min=0;} else {min=StrToInt(Edit1->Text);}
if (Edit2->Text=="")
{max=65535;} else {max=StrToInt(Edit2->Text);}
ADOQuery1->SQL->Add("Apartment BETWEEN "+min+" AND "+max+"");
Memo1->Lines->Add("Apartment BETWEEN "+min+" AND "+max+"");
}
дает ошибку
E2085 Invalid pointer addition
и
W8004 'max' is assigned a value that is never used
W8004 'min' is assigned a value that is never used
0
 Аватар для Cepera
55 / 55 / 5
Регистрация: 09.03.2009
Сообщений: 177
22.07.2010, 11:26
Цитата Сообщение от adonix Посмотреть сообщение
int max,min;
Зачем инт? Вы же все равно эти мин и макс в строку запроса вставляете, т.е. используете как текст.
0
0 / 0 / 0
Регистрация: 11.05.2010
Сообщений: 38
22.07.2010, 13:10  [ТС]
огласен, инт ни к чему.
C++
1
2
3
4
5
6
7
8
9
10
11
if (Edit1->Text!=""||Edit2->Text!="")
{AnsiString max,min;
 if (Edit1->Text=="")
   {min=0;} else {min=Edit1->Text;}
 if (Edit2->Text=="")
   {max=65535;} else {max=Edit2->Text;}
ADOQuery1->SQL->Add("WHERE Apartment BETWEEN "+min+" AND "+max+"");
 Memo1->Lines->Add("WHERE Apartment BETWEEN "+min+" AND "+max+"");}
  ADOQuery1->SQL->Add("ORDER BY Date asc");
   Memo1->Lines->Add("ORDER BY Date asc");
    ADOQuery1->Open();}
так заработало. спасибо.

Добавлено через 41 секунду
возникла еще одна идея.
как реализовать запросы с помощью выбора параметров и кнопки "выполнить" я понял.
а как то же самое реализовать с помощью обработки событий OnChange?
т.е. к примеру есть ComboBox1, ComboBox2,. Street и Hause соответственно. Хочу чтобы когда что то выбираю в ComboBox1 автоматически шла выборка по его значению, потом дополнительно выбираю значение в ComboBox2 и к условию выборки прибавляется соответствие значению ComboBox2, потом убираю ComboBox1 и остается только условиеComboBox2.
на мысль для начала кто нибудь наведет?
0
 Аватар для Cepera
55 / 55 / 5
Регистрация: 09.03.2009
Сообщений: 177
22.07.2010, 13:47
Точно также как и для кнопки "Выполнить".
0
0 / 0 / 0
Регистрация: 11.05.2010
Сообщений: 38
22.07.2010, 14:04  [ТС]
ADOQuery1->SQL->Add() - добавляет строку
а как удалить конкретную строку по номеру или добавить строку по номеру?
0
 Аватар для Cepera
55 / 55 / 5
Регистрация: 09.03.2009
Сообщений: 177
22.07.2010, 14:11
Что мешает перетащить всю процедуру из онклик кнопки "выполнить" в ончейнж комбобокса (ну или её от туда вызывать)?
0
0 / 0 / 0
Регистрация: 11.05.2010
Сообщений: 38
22.07.2010, 14:30  [ТС]
тогда глупый вопрос
как добавить функцию? прямо в test.cpp (там где все описывается)?
вроде
C++
1
2
void analis()
{}
а потом так и вызывать?
C++
1
analis();
0
 Аватар для Cepera
55 / 55 / 5
Регистрация: 09.03.2009
Сообщений: 177
22.07.2010, 14:36
Прототип функции опишите в заголовочном файле test.h (в разделе public или private класса формы). А саму функцию уже в test.cpp
ЗЫ: Но мне кажется вы пытаетесь что-то перемудрить.
Я же говорю, просто скопируйте код из OnClick кнопки выполнить в OnChange комбобокса. Или просто вызовете из ончейнж комбобокса обработчик события онклик
C++
1
2
3
4
5
void __fastcall TForm1::ComboBox1Change(TObject *Sender)
 {
 //вызов обработчика Button1;
 Button1Click(Sender)
 }
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
22.07.2010, 14:36
Помогаю со студенческими работами здесь

Реализовать выборку из БД
Пришлось заняться php волей не волей, а я хз как это все работает, ничего не понимаю, у меня есть бд ms sql 2012, я хот хочу к ней...

Помогите реализовать выборку
Доброго времени суток форумчане.. Подскажите пожалуйста, как реализовать выборку... Есть 2 таблицы: 1. CountryList: ID | Country ...

Как заменить выборку по id на выборку по классам ?
Приветствую! Решаю проблему со спамом на сайте. И встал вопрос : как можно в js коде заменить выборку по id на выборку по...

Реализовать случайную выборку без повторений
Всем привет! Такой вопрос, у меня в списке 20 имен, мне не важно какое будет выбрано, потому мне здесь порекомендовали использовать...

Реализовать выборку подматрицы из большей матрицы в Matlab
Здравствуйте, задача заключается в том, чтобы "Реализовать выборку подматрицы из большей матрицы" в Mathcad и Matlab. В Mathcad я это...


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

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Новые блоги и статьи
Доступность команды формы по условию
Maks 07.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "СписаниеМатериалов", разработанного в конфигурации КА2. Задача: сделать доступной кнопку (команда формы "ЗавершитьСписание") при. . .
Уведомление о неверно выбранном значении справочника
Maks 06.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "НарядПутевка", разработанного в конфигурации КА2. Задача: уведомлять пользователя, если в документе выбран неверный склад. . .
Установка Qt Creator для C и C++: ставим среду, CMake и MinGW без фреймворка Qt
8Observer8 05.04.2026
Среду разработки Qt Creator можно установить без фреймворка Qt. Есть отдельный репозиторий для этой среды: https:/ / github. com/ qt-creator/ qt-creator, где можно скачать установщик, на вкладке Releases:. . .
AkelPad-скрипты, структуры, и немного лирики..
testuser2 05.04.2026
Такая программа, как AkelPad существует уже давно, и также давно существуют скрипты под нее. Тем не менее, прога живет, периодически что-то не спеша дополняется, улучшается. Что меня в первую очередь. . .
Отображение реквизитов в документе по условию и контроль их заполнения
Maks 04.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "ПланированиеСпецтехники", разработанного в конфигурации КА2. Данный документ берёт данные из другого нетипового документа. . .
Фото всей Земли с борта корабля Orion миссии Artemis II
kumehtar 04.04.2026
Это первое подобное фото сделанное человеком за 50 лет. Снимок называют новым вариантом легендарной фотографии «The Blue Marble» 1972 года, сделанной с борта корабля «Аполлон-17». Новое фото. . .
Вывод диалогового окна перед закрытием, если документ не проведён
Maks 04.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "СписаниеМатериалов", разработанного в конфигурации КА2. Задача: реализовать программный контроль на предмет проведения документа. . .
Программный контроль заполнения реквизитов табличной части документа
Maks 02.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "СписаниеМатериалов", разработанного в конфигурации КА2. Задача: 1. Реализовать контроль заполнения реквизита. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru