Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Конвертация и изменение в QTableView + SQL 
:(
    Опции темы
derilshows
Дата 23.3.2016, 00:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 5
Регистрация: 22.3.2016

Репутация: нет
Всего: нет



Всем привет! Очень нужен Ваш совет.

Есть БД, где в одной колонке записаны коды в виде: 10, 10-09, 10-10, 10-11, 15, 15-02, 15-03 и тд. Каждому значению соответсвтует месяц(в числовом формате). Я делаю SQL запрос, в котором выводится какие коды в каком месяце, с подсчетом сколько раз были вызваны. Запрос отображается в QTableView.
Выходит формат: СКОЛЬКО РАЗ БЫЛ ВЫЗВАН, В КАКОМ МЕСЯЦЕ, КАКОЙ КОД.
Например, будет вывод:

125, 04, 10-09
4, 04, 10-10
93, 05, 15-02
43, 05, 15-03


Что я хочу:

Все коды, которые начинаются на две одинаковые цифры, должны обьединиться в одну строку, и уже отображаться только этими первыми двумя цифрами. Но нужно сохранить сортировку по месяцам, дабы коды из разных месяцев не склеивались. Естественно, первая коллонка(сколько раз был вызван) при обьединении должна суммировать соответственные значения строк, что склеиваются.

В итоге, должно выйти так:
129, 04, 10
136, 05, 15



Можно ли решить этот вопрос чисто SQL? Или нужно использовать QT модель?
Очень прошу помочь, совсем не представляю как это сделать.
PM MAIL   Вверх
ss
Дата 24.3.2016, 00:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 133
Регистрация: 17.5.2007

Репутация: нет
Всего: нет



мне кажется проще будет сделать такое в с++ чем в sql а модель все равно нужна для TableView.
Я так бы сделал :
берем QSqlTableModel, выполняем запрос. В результате в этой модели будет данные (как в примере выше).
берем QStandardTableModel - модель кот. будет у TableView

в цикле по всем строкам читаем QSqlTableModel
смотрим, есть ли запись с кодом QSqlTableModel[j][code] == QStandardTableModel[i][code] ? 
ДА: добавить к счетчику значение повторений;
НЕТ: добавить строку с записью.

Тут не указано когда будут одинаковые коды но разные месяцы.

Ну а дальше устанавливаем модель в TableView.

Это сообщение отредактировал(а) ss - 24.3.2016, 00:30
PM MAIL   Вверх
derilshows
Дата 24.3.2016, 00:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 5
Регистрация: 22.3.2016

Репутация: нет
Всего: нет



Цитата(ss @  24.3.2016,  00:27 Найти цитируемый пост)
Тут не указано когда будут одинаковые коды но разные месяцы.

Функция должна срабатывать только когда оба значения совпадают. Так как в разных месяцах могут быть одинаковые коды, но мне никак не надо перемешивать все))

Спасибо, не совсем понимаю как это реализовать, но буду пытаться.
PM MAIL   Вверх
ss
Дата 24.3.2016, 01:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 133
Регистрация: 17.5.2007

Репутация: нет
Всего: нет



у меня  Qt v 5.6.0. Его немного переделали. вместо QSqlTableModel взял QSqlQuery.

Код

QSqlQuery q;
    QStandardItemModel model;
        
    enum ConumnName
    {
        enCount = 0,
        enDate,
        enCode,
        enSize
    };

    
    bool res =  q.exec("SELECT paramCount, paramDate, paramCode From table");
    
    if(res)
    {
        model.setColumnCount(enSize);
        
        while(q.next())
        {
            int count = q.value("paramCode").toInt();
            QString date = q.value("paramDate").toString();
            QString code = q.value("paramCode").toString();
            
            code = code.mid(0, code.indexOf('-')-1);  //число до символа "-"
            
            for(int i = 0; i < model.rowCount(); ++i )
            {
                //нашли совпадения по коду и дате
                if(code == model.data( model.index(i, enCode)).toString() &&
                   date == model.data( model.index(i, enDate)).toString())
                {
                    //нарастим счетчик
                    count += model.data( model.index(i, enCount)).toInt();
                    model.setData(model.index(i, enCount),count);
                    break;
                }
            }
        }
    }

    QTableView tableView;
    tableView.setModel(model);

PM MAIL   Вверх
derilshows
Дата 24.3.2016, 01:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 5
Регистрация: 22.3.2016

Репутация: нет
Всего: нет



Цитата(ss @  24.3.2016,  01:37 Найти цитируемый пост)
код C++

Ого, даже код есть! Не ожидал, огромное спасибо Вам!!

У меня вопрос. Не совсем понятно как работает фрагмент наращивания счетчика. 

Программа мониторит строки в qtableview. Если два заданных параметра совпадают, допустим у пяти строк, то вместо них будет одна, где в первой ячейке будет сумма всех 5 первых ячеек из этих строк. 
Верно ли я понимаю, как будет работать?


PM MAIL   Вверх
borisbn
Дата 24.3.2016, 09:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 4875
Регистрация: 6.2.2010
Где: Ростов-на-Дону

Репутация: 48
Всего: 135



Код
select sum( paramCount ), paramDate, substr( paramCode, 1, 2 ) from table_name
group by paramDate, substr( paramCode, 1, 2 )


http://sqlfiddle.com/#!9/4a519/2/0

Не ?



--------------------
Женщины отличаются от программистов тем, что у них чары состоят из стрингов
PM MAIL Jabber   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С/С++: Кроссплатформенное программирование, QT/Gtk+/wxWidgets"
JackYF
Любитель
  • В заголовке темы в квадратных скобках обозначьте используемую вами библиотеку, например: [QT],[GTK],[wx].
  • Если вопрос актуален только для некоторой версии библиотеки, либо, если вы пользуетесь не самой последней версией, укажите это. Например: [QT4], [GTK2].
  • Все начинающие изучать Qt - не забудьте зайти сюда.
  • Проставьте несколько ключевых слов темы, чтобы её можно было легче найти.
  • В вопросе укажите полную версию версию библиотеки, а также все дополнительные используемые программные пакеты.
  • Не забывайте пользоваться кнопкой "Код".
  • Телепатов на форуме нет! Задавайте чёткий, конкретный и полный вопрос. Указывайте полностью ошибки компилятора и компоновщика.
  • Новое сообщение должно иметь прямое отношение к тематике этого раздела. Флуд, флейм, оффтопик запрещены.
  • Категорически запрещается обсуждение вареза, "кряков", взлома программ и т.д.

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, JackYF, Любитель.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | С/С++: Кроссплатформенное программирование, Qt/Gtk+/wxWidgets | Следующая тема »


 




[ Время генерации скрипта: 0.0687 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.