Даты в access

Работа VB и СУБД (Access, MSSQL, MySQL, Oracle и пр.)
Правила форума
При создании новой темы не забывайте указывать используемую СУБД.
Forlaw
Начинающий
Начинающий
 
Сообщения: 24
Зарегистрирован: 12.08.2007 (Вс) 17:02

Даты в access

Сообщение Forlaw » 12.08.2007 (Вс) 17:07

Помогите пожалуйста..

1. Есть таблица с объектами недвижимости.
2. Объект определяется по его ID("ID Объекта")
3. У объектов есть дата окончания("Дата окончания")
4. С помощью запроса выбираем все записи, где дата окончания меньше или равна текущей дате.
5. Переходим на первую запись
6. Если дата окончания меньше или равна 7("семи"), то записываем "ID Объекта" текущей записи в массив.
7. Идём на след. запись.(цикл до .eof)

8. Выдаём предупреждение, мол "Срок у некоторых объектов скоро заканчивается"
9. Открываем форму только с теми записями, где "ID Объекта"=данным из массива.


Private Sub Form_Open(Cancel As Integer)
Dim okdate, okdate2, msg, dt, df, d, m, y As String
Dim ssd As Date
Dim ar As String 'массив должен быть, наверно
okdate = DateValue(Now()) 'В запросе два поля "ID Объекта" и "Дата окончания", где "Дата окончания" >= [N]

With CurrentDb.QueryDefs("Дата окончания")
.Parameters("N") = okdate
With .openrecordset
If Not .EOF Then
.MoveFirst
Do
dt = .Fields("Дата окончания")
d = Nz(Left(dt, 2), "") `день
m = Nz(Mid(dt, 4, 2), "") `месяц
y = Nz(Right(dt, 4), "") `год (правильно?)
ssd = d & "." & m & "." & y
df = DateDiff("d", ssd, Now) `определили, вроде, разницу в днях между текущей датой и датой окончания

If df <= "7" Then
ar = .Fields("ID Объекта") `как-то надо записать в массив
.MoveNext
Else
.MoveNext
End If
Loop Until .EOF
End If
End With
End With

If ar = Null Then `если массив пустой
Exit Sub `выходим
Else
msg = MsgBox("Есть объекты, срок которых скоро заканчивается!", vbYesNo + vbCritical, "Предупреждение!")
If msg = vbYes Then
DoCmd.OpenForm "Объект", , ,[ID Объекта]=ar `с данными "ID Объекта" из массива(несколько записей)
Else
Exit Sub
End If
End If
End Sub
Самые сложные уголовные дела.

dormouse
Продвинутый пользователь
Продвинутый пользователь
Аватара пользователя
 
Сообщения: 140
Зарегистрирован: 10.01.2007 (Ср) 21:58
Откуда: Волжский

Сообщение dormouse » 12.08.2007 (Вс) 21:00

а не проще ли фильтр по дате написать прямо в строке фильтра самой формы?

ну, а если процедуру, то так:

Код: Выделить всё

Dim ar as String
If ar = "" Then
    ar = "[ID Объекта]=" & .Fields("ID Объекта")'фильтр формируется для одного значения поля
Else
    ar = ar & " or [ID Объекта]=" & .Fields("ID Объекта")'добавляются ещё значения, если они есть
End If

DoCmd.OpenForm "объект", , ar



ps:
выключил комп и подумал, а что такое 7? :)
2007 год? а 1 января 2008 ты семёрку будешь заменять на восьмёрку? ;)
неее. это не по-нашему

тогда делай рекордсет на основе
Код: Выделить всё

SELECT Объект.[ID Объекта]
FROM Объект
WHERE ((Year([Дата окончания])>=Year(Now())));

потом
Код: Выделить всё
if Not (rst.EOF) Then 'рекордсет вернул некоторое количество записей с 2007 или более поздними годами
MsgBox бла-бла
...
DoCmd.OpenForm "Объект", , "(Year([Дата окончания])>=Year(Now()))"
Последний раз редактировалось dormouse 12.08.2007 (Вс) 21:30, всего редактировалось 1 раз.
VBA, MSA97

Forlaw
Начинающий
Начинающий
 
Сообщения: 24
Зарегистрирован: 12.08.2007 (Вс) 17:02

Сообщение Forlaw » 12.08.2007 (Вс) 21:21

не, так не получится.
надо сначала массив заполнить(как, не знаю)
а потом открыть форму не с OR, а AND

В вашем варианте, всего два варианта возможно

либо с последней записью откроется форма(как сейчас есть)
либо х.з. что получится)))
Тут цикл, что ли нужен..

ar = ar & " or [ID Объекта]=" & .Fields("ID Объекта")'добавляются ещё значения, если они есть

Добавляется ещё одно значение, вроде как...
Самые сложные уголовные дела.

dormouse
Продвинутый пользователь
Продвинутый пользователь
Аватара пользователя
 
Сообщения: 140
Зарегистрирован: 10.01.2007 (Ср) 21:58
Откуда: Волжский

Сообщение dormouse » 12.08.2007 (Вс) 21:46

Forlaw писал(а):не, так не получится.
надо сначала массив заполнить(как, не знаю)
а потом открыть форму не с OR, а AND

я и привёл кусок кода, где формируется "массив" ar. строка это, где через Or перечисляются значения поля [ID объекта]. с And как раз ничего и не выйдет. не может восьмёрка одновременно равняться пятёрке и девятке ;)

[/quote]
так это будет:
вставка кода сделана обычным текстом, так что не могу точно отследить вложенность :?
Код: Выделить всё

If df <= "7" Then
If ar = "" Then
    ar = "[ID Объекта]=" & .Fields("ID Объекта")'фильтр формируется для одного значения поля
Else
    ar = ar & " or [ID Объекта]=" & .Fields("ID Объекта")'добавляются ещё значения, если они есть
End If
.MoveNext
Else
.MoveNext
End If


а вообще лучше использовать прямой фильтр по дате, а не городить циклы со сравнениями
VBA, MSA97

Forlaw
Начинающий
Начинающий
 
Сообщения: 24
Зарегистрирован: 12.08.2007 (Вс) 17:02

Сообщение Forlaw » 12.08.2007 (Вс) 22:56

"7" это "df"
df = DateDiff("d", ssd, Now)
результат функции. Т.е. разница в ДНЯХ, между "дата окончания" и "текущая дата"

Т.е. нужно сделать "будильник".
Если "срок окончания" меньше или равно "недели" (7 дней), то предупреждение.
Самые сложные уголовные дела.

Forlaw
Начинающий
Начинающий
 
Сообщения: 24
Зарегистрирован: 12.08.2007 (Вс) 17:02

Сообщение Forlaw » 12.08.2007 (Вс) 22:59

SELECT Объект.[ID Объекта]
FROM Объект
WHERE ((Year([Дата окончания])>=Year(Now())));
не то, немного..


сделал по ТОЧНОЙ дате через параметр в запросе:
okdate = DateValue(Now())
With CurrentDb.QueryDefs("Дата окончания")
.Parameters("N") = okdate

запрос:
SELECT Объекты.[Дата окончания], Объекты.[ID Объекта]
FROM Объекты
WHERE (((Объекты.[Дата окончания])>=[N]));
Самые сложные уголовные дела.

Forlaw
Начинающий
Начинающий
 
Сообщения: 24
Зарегистрирован: 12.08.2007 (Вс) 17:02

Сообщение Forlaw » 12.08.2007 (Вс) 23:43

если по полочкам:

1. Есть ТАБЛИЦА
2. В ТАБЛИЦЕ есть поле "Дата окончания"
3. В ТАБЛИЦЕ есть поле "ID Объекта"
4. При загрузке базы(или формы, которая автоматом грузится) нужно найти все записи в ТАБЛИЦЕ, где ТЕКУЩАЯ ДАТА <= "Дата окончания"
5. Вычислить "КОЛИЧЕСТВО ДНЕЙ" ("Дата окончания" - ТЕКУЩАЯ ДАТА)
6. Если "КОЛИЧЕСТВО ДНЕЙ" <= "7" то
7. Занести .fields("[ID Объекта]") в массив
8. Идём на след. запись
9. Если нет
10. Идём на след. запись (дальше loop until .EOF)
` т.е. как-то нужно занести в массив все .fields("[ID Объекта]") из данного цикла.
11. Выдаём предупреждение: "Мол, некоторые объеты скоро заканчиваются!"
12. Если нажали OK то открывам форму с фильтром, где поле [ID Объекта]= "Данное из массива1" And "Данное из массива2" And "Данное из массива3" и т.д.


Вроде так...
Самые сложные уголовные дела.

Forlaw
Начинающий
Начинающий
 
Сообщения: 24
Зарегистрирован: 12.08.2007 (Вс) 17:02

Сообщение Forlaw » 13.08.2007 (Пн) 1:03

dt = .Fields("Дата окончания")
d = Nz(Left(dt, 2), "") `день (точно правильно)
m = Nz(Mid(dt, 4, 2), "") `месяц (точно правильно)
y = Nz(Right(dt, 4), "") `год (правильно?)
ssd = d & "." & m & "." & y
df = DateDiff("d", ssd, Now) `Вроде определили разницу в днях между текущей датой и датой окончания
Самые сложные уголовные дела.

alibek
Большой Человек
Большой Человек
 
Сообщения: 14205
Зарегистрирован: 19.04.2002 (Пт) 11:40
Откуда: Russia

Сообщение alibek » 13.08.2007 (Пн) 8:18

Forlaw, убери ссылку из подписи.
Lasciate ogni speranza, voi ch'entrate.

dormouse
Продвинутый пользователь
Продвинутый пользователь
Аватара пользователя
 
Сообщения: 140
Зарегистрирован: 10.01.2007 (Ср) 21:58
Откуда: Волжский

Сообщение dormouse » 13.08.2007 (Пн) 18:54

Forlaw:
1. на форуме в твоих сообщениях ты можешь видеть кнопочку
Изображение. пользуйся ею, если хочешь что-то добавить к своим сообщениям, на которые ещё никто не успел ответить. а то впечатление, что ты разговариваешь сам с собой ;)

2. как занести в так называемый "массив" (тебе не нужен настоящий массив типа ar[0] as string) строку фильтра, я уже написал. вставь в свой цикл заполнение твоей ar перечнем значений через Or. а потом этот ar подставить, как фильтр в открытие формы. но этот путь бестолковый, имхо. запутывает и тебя и программу и, вообще, в корне не то, чего ты сам хочешь.

3. ты так и не подумал об организации фильтра по дате прямо в форме...
умеешь работать с Recorset'ом?
переделай вот так всю процедуру (мог наврать со знаками в сравнении - посмотришь):

Код: Выделить всё
Sub ы()
Dim rst As Recordset
'создаём рекордсет из запроса. можешь это выражение открыть в построителе запросов и посмотреть ,что он делает
Set rst = CurrentDb.OpenRecordset("SELECT [ID Объекта], [Дата окончания] " & _
    "FROM Объект " & _
    "WHERE ((DateDiff('d',Now(),[Дата окончания])>=7));")
'проверяем, выдал ли хоть что-то этот запрос
If Not (rst.EOF) Then
'ага. что-то там есть. не важно, что и сколько. просто задаём юзеру вопрос.
    If MsgBox("Мол, некоторые объеты скоро заканчиваются!" & vbCrLf & _
        "поглядим, что там у нас так?", _
        vbDefaultButton2 + vbInformation + vbYesNo, _
        "Внимание, внимание, говорит Германия!") = vbYes Then
'юзер ответил "да" на наш вопрос, посмотреть ли срочно немедленно нашу очень важную инфу
        DoCmd.OpenForm "form1"'открываем форму
'у отрывшейся формы сразу же меняем источник данных на запрос, который мы только что использовали (или как тебе заблагорассудится - можешь другой запрос сделать)
        Forms!form1.RecordSource = "SELECT [ID Объекта], [Дата окончания] " & _
            "FROM Объект " & _
            "WHERE ((DateDiff('d',Now(),[Дата окончания])>=7));"
    End If
End If
End Sub
'всё
VBA, MSA97

Forlaw
Начинающий
Начинающий
 
Сообщения: 24
Зарегистрирован: 12.08.2007 (Вс) 17:02

Сообщение Forlaw » 14.08.2007 (Вт) 13:56

всё было намного проще =((
select bla-bla
from bla-bla
WHERE (([Дата окончания])-Date()<=7);

так все нужные записи сразу выбираются..
Самые сложные уголовные дела.

Uza10775
Начинающий
Начинающий
 
Сообщения: 1
Зарегистрирован: 13.12.2007 (Чт) 2:50

Сообщение Uza10775 » 13.12.2007 (Чт) 3:04

Подскажите, пожалуйста. В БД есть запрос, где есть столбец "Дата проведения", где указывается дата приема пациента и есть столбец с формулой: через3месяца: DateSerial(Year(подчиненная![дата проведения]);(Month(подчиненная![дата проведения])+3);Day(подчиненная![дата проведения])), который вычисляет дату проведения следующего приема (он д.быть через три месяца). Вопрос вот в чем-вычислять то он вычисляет через три месяца, дату показывает, можно ли сделать так, чтоб если дата выпадает на выходные (суббота и воскресенье)-переносилась на понедельник,подскажите,как это лучше сделать в данном случае, потому как программировать я не умею, но попробую разобраться, если что-нидь подскажете.


Вернуться в Базы данных

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 1

    TopList