Rambler's Top100
Форум: MS ACCESSVBVBA MS OfficeMS SQL server
Новые сообщения: 0000

Форум: MS ACCESS

Вопросы связанные с MS ACCESS

Обновить визитку
Участники «Online»
Все участники

 
 

Доброго времени суток, Посетитель!

вид форума:
Линейный форум Структурный форум

тема: Вопрос опять про формулы... 2003
 
 автор: pistachio   (28.07.2009 в 13:15)   личное сообщение
 
 

Снова здравствуйте! Искренне надеюсь, что на этот раз вопрос окажется простым )
Как написать формулу в запросе, чтобы из последующей строки вычиталась предыдущая, и разница делилась на предыдущую? И вобще возможно ли это? )

  Ответить  
 
 автор: Кабан   (28.07.2009 в 13:44)   личное сообщение
 
 

если есть ключевые поля, то я бы сделал left join к этой же самой таблице/запросу где ключевое поле запроса А = ключевое поле запроса Б+1 и потом просто ЗапросА.Сумма-ЗапросБ.Сумма... как то так

  Ответить  
 
 автор: Lukas   (28.07.2009 в 13:54)   личное сообщение
 
 


...из последующей строки вычиталась предыдущая...


Научите строки запроса вычитать.

  Ответить  
 
 автор: pistachio   (28.07.2009 в 14:15)   личное сообщение
 
 

Lukas, нет, неправильно поняли, наверное. Необходимо создать формулу в запросе,, которая производила вышеупомянутую операцию со строками в таблице. Причем исключительно по одному столбцу. Знаю, что нельзя путать с экселем, но в последне это выглядело бы так: =(А2-А1)/А1. Так вот вопрос заключается в том, можно ли это сделать в аксессе.

Попробую сейчас вариант Кабана, но не уверен..

  Ответить  
 
 автор: Lukas   (28.07.2009 в 14:53)   личное сообщение
 
 

Хорошо,
Научите строки таблицы вычитать

...из последующей строки вычиталась предыдущая...
То есть, значения полей текущей строки "по барабану"?

  Ответить  
 
 автор: pistachio   (28.07.2009 в 15:02)   личное сообщение
 
 

значения текщей строки минус значение предыдущей. Так вернее, если это, конечно, сильно меняет суть

  Ответить  
 
 автор: Lukas   (28.07.2009 в 15:13)   личное сообщение
 
 

..если это, конечно, сильно меняет суть..
Ну, если у вас в рассчитываемых полях одинаковые значения во всей таблице, то, конечно не меняет.
Только в таком случае можно с расчетом и не заморачиваться.

  Ответить  
 
 автор: pistachio   (28.07.2009 в 15:17)   личное сообщение
 
 

нет, к сожалению, разные, иначе бы я этим расчетом не заморачивался. )

  Ответить  
 
 автор: Lukas   (28.07.2009 в 15:22)   личное сообщение
 
 

Хорошо, с этим определились.
Так как все-таки "вычитать строки"?
Или, все-таки, необходимые действия нужно производить со значениями конкретного поля?

  Ответить  
 
 автор: pistachio   (28.07.2009 в 15:31)   личное сообщение
 
 

так, вобщем есть в таблице столбец (!) со значениями:
1000
1010
1015
1026
1030
И надо запросом создать другой столбец со значениями:
(1010 - 1000) / 1000
(1015 - 1010) / 1010
(1026 - 1015) / 1015
И т.д.
Не знаю, как понятней обзяснить ) хотя, как мне кажется имеено это я и имел в виду, когда объяснял до этого )

  Ответить  
 
 автор: Lukas   (28.07.2009 в 15:39)   личное сообщение
 
 

Не могу судить, что вы имели в виду, могу судить только по тому, что вы писали.
Хорошо, определили: действия нужно производить со значениями столбца.

Теперь будем определять последовательность строк, дабы определить что считать "предыдущей строкой".
Последовательность строк в наборе данных определяется применением сортировки.
Как будем производить сортировку, что бы "предыдущей" оказалась именно та строка, которая нам нужна?

  Ответить  
 
 автор: pistachio   (28.07.2009 в 15:59)   личное сообщение
 
 

извиняюсь, но не понял, что вы имеете в в виду.. сейчас еще попробую "дообъяснить" задачу )

Идея в том, что этот столбец - стоимость актива на дату. То есть в базе данных не один стоблбец, а несколько, среди которых есть и даты, идущие по порядку:
25.07 1000
26.07 1010
27.07 1015
28.07 1026
И т.д.
Так вот для 1010 предыдущее - 1000, для 1015 - 1010,для 1026 - 1015 и т.д.

  Ответить  
 
 автор: Lukas   (28.07.2009 в 16:29)   личное сообщение
 
 

Это будем считать сортировкой по полю даты.

ИТОГО:
Создаем публичную функцию в модуле, которая будет считать коэффицент:

Public Function funRatio(Optional Amount)
    Static PrevAm As Currency
    If IsMissing(Amount) Then
        PrevAm = 0
    Else
        If PrevAm > 0 Then funRatio = Round((Amount - PrevAm) / PrevAm, 4)
        PrevAm = Amount
    End If
End Function

Создаем запрос:

SELECT tblAm.DateAm, tblAm.Amount, funRatio(tblAm.Amount) AS Ratio
FROM tblAm
WHERE funRatio()=0 Or True
ORDER BY tblAm.DateAm;

Смотрим в нем результаты.
Как-то так, сильно не тестил.

  Ответить  
 
 автор: Lukas   (28.07.2009 в 16:37)   личное сообщение
 
 

Или так, правильнее:
Функция:

Public Function funRatio(Optional Amount)
    Static PrevAm As Currency
    If IsMissing(Amount) Then
        PrevAm = 0
        funRatio = 0
    Else
        If PrevAm > 0 Then funRatio = Round((Amount - PrevAm) / PrevAm, 4)
        PrevAm = Amount
    End If
End Function

Запрос:

SELECT tblAm.DateAm, tblAm.Amount, funRatio(tblAm.Amount) AS Ratio
FROM tblAm
WHERE funRatio()=0
ORDER BY tblAm.DateAm;

  Ответить  
 
 автор: pistachio   (28.07.2009 в 16:38)   личное сообщение
 
 

ну пизд... так, скажите плз, где найти "модуль", в котором надо написать функцию, и я это сделаю ))

  Ответить  
 
 автор: Lukas   (28.07.2009 в 16:42)   личное сообщение
11 Кб.
 
 

Окно базы данных, Вкладка "Модули", кнопка "Создать", откроется редактор VBA кода,
в нем новый модуль.
Копируем в него функцию, сохраняем.

Добавлено: образчик прицепил.

  Ответить  
 
 автор: pistachio   (28.07.2009 в 16:48)   личное сообщение
 
 

ок :)

Спасибо большое за помощь!

  Ответить  
HiProg.com - Технологии программирования
Rambler's Top100 TopList