Archive for Март, 2009
Стоит ли использовать временные таблицы для отчетов
Здравствуйте, уважаемые читатели.
Сегодня прочитал спорное мнение на форуме, что использовать временные таблицы при формировании отчетов это кривое решение. С этим мнением я в корне не согласен.
Мои доводы ЗА:
1. Модульность. Временные таблицы позволяют разделить между собой отчет и код расчета данных. В последующем это повышает сопровождаемость (см. п.3).
2. Удобство отладки. Если отчет перестал работать или работает как-то не правильно, то гораздо легче проверить расчет данных для него.
3. Сопровождаемость. В любой момент может возникнуть необходимость переделать либо расчет данных, либо переделать отчет, например, печатать его в word. Это все можно модифицировать по отдельности. Также пользователь может захотеть хранить рассчитанные данные, этого тоже будет просто добиться.
4. Документирование. Если разработчик укажет комментарии к полям для временной таблицы, то это можно считать документацией.
Мои доводы ПРОТИВ:
1. Увеличивается время разработки. Это происходит в том случае, если для отчета можно использовать простой запрос в качестве источника данных. Если же расчет данных не вписывается в простейшие запросы, то будет проще и надежней реализовать расчет отчета в коде.
Больше против я не вспомнил. Выбор очевиден
. Увлекаться данным способом естественно не стоит, каждой проблеме лучше подбирать свое решение. Этот метод подходит для отчетов со “сложными” расчетами данных.
До встречи!
(с) Скоков Сергей
Подписаться на: RSS или e-mail рассылку или добавить в ЖЖ друзья.
3 вида меню в MS Access
Здравствуйте, уважаемые читатели.

То, что первым видит пользователь в программе – это меню. От него зависит (и не только) на сколько удобно будет работать с программой. С течением времени определенные подходы, которые я видел, классифицировались в следующие виды меню:
- формы с кнопками,
- кнопочная форма (на основе мастера),
- строка меню.
Я заметил, что «новички» начинают с форм с кнопками, затем открывают для себя кнопочные формы, а если встает задача сделать, как классическом текстовом редакторе, то переходят к строке меню или используют вместо нее панель инструментов. Конечно, бывают исключения и это только мои наблюдения.
Очень долгое время я думал, что самое лучшее и удобное меню – это строка меню. Но как показала жизнь, для каждого класса задач подходит свое меню.
1 Формы с кнопками
При этом подходе создается множество однотипных форм с кнопками или группой переключателей. Этот метод очень активно использовался в старых ДОСовских программах.
Это очень удобно использовать, когда пользователю при работе с одной из функций не нужна другая функция, которая вызывается из меню. Примером таких программ могут служить любые, в которых происходит потоковая регистрация и пользователю некогда переключаться между клавиатурой и мышкой.
К минусам такого способа можно отнести большое количество форм и муторность в изменении этого меню. Для пользователя может быть не удобно закрывать или сворачивать текущие формы, чтобы увидеть меню и открыть необходимую форму.
Очень не рекомендую использовать группы переключателей в качестве кнопок, переходить клавишами по такому меню не удастся.
2 Кнопочная форма (на основе мастера)
В этом варианте существует только одна форма и мастер редактирования пунктов. Из недостатков – при открытии любая формы, форма меню будет не видна.
При ближайшем рассмотрении оказалось, что это обыкновенная форма с х кнопками и надписями и с системной таблицей в качестве источника данных.
Не знаю почему, но мне этот вариант мне не нравится. Я лучше сам его реализую при необходимости.
3 Строка меню
Это мой самый любимый способ, т.к. очень просто изменять и все время на виду. Да и очень редко мне доводится разрабатывать программы для людей, не пользующихся мышкой.

Чтобы меню выглядело при запуске программы как на картинке, придется немножко пошаманить.
При создании меню (Сервис->Настройка), по умолчанию создается панель инструментов. По этому, выбрав созданное меню, необходимо нажать кнопку свойства. Необходимо настроить его следующим образом:

Я изменил тип на «Строка меню» и убрал галочку «Отображение и скрытие», чтобы пользователь ее не мог скрыть. Снимать все галочки не рекомендую, если будет желание то после этого обязательно проверьте, что из этого получилось и подойдет ли пользователю. А то можете получить проблему из-за меню. Также можно убрать перемещение, но только после того, как закончите сами ее настраивать.
Теперь необходимо зайти в Параметры запуска (Сервис –> Параметры запуска).

Тут я выбираю свою строку меню и убираю отображение окна базы данных. В таком режиме я и работаю.
Как вы заметили можно и свое контекстное меню сделать. Или убрать панели инструментов по умолчанию. Не рекомендую этим увлекаться. Например, панель инструментов отчетов ой как нужна, чтобы напечатать. А на панели инструментов для форм есть такая полезная штуковина как сортировка.
После того, как вы перезапустите свою БД, то всегда будет отображаться ваше меню. А стандартного не будет. Чтобы его отобразить/скрыть достаточно нажать Ctrl+F11. Очень удобно.
До встречи!
(с) Скоков Сергей
Как показать первое значение в поле со списком
Здравствуйте, уважаемые читатели.
Поделюсь с вами еще одной удобной функцией. У меня часто возникает ситуация, когда при открытии формы в поле со списком необходимо показать первое значение.
Например, на форме списка пользотваль хочет видеть данные за текущий год. Для этого я добавил на форму поле со списком “Год” (Имя элемента управления P_GOD). В нем выводятся года, за которые есть данные в обратном порядке. А при открытии формы вызвал специальную фукнцию:
Call CM_ListSelectFirst( Me.P_GOD_FLT ) '-- мега функция '-- увы при программном изменении значения поля события не происходят, '-- то придется еще вызвать фукнцию соотвествующую фукнцию Call SetFilter()
А вот код той самой функции CM_ListSelectFirst():
Public Sub CM_ListSelectFirst(ByRef ctl As Control)
' Скоков С.А. 2009-02-25
' Выбрать первое значение в поле со списком или списке
With ctl
If Not (.ControlType = acListBox Or .ControlType = acComboBox) Then
Exit Sub
End If
If .ListCount > 0 Then
.Value = Nz(.ItemData(0))
End If
End With
End Sub
P.S. Эта же функция будет работать для списков
.
До встречи!
(с) Скоков Сергей