Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > MS Access > правильно написать формулу


Автор: disely 16.4.2009, 22:45
Доброго всем здравия! помогите подскажите)
В запросе имеется поле Цена, Дата_покупки. Вобще нужно впихнуть формулу амортизации.
предположительно думаю нужно создать 2 поля: в одном считается Ам. отчисления в др. Ост. Стоимость.
Ам отчисления находится след образом: цена умножается на 0,15. Затем считается ост. стоимость, как "Цена-(цена*0,15)". И так до тех пор, пока поле с ост. стоимостью не будет <0.01. Это все для одной строчки, одного вида товара. Нужно подсчитать сумму Ам отчислений и сумму ост. стоимости. Пытаюсь сделать через построитель, имеются там функции и даже есть по амортизации. Но они не подходят. Возможно нужно как то впихнуть туда цикл, как это сделать?

Автор: Akina 17.4.2009, 07:48
Цитата(disely @  16.4.2009,  23:45 Найти цитируемый пост)
 нужно как то впихнуть туда цикл, как это сделать? 

Никак. Да это и не нужно.

Цитата(disely @  16.4.2009,  23:45 Найти цитируемый пост)
Ам отчисления находится след образом: цена умножается на 0,15. Затем считается ост. стоимость, как "Цена-(цена*0,15)". И так до тех пор, пока поле с ост. стоимостью не будет <0.01. Это все для одной строчки, одного вида товара.

Невнятно.

Автор: disely 17.4.2009, 09:08
в запросе создается еще поле, в котором нужно высчитать по каждому оборудованию амортиз. отчисления и еще поле с высчитанной ост стоимостью. В экселе было бы просто посчитать, а нужно организовать в аксесе.
Вобщем методика расчета:
есть цена например 3000
первое отчисление: 3000*0,15=450
ост. стоимость 3000-450=2550
второе отчисление 2550*0,15=382,5
ост стоимость 2550-382,5=2167,5
........................................................
послед ам. отчиселение при котором ост сумма <0.01 равно 0,001945588
само отчисление 0,011024998
затем суммируем все амортиз отчисления и выдаем последнюю ост стоимость(ее сумму не нужно)
Как образом впихнуть такой расчет в ЗАПРОС на выборку в аксес?

Автор: Akina 17.4.2009, 09:28
Код

Public Function LastSum(Sum As Double, Ost as Double) As Double
Do While Sum > Ost
  Sum=Sum*0.85
Loop
LastSum = Sum
End Function

Это - в отдельный модуль.
А в запросе соответственно
Код

select Цена
      ,ДатаПокупки
      ,LastSum([Цена], 0.01) As [ОстаточнаяЦена]
      ,[Цена]-LastSum([Цена], 0.01) As [АмортизационныеОтчисления]
from [table]

Если таблица находится в одной базе, а запрос выполняется другой (разделённые базы), модуль должен быть там где выполняется запрос.

Добавлено @ 09:36
PS. После сохранения модуля функция доступна в построителе запросов в секции "Пользовательские функции".

Добавлено через 9 минут и 6 секунд
PPS. Запрос будет ой какой неспешный...

Автор: bopoha 17.4.2009, 11:30
Я бы добавил отдельную таблицу для хранения амартизационных отчислений. Их же потом показывать придется. Или вообще сразу расчитать их до 0-я при добавлении.

Автор: disely 17.4.2009, 22:17
bopoha спасибо за подсказку.
Akina достаточно умно предумано. А можно как-то привязать кол-во суммы амортизации к периоду?
например я расчитал разницу:
Код

 Period:DataDiff("m",[ДатаПокупки],Now())

Фактически получается, сумма амортизации состоит из кварталов (по 3 месяца).
пробовал так, вобще задумался аксес:
Код

Public Function LastSum(Sum As Double, kon As Double, Ost As Double) As Double
Ost=Sum
Sum=Ost*0.15
Ost=Ost-Sum
 Do While Ost > kon
   Sum=Sum*0.15
   Ost=Ost-Sum
Loop
LastSum = Sum
End Function

и возможно ли убрать из поля АмортизационныеОтчисления значок символ "р."

Автор: ТоляМБА 17.4.2009, 22:57
Цитата(disely @  18.4.2009,  00:17 Найти цитируемый пост)
и возможно ли убрать из поля АмортизационныеОтчисления значок символ "р."

Если имеется ввиду поле на форме то Свойства -> вкладка Макет -> Формат поля -> "С разделителями разрядов".

Если поле в таблице то при типе данных "Денежный" вкладка Общие -> Формат поля -> "С разделителями разрядов".

Автор: disely 22.4.2009, 12:27
после небольших муччений я сделал правильно, а именно так:
в модуль пишем
Код

Public Function LastSum(Sum As Double, X As Double, Y As Double, Z As Double, Diapazon As Integer) As Double
If Diapazon Mod 3 = 0 Then
For i = 1 To Diapazon Step 3
Y = X * 0.15
Z = X - Y
X = Z
Sum = Sum + Y
Next i
LastSum = Sum
End If

If Diapazon Mod 3 = 2 Then
For i = 1 To Diapazon - 2 Step 3
Y = X * 0.15
Z = X - Y
X = Z
Sum = Sum + Y
Next i
Sum = Sum + 2 * Y / 3
LastSum = Sum
End If

If Diapazon Mod 3 = 1 Then
For i = 1 To Diapazon - 1 Step 3
Y = X * 0.15
Z = X - Y
X = Z
Sum = Sum + Y
Next i
Sum = Sum + Y / 3
LastSum = Sum
End If
End Function

в запросе:
Код

 LastSum(0,[Цена],1,0,Period) AS Амортизация,  [Котировка]-LastSum(0,[Цена],1,0,Period) As ОстатСтоимость

где период: 
Код

DateDiff("m",[Data_buy],Now()) AS Period

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)