5 строк кода

Как писать комерческие приложения на MS Access

Archive for the ‘решения’ Category

Как отключить скролинг записей формы

Комментариев нет

Mouse Для некоторых пользователей колесико мышки является проблемой. Так как они как правило не смотрят на экран, когда меняют что-либо. Нечаянно крутанулось колесико и поменяли не ту запись.

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 рассылку или добавить в ЖЖ друзья.

Written by Сергей Скоков

Август 23rd, 2010 at 10:45 пп

Posted in решения

Как из номера квартала получить дату или период для поиска

Комментариев нет

calendar

Недавно на моем любимом форуме проскакивал одноименный ответ. Сперва я сам как-то задумался, а как же. Но как оказалось задача «По номерам недель получить временной промежуток для фильтра по датам» оказалось проще простого. Для этого я воспользовался любимым методом «Разделяй и властвуй».

И так, задача разбилась на три части:
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 рассылку или добавить в ЖЖ друзья.

Written by Сергей Скоков

Март 25th, 2010 at 3:23 пп

Posted in решения