Помощник
Здравствуйте, гость ( Вход | Регистрация )
|
|
8:04:2008, 16:48
|
|
Новенький ![]() Группа: Программист Сообщений: 6 Регистрация: 8:04:2008 Пользователь №: 16 466 Специализация: инженер электрик Репутация: 0
|
Помогите пожалуйста.
Существует две таблицы с полями: у 1-ой - [ИД Лицевого счета];[Лицевой счет]; у 2-ой [ИД показания];[ИД Лицевого счета];[Дата снятия показания];[Показание]. Отношение один-ко-многим. Как создать Запрос вычисляющий разницу показаний последнего и предыдущего для каждого Лицевого счета? Просьба ответить поподробнее. Заранее спасибо |
|
Сообщение
#1
|
|
![]() |
|
|
8:04:2008, 17:11
|
|
Новенький ![]() Группа: Программист Сообщений: 50 Регистрация: 26:04:2006 Из: Минск Пользователь №: 3 484 Специализация: разработчик MS Access, Builder C++ Репутация: 2
|
Одним запросом никак. Понадобятся как минимум три:
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. Первые два должны быть хранимыми, надеюсь, догадаетесь как обехдинить результыты. Однако, подобные вещи гораздо лучше вычислять програмно в промежуточную таблицу. Т.к. гораздо проще ограничить набор лицевых счетов и надежней. |
|
Сообщение
#2
|
|
|
|
8:04:2008, 17:22
|
|
============== ![]() ![]() ![]() ![]() ![]() Группа: Модеры Сообщений: 1 740 Регистрация: 11:01:2007 Пользователь №: 8 750 Специализация: specialist Репутация: 27
|
BOPOHA
Наверное для получения First и Last два запроса ненадо делать. Но автору надо не First, а предыдущий т.е. перед последним, а он может быть и не First, да и не Last. |
|
Сообщение
#3
|
|
|
|
8:04:2008, 17:25
|
|
Новенький ![]() Группа: Программист Сообщений: 6 Регистрация: 8:04:2008 Пользователь №: 16 466 Специализация: инженер электрик Репутация: 0
|
Спасибо за ответ. Однако дело в том, что функция First мне неподходит: в поле [Показание] может быть огромное количество значений для каждого лицевого счета, а функция выберет только последнее и первое значение, вместо последнего и предпоследнего.
Существуют ли другие способы? |
|
Сообщение
#4
|
|
|
|
9:04:2008, 19:10
|
|
Новенький ![]() Группа: Программист Сообщений: 6 Регистрация: 8:04:2008 Пользователь №: 16 466 Специализация: инженер электрик Репутация: 0
|
Уважаемые программисты. Можете ли Вы помочь с решением данной задачи?
|
|
Сообщение
#5
|
|
|
|
10:04:2008, 06:02
|
|
============== ![]() ![]() ![]() ![]() ![]() Группа: Модеры Сообщений: 1 740 Регистрация: 11:01:2007 Пользователь №: 8 750 Специализация: specialist Репутация: 27
|
Raven
А если предыдущего нет, то как тогда? |
|
Сообщение
#6
|
|
|
|
10:04:2008, 18:44
|
|
Новенький ![]() Группа: Программист Сообщений: 6 Регистрация: 8:04:2008 Пользователь №: 16 466 Специализация: инженер электрик Репутация: 0
|
Тогда равно 0.
|
|
Сообщение
#7
|
|
|
|
10:04:2008, 20:50
|
|
Новенький ![]() Группа: Программист Сообщений: 50 Регистрация: 26:04:2006 Из: Минск Пользователь №: 3 484 Специализация: разработчик MS Access, Builder C++ Репутация: 2
|
Упс... действительно с first ошибся.
Программно эта задача решается на ура. |
|
Сообщение
#8
|
|
|
|
11:04:2008, 15:13
|
|
Новенький ![]() Группа: Программист Сообщений: 6 Регистрация: 8:04:2008 Пользователь №: 16 466 Специализация: инженер электрик Репутация: 0
|
Тогда пожалуйста подскажи, как эта задача решается программно.
|
|
Сообщение
#9
|
|
|
|
13:04:2008, 19:04
|
|
Новенький ![]() Группа: Программист Сообщений: 50 Регистрация: 26:04:2006 Из: Минск Пользователь №: 3 484 Специализация: разработчик MS Access, Builder C++ Репутация: 2
|
Код 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. Код не тестировался - возможны ошибки. |
|
Сообщение
#10
|
|
|
|
14:04:2008, 14:56
|
|
Новенький ![]() Группа: Программист Сообщений: 6 Регистрация: 8:04:2008 Пользователь №: 16 466 Специализация: инженер электрик Репутация: 0
|
Я еще не пробовал, но мне кажеться что функция LAST тут не пойдет, поскольку максимальная дата у меня может быть и не с последним ИД. Эта программа будет работать если функцию LAST заменить на MAX?
извини за назойливость, но я всего месяц в Access работаю. Допустим нашел я последнюю дату и предпоследнюю, теперь мне надо соотнести с этими датами показания и найти между ними разницу- последнее показание и предпоследнее. Как это сделать? С меня магарыч. |
|
Сообщение
#11
|
|
|
|
16:04:2008, 21:00
|
|
Новенький ![]() Группа: Программист Сообщений: 50 Регистрация: 26:04:2006 Из: Минск Пользователь №: 3 484 Специализация: разработчик MS Access, Builder C++ Репутация: 2
|
Ах... совсем забыл. В запросе нужно действительно отсортировать по дате 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("Показание") Вот два поаказания. Можно разницу считать. И т.д. |
|
Сообщение
#12
|
|
|
|
19:04:2008, 17:02
|
|
Новенький ![]() Группа: Программист Сообщений: 3 Регистрация: 19:04:2008 Пользователь №: 16 745 Специализация: будущий менеджер Репутация: 0
|
Можете сказать как сделать запросы в access, которые могли бы вывести координаты тех заводов, которые провели замеры параметров печи, газовый анализ и анализ химии сырья в один день и подсчитать разницу между динамическим и статическим давлением в печи. Меня собственно интересует сам механизм. Заранее спасибо.
|
|
Сообщение
#13
|
|
|
|
21:04:2008, 06:41
|
|
Новенький ![]() Группа: Программист Сообщений: 50 Регистрация: 26:04:2006 Из: Минск Пользователь №: 3 484 Специализация: разработчик MS Access, Builder C++ Репутация: 2
|
Ну что вас сказать. Открыли бы новую тему. Какой механизм вам рассказывать я не представляю. Не все задачи делаются запросами, иногда проще посчитать данные программно во временную таблицу. Если хотите получить ответ, то просто скажите какие таблицы и поля есть, какие данные необходимо получить.
Сообщение отредактировал BOPOHA - 21:04:2008, 06:41 |
|
Сообщение
#14
|
|
|
|
22:04:2008, 11:42
|
|
Новенький ![]() Группа: Программист Сообщений: 3 Регистрация: 19:04:2008 Пользователь №: 16 745 Специализация: будущий менеджер Репутация: 0
|
Спасибо уже справился, было не сложно. Но вот у меня новый вопрос. Как с помощью циклов For… Next и Do While…Loop написать с помощью VBA в excel программу для кнопки, которая бы смогла вычислить значения уравнения и вывести эти значения в массив, причем значения для x взяты из другого массива. Конечно мой вопрос не относится к access, но я думаю вы сможете помочь.
|
|
Сообщение
#15
|
|
|
|
24:04:2008, 19:59
|
|
Новенький ![]() Группа: Программист Сообщений: 50 Регистрация: 26:04:2006 Из: Минск Пользователь №: 3 484 Специализация: разработчик MS Access, Builder C++ Репутация: 2
|
Собственно говоря, для нового вопроса, новая тема.
Вопрос излишне абстрактен. Где масивы? Какая формула? Уточняется в новой теме. |
|
Сообщение
#16
|
|
![]() |
|
Текстовая версия | Сейчас: 16:05:2008 - 17:29 |