Russian Qt Forum

Qt => Базы данных => Тема начата: johnpion от Май 01, 2012, 17:05



Название: Sqlite. форматированный вывод
Отправлено: johnpion от Май 01, 2012, 17:05
Храню денежный значения в виде копеек, т.е. int в базе данных.
Нужно при запросе использовать
Код:
SELECT money(suma) FROM doc WHERE id = '54'
, получать значения в денежном формате
Для обычных запросов писал велосипед функцию:
Код:
QString money(QString sum = 0){
    int in = 0, b = 0;
    double flt = sum.toDouble();
    QString value, fl;
    in = flt / 1;
    b = int (100 * (flt - in));
    if (b == 0){
        fl = ",00";
    } else if (b > 0 && b < 10){
        fl = ",0" + QVariant(b).toString();
    } else if (b >= 10 && b <= 99) {
        fl = "," + QVariant(b).toString();
    }

    value = QVariant(in).toString() + fl;
    return value;
}
Но это очень не удобно, когда много раз нужно использовать этот сложный запрос.
Как можно использовать что-то типа sqlite3_create_function для этой задачи, чтобы использовать его в других запросах?


Название: Re: Sqlite. форматированный вывод
Отправлено: JayFOX от Май 01, 2012, 20:38
Код:
SELECT ROUND(suma/1,2) FROM doc WHERE id = '54'
подойдет?


Название: Re: Sqlite. форматированный вывод
Отправлено: johnpion от Май 01, 2012, 20:41
В таком варианте 34,50 будет отображаться как 34,5


Название: Re: Sqlite. форматированный вывод
Отправлено: JayFOX от Май 01, 2012, 20:44
Проверял вот тут http://sqlzoo.net/howto/source/z.dir/tip177276/sqlite (http://sqlzoo.net/howto/source/z.dir/tip177276/sqlite), 34.50 норм.


Название: Sqlite. форматированный вывод
Отправлено: johnpion от Май 01, 2012, 21:10
На вашей ссылке действительно работает как надо, только там запросы идут к MySQL, а не SQLite
Код:
SELECT version()

Победил! Решил с помощью своей модели.
Информацию взял на http://doc.crossplatform.ru/qt/4.3.2/qt4-sql.html (http://doc.crossplatform.ru/qt/4.3.2/qt4-sql.html)

Вот header:
Код:
#ifndef SQLQUERYMODEL_H
#define SQLQUERYMODEL_H

#include <QSqlQueryModel>

class SqlQueryModel : public QSqlQueryModel
{
public:
    SqlQueryModel(QObject *parent = 0){}

private:
    QString money(double sum = 0){
        int in = 0, b = 0;
        QString value, fl;
        in = sum / 1;
        b = int (100 * (sum - in));
        if (b == 0){
            fl = ",00";
        } else if (b > 0 && b < 10){
            fl = ",0" + QVariant(b).toString();
        } else if (b >= 10 && b <= 99) {
            fl = "," + QVariant(b).toString();
        }
    
        value = QVariant(in).toString() + fl;
        return value;
    }
    
    QVariant data(const QModelIndex &item, int role) const{
        QVariant value = QSqlQueryModel::data(item, role);
        if (!value.isValid())
            return QVariant();
        if (role == Qt::DisplayRole){
            if (item.column() == 4){ //колонка, в которой валюта
                return money(value.toDouble());
            }
        }
        return value;
    }
};

#endif

Как можно реализовать это в sqldriver'е?
Подобное видел на termit-personal.blogspot.com/2010/09/qt-sqlite.html (http://termit-personal.blogspot.com/2010/09/qt-sqlite.html)

Получилось реализовать для sqlite3.exe через .load
Не могу заставить этот код работать в моем проекте