powered by simpleCommunicator - 2.0.60     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Microsoft Access [игнор отключен] [закрыт для гостей] / Microsoft Access
11 сообщений из 11, страница 1 из 1
Microsoft Access
    #32068438
Dimblch
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Значит суть вопроса вот в чем: есть запрос по клиентам
Вкоторый входят поля: номерзаписи клиент Дата расход/приход . Необходимо вычислить количество дней между предидущей и последующей записью. Как это сделать ума не приложу, если не можете помочь топодскажите пожалуйста где можно покопать
...
Рейтинг: 0 / 0
Microsoft Access
    #32068522
Sander
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Запросом - очень напряжно.
лучше в процедуре сканировать recordset
...
Рейтинг: 0 / 0
Microsoft Access
    #32068895
alk
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
alk
Гость
вообще то запросы как правило работают быстрее, поэтому я считаю что лучше запросом.

предположим что
mynum - поле последовательного нумератора - id запроса
MyDate - дата в запросе.

задача - найти значение даты предыдущей записи для расчета разницы функцией datediff.

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
SELECT     mynum, mydate, mytext,
                          (SELECT     mydate
                            FROM          mytable t3
                            WHERE      t3.Mynum =
                                                       (SELECT     MAX(t2.Mynum)
                                                         FROM          mytable t2
                                                         WHERE      t2.mynum < t1.mynum)) AS prev_date
FROM         dbo.mytable t1



данный запрос верен для adp , возможно будет работать и mdb.
вот результат исплнения
Код: plaintext
1.
2.
3.
4.
mynum	mydate	             mytext	prev_date
 1 	 01 . 01 . 2001 	aaa	<Null>
 2 	 01 . 02 . 2002 	ssss	 01 . 01 . 2001 
 3 	 01 . 02 . 2003 	dddd	 01 . 02 . 2002 
 4 	 04 . 04 . 2006 	ffff	 01 . 02 . 2003 

в первой строке нул т.к. нет предыдущей записи.

соответственно расчет разницы в днях выглядит так

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
SELECT     mynum, mydate, mytext, DATEDIFF(dd, mydate,
                          (SELECT     mydate
                            FROM          mytable t3
                            WHERE      t3.Mynum =
                                                       (SELECT     MAX(t2.Mynum)
                                                         FROM          mytable t2
                                                         WHERE      t2.mynum < t1.mynum))) AS Day_difference
FROM         dbo.mytable t1


и результат такой
Код: plaintext
1.
2.
3.
4.
5.
mynum	mydate	             mytext	Day_difference
 1 	 01 . 01 . 2001 	aaa	<null>
 2 	 01 . 02 . 2002 	ssss	- 396 
 3 	 01 . 02 . 2003 	dddd	- 365 
 4 	 04 . 04 . 2006 	ffff	- 1158 


Алексей Козин kozin@mail.ru
...
Рейтинг: 0 / 0
Microsoft Access
    #32068938
-=Alexey=-
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
To Alk
Зачем такие сложности, эта задача тривиальна (если id принимает последовательные значения). Нужно связать таблицу саму с собой по id со смещением на 1.
...
Рейтинг: 0 / 0
Microsoft Access
    #32068971
Фотография mahoune
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
-=Alexey=-, мне кажется по определению такой подход будет не верен!!! Веть запись из таблицы могут удалить и будет дырка! Тут скорее надо поиграться с TOP :) Хотя предложенное тобой решение не лишено смысла! :)
...
Рейтинг: 0 / 0
Microsoft Access
    #32068997
alk
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
alk
Гость
2 -=Alexey=-

в простейшем случае действительно второй подчиненный запрос можно заменить на выражение,

но в связи с тем что в реальном запросе
Dimblch наверняка захочет чтобы рзаница дат вычислялась не между двумя последовательными записями а между записями относящихся к одному клиенту.

вот тогда и будет неизбежен второй подзапрос в который нужно будет добавить
and t1.client = t2.client
...
Рейтинг: 0 / 0
Microsoft Access
    #32070675
Dimblch
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Попробовал я сделать так как вы сказали ниже привожу то чего я натворил .К моему великому сожалению работать отказывается запрашивает кучу параметров

Код: plaintext
1.
2.
3.
4.
5.
6.
SELECT КодMT, Date, Klients_Код, DateDiff (dd,MainDataTable.Date,(SELECT MainDataTable.Date 
  FROM  MainDataTable t3 
         WHERE t3.MainDataTable.КодMT =
          (SELECT MAX(t2.MainDataTable.КодMT)
   FROM МainDataTablet2                                 
          WHERE t2.MainDataTable.КодMT <     t1.MainDataTable.КодMT))) AS Day_difference
   FROM MainDataTable t1;

Может подскажете в чем я неправ, запрос делается для Mdb
...
Рейтинг: 0 / 0
Microsoft Access
    #32070718
Dimblch
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
К стати забыл сказсать какие параметры он требует ввести
t1.MainDataTable.КодMT ,t2.MainDataTable.КодMT,MainDataTable.Date, t3.MainDataTable.КодMT ,dd
...
Рейтинг: 0 / 0
Microsoft Access
    #32070736
В таблице "MainDataTable" Access не нашел таких полей, как "КодMT", "Date". А раз не нашел, то считает это не именем поля, а параметром.
А что такое "dd"?
Где-то у тебя опечатка, наверное.
...
Рейтинг: 0 / 0
Microsoft Access
    #32070763
Dimblch
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Урааааааааа !!!!!!!!!!! заработало . Спасиба всем за содействие
...
Рейтинг: 0 / 0
Microsoft Access
    #32072075
Dimblch
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Рано порадовался . Запрос работает так сказать местами. Тормозит дико , иногда Access умирает на совсем. Как можно заставить его работать быстрее
...
Рейтинг: 0 / 0
11 сообщений из 11, страница 1 из 1
Форумы / Microsoft Access [игнор отключен] [закрыт для гостей] / Microsoft Access
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]