Форум программистов CODEBY.NET Хостинг в Беларуси — Active Technologies

Разработка бизнес сайтов

Нужны клиенты? Тогда сюда быстрее...
X   Сообщение сайта
(Сообщение закроется через 2 секунды)

Здравствуйте, гость ( Вход | Регистрация )




> Запрос на разницу. Access
Raven
Вставить ник
сообщение 8:04:2008, 16:48
Цитата Ответить 


Новенький
*

Группа: Программист
Сообщений: 6
Регистрация: 8:04:2008
Пользователь №: 16 466
Специализация: инженер электрик



Репутация: - 0 +


Помогите пожалуйста.
Существует две таблицы с полями: у 1-ой - [ИД Лицевого счета];[Лицевой счет]; у 2-ой [ИД показания];[ИД Лицевого счета];[Дата снятия показания];[Показание]. Отношение один-ко-многим.
Как создать Запрос вычисляющий разницу показаний последнего и предыдущего для каждого Лицевого счета?
Просьба ответить поподробнее. Заранее спасибо
Подняться вверх 
 
Сообщение #1
 
Новая тема 
Ответов (1 - 15)
BOPOHA
Вставить ник
сообщение 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
sax_ol
Вставить ник
сообщение 8:04:2008, 17:22
Цитата Ответить 


==============
*****

Группа: Модеры
Сообщений: 1 740
Регистрация: 11:01:2007
Пользователь №: 8 750
Специализация: specialist



Репутация: - 27 +


BOPOHA
Наверное для получения First и Last два запроса ненадо делать.
Но автору надо не First, а предыдущий т.е. перед последним, а он может быть и не First, да и не Last. smile.gif
Подняться вверх 
 
Сообщение #3
Raven
Вставить ник
сообщение 8:04:2008, 17:25
Цитата Ответить 


Новенький
*

Группа: Программист
Сообщений: 6
Регистрация: 8:04:2008
Пользователь №: 16 466
Специализация: инженер электрик



Репутация: - 0 +


Спасибо за ответ. Однако дело в том, что функция First мне неподходит: в поле [Показание] может быть огромное количество значений для каждого лицевого счета, а функция выберет только последнее и первое значение, вместо последнего и предпоследнего.
Существуют ли другие способы?
Подняться вверх 
 
Сообщение #4
Raven
Вставить ник
сообщение 9:04:2008, 19:10
Цитата Ответить 


Новенький
*

Группа: Программист
Сообщений: 6
Регистрация: 8:04:2008
Пользователь №: 16 466
Специализация: инженер электрик



Репутация: - 0 +


Уважаемые программисты. Можете ли Вы помочь с решением данной задачи?
Подняться вверх 
 
Сообщение #5
sax_ol
Вставить ник
сообщение 10:04:2008, 06:02
Цитата Ответить 


==============
*****

Группа: Модеры
Сообщений: 1 740
Регистрация: 11:01:2007
Пользователь №: 8 750
Специализация: specialist



Репутация: - 27 +


Raven
А если предыдущего нет, то как тогда?
Подняться вверх 
 
Сообщение #6
Raven
Вставить ник
сообщение 10:04:2008, 18:44
Цитата Ответить 


Новенький
*

Группа: Программист
Сообщений: 6
Регистрация: 8:04:2008
Пользователь №: 16 466
Специализация: инженер электрик



Репутация: - 0 +


Тогда равно 0.
Подняться вверх 
 
Сообщение #7
BOPOHA
Вставить ник
сообщение 10:04:2008, 20:50
Цитата Ответить 


Новенький
*

Группа: Программист
Сообщений: 50
Регистрация: 26:04:2006
Из: Минск
Пользователь №: 3 484
Специализация: разработчик MS Access, Builder C++



Репутация: - 2 +


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

Программно эта задача решается на ура.
Подняться вверх 
 
Сообщение #8
Raven
Вставить ник
сообщение 11:04:2008, 15:13
Цитата Ответить 


Новенький
*

Группа: Программист
Сообщений: 6
Регистрация: 8:04:2008
Пользователь №: 16 466
Специализация: инженер электрик



Репутация: - 0 +


Тогда пожалуйста подскажи, как эта задача решается программно.
Подняться вверх 
 
Сообщение #9
BOPOHA
Вставить ник
сообщение 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
Raven
Вставить ник
сообщение 14:04:2008, 14:56
Цитата Ответить 


Новенький
*

Группа: Программист
Сообщений: 6
Регистрация: 8:04:2008
Пользователь №: 16 466
Специализация: инженер электрик



Репутация: - 0 +


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

извини за назойливость, но я всего месяц в Access работаю. Допустим нашел я последнюю дату и предпоследнюю, теперь мне надо соотнести с этими датами показания и найти между ними разницу- последнее показание и предпоследнее. Как это сделать? С меня магарыч.
Подняться вверх 
 
Сообщение #11
BOPOHA
Вставить ник
сообщение 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
eskandernostra
Вставить ник
сообщение 19:04:2008, 17:02
Цитата Ответить 


Новенький
*

Группа: Программист
Сообщений: 3
Регистрация: 19:04:2008
Пользователь №: 16 745
Специализация: будущий менеджер



Репутация: - 0 +


Можете сказать как сделать запросы в access, которые могли бы вывести координаты тех заводов, которые провели замеры параметров печи, газовый анализ и анализ химии сырья в один день и подсчитать разницу между динамическим и статическим давлением в печи. Меня собственно интересует сам механизм. Заранее спасибо.
Подняться вверх 
 
Сообщение #13
BOPOHA
Вставить ник
сообщение 21:04:2008, 06:41
Цитата Ответить 


Новенький
*

Группа: Программист
Сообщений: 50
Регистрация: 26:04:2006
Из: Минск
Пользователь №: 3 484
Специализация: разработчик MS Access, Builder C++



Репутация: - 2 +


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

Сообщение отредактировал BOPOHA - 21:04:2008, 06:41
Подняться вверх 
 
Сообщение #14
eskandernostra
Вставить ник
сообщение 22:04:2008, 11:42
Цитата Ответить 


Новенький
*

Группа: Программист
Сообщений: 3
Регистрация: 19:04:2008
Пользователь №: 16 745
Специализация: будущий менеджер



Репутация: - 0 +


Спасибо уже справился, было не сложно. Но вот у меня новый вопрос. Как с помощью циклов For… Next и Do While…Loop написать с помощью VBA в excel программу для кнопки, которая бы смогла вычислить значения уравнения и вывести эти значения в массив, причем значения для x взяты из другого массива. Конечно мой вопрос не относится к access, но я думаю вы сможете помочь.
Подняться вверх 
 
Сообщение #15
BOPOHA
Вставить ник
сообщение 24:04:2008, 19:59
Цитата Ответить 


Новенький
*

Группа: Программист
Сообщений: 50
Регистрация: 26:04:2006
Из: Минск
Пользователь №: 3 484
Специализация: разработчик MS Access, Builder C++



Репутация: - 2 +


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


Быстрый ответ  Ответить  Новая тема 

> Быстрый ответ
Полужирный
Курсив
Подчеркнутый
Вставить изображение
Смайлики
Цитата
Код
 
 Отправлять уведомления об ответах на e-mail |  Включить смайлики |  Добавить подпись
   

 

RSS Текстовая версия Сейчас: 16:05:2008 - 17:29
с нами можно связаться по:
телефону: +375-(29)-632-60-67
e-mail:info@codeby.net