• Курсы Академии Кодебай, стартующие в мае - июне, от команды The Codeby

    1. Цифровая криминалистика и реагирование на инциденты
    2. ОС Linux (DFIR) Старт: 16 мая
    3. Анализ фишинговых атак Старт: 16 мая Устройства для тестирования на проникновение Старт: 16 мая

    Скидки до 10%

    Полный список ближайших курсов ...

Запрос на разницу. Access

  • Автор темы Raven
  • Дата начала
R

Raven

Помогите пожалуйста.
Существует две таблицы с полями: у 1-ой - [ИД Лицевого счета];[Лицевой счет]; у 2-ой [ИД показания];[ИД Лицевого счета];[Дата снятия показания];[Показание]. Отношение один-ко-многим.
Как создать Запрос вычисляющий разницу показаний последнего и предыдущего для каждого Лицевого счета?
Просьба ответить поподробнее. Заранее спасибо
 
B

BOPOHA

Одним запросом никак. Понадобятся как минимум три:
1. Вычисление первого показания.
2. Вычисление последнего показания.
3. Объединение результатов

1. SELECT [ИД Лицевого счета], First([Показание]) As FIRST_VAL FROM таблица2 GROUP BY [ИД Лицевого счета] ORDER BY [Дата снятия показания]
2. SELECT [ИД Лицевого счета], Last([Показание]) As LAST_VAL FROM таблица2 GROUP BY [ИД Лицевого счета] ORDER BY [Дата снятия показания]
3. Первые два должны быть хранимыми, надеюсь, догадаетесь как обехдинить результыты.

Однако, подобные вещи гораздо лучше вычислять програмно в промежуточную таблицу. Т.к. гораздо проще ограничить набор лицевых счетов и надежней.
 
R

Raven

Спасибо за ответ. Однако дело в том, что функция First мне неподходит: в поле [Показание] может быть огромное количество значений для каждого лицевого счета, а функция выберет только последнее и первое значение, вместо последнего и предпоследнего.
Существуют ли другие способы?
 
R

Raven

Уважаемые программисты. Можете ли Вы помочь с решением данной задачи?
 
B

BOPOHA

Упс... действительно с first ошибся.

Программно эта задача решается на ура.
 
R

Raven

Тогда пожалуйста подскажи, как эта задача решается программно.
 
B

BOPOHA

Код:
	Dim rst As DAO.Recordset
Dim rstSub As DAO.Recordset
Dim dtLast As Date
Dim dtPrev As Date

Set rst = CurrentDb.OpenRecordset("SELECT [ИД Лицевого счета] as Id FROM таблица1", dbOpenForwardOnly)

Do While Not rst.EOF
Set rstSub = CurrentDb.OpenRecordset("SELECT [Показание] as Pokazanie FROM таблица2 WHERE [ИД Лицевого счета] = " & Nz(rst("Id"), 0), dbOpenSnapshot)

If Not rstSub.EOF Then
'-- последняя дата
rstSub.MoveLast
dtLast = rstSub("Показание")
'-- предпоследняя дата
rstSub.MovePrevious
If Not rstSub.BOF Then
dtPrev = rstSub("Показание")
Else
dtPrev = ????? '-- значение по умолчанию
End If

'-- делаем что-нибудь с полученными датами

End If
rstSub.Close
rst.MoveNext
Loop
rst.Close

С тебя шеколадка :).

P.S. Код не тестировался - возможны ошибки.
 
R

Raven

Я еще не пробовал, но мне кажеться что функция LAST тут не пойдет, поскольку максимальная дата у меня может быть и не с последним ИД. Эта программа будет работать если функцию LAST заменить на MAX?

извини за назойливость, но я всего месяц в Access работаю. Допустим нашел я последнюю дату и предпоследнюю, теперь мне надо соотнести с этими датами показания и найти между ними разницу- последнее показание и предпоследнее. Как это сделать? С меня магарыч.
 
B

BOPOHA

Ах... совсем забыл. В запросе нужно действительно отсортировать по дате ORDER BY поле в помощь.

Т.е. так "SELECT [Показание] as Pokazanie FROM таблица2 WHERE [ИД Лицевого счета] = " & Nz(rst("Id"), 0) & " ORDER BY [Дата снятия показания]"

В кодя я не много нахамутал.
Вместо
Код:
	Dim dtLast As Date
Dim dtPrev As Date
стоит использовать

Код:
	Dim lLast As Long
Dim lPrev As Long

Подразумевается что поле Показание длинное целое.

Соответственно: lLast = rstSub("Показание") и lPrev = rstSub("Показание")

Вот два поаказания. Можно разницу считать. И т.д.
 
E

eskandernostra

Можете сказать как сделать запросы в access, которые могли бы вывести координаты тех заводов, которые провели замеры параметров печи, газовый анализ и анализ химии сырья в один день и подсчитать разницу между динамическим и статическим давлением в печи. Меня собственно интересует сам механизм. Заранее спасибо.
 
B

BOPOHA

Ну что вас сказать. Открыли бы новую тему. Какой механизм вам рассказывать я не представляю. Не все задачи делаются запросами, иногда проще посчитать данные программно во временную таблицу. Если хотите получить ответ, то просто скажите какие таблицы и поля есть, какие данные необходимо получить.
 
E

eskandernostra

Спасибо уже справился, было не сложно. Но вот у меня новый вопрос. Как с помощью циклов For… Next и Do While…Loop написать с помощью VBA в excel программу для кнопки, которая бы смогла вычислить значения уравнения и вывести эти значения в массив, причем значения для x взяты из другого массива. Конечно мой вопрос не относится к access, но я думаю вы сможете помочь.
 
B

BOPOHA

Собственно говоря, для нового вопроса, новая тема.
Вопрос излишне абстрактен. Где масивы? Какая формула? Уточняется в новой теме.
 
Мы в соцсетях:

Обучение наступательной кибербезопасности в игровой форме. Начать игру!