crossplatform.ru

Здравствуйте, гость ( Вход | Регистрация )

 
Ответить в данную темуНачать новую тему
> с++ QT 4.8.1 + MySQL Server 5.5 (формирование запросов через GUI)
QTlammer
  опции профиля:
сообщение 26.7.2012, 10:00
Сообщение #1


Новичок


Группа: Новичок
Сообщений: 4
Регистрация: 17.7.2012
Пользователь №: 3451

Спасибо сказали: 0 раз(а)




Репутация:   0  


Здравствуйте:)

Написал программу по выводу на экран информации из БД. Вывод осуществляется через QSQLQueyModel+QTableView. БД нужна для логирования, поэтому сами данные нередактируемые, к тому же будет заточена под единственного на каждую сессию клиента.
Единственная функция приложения в том, чтобы предоставить пользователю возможность выборки из БД по некоторым критериям. Т.к. потенциальный пользователь с SQL не знаком и знакомится не собирается, думаю самым удобным способом выбора критериев будет выделение мышью или некой комбинацией "кнопка+ЛКМ/ПКМ" нескольких критериев выборки на экранном представлении с последующим формированием запроса. Т.е. если грубо, кликаем на "Фамилию1", кликаем на "Фамилию2", кликаем на "ДатуХ", нажимаем на форме большую кнопку "Применить фильтр" и смотрим на результат.

Общие принципы формирования запросов в БД я знаю, как определять содержимое кликнутой ячейки таблиц (т.е. критерий выборки) тоже вроде по форумам освещено нормально, непонятно как это оптимально совместить в одном месте - запросы в драйвер БД передаются виде строки, где название таблицы и столбцы, по которым будет производится выборка (т.е. в данном случае "Фамилия" и "дата"), вроде должны указываться явно?

Я думал в сторону формирования набора шаблонов, учитывающих все возможные варианты сочетания столбцов, но потом вспомнил комбинаторику и осознал, что для таблицы из 15 столбцов это слишком будет:)

Если кто сталкивался с подобной проблемой, то буду рад помощи:)

А то я вчера потратил полдня форумы и документацию, чтобы понять как размер таблицы к размеру окна привязать, а там всего два раза мышью кликнуть надо было:)
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Алексей1153
  опции профиля:
сообщение 26.7.2012, 10:38
Сообщение #2


фрилансер
******

Группа: Участник
Сообщений: 2941
Регистрация: 19.6.2010
Из: Обливион
Пользователь №: 1822

Спасибо сказали: 215 раз(а)




Репутация:   34  


совсем непонятно, зачем у тебя БД с таблицей на экране связана - это разные объекты, друг про друга не знающие

пусть у тебя есть переменная
QString sql;

без фильтра
Цитата
sql="select * from table";


когда щёлкаешь "фамилия1" , sql у тебя должна принять вид
sql=="select * from table where secondname='фамилия1' ";


когда щёлкаешь ещё "фамилия2"
sql=="select * from table where secondname='фамилия1'  or secondname='фамилия2'";


и так далее

затем ты отправляешь собранный запрос в СУБД , получаешь данные и выводишь на экран
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Гость_Гость_*
сообщение 26.7.2012, 17:48
Сообщение #3





Гости








    


Можно конечно вручную формировать строки запросов и потом как то мэпить параметры подбирая их с UI и где то предварительно храня...
Но на мой взгляд делать вот так вот:
Цитата
sql=="select * from table where secondname='фамилия1' ";

это убожество :) А если это будут не строковые данные да не под одну СУБД ? Да и не стоит забывать, что что есть escape символы, которые в разных БД разные и их тоже надо как нибудь экранировать и экранируются они обычно тоже по разному...

А можно использовать средства фреймворка :)
Например QSqlTableModel работает именно на основе данного функционала.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Алексей1153
  опции профиля:
сообщение 26.7.2012, 19:01
Сообщение #4


фрилансер
******

Группа: Участник
Сообщений: 2941
Регистрация: 19.6.2010
Из: Обливион
Пользователь №: 1822

Спасибо сказали: 215 раз(а)




Репутация:   34  


я только путь показал, на пальцах. Не стоит так остро реагировать :) Дальше - думать

и вот тут поподробнее объясни свой бред :rolleyes:
Цитата(Гость_Гость_* @ 26.7.2012, 20:48) *
А если это будут не строковые данные


и
Цитата(Гость_Гость_* @ 26.7.2012, 20:48) *
да не под одну СУБД

Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
QTlammer
  опции профиля:
сообщение 27.7.2012, 10:59
Сообщение #5


Новичок


Группа: Новичок
Сообщений: 4
Регистрация: 17.7.2012
Пользователь №: 3451

Спасибо сказали: 0 раз(а)




Репутация:   0  


Цитата(Гость @ 26.7.2012, 17:48) *
Можно конечно вручную формировать строки запросов и потом как то мэпить параметры подбирая их с UI и где то предварительно храня...
Но на мой взгляд делать вот так вот:
Цитата
sql=="select * from table where secondname='фамилия1' ";

это убожество :) А если это будут не строковые данные да не под одну СУБД ? Да и не стоит забывать, что что есть escape символы, которые в разных БД разные и их тоже надо как нибудь экранировать и экранируются они обычно тоже по разному...

А можно использовать средства фреймворка :)
Например QSqlTableModel работает именно на основе данного функционала.



ручной формирование не желательно в связи с тем, что пользователь может сначала выбрать пару фамилий, потом интрвал суток в котором их эти фамилии интересуют, а потом решить, что его еще и кто-то третий интересует и только после этого задействовать фильтр - как при этом строку формировать хз:)

sqlstatement поначалу показалась заманчивой, но тоже отпала, ввиду наличия сранительных критериев отбора (того временного интервала), а она робит только с жестко заданными значениями полей..
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Гость_Гость_*
сообщение 27.7.2012, 12:01
Сообщение #6





Гости








    


Цитата(QTlammer @ 27.7.2012, 10:59) *
sqlstatement поначалу показалась заманчивой, но тоже отпала, ввиду наличия сранительных критериев отбора (того временного интервала), а она робит только с жестко заданными значениями полей..


bool preparedStatement - установка этого флага позволяет подготовить многоразовый запрос, в который можно биндить значения.

Цитата
только путь показал, на пальцах. Не стоит так остро реагировать Дальше - думать

Сенсей указал путь ?:) Я думаю, то что нужно генерировать запросы это и так очевидно, ну при условии что объем данных более менее большой, иначе можно было бы использовать прокси модели например. Кстати что на это скажет ТС, каков предполагаемый объем данных?

Алексею, если это будут не строковые данные а например даты, то перед тем как добавить их в запрос в предложенном тобой варианте, придется их каким то образом форматировать, что лишняя работа и уг вэй, по крайней мере пока фреймворк предоставляет более удобные средства например биндинг.

Форматы данных(тех же дат, или например блоб полей) могут отличаться в различных СУБД. (пруф)

Цитата
и вот тут поподробнее объясни свой бред

не удивительно что в гугле забанили такого не вежливого и некомпетентного человека :)
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Алексей1153
  опции профиля:
сообщение 27.7.2012, 19:20
Сообщение #7


фрилансер
******

Группа: Участник
Сообщений: 2941
Регистрация: 19.6.2010
Из: Обливион
Пользователь №: 1822

Спасибо сказали: 215 раз(а)




Репутация:   34  


Цитата(Гость_Гость_* @ 27.7.2012, 15:01) *
не удивительно что в гугле забанили такого не вежливого и некомпетентного человека

я прекрасно знаю всё, о чём тут говорится. А вот ты читать не умеешь :) Естественно, что я предполагаю сначала сбор данных (не текстов - а просто набор флагов и данных, из чего потом собирать запрос). Когда собирается запрос, всё делается по правилам - и порядок, и экранирование.

Странно, что такие очевидные вещи нужно пояснять

Сообщение отредактировал Алексей1153 - 27.7.2012, 19:21
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение

Быстрый ответОтветить в данную темуНачать новую тему
Теги
Нет тегов для показа


1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0




RSS Текстовая версия Сейчас: 26.11.2024, 22:01