<?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>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.2</generator>
		<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>Как сделать табличный вид в отчете</title>
		<link>http://feedproxy.google.com/~r/5codelines/~3/7iTXz08B-Nw/</link>
		<comments>http://5codelines.net/kak-sdelat-tablichnyj-vid-v-otchete/#comments</comments>
		<pubDate>Sat, 28 Jan 2012 21:07:24 +0000</pubDate>
		<dc:creator>Сергей Скоков</dc:creator>
				<category><![CDATA[mc_report]]></category>
		<category><![CDATA[UI]]></category>
		<category><![CDATA[библиотека]]></category>
		<category><![CDATA[черновик]]></category>

		<guid isPermaLink="false">http://5codelines.net/?p=203</guid>
		<description><![CDATA[Если в строку разместить несколько полей, добавить в оформлении рамку, то получим таблицу, как Word или Excel. Весь кайф может поломать всего лишь одно поле, которое содержит много текста и нужно ставить &#171;Да&#187; свойству &#171;Расширение&#187;. В этом случае придется немного по программировать. Для начала уберем у полей рамку. Добавим одну линию в конце нашей записи [...]]]></description>
			<content:encoded><![CDATA[<p>Если в строку разместить несколько полей, добавить в оформлении рамку, то получим таблицу, как Word или Excel. Весь кайф может поломать всего лишь одно поле, которое содержит много текста и нужно ставить &#171;Да&#187; свойству &#171;Расширение&#187;.</p>
<p>В этом случае придется немного по программировать. Для начала уберем у полей рамку. Добавим одну линию в конце нашей записи &#8212; lineEndRow. Вертикальные линии будем рисовать самостоятельно методом Report.Line меду началом секции &#171;Область данных&#187; и линией lineEndRow. Функцию ниже нужно вызывать из события ОбластьДанных_Print.</p>
<p><span id="more-203"></span><br />
Вот реализация функции и живет она у меня в модуле mc_report:</p>
<pre name="code" class="vb">
Public Sub ReportPrintTable(ByRef lineEndRow As Line _
                            , Optional ByVal lColor As Long = 3355443)
' печать вертикальных линий
    Dim ctl As Control
    Dim sct As Section
    Dim lHeight As Long
    Dim rpt As Report

    Set rpt = lineEndRow.Parent

    Set sct = rpt.Section(acDetail)
    rpt.DrawWidth = 1

    lHeight = lineEndRow.Top
    For Each ctl In sct.Controls
        If ctl.ControlType = acTextBox Then
            rpt.Line (ctl.Left, ctl.Top)-Step(0, lHeight - 2), lColor
            rpt.Line (ctl.Left + ctl.Width, ctl.Top)-Step(0, lHeight - 2), lColor
        End If
    Next ctl
End Sub
</pre>
<p>Как это работает можно увидеть в <a href="http://5codelines.net/wp-content/uploads/kak-sdelat-tablichnyj-vid-v-otchete/mdb_sampe.rar ">примере</a>.</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/7iTXz08B-Nw" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://5codelines.net/kak-sdelat-tablichnyj-vid-v-otchete/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		<feedburner:origLink>http://5codelines.net/kak-sdelat-tablichnyj-vid-v-otchete/?utm_source=rss&amp;utm_medium=rss&amp;utm_campaign=kak-sdelat-tablichnyj-vid-v-otchete</feedburner:origLink></item>
		<item>
		<title>Как сменить стандартную иконку</title>
		<link>http://feedproxy.google.com/~r/5codelines/~3/bxP8hneeWug/</link>
		<comments>http://5codelines.net/kak-smenit-standartnuyu-ikonku/#comments</comments>
		<pubDate>Sat, 14 Jan 2012 20:15:11 +0000</pubDate>
		<dc:creator>Сергей Скоков</dc:creator>
				<category><![CDATA[mc_objects]]></category>
		<category><![CDATA[библиотека]]></category>
		<category><![CDATA[системные]]></category>

		<guid isPermaLink="false">http://5codelines.net/?p=403</guid>
		<description><![CDATA[Что бы поменять стандартную иконку MS Access на что-нибудь свое необходимо открыть окно параметры запуска приложения и указывать там путь к изображению. Заодно можно поменять его руками. Естественно этот параметр можно задавать программно см. имена и значения коллекции CurrentDb.Parametrs. Для изменения параметров из коллекций типа CurrentDb.Parametrs я написал функцию VC_PropertyChange(), которая располагается в модуле mc_objects. [...]]]></description>
			<content:encoded><![CDATA[<p>Что бы поменять стандартную иконку MS Access на что-нибудь свое необходимо открыть окно параметры запуска приложения и указывать там путь к изображению. Заодно можно поменять его руками. Естественно этот параметр можно задавать программно см. имена и значения коллекции CurrentDb.Parametrs. </p>
<p>Для изменения параметров из коллекций типа CurrentDb.Parametrs я написал функцию <code>VC_PropertyChange()</code>, которая располагается в модуле mc_objects.</p>
<pre name="code" class="vb">
Dim stAppTitle as String
dim stPathToIco as String

'-- изменить название приложения
Call mc_objects.VC_PropertyChange(CurrentDb, "AppTitle", dbText, stAppTitle)
'-- изменить иконку по умолчанию
Call mc_objects.VC_PropertyChange(CurrentDb, "AppIcon", dbText, stPathToIco)
Call mc_objects.VC_PropertyChange(CurrentDb, "UseAppIconForFrmRpt", dbBoolean, True)
'-- отобразить изменения
Application.RefreshTitleBar
</pre>
<p>Также в модуле mc_objects располагается еще одна полезная функция <code>VC_PropertyValue()</code>, которая читает значения параметра:</p>
<pre name="code" class="vb">
Dim stMenu As String
'-- получить меню по умолчанию
stMenu = VC_PropertyValue(CurrentDb, "StartUpMenuBar")
</pre>
<p>Текст функций:<br />
<span id="more-403"></span></p>
<pre name="code" class="vb">
Public Sub CM_PropertyChange(ByRef obj As Object _
                                , ByVal imProperty As String _
                                , ByVal vPropertyType As Variant _
                                , ByVal vPropertyValue As Variant)
' 2007-03-17 Скоков С.А.
' Изменить свойства (Properties) объекта. Если свойства нет, то оно добавляется.
On Error GoTo Err_
    Dim prp As DAO.Property
    Const c_ErrorPropNotFound = 3270

    obj.Properties(imProperty) = vPropertyValue
    CM_PropertyChange = True

Exit_:
    Exit Sub

Err_:
    If Err.Number = c_ErrorPropNotFound Then     '-- Property not found.
        Set prp = obj.CreateProperty(imProperty, vPropertyType, vPropertyValue)
        obj.Properties.Append prp
        Resume Next
    Else '-- Unknown error.
	Err.Raise vbObjectError + 1, "CM_PropertyChange()->" &#038; Err.Source, Err.Description, Err.HelpFile, Err.HelpContext
    End If
End Sub

Public Function CM_PropertyValue(ByRef obj As Object _
                                , ByVal imProperty As String) As Variant
' 2007-03-17 Скоков С.А.
' Изменить свойства (Properties) объекта. Если свойства нет, то оно добавляется.
On Error GoTo Err_
    Dim prp As DAO.Property
    Const c_ErrorPropNotFound = 3270

    Set prp = obj.Properties(imProperty)

    CM_PropertyValue = prp.Value

Exit_:
    Exit Function

Err_:
    If Err.Number = c_ErrorPropNotFound Then     '-- Property not found.
    Else '-- Unknown error.
        Err.Raise vbObjectError + 1, "CM_PropertyValue()->" &#038; Err.Source, Err.Description, Err.HelpFile, Err.HelpContext
    End If
End Function
</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/bxP8hneeWug" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://5codelines.net/kak-smenit-standartnuyu-ikonku/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		<feedburner:origLink>http://5codelines.net/kak-smenit-standartnuyu-ikonku/?utm_source=rss&amp;utm_medium=rss&amp;utm_campaign=kak-smenit-standartnuyu-ikonku</feedburner:origLink></item>
		<item>
		<title>Книга «Программист-прагматик»</title>
		<link>http://feedproxy.google.com/~r/5codelines/~3/eV8wJid-kxY/</link>
		<comments>http://5codelines.net/kniga-programmist-pragmatik/#comments</comments>
		<pubDate>Fri, 06 Jan 2012 20:31:25 +0000</pubDate>
		<dc:creator>Сергей Скоков</dc:creator>
				<category><![CDATA[книги]]></category>
		<category><![CDATA[черновик]]></category>

		<guid isPermaLink="false">http://5codelines.net/?p=283</guid>
		<description><![CDATA[Очень замечательная книга. Уже давно прочитал ее. Расскрывает многие принципы хорошего подхода к программированию. Рекомендую к прочтению. До встречи! (с) Скоков Сергей Подписаться на: RSS или e-mail рассылку или добавить в ЖЖ друзья.]]></description>
			<content:encoded><![CDATA[<p><img class="size-medium wp-image-284" title="The_Pragmatic_Programmer" src="http://5codelines.net/wp-content/uploads/The_Pragmatic_Programmer-208x300.jpg" alt="" width="208" height="300" /></p>
<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/eV8wJid-kxY" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://5codelines.net/kniga-programmist-pragmatik/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		<feedburner:origLink>http://5codelines.net/kniga-programmist-pragmatik/?utm_source=rss&amp;utm_medium=rss&amp;utm_campaign=kniga-programmist-pragmatik</feedburner:origLink></item>
		<item>
		<title>Динамеческое изменение размеров элементов управления</title>
		<link>http://feedproxy.google.com/~r/5codelines/~3/GsbJrmKEVuM/</link>
		<comments>http://5codelines.net/control-resizing/#comments</comments>
		<pubDate>Fri, 04 Nov 2011 21:39:46 +0000</pubDate>
		<dc:creator>Сергей Скоков</dc:creator>
				<category><![CDATA[mc_form]]></category>
		<category><![CDATA[UI]]></category>
		<category><![CDATA[библиотека]]></category>

		<guid isPermaLink="false">http://5codelines.net/?p=235</guid>
		<description><![CDATA[Я хочу поделиться очень полезными функциями CM_ResizeCtl() и CM_ResizeWidth(), которые подгоняют элемент управления при изменении размеров форм. В основном я использую их для подчиненных форм в табличном виде. Что нужно сделать: Создать новую форму. Убрать область выделения, полосы прокрутки, область выбора записей. Разместить в области данных элемент управления в левом верхнем углу. Назовем его f_spis_. [...]]]></description>
			<content:encoded><![CDATA[<p>Я хочу поделиться очень полезными функциями <code>CM_ResizeCtl()</code> и <code>CM_ResizeWidth()</code>, которые подгоняют элемент управления при изменении размеров форм. В основном я использую их для подчиненных форм в табличном виде.</p>
<p>Что нужно сделать:</p>
<ul>
<li>Создать новую форму.</li>
<li>Убрать область выделения, полосы прокрутки, область выбора записей.</li>
<li>Разместить в области данных элемент управления <span style="text-decoration: underline;">в левом верхнем углу</span>. Назовем его <code>f_spis_</code>. Элементом управления может быть любой тип. Я чаще использую для подобных случаев подчиненную форму в табличном виде. Элемент управления можно размещать и в заголовке или примечании формы, но в этом случае элемент управления будет меняться только по ширине.</li>
<li>Создать событие формы &#171;Изменение размера&#187; следующего вида:</li>
</ul>
<p><span id="more-235"></span></p>
<pre name="code" class="vb">
Private Sub Form_Resize()
    Call mc_Form.VC_ResizeCtl(Me.f_spis_)
End Sub
</pre>
<p>Код функций:</p>
<pre name="code" class="vb">
Public Sub VC_ResizeCtl(ByRef ctl As Control)
' Скоков С.А. 2006-12-16
' Изменяет размер элемента управления под оконные размеры формы.
' функция должна вызываться на событие Form_Resize()
' Элемент управления должен находится в области данных.
' Предполагается что он один и должен занимать всю облатсь данных.
' 0.6 * c_lTvipInSm и 1 * c_lTvipInSm константы, определенные опытным путем,
' чтобы элемент управления не прилипал к правой и ниженй части формы
On Error GoTo Err_
    Dim frm As Form
    Dim lCtlWidth As Long, lCtlHeight As Long
    Dim lDetailHeight As Long

    Set frm = ctl.Parent
    '-- изменение размеров "поверхности" формы
    frm.Width = frm.WindowWidth
    lDetailHeight = frm.WindowHeight - frm.Section(acHeader).Height - frm.Section(acFooter).Height
    '-- если форму свернуть, то произойдет ошибка
    If lDetailHeight < 0 Then
        Exit Sub
    End If

    frm.Section(acDetail).Height = lDetailHeight
    '-- изменение размеров элемента управления
    lCtlWidth = frm.WindowWidth - ctl.Left * 2 - 0.4 * c_lTvipInSm
    lCtlHeight = frm.WindowHeight - ctl.Top * 2 - 1 * c_lTvipInSm _
                - frm.Section(acHeader).Height - frm.Section(acFooter).Height

    If lCtlWidth > c_lTvipInSm Then ctl.Width = lCtlWidth
    If lCtlHeight > c_lTvipInSm Then ctl.Height = lCtlHeight
Exit_:
    Exit Sub
Err_:
    MsgBox Err.Description
    Resume Exit_
    Resume
End Sub
</pre>
<pre name="code" class="vb">
Public Sub CM_ResizeWidth(ByRef frm As Form, ByRef ctl As Control)
' Скоков С.А. 2008-03-12
' Изменяет размер элемента управления под оконные размеры формы по ШИРИНЕ.
' функция должна вызываться на событие Form_Resize()
' Элемент управления должен находится в области данных.
' Предполагается что он один и должен занимать всю облатсь данных.
' 0.6 * c_lTvipInSm и 1 * c_lTvipInSm константы, определенные опытным путем,
' чтобы элемент управления не прилипал к правой и ниженй части формы
On Error GoTo Err_
    Const c_lTvipInSm As Long = 567

    Dim lCtlWidth As Long, lCtlHeight As Long

    '-- изменение размеров элемента управления
    lCtlWidth = frm.WindowWidth - ctl.Left - 0.6 * c_lTvipInSm

    If lCtlWidth &gt; c_lTvipInSm Then ctl.Width = lCtlWidth
Exit_:
    Exit Sub
Err_:
    MsgBox Err.Description
    Resume Exit_
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/GsbJrmKEVuM" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://5codelines.net/control-resizing/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		<feedburner:origLink>http://5codelines.net/control-resizing/?utm_source=rss&amp;utm_medium=rss&amp;utm_campaign=control-resizing</feedburner:origLink></item>
		<item>
		<title>Как создать временные таблицы</title>
		<link>http://feedproxy.google.com/~r/5codelines/~3/ZFgcQTdOmOA/</link>
		<comments>http://5codelines.net/kak-sozdat-vremennye-tablicy/#comments</comments>
		<pubDate>Mon, 17 Oct 2011 20:32:35 +0000</pubDate>
		<dc:creator>Сергей Скоков</dc:creator>
				<category><![CDATA[mc_TempMDB]]></category>
		<category><![CDATA[библиотека]]></category>
		<category><![CDATA[решения]]></category>
		<category><![CDATA[системные]]></category>

		<guid isPermaLink="false">http://5codelines.net/?p=252</guid>
		<description><![CDATA[Что бы не загаживать базу с данными и/или интерфейсную базу временными таблицами я решил перенести их в специальную временную базу данных. Это делает функция CM_CreateTempMDB(). И живет она в модуле mc_TempMDB. Для своей работы функция использует функции из внешних модулей: mc_LT.CM_LT_AddAllExt(), mc_File.CM_GetDBPath(), mc_StrSost.CM_StrSost(). У меня временная база пересоздается каждый раз при запуске программы. Функция копирует [...]]]></description>
			<content:encoded><![CDATA[<p>Что бы не загаживать базу с данными и/или интерфейсную базу временными таблицами я решил перенести их в специальную временную базу данных. Это делает функция <code>CM_CreateTempMDB()</code>. И живет она в модуле <code>mc_TempMDB</code>. Для своей работы функция использует функции из внешних модулей: <a href="http://5codelines.net/category/lib/sys/mc_LT">mc_LT</a>.CM_LT_AddAllExt(), <a href="http://5codelines.net/category/lib/sys/mc_File">mc_File</a>.CM_GetDBPath(), <a href="http://5codelines.net/category/lib/sys/mc_strsost">mc_StrSost</a>.<a href="http://5codelines.net/kak-ispolzovat-stroku-sostoyaniya">CM_StrSost()</a>.</p>
<p>У меня временная база пересоздается каждый раз при запуске программы. Функция копирует шаблоны временных таблиц из интерфейсной базы, имя которых подходит под условие: temp_*_def. Например, temp_import_def. </p>
<p>Текст функции:<br />
<span id="more-252"></span></p>
<pre name="code" class="vb">
Public Sub CM_CreateTempMDB()
' Скоков С.А. 2007-04-02
' Создание временной БД. Временные таблицы в текущей БД должны соответствовать формату temp_*_def.
' Подлинковываться в текущую БД они будут с именами temp_*
' внешние модули: mc_LT, mc_File, mc_StrSost
On Error GoTo Err_
    Dim db As DAO.Database
    Dim tdf As DAO.TableDef
    Dim pathToDb As String

    Call mc_StrSost.CM_StrSost("Создание временного файла")

    '-- создание БД
    pathToDb = mc_File.CM_GetDBPath &#038; "temp.mdb"

    If Dir(pathToDb) <> "" Then
        Call Kill(pathToDb)
    End If

    Set db = CreateDatabase(pathToDb, dbLangGeneral)
    db.Close

    '-- копирование таблиц во временную БД
    Set db = CurrentDb

    For Each tdf In db.TableDefs
        If tdf.Name Like "temp_*_def" Then
            DoCmd.CopyObject pathToDb, Left(tdf.Name, Len(tdf.Name) - 4), acTable, tdf.Name
        End If
    Next

    '-- линковка временных таблиц
    mc_LT.CM_LT_AddAllExt (pathToDb)
Exit_:
    Call mc_StrSost.CM_StrSost
    Exit Sub
Err_:
    Err.Raise Err.Number, "CM_CreateTempMDB()->" &#038; Err.Source, Err.Description
    Resume Exit_
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/ZFgcQTdOmOA" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://5codelines.net/kak-sozdat-vremennye-tablicy/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		<feedburner:origLink>http://5codelines.net/kak-sozdat-vremennye-tablicy/?utm_source=rss&amp;utm_medium=rss&amp;utm_campaign=kak-sozdat-vremennye-tablicy</feedburner:origLink></item>
		<item>
		<title>Как создать ссылки на таблицы</title>
		<link>http://feedproxy.google.com/~r/5codelines/~3/1LoafRBJNbg/</link>
		<comments>http://5codelines.net/kak-sozdat-ssylki-na-tablicy/#comments</comments>
		<pubDate>Fri, 06 May 2011 09:41:46 +0000</pubDate>
		<dc:creator>Сергей Скоков</dc:creator>
				<category><![CDATA[mc_LT]]></category>
		<category><![CDATA[библиотека]]></category>
		<category><![CDATA[решения]]></category>
		<category><![CDATA[системные]]></category>

		<guid isPermaLink="false">http://5codelines.net/?p=254</guid>
		<description><![CDATA[Хочу представить Вам функции, без которых нормальная жизнь программы на MS Access не возможно. Их всего три: CM_LT_AddAllExt() &#8212; добавляет в текущую базу ссылки на таблицы из mdb файла CM_LT_AddAllExt_ODBC() &#8212; добавляет в текущую базу ссылки на ODBC таблицы на сервере CM_LT_DelAll() &#8212; удаляет таблицы-ссылки из текущей базы Они позволяют создать в интерфейсной базе ссылки [...]]]></description>
			<content:encoded><![CDATA[<p>Хочу представить Вам функции, без которых нормальная жизнь программы на MS Access не возможно.</p>
<p>Их всего три:</p>
<ul>
<li><code>CM_LT_AddAllExt()</code> &#8212; добавляет в текущую базу ссылки на таблицы из mdb файла</li>
<li><code>CM_LT_AddAllExt_ODBC()</code> &#8212; добавляет в текущую базу ссылки на ODBC таблицы на сервере</li>
<li><code>CM_LT_DelAll()</code> &#8212; удаляет таблицы-ссылки из текущей базы</li>
</ul>
<p>Они позволяют создать в интерфейсной базе ссылки на таблицы из базы с данным. У меня они запускаются каждый раз при запуске. Написаны они давным давно, но полезны до сих пор.</p>
<p>Текст функций:<br />
<span id="more-254"></span></p>
<pre name="code" class="vb">
Public Function CM_LT_AddAllExt(ByVal stPathToBase As String) As Long
' <Скоков С.А.> создана: 2004-02-05
' подлинковывает все таблицы из указанной базы
' проверяет существует ли подлинковываемая таблица в текущей как ссылка, то обновляется строка подключения.
' если же в тек. базе есть таблица с таким именем (не ссылка), то подлинковываемая таблица пропускается
' т.о. перед вызовом этой функции удалять линкованные таблицы не нужно
' вход: stPathToBase - путь и имя базы
' выход: количество не подлинкованных таблиц, в случае ошибки возвращает -1

On Error GoTo Err_
    CM_LT_AddAllExt = 0

    Dim tdf As TableDef
    Dim db As Database
    Dim bIsSysOrLink As Boolean
    Dim stNameTbl As String
    Dim lCountNotLinket As Long ' количество не подлинкованных таблиц
    Dim stConnect As String
    Dim dbCur As DAO.Database
    Dim tdfNew As DAO.TableDef
    Dim tdfsCur As DAO.TableDefs

    stConnect = ";DATABASE=" &#038; stPathToBase
    Set dbCur = CurrentDb
    Set tdfsCur = dbCur.TableDefs

    '-- делаем масив таблиц в текущей базе
    Dim masNameTbl() As String
    Dim i As Long

    tdfsCur.Refresh
    ReDim masNameTbl(tdfsCur.count - 1)
    i = 0
    For Each tdf In tdfsCur
        masNameTbl(i) = tdf.Name
        i = i + 1
    Next tdf

    '-- коннектимся к базе
    Set db = OpenDatabase(stPathToBase)

    lCountNotLinket = 0
    '-- линкуем
    For Each tdf In db.TableDefs
        bIsSysOrLink = (tdf.Attributes And dbSystemObject) Or _
                    (tdf.Attributes And dbHiddenObject) _
                    Or (tdf.Attributes And dbAttachedTable) ' системная или присеоединенная ли?

        If Not bIsSysOrLink Then  ' если не то что выше, то можно делать линк
            stNameTbl = tdf.Name
            '-- если такая таблица существует в текущей базе
            If SerchStrInMas(masNameTbl, stNameTbl) <> -1 Then
                '-- то проверяем подлинкованая ли? иначе пропускаем эту таблицу и переходим на следующую
                If (tdfsCur(stNameTbl).Attributes And dbAttachedTable) Then
                    '-- обновляем путь к бд
                    tdfsCur(stNameTbl).Connect = stConnect
                    tdfsCur(stNameTbl).RefreshLink
                Else
                    Debug.Print "CM_LT_AddAllExt(), пропущена таблица:", stNameTbl
                    lCountNotLinket = lCountNotLinket + 1
                End If
            Else
				'-- не существует - то линкуем
                Set tdfNew = dbCur.CreateTableDef(stNameTbl)
                tdfNew.SourceTableName = stNameTbl
                tdfNew.Connect = stConnect
                tdfsCur.Append tdfNew
            End If
        End If
    Next tdf

    db.Close
    Set db = Nothing

    tdfsCur.Refresh
    Set tdfsCur = Nothing
    Set dbCur = Nothing

    CM_LT_AddAllExt = lCountNotLinket
Exit_:
    Exit Function

Err_:
    CM_LT_AddAllExt = -1
	Err.Raise Err.Number, "CM_LT_AddAllExt()->" &#038; Err.Source, Err.Description '-- передаем ошибку в вызвавшую функцию

    Resume Exit_
End Function

Private Function SerchStrInMas(ByRef masStr() As String, ByRef SerchStr As String) As Long
' <Скоков С.А.> создана: 2004-02-05

' Поиск строки в строковом массиве
' вход: masStr - массив строк
'       SerchStr - искомая строка
' выход:
'   номер элемента массива, в котором была найдена подстрока SerchStr, иначе -1 (когда нет совпадений)
'   при ошибке возвращает -1

On Error GoTo Err_

    Dim i As Long

    SerchStrInMas = -1

    For i = LBound(masStr) To UBound(masStr)
        If masStr(i) = SerchStr Then
            SerchStrInMas = i
            Exit For
        End If
    Next i

Exit_:
    Exit Function
Err_:
    SerchStrInMas = -1
    Resume Exit_
End Function

Public Function CM_LT_AddAllExt_ODBC(ByVal stConnectStr As String) As Long
' <Кулага С.Ю.> создана: 2006-10-12

'   подлинковывает все таблицы из указанной базы
'   проверяет существует ли подлинковываемая таблица в текущей как ссылка, то удаляет.
'   если же это является таблицей, то подлинковываемая таблица пропускается
'   т.е. перед вызовом этой функции удалять линкованные таблицы не нужно, он удалить необходимые сама
' вход: stConnectStr - строка подключения ADO
' выход: количество не подлинкованных таблиц, в случае ошибки возвращает -1

On Error GoTo Err_
    CM_LT_AddAllExt_ODBC = 0

    Dim bIsSysOrLink As Boolean
    Dim stNameTbl As String
    Dim tdf As TableDef
    Dim lCountNotLinket As Long ' количество не подлинкованных таблиц
    Dim cnn As ADODB.Connection
    Dim rst As ADODB.Recordset
    Dim stConnectTbl As String
    Dim dbCur As DAO.Database
    Dim tdfNew As DAO.TableDef
    Dim tdfsCur As DAO.TableDefs

    stConnectTbl = "ODBC;" &#038; stConnectStr
    Set dbCur = CurrentDb
    Set tdfsCur = dbCur.TableDefs

    ' делаем масив таблиц в текущей базе
    Dim masNameTbl() As String
    Dim i As Long

    ReDim masNameTbl(tdfsCur.count - 1)
    i = 0
    For Each tdf In tdfsCur
        masNameTbl(i) = tdf.Name
        i = i + 1
    Next tdf

    ' коннектимся к базе
    Set cnn = New ADODB.Connection
    cnn.Open (stConnectStr)
    Set rst = cnn.OpenSchema(adSchemaTables)

    lCountNotLinket = 0
    ' линкуем
    Do While Not rst.EOF
        stNameTbl = rst("TABLE_NAME")
        ' если такая таблица существует в текущей базе
        If SerchStrInMas(masNameTbl, stNameTbl) <> -1 Then
            ' то проверяем линкованая ли? иначе пропусаем эту таблицу и переходим на следующую
            If (tdfsCur(stNameTbl).Attributes And (dbAttachedTable + dbAttachedODBC)) Then
                '-- обновляем путь к бд
                tdfsCur(stNameTbl).Connect = stConnectTbl
                tdfsCur(stNameTbl).RefreshLink
            Else
                Debug.Print "CM_LT_AddAllExt_ODBC(), пропущена таблица:", stNameTbl
                lCountNotLinket = lCountNotLinket + 1
            End If
        Else
			'-- не существует - то линкуем
            Set tdfNew = dbCur.CreateTableDef(stNameTbl)
            tdfNew.SourceTableName = stNameTbl
            tdfNew.Connect = stConnectTbl
            tdfsCur.Append tdfNew
        End If
        rst.MoveNext
    Loop

    tdfsCur.Refresh
    Set tdfsCur = Nothing
    Set dbCur = Nothing

    rst.Close
    cnn.Close
    CM_LT_AddAllExt_ODBC = lCountNotLinket

Exit_:
    Exit Function

Err_:
    Err.Raise Err.Number, "CM_LT_AddAllExt_ODBC()->" &#038; Err.Source, Err.Description '-- передаем ошибку в вызвавшую функцию
    CM_LT_AddAllExt_ODBC = -1
    Resume Exit_
End Function

Public Function CM_LT_DelAll() As Boolean
' <Скоков С.А.> создана: 2003-12-12

' удаляет все связаные таблицы в текущей базе

On Error GoTo Err_

    Dim tdf As TableDef
    Dim db As Database
    Dim bIsAttached As Boolean

    Set db = CurrentDb

    For Each tdf In db.TableDefs
        bIsAttached = (tdf.Attributes And dbAttachedODBC) _
                Or (tdf.Attributes And dbAttachedTable) ' присеоединенная таблица обыкновенная или ODBC

        If bIsAttached Then ' удаляем только прилинкованные
            DoCmd.DeleteObject acTable, tdf.Name
        End If
    Next

    Set db = Nothing
    CM_LT_DelAll = True
Exit_:
    Exit Function
Err_:
    CM_LT_DelAll = False

	Err.Raise Err.Number, "CM_LT_DelAll()->" &#038; Err.Source, Err.Description '-- передаем ошибку в вызвавшую функцию
    Resume Exit_
End Function
</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/1LoafRBJNbg" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://5codelines.net/kak-sozdat-ssylki-na-tablicy/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		<feedburner:origLink>http://5codelines.net/kak-sozdat-ssylki-na-tablicy/?utm_source=rss&amp;utm_medium=rss&amp;utm_campaign=kak-sozdat-ssylki-na-tablicy</feedburner:origLink></item>
		<item>
		<title>Как получить путь к текущей базе</title>
		<link>http://feedproxy.google.com/~r/5codelines/~3/wFKx4Rhl60Y/</link>
		<comments>http://5codelines.net/kak-poluchit-put-k-tekushhej-baze/#comments</comments>
		<pubDate>Tue, 19 Apr 2011 08:23:54 +0000</pubDate>
		<dc:creator>Сергей Скоков</dc:creator>
				<category><![CDATA[mc_file]]></category>
		<category><![CDATA[библиотека]]></category>
		<category><![CDATA[системные]]></category>

		<guid isPermaLink="false">http://5codelines.net/?p=388</guid>
		<description><![CDATA[Все очень просо: Function CM_GetDBPath() As String Dim db As Database With CurrentDb CM_GetDBPath = Left(.Name, Len(.Name) - Len(Dir(.Name))) End With End Function До встречи! (с) Скоков Сергей Подписаться на: RSS или e-mail рассылку или добавить в ЖЖ друзья.]]></description>
			<content:encoded><![CDATA[<p>Все очень просо:</p>
<pre name="code" class="vb">
Function CM_GetDBPath() As String
    Dim db As Database

    With CurrentDb
        CM_GetDBPath = Left(.Name, Len(.Name) - Len(Dir(.Name)))
    End With
End Function
</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/wFKx4Rhl60Y" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://5codelines.net/kak-poluchit-put-k-tekushhej-baze/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		<feedburner:origLink>http://5codelines.net/kak-poluchit-put-k-tekushhej-baze/?utm_source=rss&amp;utm_medium=rss&amp;utm_campaign=kak-poluchit-put-k-tekushhej-baze</feedburner:origLink></item>
		<item>
		<title>Как получить текущее значение поля со списком</title>
		<link>http://feedproxy.google.com/~r/5codelines/~3/_DhZ5rf3umg/</link>
		<comments>http://5codelines.net/kak-poluchit-tekushhee-znachenie-polya-so-spiskom/#comments</comments>
		<pubDate>Sun, 03 Apr 2011 11:43:51 +0000</pubDate>
		<dc:creator>Сергей Скоков</dc:creator>
				<category><![CDATA[UI]]></category>

		<guid isPermaLink="false">http://5codelines.net/?p=326</guid>
		<description><![CDATA[Для доступа к значению поля со списком можно воспользоваться двумя способами. Рассмотрим на примере, где P_K_MES это поле со списком, в котором можно выбрать месяц. Источником данных для такого запроса может служить такой запрос: SELECT K_MES, T_MES FROM s_mes; Атрибуты настроены так: Макет Данные Рассмотрим пример чтения текущего выбранного значения: Dim iMes As Integer '-- [...]]]></description>
			<content:encoded><![CDATA[<p>Для доступа к значению поля со списком можно воспользоваться двумя способами. Рассмотрим на примере, где P_K_MES это поле со списком, в котором можно выбрать месяц.</p>
<p>Источником данных для такого запроса может служить такой запрос:</p>
<pre name="code" class="sql">SELECT K_MES, T_MES FROM s_mes;</pre>
<p>Атрибуты настроены так:</p>
<ul>
<li>Макет<br />
<img src="http://5codelines.net/wp-content/uploads/kak-poluchit-tekushhee-znachenie-polya-so-spiskom/property1.png" alt="Свойства. Макет" /></li>
<li> Данные<br />
<img src="http://5codelines.net/wp-content/uploads/kak-poluchit-tekushhee-znachenie-polya-so-spiskom/property2.png" alt="Свойства. Данные" />
</li>
</ul>
<p>Рассмотрим пример чтения текущего выбранного значения:</p>
<pre name="code" class="vb">
    Dim iMes As Integer '-- номер месяца
    Dim stMes As String '-- имя месяца

    '-- значение присоединенного столбца
    iMes = nz(Me.P_K_MES, 0)
    iMes = nz(Me.P_K_MES.Value, 0)
    iMes = nz(Me.P_K_MES.Column(0), 0)

    '-- значение произвольной колонки
    stMes = nz(Me.P_K_MES.Column(1), "Не выбрано")

    MsgBox "Выбранные значения: Номер - " &#038; iMes &#038; ", Название - " &#038; stMes &#038; ".", vbInformation
</pre>
<p>Первое на что стоит обратить внимание это то, что мы всегда можем прочитать значение колонок только выбранной строчки. Если ничего не выбрано и нет значения по умолчанию, то атрибуты Value и Column вернут Null.</p>
<p>Как Вы заметили, к значению присоединенного столбца можно обратиться двумя способами при помощи Value и Column. Колонки нумеруются с 0, в порядке следования полей в запросе. Но в атрибутах нумерация с 1-ы. <a href="http://5codelines.net/wp-content/uploads/kak-poluchit-tekushhee-znachenie-polya-so-spiskom/mdb_sampe.rar">Пример скачать тут</a>.</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/_DhZ5rf3umg" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://5codelines.net/kak-poluchit-tekushhee-znachenie-polya-so-spiskom/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		<feedburner:origLink>http://5codelines.net/kak-poluchit-tekushhee-znachenie-polya-so-spiskom/?utm_source=rss&amp;utm_medium=rss&amp;utm_campaign=kak-poluchit-tekushhee-znachenie-polya-so-spiskom</feedburner:origLink></item>
		<item>
		<title>Как использовать строку состояния</title>
		<link>http://feedproxy.google.com/~r/5codelines/~3/Ys-e9Uw0lG0/</link>
		<comments>http://5codelines.net/kak-ispolzovat-stroku-sostoyaniya/#comments</comments>
		<pubDate>Sat, 26 Mar 2011 23:19:32 +0000</pubDate>
		<dc:creator>Сергей Скоков</dc:creator>
				<category><![CDATA[mc_StrSost]]></category>
		<category><![CDATA[библиотека]]></category>
		<category><![CDATA[Утилиты]]></category>

		<guid isPermaLink="false">http://5codelines.net/?p=250</guid>
		<description><![CDATA[При выполнении длительных операций желательно и даже необходимо держать пользователя в курсе дела. Один из вариантов это отображать текущее состояние процесса в специально открытой форме. Там же можно и кнопку отмены разместить. Вторым более простым вариантом является использования строки состояния. В MS Access со строкой состояния можно работать через вызов функции SysCmd(). Я написал функции-оболочки [...]]]></description>
			<content:encoded><![CDATA[<p><img class="alignright" src="http://5codelines.net/wp-content/uploads/kak-ispolzovat-stroku-sostoyaniya/PrBar.png " alt="Progress Bar" width="339" height="60" />При выполнении длительных операций желательно и даже необходимо держать пользователя в курсе дела. Один из вариантов это отображать текущее состояние процесса в специально открытой форме. Там же можно и кнопку отмены разместить. Вторым более простым вариантом является использования строки состояния. В MS Access со строкой состояния можно работать через вызов функции <code>SysCmd()</code>. Я написал функции-оболочки для нее и разместил в библиотечном модуле mc_StrSost.</p>
<p>Всего получилось три функции для работы с прогресс баром:</p>
<ul>
<li><code>CM_PrBarStart()</code> &#8212; инициализировать прогресс бар</li>
<li><code>CM_PrBarStep()</code> &#8212; изменить прогресс бар</li>
<li><code>CM_PrBarEnd()</code> &#8212; убрать прогресс бар</li>
</ul>
<p>И одна функция для работы со строкой состояния:</p>
<ul>
<li><code>CM_StrSost()</code></li>
</ul>
<p>Что бы это все заработало необходимо что бы строка состояния была включена (см. параметры запуска).</p>
<p>Код функций:</p>
<pre name="code" class="vb">Public Sub CM_PrBarStart(ByRef stText As String, ByVal lMaxVal As Long)
' инициализация прогресс бара
    DoEvents
    SysCmd acSysCmdInitMeter, stText, lMaxVal
End Sub

Public Sub CM_PrBarStep(ByRef lNextVal As Long)
' увеличение строки прогресса
    DoEvents
    SysCmd acSysCmdUpdateMeter, lNextVal
End Sub

Public Sub CM_PrBarEnd()
' удаление прогресс бара
    DoEvents
    SysCmd (acSysCmdRemoveMeter)
End Sub

Public Function CM_StrSost(Optional stText As String = "")
' Изменяет строку сотояния, если текст не передан, строка состояния очищается
    DoEvents

    If stText = "" Then
        SysCmd acSysCmdClearStatus
    Else
        SysCmd acSysCmdSetStatus, stText
    End If
End Function
</pre>
<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/Ys-e9Uw0lG0" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://5codelines.net/kak-ispolzovat-stroku-sostoyaniya/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		<feedburner:origLink>http://5codelines.net/kak-ispolzovat-stroku-sostoyaniya/?utm_source=rss&amp;utm_medium=rss&amp;utm_campaign=kak-ispolzovat-stroku-sostoyaniya</feedburner:origLink></item>
		<item>
		<title>Функции для логирования</title>
		<link>http://feedproxy.google.com/~r/5codelines/~3/VNvz74RTF38/</link>
		<comments>http://5codelines.net/funkcii-dlya-logirovaniya/#comments</comments>
		<pubDate>Mon, 14 Mar 2011 10:18:35 +0000</pubDate>
		<dc:creator>Сергей Скоков</dc:creator>
				<category><![CDATA[mc_log]]></category>
		<category><![CDATA[библиотека]]></category>
		<category><![CDATA[решения]]></category>
		<category><![CDATA[системные]]></category>

		<guid isPermaLink="false">http://5codelines.net/?p=240</guid>
		<description><![CDATA[Представляю вам набор функций для логирования: CM_LogMsg() &#8212; записать сообщение CM_LogErrForm() &#8212; записать сообщение об ошибке в форме CM_LogErr() &#8212; записать сообщение об ошибке CM_LogCheckSize() &#8212; проверяет размер файла лога. Обычно используется только при запуске приложения. CM_LogGetPathFile() &#8212; формирует путь к файлу лога CM_LogErrDAO() &#8212; записать ошибки, возникшие при работе с данными. Только при использовании [...]]]></description>
			<content:encoded><![CDATA[<p>Представляю вам набор функций для логирования:</p>
<ul>
<li><code>CM_LogMsg()</code> &#8212; записать сообщение</li>
<li><code>CM_LogErrForm()</code> &#8212; записать сообщение об ошибке в форме</li>
<li><code>CM_LogErr()</code> &#8212; записать сообщение об ошибке</li>
<li><code>CM_LogCheckSize()</code> &#8212; проверяет размер файла лога. Обычно используется только при запуске приложения.</li>
<li><code>CM_LogGetPathFile()</code> &#8212; формирует путь к файлу лога</li>
<li><code>CM_LogErrDAO()</code> &#8212; записать ошибки, возникшие при работе с данными. Только при использовании библиотеки DAO.</li>
</ul>
<p>&#171;Живут&#187; эти функции в модуле: mc_Log.</p>
<p>Текст функций:<br />
<span id="more-240"></span></p>
<pre name="code" class="vb">
' функции для ведения лога в текстовый файл

'-- имя файла лога
Private Const c_imFileLog As String = "Log.txt"

Public Sub CM_LogMsg(ByRef stMsg As String)
' <Скоков С.А.> 2005-04-05

' запись в файл сообщения
' вход:
'       stMsg - строка сообщения

On Error Resume Next '-- нет обработки ошибок

    Dim iNomFile As Integer

    '-- получаем свободный номер файла
    iNomFile = FreeFile

    Open CM_LogGetPathFile() For Append As #iNomFile
    Print #iNomFile, "m"; Spc(1); Date; Spc(1); Time; Spc(1); stMsg
    Close #iNomFile
End Sub

Public Sub CM_LogErrForm(ByRef frm As Form _
                , ByVal imFunc As String _
                , Optional ErrNom As Variant _
                , Optional ErrDescription As Variant)
' <Скоков С.А.> 2010-03-28

    If frm Is Nothing Then
        imFunc = "Nothing::" &#038; imFunc
    Else
        imFunc = frm.Name &#038; "::" &#038; imFunc
    End If

    Call CM_LogErr(imFunc, ErrNom, ErrDescription)
End Sub

Public Sub CM_LogErr(ByRef imFunc As String _
                , Optional ErrNom As Variant _
                , Optional ErrDescription As Variant)
' <Скоков С.А.> 2005-04-05

' запись в файл сообщения об ошибке
' вход:
'       imFunc - имя функции
'       ErrNom - номер ошибки. если пропущено, то данные берутся из Err.Nuber
'       ErrDescription - строка сообщения/описания ошибки
'                        если пропущено, то данные берутся из Err.Description

    Dim iNomFile As Integer

    '-- обработка входных параметров
    If IsMissing(ErrNom) Then
        ErrNom = Err.Number
    End If

    If IsMissing(ErrDescription) Then
        ErrDescription = Err.Description
    End If

On Error Resume Next '-- нет обработки ошибок

    '-- получаем свободный номер файла
    iNomFile = FreeFile

    Open CM_LogGetPathFile() For Append As #iNomFile
    Print #iNomFile, "e"; Spc(1); Date; Spc(1); Time; Spc(1); _
                    imFunc; Spc(1); "Err: "; ErrNom; Spc(1); ErrDescription
    Close #iNomFile
End Sub

Public Sub CM_LogCheckSize(Optional ByVal lLenMax As Double = 1048576)
' Скоков С.А. 2006-12-07
' проверяет размер файла лога и удаляет если он превышает лимит
' lLenMax - максимальная длинна файла, по умолчанию 1 Мб
    Dim oFSO As Object, oFile As Object
    Dim stPathFile As String

    stPathFile = CM_LogGetPathFile()

    Set oFSO = CreateObject("Scripting.FileSystemObject")
    Set oFile = oFSO.GetFile(stPathFile)

    If oFile.Size >= lLenMax Then
        Kill stPathFile
    End If
End Sub

Public Function CM_LogGetPathFile() As String
' Скоков С.А. 2006-12-07
' возвращает путь с именем файла лога
    Dim Db As DAO.Database

    Set Db = CurrentDb
    CM_LogGetPathFile = Left(Db.Name, Len(Db.Name) - Len(Dir(Db.Name))) + c_imFileLog
End Function

Public Sub CM_LogErrDAO(ByRef imFunc As String, Optional ByRef errs As DAO.Errors = Nothing)
' <Скоков С.А.> 2006-12-07

' запись в файл сообщения об ошибке
' вход:
'       imFunc - имя функции
'       ErrNom - номер ошибки. если пропущено, то данные берутся из Err.Nuber
'       ErrDescription - строка сообщения/описания ошибки
'                        если пропущено, то данные берутся из Err.Description
'

On Error Resume Next '-- нет обработки ошибок
    Dim iNomFile As Integer
    Dim errTek As DAO.Error
    '-- получаем свободный номер файла
    iNomFile = FreeFile

    If errs Is Nothing Then
        Set errs = DAO.Errors
    End If

    Open mc_Log.CM_LogGetPathFile() For Append As #iNomFile
    For Each errTek In errs
        Print #iNomFile, "e"; Spc(1); Date; Spc(1); Time; Spc(1); _
                        imFunc; Spc(1); errTek.Source; " Err: "; errTek.Number; Spc(1); errTek.Description
    Next errTek
    Close #iNomFile
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/VNvz74RTF38" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://5codelines.net/funkcii-dlya-logirovaniya/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		<feedburner:origLink>http://5codelines.net/funkcii-dlya-logirovaniya/?utm_source=rss&amp;utm_medium=rss&amp;utm_campaign=funkcii-dlya-logirovaniya</feedburner:origLink></item>
	</channel>
</rss>

