|
|
|
| Народ, если кто разбирается, помогите пожалуйста правильно сформировать 2 формулы в отчете в прикреплённом тестовом файле mdb. Не получается рассчитать "Сумму НДС" с округлением и поле "Стоимость с НДС" - она высчитывается как Количество * Цену + НДС.
Отчет Documents2
documents2.mdb | |
|
| |
|
|
|
| Сейчас скачать не могу.
А почему не сделать источником строк отчета запрос, в котором все высчитывается. СтоимостьСНДС=[Количество]*[Цена]+[НДС] | |
|
| |
|
|
|
| Ну в общем, там в "Области данных" для поля используется формула
=[FieldCena]+([FieldCena]/100*[NDSPersent]), т.е. таким образом я считаю цену + 20% ндс
в результате получается например такие результаты в полях данных:
12.4
13.4
17.2
если каждую строку округлить, то в сумме получается 42, а если сложить всё как есть, то получится 43. А нужно с округлением.
Блин, да неужели нет нормального спеца на форуме? | |
|
| |
|
|
|
| спецы есть
выходные сейчас
есть такая функция INT() - выделить целую часть числа
если отчет строить не на основе таблицы, а на основе запроса, то в запросе можно воткнуть поля для промежуточного вычисления и поля- где промежуточные вычисления округлять | |
|
| |
|
|
|
| Пример в студию и будет готовое решение. | |
|
| |
|
|
|
| У вас
Сумма НДС, руб. РБ = [FieldCena]+([FieldCena]/100*[NDSPersent])
Стоимость с НДС, руб. РБ =[FieldCena]+([FieldCena]/100*[NDSPersent])
|
а должно быть
Сумма НДС, руб. РБ = [FieldCena]/100*[NDSPersent]
Стоимость с НДС, руб. РБ =[FieldCena]+([FieldCena]/100*[NDSPersent])
|
а чтобы округлять
Сумма НДС, руб. РБ = int([FieldCena]/100*[NDSPersent])
Стоимость с НДС, руб. РБ =int([FieldCena]+([FieldCena]/100*[NDSPersent]))
|
| |
|
| |
|
|
|
| Да не, Int это не округление. Int просто возращает целую часть.
Округление это когда:
12.4 = 12
12.5 = 13
12.9 = 13 | |
|
| |
|
|
|
|
Public Function Round( _
ByVal Number As Variant, NumDigits As Long, _
Optional UseBankersRounding As Boolean = False) As Double
'ЕЩЕ ОДНА ВСПОМОГАТЕЛЬНАЯ ФУНКЦИЯ , округляет указанное число, до указанной точности
'Here s the version I recently wrote that solves that last issue. I've
'sent this in to Advisor to post as an errata. I think this will work
'now... -- Ken
Dim dblPower As Double
Dim varTemp As Variant
Dim intSgn As Integer
If Not IsNumeric(Number) Then
' Raise an error indicating that
' you've supplied an invalid parameter.
Err.Raise 5
End If
dblPower = 10 ^ NumDigits
' Do the major calculation.
varTemp = CDec(Number) * dblPower + 0.5
' Now round to nearest even, if necessary.
If UseBankersRounding Then
' Is this a negative number, or not?
' intSgn will contain -1, 0, or 1.
intSgn = Sgn(Number)
varTemp = Abs(varTemp)
If Int(varTemp) = varTemp Then
If varTemp Mod 2 = 1 Then
' If working with a negative number,
' add 1. If working with a
' positive number, subtract one.
' That's what "- intSgn" will do.
varTemp = _
intSgn * (varTemp - intSgn)
End If
End If
End If
' Finish the calculation.
Round = Int(varTemp) / dblPower
End Function
|
Пример
Sub testround()
Debug.Print Round(12.6666666666, 1)
Debug.Print Round(12.6666666666, 3)
Debug.Print Round(-12.6666666666, 3, False)
Debug.Print Round(-12.6666666666, 3, True)
End Sub
Результаты
12,7
12,667
-12,667
12,666 | |
|
| |