Страницы: 1
RSS
Округление значений при экстракте чисел из БД
 
Есть два, условно одинаковых, кода. Первый возвращает числа в формате 0,00 (Общий), а второй (Мой) – 0,0000000000000 (13 нолей после ","). Эти числа именно в значение в ячейки, не формат отображения. Формат отображения настраивается без проблем в «Формате ячейки».  Различные значения «com1.Parameters.Item("@id").Value» не причина. Они есть в обоих кодах (в полных версиях) в разных местах, результат один. Если их поменять местами – результат не меняется. Друзья, научите где искать причину такого разного результата в значение чисел?
Общий:
Код
Private Sub CommandButton1_Click()
 
Dim n As Double
Dim i As Double
n = 2   '2
While Лист4.Range("a" + CStr(n)).Value <> ""
    n = n + 1
Wend
Dim dt As Date
dt = Лист4.Range("a" + CStr(n - 1)).Value
 
Лист4.Range("a" + CStr(n)).Select
 
Dim con1 As New ADODB.Connection
Dim com1 As New ADODB.Command
Dim rs1 As New ADODB.Recordset
con1.ConnectionString = "Provider=sqloledb;Data Source=web-nnv;Initial Catalog=www-fs;Integrated Security=SSPI;"
'Range("n74326") = con1 'Лощилов
con1.Open
'Range("n74326") = con1 'Лощилов
com1.CommandType = ADODB.CommandTypeEnum.adCmdStoredProc
com1.ActiveConnection = con1
com1.CommandText = "pProc2"
 
com1.Parameters.Refresh
com1.Parameters.Item("@ct").Value = "H"
com1.Parameters.Item("@id").Value = 3217
com1.Parameters.Item("@stt").Value = dt
com1.Parameters.Item("@stp").Value = Now
com1.Parameters.Item("@st").Value = 1800
com1.Parameters.Item("@rfr").Value = 1
com1.Prepared = True
 
i = n
rs1.CursorType = ADODB.CursorTypeEnum.adOpenKeyset
rs1.LockType = ADODB.LockTypeEnum.adLockOptimistic
 
Set rs1 = com1.Execute
    rs1.MoveFirst
    rs1.MoveNext
    While Not rs1.EOF
        Лист4.Range("a" + CStr(i)).Value = rs1.Fields("Time").Value + 3 / 24
        Лист4.Range("b" + CStr(i)).Value = rs1.Fields("Value").Value
        i = i + 1
        rs1.MoveNext
    Wend
rs1.Close
con1.Close
Set rs1 = Nothing
Set con1 = Nothing
Set com1 = Nothing
 
Лист4.Range("a" + CStr(i - 1)).Select
End Sub

Мой:
Код
Sub Факт()  'Выгрузка факта.
Dim n As Double
Dim I As Double
n = 57139
While Лист4.Range("a" + CStr(n)).Value <> ""
    n = n + 1
Wend
 
n = n - 1   'Обновление последней строки
 
Dim dt As Date
dt = Лист4.Range("a" + CStr(n - 1)).Value
Лист4.Range("a" + CStr(n)).Select
 
Dim con1 As New ADODB.Connection
Dim com1 As New ADODB.Command
Dim rs1 As New ADODB.Recordset
 
con1.ConnectionString = "Provider=sqloledb;Data Source=web-nnv;Initial Catalog=www-fs;Integrated Security=SSPI;"
con1.Open
com1.CommandType = ADODB.CommandTypeEnum.adCmdStoredProc
com1.ActiveConnection = con1
 
com1.CommandText = "pProc2"
com1.Parameters.Refresh
com1.Parameters.Item("@ct").Value = "H"     'ТИ, ПВ - H
com1.Parameters.Item("@id").Value = 3434   'ЧЭС/ МРЭС; ПВ/ТИ - 3434/24597
com1.Parameters.Item("@stt").Value = dt
com1.Parameters.Item("@stp").Value = Now
com1.Parameters.Item("@st").Value = 1800
com1.Parameters.Item("@rfr").Value = 1
com1.Prepared = True
 
I = n
rs1.CursorType = ADODB.CursorTypeEnum.adOpenKeyset
rs1.LockType = ADODB.LockTypeEnum.adLockOptimistic
 
Set rs1 = com1.Execute
    rs1.MoveFirst
    rs1.MoveNext
    While Not rs1.EOF
        Лист4.Range("a" + CStr(I)).Value = rs1.Fields("Time").Value + 3 / 24
        Лист4.Range("b" + CStr(I)).Value = rs1.Fields("Value").Value
'        Лист4.Range("b" + CStr(I)).Value = Format(rs1.Fields("Value").Value, "#0.00")
 
        I = I + 1
        rs1.MoveNext
    Wend
rs1.Close
con1.Close
Set rs1 = Nothing
Set con1 = Nothing
Set com1 = Nothing
 
Лист4.Range("a" + CStr(I - 1)).Select
End Sub
 
А почему Вы это не делаете в ХП?
 
Нужно уточнить, коды в разнх документах работают.
 
Цитата
А почему Вы это не делаете в ХП?
Я на столько дилетант, что "ХП" у меня ассоциируется толко с Windows XP. Не могу ответить на ваш вопрос.
Свой код я лепил переделывая имеющийся код написанный другим автором.
 
Доброе время суток.
Цитата
Buxpb написал:
"ХП" у меня ассоциируется толко с Windows XP
Не, в данном случае, так как вы работаете с SQL, то это хранимая процедура, которую вы вызываете. Вот в ней, по идее, и нужно форматировать результат до нужного числа знаков. Нечто вроде Cast([NumberFieldName] As numeric(13, 2)) As [NewOrOldFieldName]
Изменено: Андрей VG - 16.01.2018 13:26:22
 
Тема особо не пошла, но отвечу Андрею. Обработка процедуры это, конечно, хорошо, но вопрос всё же откуда берётся такая разница, это му же должно быть объяснение.
 
Может добавить эту строку в первом коде (тут что-то форматируете)
Цитата
Лист4.Range("b" + CStr(I)).Value = Format(rs1.Fields("Value").Value, "#0.00")
Изменено: skais675 - 17.01.2018 20:11:48
 
К сожалению нет. Эта строка в Моём коде - попытка добиться округления, об этом я хотел сказать позже, в отдельной теме. Результата эта попытка не принесла.
 
Я бы посоветовал, прежде всего, посмотреть в отладчике на свойства объекта rs1.Fields("Value") : Type, Precision, and NumericScale
Владимир
 
Решение:Лист4.Range("b" + CStr(I)).Value = WorksheetFunction.Round(rs1.Fields("Value").Value, 3)

Решение выглядит как применение функции "=округл" из Excel. Функция ВБА Формат не подходит, поскольку выдаёт число отформатированное как текст. Функция ВБА Round уступает такому решению потомучто округляет не по математическому закону, а, как встрете на каком-то форуме, "банкирское/ финансовое" округление.
Это решение, в действительности, костыль, поскольку не отвечает на вопрос темы, в который я хотел узнать разницу округления значений при извлечение из БД.
Страницы: 1
Наверх