УПРАВЛЕИЕ ТИПАМИ ДАННЫХ ПОЛУЧЕННЫХ ОБРАБОТКОЙ SQL запроса

Работа VB и СУБД (Access, MSSQL, MySQL, Oracle и пр.)
Правила форума
При создании новой темы не забывайте указывать используемую СУБД.
Alex404
Продвинутый пользователь
Продвинутый пользователь
 
Сообщения: 109
Зарегистрирован: 22.09.2002 (Вс) 10:58

УПРАВЛЕИЕ ТИПАМИ ДАННЫХ ПОЛУЧЕННЫХ ОБРАБОТКОЙ SQL запроса

Сообщение Alex404 » 10.04.2003 (Чт) 10:53

База MDB
Есть пара таблиц всязанных по полю.
Нужно заполнить MSHFlexDrid результатами отработки SQL-запроса (SQLstr).

With Adodc1
.ConnectionString = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=База.mdb" & _
";Mode=ReadWrite;Persist Security Info=False;"
'Jet OLEDB:Database Password=pyfxbn dfc"
.CursorLocation = adUseClient
.CursorType = adOpenStatic
.CommandType = adCmdText
.RecordSource = SQLstr
.Refresh
End With
Set MSHFlexGrid1.DataSource = Adodc1

Запрос на выходе формирует 2 вычисляемых поля опрерируя данными таблиц.
SQLstr = "SELECT ТБЛ1!ПЛ1 & 'x' & ТБЛ1!ПЛ2 & '-' & ТБЛ1!ПЛ3 AS Рез1, " & _
"SUM(ТБЛ1!ПЛ1*ТБЛ1!ПЛ2/1000000*ТБЛ1!ПЛ3) AS Рез2"
"FROM........"
"GROUP BY..."
Поле1 Запроса (Рез1) - сцепливает в строку значения 3-х полей таблицы (все значения целочисленные)
Поле2 Запроса (Рез2)- вычисляется по схеме Поле1Табл*Поле2Табл/1000000*Поле3 (Поле1Табл, Поле2Табл, Поле3Табл - целочисленные)
Кроме того запрос группирует выборку по Поле1Запр с суммированием значений Поля2Запр

Проблема с Полем2Запроса.
Нетрудно заметить, что значение Поля2Запроса получается дробным (single)
MSHFlexGrid - дисциплинированно отображает все положенные в этом случае нули и не нули (234,34587800053...)

А мне нужны 3 знака после запятой.
Пытался округлять вставляя в SQL round:
SQLstr = "SELECT ................... AS Рез1, " & _
"Round(SUM(ТБЛ1!ПЛ1*ТБЛ1!ПЛ2/1000000*ТБЛ1!ПЛ3);3) AS Рез2"
...............................
Удивительно, но частично оно сработало, хотя упоминания функции round ни в одной справке по SQL не видел.
"Частичность" же в том что 234,34587800053 преобразуется в 234,346000000007

Немного посмеялся и понял, что Полю2Запроса нужно навязывать тип данных (В Access этот тип данных называется "Действительное" с указанием точности)
В Access-овской справке по построителю выражений нашел упоминание о функции Cdec.

Переписал SQLstr:
SQLstr = "SELECT ................... AS Рез1, " & _
"cdec(Round(SUM(ТБЛ1!ПЛ1*ТБЛ1!ПЛ2/1000000*ТБЛ1!ПЛ3);3);3) AS Рез2"
...............................
Вот тут грабли начали ветвиться:
Если этот запрос отработать а Access то Поле2Запроса=0
Если в VB - компилятор матерится что в SQL никакого такого CDec-а нету
И еще одна непонятка : в Access справке по построителю выражений CDec пишется с одним аргументом, а на деле не срабатывает пока, как в округлении, не поставишь еще и к-во знаков после запятой.

Теперь вопрос - КАК ЗАБИТЬ ДЛЯ ПОЛЯ ВЫЧИСЛЯЕМОГО ЗАПРОСОМ ТИП ДАННЫХ ?
Спасибо дочитавшим до конца.

alibek
Большой Человек
Большой Человек
 
Сообщения: 14205
Зарегистрирован: 19.04.2002 (Пт) 11:40
Откуда: Russia

Сообщение alibek » 15.04.2003 (Вт) 8:32

Попробуй округлять вручную. Если результат выразить как Arg, то примерно так:

Int(Arg*1000+0.5)/1000

округление до трех знаков. Правда неуверен, что в SQL имеется функция Int, но функция для отбрасывания дробной части точно имеется
Lasciate ogni speranza, voi ch'entrate.

Alex404
Продвинутый пользователь
Продвинутый пользователь
 
Сообщения: 109
Зарегистрирован: 22.09.2002 (Вс) 10:58

Сообщение Alex404 » 15.04.2003 (Вт) 21:40

Повторюсь: спаcибо всем прочитавшим и ответившим...
Решение нашлось простое и естественное:
format(Round(SUM(...);3) , '0.000').

format SQL-ем кушается -полный вперед! Выбор типа - определяется синтаксисом . Например format(Round(SUM(...);3) , #0.000#) - дает тип данных ДАТА.

alibek
Большой Человек
Большой Человек
 
Сообщения: 14205
Зарегистрирован: 19.04.2002 (Пт) 11:40
Откуда: Russia

Сообщение alibek » 16.04.2003 (Ср) 8:23

Э... Я точно не уверен, но (по-моему) результатом функции Format всегда является String.
Т.е. Format(234,34587800053,'0.000') преобразуеться в текст "234.346".
Lasciate ogni speranza, voi ch'entrate.

Alex404
Продвинутый пользователь
Продвинутый пользователь
 
Сообщения: 109
Зарегистрирован: 22.09.2002 (Вс) 10:58

Сообщение Alex404 » 16.04.2003 (Ср) 13:45

Так то оно так...Форма '0.000' очень похожа на строковую... Но суммируются эти полученные данные совершенно нормально. Агрегирующие функции SQL (Sum, Min, Max, Avg...) их тоже воспринимаю адекватно (как числа) ...

alibek
Большой Человек
Большой Человек
 
Сообщения: 14205
Зарегистрирован: 19.04.2002 (Пт) 11:40
Откуда: Russia

Сообщение alibek » 16.04.2003 (Ср) 14:09

Ну ведь агрегирующие функции расположены внутри Format, потому и считает.
Вот если будет работать конструкция Sum(Format(Arg,'0.000')) это будет удивительно.
Lasciate ogni speranza, voi ch'entrate.

Alex404
Продвинутый пользователь
Продвинутый пользователь
 
Сообщения: 109
Зарегистрирован: 22.09.2002 (Вс) 10:58

Сообщение Alex404 » 16.04.2003 (Ср) 14:50

Я ж говорю: ПОЛУЧЕННЫЕ ДАННЫЕ
SQL1= "SELECT format (...., '0.000' ) AS поле ...FROM...WHERE...GROUP BY... ORDER..."
SQLSum = "SELECT SUM(поле) AS СуммаПоля FROM (" & SQL1 & ") "


Вернуться в Базы данных

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 16

    TopList