Конференція vbstreets - перегляд теми - дати в access

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

Найскладніші кримінальні справи.

а чи не простіше фільтр за датою написати прямо в рядку фільтра самої форми?

ну, а якщо процедуру, то так:

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

DoCmd.OpenForm "об'єкт". ar

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

У вашому варіанті, всього два варіанти можливо

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

ar = ar "Or [ID Об'єкту] =" .Fields ( "ID Об'єкту") 'додаються ще значення, якщо вони є

Додається ще одне значення, з одного боку.

Найскладніші кримінальні справи.

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

а взагалі краще використовувати прямий фільтр по даті, а не городити цикли з порівняннями

Схожі статті