crossplatform.ru

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

soskol-ist
  опции профиля:
сообщение 20.4.2009, 11:33
Сообщение #1


Новичок


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

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




Репутация:   0  


помогите, каким способом лучше записать значение из столбца sql таблицы в переменную.
мне нужно посчитать значение по некоторой формуле, и потом записать его в новый столбец таблицы.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
2 страниц V   1 2 >  
Начать новую тему
Ответов (1 - 15)
SABROG
  опции профиля:
сообщение 20.4.2009, 11:42
Сообщение #2


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

Группа: Участник
Сообщений: 1207
Регистрация: 8.12.2008
Из: Russia, Moscow
Пользователь №: 446

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




Репутация:   34  


Цитата(soskol-ist @ 20.4.2009, 12:33) *
каким способом лучше записать значение

А какие способы ты знаешь?
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
soskol-ist
  опции профиля:
сообщение 20.4.2009, 11:51
Сообщение #3


Новичок


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

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




Репутация:   0  


Цитата(SABROG @ 20.4.2009, 12:42) *
Цитата(soskol-ist @ 20.4.2009, 12:33) *
каким способом лучше записать значение

А какие способы ты знаешь?

я только начал разбираться с qt, знаю что можно таблицу запихнуть в модель и оттуда считать, но как пока не разобрался.
QSqlTableModel model_vozvrat;
model_vozvrat.setTable("spr_vozvrat");
model_vozvrat.setFilter("kod_tovara = " + record.value("kod_tovara").toString());
model_vozvrat.select();

а вот как обратиться к записи не знаю.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
SABROG
  опции профиля:
сообщение 20.4.2009, 11:58
Сообщение #4


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

Группа: Участник
Сообщений: 1207
Регистрация: 8.12.2008
Из: Russia, Moscow
Пользователь №: 446

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




Репутация:   34  


Тебе именно из модели надо данные читать или из QTableView?
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
soskol-ist
  опции профиля:
сообщение 20.4.2009, 12:09
Сообщение #5


Новичок


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

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




Репутация:   0  


Цитата(SABROG @ 20.4.2009, 12:58) *
Тебе именно из модели надо данные читать или из QTableView?

принципиальой разницы нет.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
SABROG
  опции профиля:
сообщение 20.4.2009, 12:33
Сообщение #6


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

Группа: Участник
Сообщений: 1207
Регистрация: 8.12.2008
Из: Russia, Moscow
Пользователь №: 446

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




Репутация:   34  


    QModelIndex item = model->index(row, column);
    qDebug() << item.data().toString();
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Litkevich Yuriy
  опции профиля:
сообщение 20.4.2009, 12:40
Сообщение #7


разработчик РЭА
*******

Группа: Сомодератор
Сообщений: 9669
Регистрация: 9.1.2008
Из: Тюмень
Пользователь №: 64

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




Репутация:   94  


soskol-ist, если тебе не нужно отображать данные в таблице, а только получить значение поля, для неких внутренних действий.
То проще воспользоваться QSqlQuery.

примерно так:
  QSqlQuery        q(db);
  QString        qstr, qerr;
  bool            ok;
    
    qstr = QString("SELECT a.F_ID FROM REFPOINT a WHERE a.F_OBJNAME = '%1'")
            .arg(combobox->currentText());
    q.exec(qstr);
    ok = q.first();
    if (!ok)
    {
        qerr = q->lastError().text();
        qDebug() << "No query, Reason:" << qerr;
    }
    //береём нулевой столбец и приводим его к строке
    strpoint = q.value(0).toString();
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
soskol-ist
  опции профиля:
сообщение 21.4.2009, 14:21
Сообщение #8


Новичок


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

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




Репутация:   0  


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

Цитата(Litkevich Yuriy @ 20.4.2009, 13:40) *
soskol-ist, если тебе не нужно отображать данные в таблице, а только получить значение поля, для неких внутренних действий.
То проще воспользоваться QSqlQuery.

примерно так:
  QSqlQuery        q(db);
  QString        qstr, qerr;
  bool            ok;
    
    qstr = QString("SELECT a.F_ID FROM REFPOINT a WHERE a.F_OBJNAME = '%1'")
            .arg(combobox->currentText());
    q.exec(qstr);
    ok = q.first();
    if (!ok)
    {
        qerr = q->lastError().text();
        qDebug() << "No query, Reason:" << qerr;
    }
    //береём нулевой столбец и приводим его к строке
    strpoint = q.value(0).toString();

непонятно зачем тут присутствует элемент combobox.
спасибо конечно, но мне нужно взять значение из одного поля столбца, и поизвести вычисления по следующей формуле T+=ti/N; где N-это количество строк в столбце, ti-i-ая строка в столбце. А потом все записать с помощью SQL запроса в базу.
по сути вопросов два:
1) как записать конкретное поле в переменную?
2) как посчитать количество строк в столбце/табице?
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Litkevich Yuriy
  опции профиля:
сообщение 21.4.2009, 14:38
Сообщение #9


разработчик РЭА
*******

Группа: Сомодератор
Сообщений: 9669
Регистрация: 9.1.2008
Из: Тюмень
Пользователь №: 64

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




Репутация:   94  


Цитата(soskol-ist @ 21.4.2009, 18:21) *
непонятно зачем тут присутствует элемент combobox.
это просто кусок кода из моего исходника.

Цитата(soskol-ist @ 21.4.2009, 18:21) *
1) как записать конкретное поле в переменную?
Цитата(soskol-ist @ 21.4.2009, 18:21) *
//береём нулевой столбец и приводим его к строке
strpoint = q.value(0).toString();


Цитата(soskol-ist @ 21.4.2009, 18:21) *
2) как посчитать количество строк в столбце/табице?
ты имеешь в виду кол-во строк в выборке? Если да, то смотри QSqlRecord::size()

Цитата(Litkevich Yuriy @ 21.4.2009, 18:33) *
Если да, то смотри QSqlRecord::size()
пардон, см. int QSqlQuery::size () const
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
soskol-ist
  опции профиля:
сообщение 21.4.2009, 15:58
Сообщение #10


Новичок


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

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




Репутация:   0  


спс за помощь, решил так:
QSqlQuery query1("SELECT T FROM spr_vozvrat");    
    if ( query1.isActive() )
    {
        while ( query1.next() )
            {                
                QString name = query1.value(0).toString();
                tau=+name.toFloat()/query1.size();                
                qDebug() << tau;
            }
    }
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Litkevich Yuriy
  опции профиля:
сообщение 21.4.2009, 16:03
Сообщение #11


разработчик РЭА
*******

Группа: Сомодератор
Сообщений: 9669
Регистрация: 9.1.2008
Из: Тюмень
Пользователь №: 64

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




Репутация:   94  


soskol-ist, поьзуйся тэгом code, см. справку

Цитата(soskol-ist @ 21.4.2009, 19:58) *
tau=+name
последовательность операторов перепутал
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
SABROG
  опции профиля:
сообщение 21.4.2009, 16:12
Сообщение #12


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

Группа: Участник
Сообщений: 1207
Регистрация: 8.12.2008
Из: Russia, Moscow
Пользователь №: 446

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




Репутация:   34  


Цитата(soskol-ist @ 21.4.2009, 15:21) *
2) как посчитать количество строк в столбце/табице?


К сожалению метод int QSqlQuery::size () const не всегда выдает корректное значение с разными настройками соединения или базами данных.
Если курсор находится на стороне сервера то, как правило, возврат данных после запроса идет быстрее из-за того, что становится доступной первая порция данных скажем 10 строк из 1000. Пока пользователь работает с этой порцией - обработка запроса продолжается и данных становится все больше и больше. Если же мы передвинем курсор на 500-ую запись, то нам придется ждать ответа от сервера. При этом метод size() не будет возвращать корректное значение, т.к. запрос еще не завершился.

Если же курсор находится на стороне клиента, то пользователь будет каждый раз ждать пока клиент выкачает все данные с сервера. Это тормозит работу. В общем подобную проблему я решал двумя путями:
- 2 запроса вместо одного: "SELECT COUNT(primary_key) FROM table WHERE <my query>" и "SELECT field1, field2 FROM table WHERE <my query>". Несмотря на кажущийся overhead большинство современных баз данных кэшируют результаты запросов и держат некоторое время в памяти данные к которым недавно обращались.
- использование этого кода:
uint rows = 0;
while (query->next()) rows++;


Сообщение отредактировал SABROG - 21.4.2009, 16:17
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
soskol-ist
  опции профиля:
сообщение 22.4.2009, 11:43
Сообщение #13


Новичок


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

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




Репутация:   0  


еще вопрос, всю голову сломал, вроде все правильно записано, а при запросе возвращает false
    float tau;
    QSqlQuery query1("SELECT T FROM spr_vozvrat");    
    QSqlQuery query2;
    if ( query1.isActive() )
    {
        while ( query1.next() )
            {                
                QString name = query1.value(0).toString();
                tau=+name.toFloat()/query1.size();                
                query2.prepare("UPDATE spr_vozvrat SET tau = ?");
                query2.addBindValue(tau, QSql::In);
                query2.exec();
                qDebug() << query2.exec();
            }
    }
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Kagami
  опции профиля:
сообщение 22.4.2009, 13:54
Сообщение #14


Старейший участник
****

Группа: Участник
Сообщений: 601
Регистрация: 2.2.2009
Пользователь №: 523

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




Репутация:   9  


1. Может стоит инициализировать tau?
2. Не совсем понятен оператор "=+". Может имелось в виду "+="?
3. Почему бы не посмотреть сообщение об ошибке?
if (!query2.exec()) qDebug << query2.lastError.text();

вместо
qDebug() << query2.exec();


Кстати, а какой драйвер используется? Вроде бы QSQLITE не умеет возвращать размер выборки
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
soskol-ist
  опции профиля:
сообщение 22.4.2009, 20:24
Сообщение #15


Новичок


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

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




Репутация:   0  


Цитата(Kagami @ 22.4.2009, 14:54) *
1. Может стоит инициализировать tau?

инициализировал
Цитата
2. Не совсем понятен оператор "=+". Может имелось в виду "+="?

да описался "+="
Цитата
3. Почему бы не посмотреть сообщение об ошибке?
if (!query2.exec()) qDebug << query2.lastError.text();

вот такая ошибка
Цитата
QSqlError(2036, "QMYSQL3: Unable to bind value", "Using unsupported buffer type: 1073741824 (parameter: 1)")
, как с ней бороться ума не приложу.
Цитата
Кстати, а какой драйвер используется? Вроде бы QSQLITE не умеет возвращать размер выборки

драйвер QMYSQL
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
LE0N
  опции профиля:
сообщение 23.4.2009, 11:12
Сообщение #16


Студент
*

Группа: Участник
Сообщений: 97
Регистрация: 10.3.2009
Из: Беларусь
Пользователь №: 604

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




Репутация:   0  


Цитата
QSql::In

Это ЧТО ?
Постарайтесь внимательно писать свой код и отлаживать его сами.
Если не знаете английского:
translate.google.com
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение

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


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


RSS Рейтинг@Mail.ru Текстовая версия Сейчас: 16.6.2025, 8:11