<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>5 строк кода &#187; сопровождение</title>
	<atom:link href="http://5codelines.net/category/maintenance/feed/" rel="self" type="application/rss+xml" />
	<link>http://5codelines.net</link>
	<description>Как писать комерческие приложения на MS Access</description>
	<lastBuildDate>Sat, 28 Jan 2012 21:20:45 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.3.1</generator>
		<item>
		<title>Стоит ли использовать временные таблицы для отчетов</title>
		<link>http://5codelines.net/stoit-li-ispolzovat-vremennye-tablicy-dlya-otchetov/?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=stoit-li-ispolzovat-vremennye-tablicy-dlya-otchetov</link>
		<comments>http://5codelines.net/stoit-li-ispolzovat-vremennye-tablicy-dlya-otchetov/#comments</comments>
		<pubDate>Sun, 22 Mar 2009 15:14:38 +0000</pubDate>
		<dc:creator>Сергей Скоков</dc:creator>
				<category><![CDATA[архитектура]]></category>
		<category><![CDATA[сопровождение]]></category>

		<guid isPermaLink="false">http://5codelines.net/?p=134</guid>
		<description><![CDATA[Стоит ли использовать временные таблицы для отчетов]]></description>
			<content:encoded><![CDATA[<p>Здравствуйте, уважаемые читатели.</p>
<p><img src="http://5codelines.net/wp-content/uploads/stoit-li-ispolzovat-vremennye-tablicy-dlya-otchetov/report.PNG" alt="Отчет" /></p>
<p>Сегодня <a href="http://forum.vingrad.ru/forum/topic-251975/anchor-entry1819420/0.html#">прочитал спорное мнение на форуме</a>, что использовать временные таблицы при формировании отчетов это кривое решение. С этим мнением я в корне не согласен.</p>
<p>Мои доводы ЗА:<br />
1. <em>Модульность.</em> Временные таблицы позволяют разделить между собой отчет и код расчета данных. В последующем это повышает сопровождаемость (см. п.3).</p>
<p>2. <em>Удобство отладки.</em> Если отчет перестал работать или работает как-то не правильно, то гораздо легче проверить расчет данных для него.</p>
<p>3. <em>Сопровождаемость.</em> В любой момент может возникнуть необходимость переделать либо расчет данных, либо переделать отчет, например, печатать его в word. Это все можно модифицировать по отдельности. Также пользователь может захотеть хранить рассчитанные данные, этого тоже будет просто добиться.</p>
<p>4. <em>Документирование</em>. Если разработчик укажет комментарии к полям для временной таблицы, то это можно считать документацией.</p>
<p>Мои доводы ПРОТИВ:<br />
1. <em>Увеличивается время разработки</em>. Это происходит в том случае, если для отчета можно использовать простой запрос в качестве источника данных. Если же расчет данных не вписывается в простейшие запросы, то будет проще и надежней реализовать расчет отчета в коде.</p>
<p>Больше против я не вспомнил. Выбор очевиден <img src='http://5codelines.net/wp-includes/images/smilies/icon_smile.gif' alt=':-)' class='wp-smiley' /> . Увлекаться данным способом естественно не стоит, каждой проблеме лучше подбирать свое решение. Этот метод подходит для отчетов со &#171;сложными&#187; расчетами данных.</p>
<p>До встречи!</p>
<p align="right">(с) Скоков Сергей</p>
<p>Подписаться на: <a href="http://feeds2.feedburner.com/5codelines">RSS</a> или <a href="http://5codelines.net/e-mail-rassylka/">e-mail рассылку</a> или <a href="http://www.livejournal.com/friends/add.bml?user=5codelines">добавить в ЖЖ друзья</a>.</p>
<div></div>]]></content:encoded>
			<wfw:commentRss>http://5codelines.net/stoit-li-ispolzovat-vremennye-tablicy-dlya-otchetov/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>События</title>
		<link>http://5codelines.net/events1/?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=events1</link>
		<comments>http://5codelines.net/events1/#comments</comments>
		<pubDate>Sun, 05 Oct 2008 17:09:21 +0000</pubDate>
		<dc:creator>Сергей Скоков</dc:creator>
				<category><![CDATA[архитектура]]></category>
		<category><![CDATA[решения]]></category>
		<category><![CDATA[сопровождение]]></category>

		<guid isPermaLink="false">http://5codelines.net/?p=11</guid>
		<description><![CDATA[Как использовать события в MS Access]]></description>
			<content:encoded><![CDATA[<p>Здравствуйте, уважаемые читатели.</p>
<p>Поговорим в этом выпуске об очень интересной штуке &#8212; события. Я очень мало где видел их использование в MS Access. Но они очень сильно облегчают жизнь при работе, особенно с формами. У событий есть маленькое ограничение. Их могут использовать только объекты. Это означает, что их можно объявлять и получать только в модулях пользовательских классов, формах и отчетах.</p>
<p>Чтобы объявить событие необходимо в начале модуля класса (формы, отчета или пользовательского) написать:<br />
<strong>Event ИмяСобытия( СписокАргументов )</strong></p>
<p>Для использовании события необходимо объявить в начале модуля ссылку на объект и в списке (левый список, который расположен в редакторе кода) выбрать обявленный атрибут, в правом списке можно выбрать событие, если их несколько. В результате получим следующее:<br />
<strong>Dim WithEvents Имя As Тип</strong></p>
<p>Вызвать событие можно так:<br />
<strong>RaiseEvent ИмяСобытия( Параметры )</strong></p>
<p>Где это можно применить? Рассмотрим пример из жизни. На форме заказа есть поле клиента. В этом поле отображается, допустим, УНН и название клиента. Рядом с полем кнопка. По нажатию на кнопке отображается еще одна форма &#8212; список клиентов. Задача &#8212; выбрать клиента.</p>
<p>Одним из решений будет открыть модальное окно и тут возникает куча разных вариантов: записать напрямую с формы списка клиентов в поле формы заказов (очень плохая идея!!!), скрыть форму при нажатии пользователем кнопки &#171;Ок&#187; (Выбрать) и т.д.</p>
<p>При помощи событий получается простое и элегантное решение. Всего-то объявить на форме списка клиентов событие:<br />
<strong>Event OnClientSelect(ByVal lId As Long)</strong></p>
<p>На форме заказа это событие обработать:</p>
<pre name="code" class="vb">
Dim WithEvents m_frmKlientSepis As Form_frmKlientSpis
'--

Private Sub Kn_KlientSelect_Click()
	'-- выбор клиента
	'-- можно и так
	'-- DoCmd.OpenForm "frmKlientSpis"
	'-- Set m_frmKlientSepis = Forms("frmKlientSpis")

	'-- но мне нравится этот вариант
	Set m_frmKlientSepis = New Form_frmKlientSpis
	m_frmKlientSepis.Visible = True
End Sub

Private Sub m_frmKlientSepis_OnClientSelect(ByVal lK_KLIENT As Long)
	'-- клиент выбран пользователем
	Me.K_KLIENT = lK_KLIENT
	Set m_frmKlientSepis = Nothing '-- уничтожаем форму
End Sub
</pre>
<p>Подробности можете увидеть в <a href="http://5codelines.net/wp-content/uploads/events_1_sampe.rar">примере</a>. Чуть позже я расмотрю еще один пример &#8212; связные списки.</p>
<p>До скорых встреч!</p>
<p align="right">(с) Скоков Сергей</p>
]]></content:encoded>
			<wfw:commentRss>http://5codelines.net/events1/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Повышение сопровождаемости. Часть 1. Формы.</title>
		<link>http://5codelines.net/povyshenie-soprovozhdaemosti-chast-1-formy/?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=povyshenie-soprovozhdaemosti-chast-1-formy</link>
		<comments>http://5codelines.net/povyshenie-soprovozhdaemosti-chast-1-formy/#comments</comments>
		<pubDate>Sun, 13 Jul 2008 22:45:41 +0000</pubDate>
		<dc:creator>Сергей Скоков</dc:creator>
				<category><![CDATA[сопровождение]]></category>

		<guid isPermaLink="false">http://5codelines.net/povyshenie-soprovozhdaemosti-chast-1-formy/</guid>
		<description><![CDATA[Лучший способ работы с формами]]></description>
			<content:encoded><![CDATA[<p>Здравствуйте, уважаемые подписчики.</p>
<p>В этом выпуске мы откроем очень важную тему сопровождаемость. Это то, что экономит время в последующем, когда изменения как правило нужно вносить быстро.</p>
<p>MS Access представляет из себя конструктор со встроенным языком программирования. Формы, отчеты, запросы и пр. никакого отношения к языку не имеют. Можно сказать, что они представляют из себя хранимые настройки классов Form, Report, QureyDef и п.р. При создании формы не обязательно создается модуль класса (далее класс), только если указать в свойстве «наличие модуля» да или создать обработчик события. В этом случае имя класса будет Form_&lt;имя формы&gt;. Это истинно и для отчетов.</p>
<p>К объектам MS Access (формы, отчеты, запросы, таблицы) обращаются по текстовому имени. В результате компилятор не проверяет правильность написания текстовых констант. В процессе жизни проект может пережить много модификаций: добавлений, удалений, переименований. После подобных изменений идет страшная череда тестирований и исправлений ошибок. Один из способов повышения сопровождаемости – это писать «компилируемый код». Да, смешно звучит. Т.е. переносить проверку кода с этапа выполнения на этап компиляции. Сейчас все поясню. Все что будет сказано про форму, в той или иной степени относится к отчетам.<br />
<span id="more-12"></span><br />
<strong>Обращение к элементам управления формы</strong><br />
Для начала рассмотрим взаимодействие с элементами управления на форме. Далее под словом поле буду понимать элемент управления. К полям на форме в модуле формы (он же модуль класса) можно обращаться следующими способами:<br />
1. Me![&lt;имя поля&gt;]<br />
2. Me(&#171;&lt;имя поля&gt;&#187;)<br />
3. Me.Controls(&#171;&lt;имя поля&gt;&#187;)<br />
4. Me.&lt;имя поля&gt;<br />
5. &lt;имя поля&gt;</p>
<p>Вопрос, какой из методов компилируем? Правильный ответ 4 и 5 (действителен только в пределах модуля формы), все остальные варианты содержат текстовую константу с именем поля. Теперь рассмотрим, как это работает. Мы создали форму, разместили на ней поля. Прошло некоторое время. Какие-то поля мы удалили, у каких-то изменили имя. Задача состоит в том, чтобы проверить код на этой форме, чтобы нигде не было ошибок. Можно это сделать «глазками». А можно открыть редактор кода, выбрать пункт Debug-&gt;Compile. По ошибкам можно быстро найти места с багами. Если мы будем использовать любой способ, кроме 4-го, то это нам не поможет. Придется убеждаться в правильности методом испытания формы в реальном бою – то есть проводить тестирование. Поверьте, скомпилировать дешевле по времени.</p>
<p><strong>Взаимодействие с полем формы</strong><br />
Усложним задачу – обратимся к полю извне формы. Перед этим рассмотрим варианты обращения к открытой форме:<br />
1. Forms(&#171;&lt;имя формы&gt;&#187;)<br />
2. Forms![&lt;имя формы&gt;]</p>
<p>Как видите эти методы не очень то и сопровождаемы, так как ссылку на открытую форму можно получить только по имени (Если форма открыта методом DoCmd.OpenForm). Можно постараться оптимизировать:</p>
<pre name="code" class="vb">
Dim frm as Form  

DoCmd.OpenForm "f_doc"
'-- тут такие параноики как я могут проверить, отрылась ли форма
Set frm = Forms("f_doc")
frm. &lt;имя поля&gt; = 123
</pre>
<p>Вместо абстрактной формы &lt;имя формы&gt; появилась форма f_doc. Она же и будет использоваться далее.</p>
<p>И в этом случае поле будет определяться компилятором на этапе выполнения. Потому что класс Form не содержит этого поля. Чтобы это произошло на этапе компиляции необходимо по другому определить переменную frm:</p>
<pre name="code" class="vb">Dim frm as Form_f_doc  

DoCmd.OpenForm "f_doc"
Set frm = Forms("f_doc")
frm. &lt;имя поля&gt; = 123</pre>
<p>В результате компилятор знает тип формы, во время редактирования подскажет вам какие поля и методы пользователя есть на форме. Если мы решим изменить имя поля или метода, то скомпилировав, по ошибкам можно будет все найти и исправить.</p>
<p>Идем дальше. Обращаться на прямую к полям формы не очень рассудительно. Исходя из опыта сопровождения, гораздо дешевле реализовать соответствующую функцию обработки в модуле этой формы. В последующем модифицировать гораздо дешевле, чем рыться во многих частях программы.</p>
<p><strong>Открытие формы</strong><br />
Открытие формы на кнопку очень просто сделать при помощи мастера. Одинаковые кнопки на разных формах можно очень быстро наплодить. Но если мы хотим сэкономить в будущем, то придется немножко пописать руками.<br />
Открытие формы при помощи DoCmd.OpenForm не совсем надежно, т.к. имя формы не проверяется компилятором. Только во время выполнения получим сообщения об ошибке.<br />
Как можно свести ошибки в имени формы к минимуму? Константы!</p>
<pre name="code" class="vb">Const c_imFrmDoc as String = "f_doc"</pre>
<p>Теперь код превратиться в:</p>
<pre name="code" class="vb">
Dim frm as Form_f_doc  

DoCmd.OpenForm c_imFrmDoc
Set frm = Forms(c_imFrmDoc)
frm. &lt;имя поля&gt; = 123
</pre>
<p>Это еще не все. Если подобным образом нужно каждый раз открывать форму, то эти 4-е строчки кода придется дублировать каждый раз при открытии этой формы. Я очень популярные формы открываю при помощи специальных функций. Это гораздо удобнее, чем использование только констант. Например:</p>
<pre name="code" class="vb">
Fumction OpenFrmDoc() as Form_f_doc
On Error GoTo Err_
	DoCmd.OpenForm c_imFrmDoc
	Set OpenFrmDoc = Forms(c_imFrmDoc)
Exit_:
	Exit Function
Err_:
	Resume Exit_
End Function
</pre>
<p>Если я и ошибусь в имени формы, то это произойдет один раз. Изменить имя формы очень легко и просто. Если мне понадобится передавать дополнительные параметры для метода OpenForm, то их придется реализовать. Поменялся способ открытия формы – тоже не проблема.</p>
<p>Как еще можно открыть форму? Можно еще и так:</p>
<pre name="code" class="vb">
Dim frm as Form_f_doc  

Set frm = New Form_f_doc
'-- взаимодействие с формой
</pre>
<p>Стоит обратить внимание на 3 строчку. В ней создается новый объект указанного класса. Бонус этого метода в том, что позволяет наплодить множество экземпляров одной и той же формы. Но не позволит запустить форму в диалоговом режиме и не добавит ее в коллекцию Forms. Т.е. ссылку на форму необходимо сохранить в переменную и до тех пор пока будет хоть одна ссылка на это форму, она будет существовать.</p>
<p>Пример можно скачать <a href="http://5codelines.net/wp-content/uploads/code_1_sampe.rar">тут</a>. В примере попробуйте изменить имя формы f_doc на любое другое, а также имя ее поля P_Field. В примере специально все обработчики ошибок не содержат сообщений об ошибках.</p>
<p align="right">(с) Скоков Сергей</p>
]]></content:encoded>
			<wfw:commentRss>http://5codelines.net/povyshenie-soprovozhdaemosti-chast-1-formy/feed/</wfw:commentRss>
		<slash:comments>4</slash:comments>
		</item>
	</channel>
</rss>

