База 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 пишется с одним аргументом, а на деле не срабатывает пока, как в округлении, не поставишь еще и к-во знаков после запятой.
Теперь вопрос - КАК ЗАБИТЬ ДЛЯ ПОЛЯ ВЫЧИСЛЯЕМОГО ЗАПРОСОМ ТИП ДАННЫХ ?
Спасибо дочитавшим до конца.