crossplatform.ru

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

2 страниц V  < 1 2  
Ответить в данную темуНачать новую тему
> Как мне создать маску для числового поля?
Litkevich Yuriy
  опции профиля:
сообщение 14.9.2009, 15:22
Сообщение #11


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

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

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




Репутация:   94  


Цитата(SABROG @ 14.9.2009, 19:15) *
- типу вводимых значений (int, float, char)
Я понял, что по типу БД (NUMERIC(10,3) ...)
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
mva
  опции профиля:
сообщение 14.9.2009, 15:30
Сообщение #12


Участник
**

Группа: Участник
Сообщений: 104
Регистрация: 15.3.2009
Из: Киров
Пользователь №: 615

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




Репутация:   0  


Мне нужно генерировать маску для любого поля типа NUMERIC исходя того, как они заданы в PostgreSQL. Не важно, сколько знаков после запятой и сколько целочисленных знаков, все должно делаться автоматически в том числе и для пустых таблиц. Так, что если я добавлю новые поля типа NUMERIC в какую-либо таблицу в БД, то для этого не нужно было бы править код клиентского приложения.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
SABROG
  опции профиля:
сообщение 14.9.2009, 15:31
Сообщение #13


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

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

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




Репутация:   34  


Цитата(Litkevich Yuriy @ 14.9.2009, 16:22) *
Цитата(SABROG @ 14.9.2009, 19:15) *
- типу вводимых значений (int, float, char)
Я понял, что по типу БД (NUMERIC(10,3) ...)

Кажись понял, это скалярный тип. Может быть через метод Type QVariant::type () const получится?
---
Не прокатит. Qt под одну гребенку следующие типы приводит к double:

template<class T>
static QVariant::Type qDecodeODBCType(SQLSMALLINT sqltype, const T* p, bool isSigned = true)
{
    QVariant::Type type = QVariant::Invalid;
    switch (sqltype) {
    case SQL_DECIMAL:
    case SQL_NUMERIC:
    case SQL_REAL:
    case SQL_FLOAT:
    case SQL_DOUBLE:
        type = QVariant::Double;
        break;
    case SQL_SMALLINT:
    case SQL_INTEGER:
    case SQL_BIT:
    case SQL_TINYINT:
        type = isSigned ? QVariant::Int : QVariant::UInt;
        break;


Сообщение отредактировал SABROG - 14.9.2009, 15:37
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
mva
  опции профиля:
сообщение 14.9.2009, 15:53
Сообщение #14


Участник
**

Группа: Участник
Сообщений: 104
Регистрация: 15.3.2009
Из: Киров
Пользователь №: 615

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




Репутация:   0  


Цитата(SABROG @ 14.9.2009, 16:31) *
Не прокатит. Qt под одну гребенку следующие типы приводит к double:


Вот именно.

Подсмотрел через сниффер. Оказывается, Qt ничего не знает о типе числовых полей. Она просто тупо отображает то, что получает от SQL сервера. Похоже, при открытии таблицы придется дополнительно делать запрос на сервер о более подробной информации о полях таблицы.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
mva
  опции профиля:
сообщение 14.9.2009, 16:42
Сообщение #15


Участник
**

Группа: Участник
Сообщений: 104
Регистрация: 15.3.2009
Из: Киров
Пользователь №: 615

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




Репутация:   0  


Нашел вот такую функцию, с помощью которой можно было бы сгенерить маску:

QString QSqlDriver::formatValue ( const QSqlField & field, bool trimStrings = false ) const [virtual]

Но она работает только с непустыми записями.


Решил при открытии таблицы делать запрос на сервер о дополнительной информации по столбцам. Для PostgreSQL это будет примерно так:

SELECT column_name, data_type, numeric_precision, numeric_scale FROM information_schema.columns WHERE table_name LIKE '...'

Сообщение отредактировал mva - 14.9.2009, 16:44
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Litkevich Yuriy
  опции профиля:
сообщение 14.9.2009, 18:33
Сообщение #16


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

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

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




Репутация:   94  


mva, Я думаю, троли для начала PostgreSQL поддержали в надежде, что кто-нибудь патчи по присылает. А желающих допилить драйвер не нашлось.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
abra
  опции профиля:
сообщение 14.9.2009, 22:19
Сообщение #17


Студент
*

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

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




Репутация:   2  


Слушай.А не понимаю тебя человек....Я же написал тебе код.
Ты же можешь узнать,какой размерность данные хранятся в БАЗЕ,можешь.Это делается путём SQL запроса.
Узнаешь,получаешь скажем num 3,2.
А дальше смотришь.

3 знака до запятой и 2 знака после.
Указываешь в inputMask Этого поля 999,99.


P.S Точнее не код я тебе написал,а алгоритм.Если сложно реализовать,скажи,покурим вместе.

P.P.S О.Прочитал выше твой пост=)))
Ну вот да.Так же и делай.Я это и пытался до тебя донести.=)
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
mva
  опции профиля:
сообщение 15.9.2009, 9:48
Сообщение #18


Участник
**

Группа: Участник
Сообщений: 104
Регистрация: 15.3.2009
Из: Киров
Пользователь №: 615

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




Репутация:   0  


Цитата(abra @ 14.9.2009, 23:19) *
Слушай.А не понимаю тебя человек....Я же написал тебе код.
Ты же можешь узнать,какой размерность данные хранятся в БАЗЕ,можешь.Это делается путём SQL запроса.
Узнаешь,получаешь скажем num 3,2.
А дальше смотришь.


Я думал, что в Qt есть специальные средства для этого. Оказалось, что нет. Ведь если подключать другую базу, то соответственно и этот запрос может быть другим. Впрочем, я сразу предусмотрел работу с базами с использованием паттерна "Фабрика". Так что основной код потом переписывать не придется.

Сообщение отредактировал mva - 15.9.2009, 9:51
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение

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


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




RSS Текстовая версия Сейчас: 14.1.2025, 15:49