Archive for the ‘решения’ Category
Как отключить скролинг записей формы
Для некоторых пользователей колесико мышки является проблемой. Так как они как правило не смотрят на экран, когда меняют что-либо. Нечаянно крутанулось колесико и поменяли не ту запись.
MS Access 2003 поддерживает событие MouseWheel, но, увы, не позволяет отменить это. Даже DoCmd.CancelEvent не помогает.
Private Sub Form_MouseWheel(ByVal Page As Boolean, ByVal Count As Long)
DoCmd.CancelEvent '-- не работает
End Sub
Одно из решений это хук событий формы описанный на сайте microsoft (How to Detect and Prevent the Mouse Wheel from Scrolling Through Records in a Form). И тут не обошлось без недостатков. Если не использовать внешней dll, то периодически форма тормозит, т.к. все события проваливаются через медленный VBA. Возможно, если вынести данный код в dll, то будет работать на порядок быстрее. Мне не захотелось возится с отдельной dll, т.к. я нашел метод попроще (об этом ниже). Пока я исследовал пример, немного расширил его. Результат трудов можно скачать тут, вдруг кому понадобится.
Более простым решением на мой взгляд является фильтр по ключевому полю. При этом нужно отключить добавление записей. У этой идеи тоже есть недостатки:
- для ленточных форм, естественно, это не работает.
- нужно реализовывать добавление записи, а потом уже открывать ее на редактирование.
Какой вариант выбрать зависит от ситуации. Я же стараюсь свести дизайн программы ко второму варианту. Уж больно он мне по душе.
До встречи!
(с) Скоков Сергей
Подписаться на: RSS или e-mail рассылку или добавить в ЖЖ друзья.
Как из номера квартала получить дату или период для поиска
Недавно на моем любимом форуме проскакивал одноименный ответ. Сперва я сам как-то задумался, а как же. Но как оказалось задача «По номерам недель получить временной промежуток для фильтра по датам» оказалось проще простого. Для этого я воспользовался любимым методом «Разделяй и властвуй».
И так, задача разбилась на три части:
1. Функция, которая вернет дату начала недели по номеру недели и году.
Public Function GetDateOfStartWeek(ByVal nWeek As Byte, ByVal nYear As Integer) As Date
Dim dt1Jan As Date
Dim dayFirstWeek As Integer
Dim dtResult As Date
dt1Jan = DateSerial(nYear, 1, 1)
dayFirstWeek = Weekday(dt1Jan, vbMonday)
dtResult = DateAdd("ww", nWeek - 1, dt1Jan)
If dayFirstWeek > 1 And nWeek > 1 Then
dtResult = DateAdd("d", -1 * (7 - Weekday(dt1Jan, vbMonday) + 2), dtResult)
End If
GetDateOfStartWeek = dtResult
End Function
2. Функция, которая вернет дату окончания недели по номеру недели и году.
Public Function GetDateOfEndWeek(ByVal nWeek As Byte, ByVal nYear As Integer) As Date
GetDateOfEndWeek = DateAdd("d", 7 - 1, GetDateOfStartWeek(nWeek, nYear))
End Function
3. Фнункция, которая вернет условие за период по датам:
public frunction GetWherePeriod(ByVal imFld as string, ByVal dtFrom as Date, ByVal dtTo as Date) as String GetWherePeriod = BuildCriteria(imFld, dbDate, "Between " & dtFrom & " And " & dtTo & "") End Public '-- Проверка Debug.Print GetWherePeriod(GetDateOfStartWeek(1, 2010), GetDateOfEndWeek(1, 2010))
Как-то уж очень просто получилось… Функцию GetDateOfStartWeek() я активно не тестировал, проверял только для января за 2010 и 2007 года. Если будут ошибки, пишите.
До встречи!
(с) Скоков Сергей
Подписаться на: RSS или e-mail рассылку или добавить в ЖЖ друзья.