<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" media="screen" href="/~d/styles/rss2russianfull.xsl"?><?xml-stylesheet type="text/css" media="screen" href="http://feeds.feedburner.com/~d/styles/itemcontent.css"?><rss 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/" xmlns:creativeCommons="http://backend.userland.com/creativeCommonsRssModule" xmlns:feedburner="http://rssnamespace.org/feedburner/ext/1.0" version="2.0">

<channel>
	<title>5 строк кода</title>
	
	<link>http://5codelines.net</link>
	<description>Как писать комерческие приложения на MS Access</description>
	<lastBuildDate>Tue, 31 Aug 2010 19:18:58 +0000</lastBuildDate>
	<generator>http://wordpress.org/?v=2.9.2</generator>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
			<atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="self" type="application/rss+xml" href="http://feeds.feedburner.com/5codelines" /><feedburner:info uri="5codelines" /><atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="hub" href="http://pubsubhubbub.appspot.com/" /><creativeCommons:license>http://creativecommons.org/licenses/by-nd/2.0/</creativeCommons:license><feedburner:emailServiceId>5codelines</feedburner:emailServiceId><feedburner:feedburnerHostname>http://feedburner.google.com</feedburner:feedburnerHostname><feedburner:feedFlare href="http://add.my.yahoo.com/rss?url=http%3A%2F%2Ffeeds.feedburner.com%2F5codelines" src="http://us.i1.yimg.com/us.yimg.com/i/us/my/addtomyyahoo4.gif">Subscribe with My Yahoo!</feedburner:feedFlare><feedburner:feedFlare href="http://www.newsgator.com/ngs/subscriber/subext.aspx?url=http%3A%2F%2Ffeeds.feedburner.com%2F5codelines" src="http://www.newsgator.com/images/ngsub1.gif">Subscribe with NewsGator</feedburner:feedFlare><feedburner:feedFlare href="http://feeds.my.aol.com/add.jsp?url=http%3A%2F%2Ffeeds.feedburner.com%2F5codelines" src="http://o.aolcdn.com/favorites.my.aol.com/webmaster/ffclient/webroot/locale/en-US/images/myAOLButtonSmall.gif">Subscribe with My AOL</feedburner:feedFlare><feedburner:feedFlare href="http://www.bloglines.com/sub/http://feeds.feedburner.com/5codelines" src="http://www.bloglines.com/images/sub_modern11.gif">Subscribe with Bloglines</feedburner:feedFlare><feedburner:feedFlare href="http://www.netvibes.com/subscribe.php?url=http%3A%2F%2Ffeeds.feedburner.com%2F5codelines" src="http://www.netvibes.com/img/add2netvibes.gif">Subscribe with Netvibes</feedburner:feedFlare><feedburner:feedFlare href="http://fusion.google.com/add?feedurl=http%3A%2F%2Ffeeds.feedburner.com%2F5codelines" src="http://buttons.googlesyndication.com/fusion/add.gif">Subscribe with Google</feedburner:feedFlare><feedburner:feedFlare href="http://www.pageflakes.com/subscribe.aspx?url=http%3A%2F%2Ffeeds.feedburner.com%2F5codelines" src="http://www.pageflakes.com/ImageFile.ashx?instanceId=Static_4&amp;fileName=ATP_blu_91x17.gif">Subscribe with Pageflakes</feedburner:feedFlare><feedburner:feedFlare href="http://lenta.yandex.ru/settings.xml?name=feed&amp;url=http%3A%2F%2Ffeeds.feedburner.com%2F5codelines" src="http://lenta.yandex.ru/i/addfeed.gif">?????? ? ??????.?????</feedburner:feedFlare><item>
		<title>Как программно создать ODBC DSN</title>
		<link>http://feedproxy.google.com/~r/5codelines/~3/HKSKu5RQjOM/</link>
		<comments>http://5codelines.net/kak-programmno-sozdat-odbc-dsn/#comments</comments>
		<pubDate>Tue, 31 Aug 2010 19:17:04 +0000</pubDate>
		<dc:creator>Сергей Скоков</dc:creator>
				<category><![CDATA[mc_dns]]></category>

		<guid isPermaLink="false">http://5codelines.net/?p=246</guid>
		<description><![CDATA[Настал такой момент, когда нужно обратиться к кому-нибудь серверу БД. MS Access предоставляет возможность создавать связанные ODBC таблицы (настоятельно рекомендую отказаться от их исопльзования) и запросы к серверу.
При использования запросов к серверу в качестве строки подключения предлогается указать имя DSN. Помимо имени DSN мастер вставляет дополнительные параметры, например, имя пользователя и пароль. Это очень плохо. [...]]]></description>
			<content:encoded><![CDATA[<p>Настал такой момент, когда нужно обратиться к кому-нибудь серверу БД. MS Access предоставляет возможность создавать связанные ODBC таблицы (настоятельно рекомендую отказаться от их исопльзования) и запросы к серверу.</p>
<p>При использования запросов к серверу в качестве строки подключения предлогается указать имя DSN. Помимо имени DSN мастер вставляет дополнительные параметры, например, имя пользователя и пароль. Это очень плохо. И даже при этом ODBC подклчюение должно быть создано.</p>
<p>Я при использовании запросов к серверу в строку подключения писал только имя DSN, т.е. строка подключения выглядит следующим образом:<br />
<code>DSN=DEV_SERVER;</code></p>
<p>Что-бы избавить себя от необходимости помнить о необходимости создавать ODBC DSN написана библиотечная функция <em>CM_CreateDSN()</em>. Эта фукнция живет у меня в библиотечном модуле mc_dns. Параметры для подклчюения выбираются из настроек приложения при помощи функции <em>CM_Param_Get()</em>.</p>
<p>Как правило функция <em>CM_CreateDSN()</em> выполняется каждый раз при старте. Это гарантирует, что дальше при работе приложения мы сможем получить доступ к данным.</p>
<p>Стоит отдельно обратить внимание на параметр настроек <em>CnnOptionsOther</em>. Именно тут задаются специфические параметры для подключения к серверу. В качестве параметра функции я его не выносил, т.к. необходимости не было. Как оказалось наиболее используемыми параметрыми оказались <em>imUser </em>и <em>stPWD</em>.</p>
<p>Также я думаю будут полезны пара сайтов, на которых можно найти примеры строк полключения к разным серверам:</p>
<ol>
<li><a href="http://www.connectionstrings.com">http://www.connectionstrings.com</a> &#8211; лучший на мой взгляд.
<li><a href="http://www.codeproject.com/KB/database/connectionstrings.aspx">ADO Connection Strings</a></li>
<li><a href="http://www.codemaker.co.uk/it/tips/ado_conn.htm">ADO Connection String Samples</a></li>
</ol>
<p>А вот собственно сама функция <em>CM_CreateDSN()</em>:</p>
<pre name="code" class="vb">
Public Function CM_CreateDSN(Optional imDSN As String = "" _
                        , Optional imDriver As String = "" _
                        , Optional imDB As String = "" _
                        , Optional imServer As String = "" _
                        , Optional imUser As String = "" _
                        , Optional stPWD As String = "") As Boolean
' Скоков С.А. 2006-05-15
' изменена 2006-09-07 Скоков С.А.
' Создание DSN для подключения к базе данных
On Error GoTo Err_

    Dim stCnnOptionsOther As String
    Dim stAttributes As String

    '-- читаем из настройки, если параметр не передан
    If imDSN = "" Then imDSN = CM_Param_Get("DSN")
    If imDriver = "" Then imDriver = CM_Param_Get("Driver")
    If imDB = "" Then imDB = CM_Param_Get("DB")
    If imServer = "" Then imServer = CM_Param_Get("Server")
    If imUser = "" Then imUser = CM_Param_Get("User")
    If stPWD = "" Then stPWD = CM_Param_Get("PWD")
    stCnnOptionsOther = CM_Param_Get("CnnOptionsOther")

    '-- формирование дополнительных атрибутов
    If imDB <> "" Then stAttributes = stAttributes &#038; "Database=" &#038; imDB &#038; ";"
    If imServer <> "" Then stAttributes = stAttributes &#038; "Server=" &#038; imServer &#038; ";"
    If imUser <> "" Then stAttributes = stAttributes &#038; "User=" &#038; imUser &#038; ";"
    If stPWD <> "" Then stAttributes = stAttributes &#038; "Password=" &#038; stPWD &#038; ";"
    If stCnnOptionsOther <> "" Then stAttributes = stAttributes &#038; stCnnOptionsOther

    RegisterDatabase imDSN, imDriver, True, stAttributes

    CM_CreateDSN = True
Exit_:
    Exit Function
Err_:
    Err.Raise Err.Number, "CM_CreateDSN()->" &#038; Err.Source, Err.Description, Err.HelpFile, Err.HelpContext
End Function
</pre>
<img src="http://feeds.feedburner.com/~r/5codelines/~4/HKSKu5RQjOM" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://5codelines.net/kak-programmno-sozdat-odbc-dsn/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		<feedburner:origLink>http://5codelines.net/kak-programmno-sozdat-odbc-dsn/</feedburner:origLink></item>
		<item>
		<title>Как отключить скролинг записей формы</title>
		<link>http://feedproxy.google.com/~r/5codelines/~3/1SuHvV9Ld7s/</link>
		<comments>http://5codelines.net/mouse-wheel/#comments</comments>
		<pubDate>Mon, 23 Aug 2010 20:45:57 +0000</pubDate>
		<dc:creator>Сергей Скоков</dc:creator>
				<category><![CDATA[решения]]></category>

		<guid isPermaLink="false">http://5codelines.net/?p=179</guid>
		<description><![CDATA[ Для некоторых пользователей колесико мышки является проблемой. Так как они как правило не смотрят на экран, когда меняют что-либо. Нечаянно крутанулось колесико и поменяли не ту запись.
MS Access 2003 поддерживает событие MouseWheel, но, увы, не позволяет отменить это. Даже DoCmd.CancelEvent не помогает.
Private Sub Form_MouseWheel(ByVal Page As Boolean, ByVal Count As Long)
    [...]]]></description>
			<content:encoded><![CDATA[<p><a href="http://5codelines.net/wp-content/uploads/Mouse.jpg"><img class="alignleft size-full wp-image-217" title="Mouse" src="http://5codelines.net/wp-content/uploads/Mouse.jpg" alt="Mouse" width="156" height="120" /></a> Для некоторых пользователей колесико мышки является проблемой. Так как они как правило не смотрят на экран, когда меняют что-либо. Нечаянно крутанулось колесико и поменяли не ту запись.</p>
<p>MS Access 2003 поддерживает событие MouseWheel, но, увы, не позволяет отменить это. Даже <span style="color: #ff0000;">DoCmd.CancelEvent</span> не помогает.</p>
<pre name="code" class="vb">Private Sub Form_MouseWheel(ByVal Page As Boolean, ByVal Count As Long)
    DoCmd.CancelEvent '-- не работает
End Sub</pre>
<p>Одно из решений это хук событий формы описанный на сайте microsoft (<a href="http://support.microsoft.com/kb/278379">How to Detect and Prevent the Mouse Wheel from Scrolling Through Records in a Form</a>). И тут не обошлось без недостатков. Если не использовать внешней dll, то периодически форма тормозит, т.к. все события проваливаются через медленный VBA. Возможно, если вынести данный код в dll, то будет работать на порядок быстрее. Мне не захотелось возится с отдельной dll, т.к. я нашел метод попроще (об этом ниже). Пока я исследовал пример, немного расширил его. Результат трудов можно скачать <a href="wp-content/uploads/mouse_wheel_sampe/mouse_wheel_sampe.rar ">тут</a>, вдруг кому понадобится.</p>
<p>Более простым решением на мой взгляд является фильтр по ключевому полю. При этом нужно отключить добавление записей. У этой идеи тоже есть недостатки:</p>
<ul>
<li>
для ленточных форм, естественно, это не работает.</li>
<li>
нужно реализовывать добавление записи, а потом уже открывать ее на редактирование.</li>
</ul>
<p>Какой вариант выбрать зависит от ситуации. Я же стараюсь свести дизайн программы ко второму варианту. Уж больно он мне по душе.</p>
<p>До встречи!</p>
<p>(с) Скоков Сергей</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>
<img src="http://feeds.feedburner.com/~r/5codelines/~4/1SuHvV9Ld7s" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://5codelines.net/mouse-wheel/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		<feedburner:origLink>http://5codelines.net/mouse-wheel/</feedburner:origLink></item>
		<item>
		<title>Метод MoveFirst</title>
		<link>http://feedproxy.google.com/~r/5codelines/~3/JMq-XeHXsl8/</link>
		<comments>http://5codelines.net/metod-movefirst/#comments</comments>
		<pubDate>Mon, 26 Apr 2010 20:57:58 +0000</pubDate>
		<dc:creator>Сергей Скоков</dc:creator>
				<category><![CDATA[между делом]]></category>

		<guid isPermaLink="false">http://5codelines.net/?p=207</guid>
		<description><![CDATA[Я очень часто замечаю, что многие программисты (как опытные так и новички ) при работе c Recordset библиотеки DAO или ADO, перед началом работы с данными вызывают метод MoveFirst. Это похоже на параною.
Тогда код выглядит примерно, так:

    Dim rst As DAO.Recordset

    Set rst = CurrentDb.OpenRecordset("tbl1", dbOpenDynaset)

    [...]]]></description>
			<content:encoded><![CDATA[<p>Я очень часто замечаю, что многие программисты (как опытные так и новички ) при работе c Recordset библиотеки DAO или ADO, перед началом работы с данными вызывают метод <code>MoveFirst</code>. Это похоже на параною.</p>
<p>Тогда код выглядит примерно, так:</p>
<pre name="code" class="vb">
    Dim rst As DAO.Recordset

    Set rst = CurrentDb.OpenRecordset("tbl1", dbOpenDynaset)

    If Not rst.BOF Then
        rst.MoveFirst
    End If

    Do While Not rst.EOF
        '-- ...
        rst.MoveNext
    Loop

    rst.Close
</pre>
<p>Смысл этого действа мне не понятен. В документации четко написано:</p>
<blockquote><p>When you open a Recordset, the first record is current and the BOF property is False. If the Recordset contains no records, the BOF property is True, and there is no current record.</p></blockquote>
<p>Что вкратце означает, если Recordset содержит данные, то текущей записью будет первая запись. Смело избавляйтесь от бесмысленного ифа.</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>
<img src="http://feeds.feedburner.com/~r/5codelines/~4/JMq-XeHXsl8" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://5codelines.net/metod-movefirst/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		<feedburner:origLink>http://5codelines.net/metod-movefirst/</feedburner:origLink></item>
		<item>
		<title>Как из номера квартала получить дату или период для поиска</title>
		<link>http://feedproxy.google.com/~r/5codelines/~3/4I-j7IbqRIs/</link>
		<comments>http://5codelines.net/kvartal-v-datu/#comments</comments>
		<pubDate>Thu, 25 Mar 2010 13:23:10 +0000</pubDate>
		<dc:creator>Сергей Скоков</dc:creator>
				<category><![CDATA[решения]]></category>

		<guid isPermaLink="false">http://5codelines.net/?p=192</guid>
		<description><![CDATA[
Недавно на моем любимом форуме проскакивал одноименный ответ. Сперва я сам как-то задумался, а как же. Но как оказалось задача &#8220;По номерам недель получить временной промежуток для фильтра по датам&#8221; оказалось проще простого. Для этого я воспользовался любимым методом &#8220;Разделяй и властвуй&#8221;.
И так, задача разбилась на три части:
1. Функция, которая вернет дату начала недели по [...]]]></description>
			<content:encoded><![CDATA[<p><img src="http://5codelines.net/wp-content/uploads/calendar.PNG" alt="calendar" title="calendar" width="116" height="138" class="alignnone size-full wp-image-199" /></p>
<p>Недавно на моем любимом форуме проскакивал одноименный ответ. Сперва я сам как-то задумался, а как же. Но как оказалось задача &#8220;По номерам недель получить временной промежуток для фильтра по датам&#8221; оказалось проще простого. Для этого я воспользовался любимым методом &#8220;Разделяй и властвуй&#8221;.</p>
<p>И так, задача разбилась на три части:<br />
1. Функция, которая вернет дату начала недели по номеру недели и году.</p>
<pre name="code" class="vb">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 &gt; 1 And nWeek &gt; 1 Then
      dtResult = DateAdd("d", -1 * (7 - Weekday(dt1Jan, vbMonday) + 2), dtResult)
    End If

    GetDateOfStartWeek = dtResult
End Function
</pre>
<p>2. Функция, которая вернет дату окончания недели по номеру недели и году.</p>
<pre name="code" class="vb">Public Function GetDateOfEndWeek(ByVal nWeek As Byte, ByVal nYear As Integer) As Date
    GetDateOfEndWeek = DateAdd("d", 7 - 1, GetDateOfStartWeek(nWeek, nYear))
End Function
</pre>
<p>3. Фнункция, которая вернет условие за период по датам:</p>
<pre name="code" class="vb">public frunction GetWherePeriod(ByVal imFld as string, ByVal dtFrom as Date, ByVal dtTo as Date) as String
   GetWherePeriod = BuildCriteria(imFld, dbDate, "Between " &amp; dtFrom &amp; " And " &amp; dtTo &amp; "")
End Public

'-- Проверка
Debug.Print GetWherePeriod(GetDateOfStartWeek(1, 2010), GetDateOfEndWeek(1, 2010))
</pre>
<p>Как-то уж очень просто получилось&#8230; Функцию GetDateOfStartWeek() я активно не тестировал, проверял только для января за 2010 и 2007 года. Если будут ошибки, пишите.</p>
<p>До встречи!</p>
<p>(с) Скоков Сергей</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>.</pre>
</pre>
</pre>
</pre>
</pre>
</pre>
<img src="http://feeds.feedburner.com/~r/5codelines/~4/4I-j7IbqRIs" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://5codelines.net/kvartal-v-datu/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		<feedburner:origLink>http://5codelines.net/kvartal-v-datu/</feedburner:origLink></item>
		<item>
		<title>Как получить значение поля таблицы</title>
		<link>http://feedproxy.google.com/~r/5codelines/~3/gUvvqLmszLo/</link>
		<comments>http://5codelines.net/kak-poluchit-znachenie-polya-tablicy/#comments</comments>
		<pubDate>Mon, 12 Oct 2009 14:23:29 +0000</pubDate>
		<dc:creator>Сергей Скоков</dc:creator>
				<category><![CDATA[решения]]></category>

		<guid isPermaLink="false">http://5codelines.net/?p=172</guid>
		<description><![CDATA[
Очень часто новички сталкиваются с задачей прочитать значение из поля таблицы. Например, они знают о существовании библиотек DAO или ADO и пишут свою функцию для вычисления этой операции (или не пишут, а идут на форумы спрашивать  ). Но ведь есть встроенные. Знакомьтесь:

DLookUp
DFirst
DLast
DCount
DMax
DMin

У всех этих функций одинаковые параметры: имя поля или выражение, таблица, условие отбора. [...]]]></description>
			<content:encoded><![CDATA[<p><img class="alignnone size-full wp-image-187" title="Таблица" src="http://5codelines.net/wp-content/uploads/2009/10/table.PNG" alt="Таблица" width="118" height="157" /></p>
<p>Очень часто новички сталкиваются с задачей прочитать значение из поля таблицы. Например, они знают о существовании библиотек <a href="http://ru.wikipedia.org/wiki/Data_Access_Objects">DAO</a> или <a href="http://ru.wikipedia.org/wiki/ADO">ADO</a> и пишут свою функцию для вычисления этой операции (или не пишут, а идут на форумы спрашивать <img src='http://5codelines.net/wp-includes/images/smilies/icon_smile.gif' alt=':-)' class='wp-smiley' /> ). Но ведь есть встроенные. Знакомьтесь:</p>
<ul>
<li>DLookUp</li>
<li>DFirst</li>
<li>DLast</li>
<li>DCount</li>
<li>DMax</li>
<li>DMin</li>
</ul>
<p>У всех этих функций одинаковые параметры: имя поля или выражение, таблица, условие отбора. Возвращать они могут Null (кроме DCount), по этому использование nz() не будет лишним.</p>
<p>И напоследок пара примеров использования:</p>
<pre name="code" class="vb">Public Sub test()
    Dim stKlient As String
    Dim lK_KLIENT As Long
    Dim count As Long

    lK_KLIENT = 123

    stKlient = Nz(DLookup("T_KLIENT", "b_klient", "K_KLIENT = " &amp; lK_KLIENT))
    count = DCount("*", "b_klient", "T_KLIENT LIke '" &amp; Left(stKlient, 3) &amp; "*'")
End Sub</pre>
<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>
<img src="http://feeds.feedburner.com/~r/5codelines/~4/gUvvqLmszLo" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://5codelines.net/kak-poluchit-znachenie-polya-tablicy/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		<feedburner:origLink>http://5codelines.net/kak-poluchit-znachenie-polya-tablicy/</feedburner:origLink></item>
		<item>
		<title>Сказка</title>
		<link>http://feedproxy.google.com/~r/5codelines/~3/55LjNhMBa0M/</link>
		<comments>http://5codelines.net/skazka/#comments</comments>
		<pubDate>Mon, 06 Jul 2009 09:07:31 +0000</pubDate>
		<dc:creator>Сергей Скоков</dc:creator>
				<category><![CDATA[шучу]]></category>

		<guid isPermaLink="false">http://5codelines.net/?p=175</guid>
		<description><![CDATA[&#8220;Жил был царь Репозиторий. И было у него три сына: старший &#8211; Транк, средний &#8211; Тэг и средний &#8211; Бранч.&#8221;
(с) Скоков Сергей
]]></description>
			<content:encoded><![CDATA[<p>&#8220;Жил был царь Репозиторий. И было у него три сына: старший &#8211; Транк, средний &#8211; Тэг и средний &#8211; Бранч.&#8221;</p>
<p align="right">(с) Скоков Сергей</p>
<img src="http://feeds.feedburner.com/~r/5codelines/~4/55LjNhMBa0M" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://5codelines.net/skazka/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		<feedburner:origLink>http://5codelines.net/skazka/</feedburner:origLink></item>
		<item>
		<title>Как создать меню в MS Access</title>
		<link>http://feedproxy.google.com/~r/5codelines/~3/2Ja4cJYOsss/</link>
		<comments>http://5codelines.net/kak-sozdat-menyu-v-ms-access/#comments</comments>
		<pubDate>Tue, 02 Jun 2009 13:07:22 +0000</pubDate>
		<dc:creator>Сергей Скоков</dc:creator>
				<category><![CDATA[решения]]></category>

		<guid isPermaLink="false">http://5codelines.net/?p=158</guid>
		<description><![CDATA[Всем привет!
Как оказалось очень полезно смотреть ключевые слова, по которым пользователи переходят на мой сайт. В них можно найти новые тему. Например, как эту. Оказывается, у некоторых это вызывает трудности.
Как создать меню
В прошлой статье про меню я забыл дорасказать, как же все же добавляеть новые пункты меню в строку меню. По-этом рекомендую сперва ознакомится с [...]]]></description>
			<content:encoded><![CDATA[<p>Всем привет!</p>
<p>Как оказалось очень полезно смотреть ключевые слова, по которым пользователи переходят на мой сайт. В них можно найти новые тему. Например, как эту. Оказывается, у некоторых это вызывает трудности.</p>
<p><strong>Как создать меню</strong><br />
В <a href="http://5codelines.net/3menu/">прошлой статье про меню</a> я забыл дорасказать, как же все же добавляеть новые пункты меню в строку меню. По-этом рекомендую сперва ознакомится с прошлым постом и пеерходить к чтению этого.</p>
<p><strong>Как создать пункты меню</strong><br />
<img src="http://5codelines.net/wp-content/uploads/kak-sozdat-menyu-v-ms-access/1_3.png" alt="Настройка меню" /></p>
<p>Чтобы сюда попасть можно выбрать пункт меню MS Access &#8220;Сервис &#8211; Настройка&#8221; или кликнуть в пустом месте меню и в контестном меню выбрать пункт &#8220;Настройка&#8221;.</p>
<p><img src="http://5codelines.net/wp-content/uploads/kak-sozdat-menyu-v-ms-access/2.png" alt="Настройка меню" /></p>
<p>Теперь все внимание на вкладку &#8220;Команды&#8221; нового окошка.</p>
<p>В категории &#8220;Файл&#8221; вы найдете пункт меню &#8220;Специальная&#8221;. Это рабочая лошадка меню. На самом деле это кнопка.</p>
<p><img src="http://5codelines.net/wp-content/uploads/kak-sozdat-menyu-v-ms-access/1_3.png" alt="Пункты меню" /></p>
<p>В категории &#8220;Новое меню&#8221; найдете выпадающее меню &#8220;Новое меню&#8221;. На самом деле это поле с выпадающим списком.</p>
<p>Еще в категории &#8220;Все формы&#8221; и т.п. вы найдете соостветственно готовые пункты меню. У них есть свои особенности. Об этом ниже.</p>
<p>Это все &#8220;многообразие&#8221; элементов можно при помощи перетаскивания перенести на свою строку меню или панель инструментов (я надеюсь вы прочитали предыдущую статью и знаете как это делать).</p>
<p><img src="http://5codelines.net/wp-content/uploads/kak-sozdat-menyu-v-ms-access/4.png" alt="Панель еню" /></p>
<p><strong>Как выполнить действие</strong><br />
Тут самое интересное. <span style="text-decoration: underline;">Только не закрывайте чудесное окошко &#8220;Настройка&#8221;.</span> Кликните правой кнопочкой мыши на любом пункте меню (не список!) и в контекстном меню выберете пункт &#8220;Свойства&#8221;. У вас откроется следующее окошко:</p>
<p><img src="http://5codelines.net/wp-content/uploads/kak-sozdat-menyu-v-ms-access/5.png" alt="Свойства пункта меню" /></p>
<p>Все поля содержат описание и понятны. При помощи этого пункта меню можно вызвать любую функцию из модуля, написав так <code>=MyFunction()</code>. Чаще всего я использую именно этот способ, т.к. частенько формы открываются с какими-то параметрами.</p>
<p><strong>Особенности открытия форм</strong><br />
А теперь давайте таким же образом откроем пункт меню, созданный перетаскиванием пункта из группы &#8220;Все формы&#8221;, например.</p>
<p><img src="http://5codelines.net/wp-content/uploads/kak-sozdat-menyu-v-ms-access/6.png" alt="Свойства пункта меню" /></p>
<p>В свойстве &#8220;Параметр&#8221; вы обнаружите имя формы. Так вот, если прописать это же имя в пункте меню из группы &#8220;File&#8221;, то форма не откроется. Вот такой чудесный нюанс.</p>
<p>В следующий раз опишу о программном создании и управлении меню.</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>
<img src="http://feeds.feedburner.com/~r/5codelines/~4/2Ja4cJYOsss" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://5codelines.net/kak-sozdat-menyu-v-ms-access/feed/</wfw:commentRss>
		<slash:comments>4</slash:comments>
		<feedburner:origLink>http://5codelines.net/kak-sozdat-menyu-v-ms-access/</feedburner:origLink></item>
		<item>
		<title>Недостатки DoCmd.GoToRecord и достоинства CodeContextObject</title>
		<link>http://feedproxy.google.com/~r/5codelines/~3/ngfVmprChdQ/</link>
		<comments>http://5codelines.net/gotolastrecord/#comments</comments>
		<pubDate>Wed, 27 May 2009 13:35:37 +0000</pubDate>
		<dc:creator>Сергей Скоков</dc:creator>
				<category><![CDATA[архитектура]]></category>
		<category><![CDATA[решения]]></category>

		<guid isPermaLink="false">http://5codelines.net/?p=149</guid>
		<description><![CDATA[Пара камней в огород DoCmd
Как-то мне понадобилось перейти к последней записи в подчиненной форме. Перейти к последней записи можно разными способами, простейший &#8211; это вот эта команда: DoCmd.GoToRecord , , acLast. Вот с подчиненненными формами есть нюанс &#8211; нужно вызывать ее в обработчике события или методе подчиненной формы. В моем случае события не подходили, метод [...]]]></description>
			<content:encoded><![CDATA[<p><strong>Пара камней в огород DoCmd</strong><br />
Как-то мне понадобилось перейти к последней записи в подчиненной форме. Перейти к последней записи можно разными способами, простейший &#8211; это вот эта команда: <code>DoCmd.GoToRecord , , acLast</code>. Вот с подчиненненными формами есть нюанс &#8211; нужно вызывать ее в обработчике события или методе подчиненной формы. В моем случае события не подходили, метод было реализовывать влом и очень хотелось реализовать это на главной форме.</p>
<p>Поэтому пришлось написать свою функцию. Благодаря тому, что функция принимает ссылку на форму, а не имя, то можно ее использовать для любой формы, подчиненной, созданной при помощи DoCmd.OpenForm или оператора New.</p>
<pre name="code" class="vb">
Public Sub CM_FormGoToLastRecord(Optional ByRef frm As Form = Nothing)
' перейти на последнюю запись
' frm можно не передавать, в этом случае она будет получена при помощи CodeContextObject
On Error GoTo Err_

    If frm Is Nothing Then
        Set frm = CodeContextObject
    End If

    If frm Is Nothing Then Exit Sub

    Dim rst As DAO.Recordset

    Set rst = frm.RecordsetClone
    If Not rst.EOF Then rst.MoveLast
    frm.Bookmark = rst.Bookmark

Exit_:
    Exit Sub
Err_:
    mc_Log.MC_LogErr ("CM_FormGoToLastRecord()")
    Resume Exit_:
End Sub
</pre>
<p><code>mc_Log.MC_LogErr ("FormGoToLastRecord()") </code>- фукнция, которая логирует ошибку в текстовом файле. О ведении лога я как-нибудь расскажу попозже.</p>
<p><strong>CodeContextObject</strong><br />
В процедуре <code>CM_FormGoToLastRecord()</code> используется такая штука, как <code>CodeContextObject</code>, которое в справке называют свойством. Это свойство позволяет получить ссылку на объект, в рамках которого выполняется данный код. Если вызвать процедуру <code>CM_FormGoToLastRecord()</code> в событии подчиненной формы, то <code>CodeContextObject</code> выдаст ссылку на подчиненную форму. Этот же способ использует DoCmd.GoToRecord, когда не указывается имя объекта.</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>
<img src="http://feeds.feedburner.com/~r/5codelines/~4/ngfVmprChdQ" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://5codelines.net/gotolastrecord/feed/</wfw:commentRss>
		<slash:comments>10</slash:comments>
		<feedburner:origLink>http://5codelines.net/gotolastrecord/</feedburner:origLink></item>
		<item>
		<title>Как получить доступ к свойствам диаграммы и других ActiveX объектов</title>
		<link>http://feedproxy.google.com/~r/5codelines/~3/MyqPJyl4yHY/</link>
		<comments>http://5codelines.net/activex1/#comments</comments>
		<pubDate>Tue, 05 May 2009 22:45:02 +0000</pubDate>
		<dc:creator>Сергей Скоков</dc:creator>
				<category><![CDATA[решения]]></category>

		<guid isPermaLink="false">http://5codelines.net/?p=140</guid>
		<description><![CDATA[MS Access поддерживает технологию ActiveX. Но те возможности, которые предоставляет стандартный элемент управления OLE объектами весьма скудны. А иногда бывает необходимо управлять скрытыми свойствами ActiveX объекта. Как же добраться до свойств объектов ActiveX?
Рассмотрим эту задачку на примере диаграмм.
На форму (или отчет) вставим диаграмму с именем “OLE_PRODAZHA_CHART” и изменим название диаграммы программно.
Далее необходимо подключить библиотеку “Microsoft [...]]]></description>
			<content:encoded><![CDATA[<p>MS Access поддерживает технологию ActiveX. Но те возможности, которые предоставляет стандартный элемент управления OLE объектами весьма скудны. А иногда бывает необходимо управлять скрытыми свойствами ActiveX объекта. Как же добраться до свойств объектов ActiveX?</p>
<p><strong>Рассмотрим эту задачку на примере диаграмм.</strong><br />
На форму (или отчет) вставим диаграмму с именем “OLE_PRODAZHA_CHART” и изменим название диаграммы программно.<br />
Далее необходимо подключить библиотеку “Microsoft Graph X.0 Object Library”, чтобы тип “Chart” (диаграмма) стал доступен (ниже узнаете зачем он нужен). Увы для диаграмм Access почему-то не добавляет ссылку на библиотеку.<br />
Также добавим на форму кнопку с названием “Изменить название диаграммы”. В обработчике событий разместим следующий код:</p>
<pre name="code" class="vb">
Dim obj As Graph.Chart

Set obj = Me.OLE_PRODAZHA_CHART.Object
obj.ChartTitle.Text = "Мое название"
</pre>
<p>Весь фокус заключается в типе “Graph.Chart” и свойстве “Object” элемента управления. Свойство “Object” элемента управления возвращает ссылку на созданный объект. Библиотека “Microsoft Graph X.0 Object Library” в коде называется Graph и предоставляет класс типа Chart. Теперь можно пользоваться справкой и просмотреть все свойства и методы класса Graph.Chart.</p>
<p><strong>Как быть с другим ActiveX объектами?</strong><br />
После вставки ActiveX элемента на форму, Access сам добавить Reference на библиотеку типов. Найти библиотеку и тип ActiveX элемента можно найти в Object Browser (в редакторе кода можно нажать кнопку F2).<br />
Чтобы точно определить имя нужной библиотеки и типа ActiveX элемента, давайте посмотрим на свойства уже ранее созданной диаграммы. А именно “Класс” и “Класс OLE”.<br />
Для диаграммы свойства имеют значения:<br />
- Класс = MSGraph.Chart.8<br />
- Класс OLE = Microsoft Graph Chart<br />
“Класс OLE” содержит описание для пользователя. По этому имени можно найти библиотеку типов списке ссылок (Tools-&gt;References). “Класс” содежит имя класса, при помощи которого можно создать этот объект.</p>
<p>Возвращаясь к злосчастной диаграмме, в Object Browser имя библиотеки будет Graph, а имя класса Chart.</p>
<p>В <a href="http://www.5codelines.net/wp-content/uploads/ActiveX_1_sampe.rar">примере </a>вы также найдете ActiveX элемент TreeView, посмотрите код в модуле формы. Там добавлена обработка события, которого нет в списке событий в свойствах элемента управления.</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>
<img src="http://feeds.feedburner.com/~r/5codelines/~4/MyqPJyl4yHY" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://5codelines.net/activex1/feed/</wfw:commentRss>
		<slash:comments>4</slash:comments>
		<feedburner:origLink>http://5codelines.net/activex1/</feedburner:origLink></item>
		<item>
		<title>Как получить значение ключевого поля для добавленной записи</title>
		<link>http://feedproxy.google.com/~r/5codelines/~3/3BxvwYKcoh8/</link>
		<comments>http://5codelines.net/kak-poluchit-znachenie-klyuchevogo-polya-dlya-dobavlennoj-zapisi/#comments</comments>
		<pubDate>Thu, 02 Apr 2009 13:10:14 +0000</pubDate>
		<dc:creator>Сергей Скоков</dc:creator>
				<category><![CDATA[решения]]></category>

		<guid isPermaLink="false">http://5codelines.net/?p=130</guid>
		<description><![CDATA[Всем привет!
Как оказалось вопросы по этой теме все еще возникают. Рассказываю  . 
Значение ключевого поля новой записи при помощи библиотеки DAO можно получить следующим образом (K_KLIENT &#8211; ключевое поле):

Dim rst as DAO.Recordset
Dim lPk as Long

' ....
rst.AddNew
rst("T_KLIENT")="ОАО Рога и копыта"
' ...

А дальше есть несколько вариантов:
- 1-й вариант:

lPk = rst("K_KLIENT")
rst.Update

- 2-й вариант:

rst.Update
rst.Bookmark = rst.LastModified
lPk = rst("K_KLIENT")

1-й [...]]]></description>
			<content:encoded><![CDATA[<p>Всем привет!</p>
<p>Как оказалось вопросы по этой теме все еще возникают. Рассказываю <img src='http://5codelines.net/wp-includes/images/smilies/icon_smile.gif' alt=':-)' class='wp-smiley' /> . </p>
<p>Значение ключевого поля новой записи при помощи библиотеки DAO можно получить следующим образом (K_KLIENT &#8211; ключевое поле):</p>
<pre name="code" class="vb">
Dim rst as DAO.Recordset
Dim lPk as Long

' ....
rst.AddNew
rst("T_KLIENT")="ОАО Рога и копыта"
' ...
</pre>
<p>А дальше есть несколько вариантов:<br />
- 1-й вариант:</p>
<pre name="code" class="vb">
lPk = rst("K_KLIENT")
rst.Update
</pre>
<p>- 2-й вариант:</p>
<pre name="code" class="vb">
rst.Update
rst.Bookmark = rst.LastModified
lPk = rst("K_KLIENT")
</pre>
<p>1-й вариант работает только с таблицами MS Access, т.к. значение счетчика вычилсяется сразу же после AddNew. На всех остальных нужно проверять. Например, с ODBC таблицами 1-й вариант точно не прокатит, т.к. значение счетчика вычисляет сервер.</p>
<p>C библиотекой ADO получится только 1-й вариант.</p>
<pre name="code" class="vb">
Dim rst As ADODB.Recordset

Set rst = New ADODB.Recordset
rst.Open "tbl1", CurrentProject.Connection, adOpenKeyset, adLockOptimistic
rst.AddNew
MsgBox rst("key")
rst.Update
</pre>
<p>А с серверами БД придется что-то придумывать, например, использовать TimeStamp, чтобы найти только что добавленную запись.</p>
<p>До встречи!</p>
<p align="right">(с) Скоков Сергей</p>
<img src="http://feeds.feedburner.com/~r/5codelines/~4/3BxvwYKcoh8" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://5codelines.net/kak-poluchit-znachenie-klyuchevogo-polya-dlya-dobavlennoj-zapisi/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		<feedburner:origLink>http://5codelines.net/kak-poluchit-znachenie-klyuchevogo-polya-dlya-dobavlennoj-zapisi/</feedburner:origLink></item>
	</channel>
</rss>
