<?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/resheniya/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.2</generator>
		<item>
		<title>Как создать временные таблицы</title>
		<link>http://5codelines.net/kak-sozdat-vremennye-tablicy/?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=kak-sozdat-vremennye-tablicy</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>
]]></content:encoded>
			<wfw:commentRss>http://5codelines.net/kak-sozdat-vremennye-tablicy/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Как создать ссылки на таблицы</title>
		<link>http://5codelines.net/kak-sozdat-ssylki-na-tablicy/?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=kak-sozdat-ssylki-na-tablicy</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>
]]></content:encoded>
			<wfw:commentRss>http://5codelines.net/kak-sozdat-ssylki-na-tablicy/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Функции для логирования</title>
		<link>http://5codelines.net/funkcii-dlya-logirovaniya/?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=funkcii-dlya-logirovaniya</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>
]]></content:encoded>
			<wfw:commentRss>http://5codelines.net/funkcii-dlya-logirovaniya/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Как преобразовать записи таблицы в строку</title>
		<link>http://5codelines.net/kak-preobrazovat-zapisi-tablicy-v-stroku/?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=kak-preobrazovat-zapisi-tablicy-v-stroku</link>
		<comments>http://5codelines.net/kak-preobrazovat-zapisi-tablicy-v-stroku/#comments</comments>
		<pubDate>Wed, 23 Feb 2011 11:14:23 +0000</pubDate>
		<dc:creator>Сергей Скоков</dc:creator>
				<category><![CDATA[mc_rec]]></category>
		<category><![CDATA[библиотека]]></category>
		<category><![CDATA[решения]]></category>
		<category><![CDATA[Утилиты]]></category>

		<guid isPermaLink="false">http://5codelines.net/?p=244</guid>
		<description><![CDATA[Я хочу предоставить Вам несколько очень полезных функций, которые позволяют собрать данные из таблицы в строку через разделитель: CM_RecsInStr() CM_RecsInStrExt() Отличия между ними заключаются в параметрах. CM_RecsInStr() работает с Recordset, а CM_RecsInStrExt() с запросом или именем таблицы. Эти функции я часто использую, что бы показать информацию о сложном объекте в сжатом виде. Например, для заказа [...]]]></description>
			<content:encoded><![CDATA[<p>Я хочу предоставить Вам несколько очень полезных функций, которые позволяют собрать данные из таблицы в строку через разделитель:</p>
<ul>
<li>CM_RecsInStr()</li>
<li>CM_RecsInStrExt()</li>
</ul>
<p>Отличия между ними заключаются в параметрах. <code>CM_RecsInStr()</code> работает с <code>Recordset</code>, а <code>CM_RecsInStrExt()</code> с запросом или именем таблицы.</p>
<p>Эти функции я часто использую, что бы показать информацию о сложном объекте в сжатом виде. Например, для заказа можно показать выбранные товары через запятую, при этом можно ограничить вывод первыми 10 записями.</p>
<p>Пример использования:</p>
<pre name="code" class="vb">
Dim lK_OREDER As Long
Dim rst As DAO.Recordset
Dim stSQL As String

lK_OREDER = 123
stSQL = "SELECT TOP 25 T_ORDER_ITEM &#038; '(' &#038; N_COUNT &#038; ')' As T_ITEM FROM K_ORDER = " &#038; lK_OREDER

Set rst = CurrentDb.OpenRecordset(stSQL, dbOpenForwardOnly)

MsgBox CM_RecsInStr(rst, "T_ITEM", " | ")
MsgBox CM_RecsInStr(stSQL , "T_ITEM", " | ")
</pre>
<p>В результате работы примера получим примерно такую строку:<br />
<code><br />
Товар А (1) | Товар Б (2) | Товар В (1)<br />
</code></p>
<p>Наиболее удачной получилось <code>CM_RecsInStrExt()</code>. Иногда для простоты я ее использую в качестве истоника данных полей на формах.</p>
<p>Текст функций:<br />
<span id="more-244"></span></p>
<pre name="code" class="vb">
Public Function CM_RecsInStr(ByRef rstTable As Recordset _
                            , ByVal stFieldName As String _
                            , Optional ByVal SimvRazd As String = ",") As String
' Скоков С.А.
' Формирует строку из записей таблицы, разделяя их запятыми
' rstTable - ссылка на открытый набор записей
' stFieldName - имя поле, из которого брать данные
' SimvRazd - символ разделитель значений

On Error GoTo Err_

    Dim stRet As String

    ' если есть записи то
    If rstTable.RecordCount > 0 Then
        ' это потому что эти значения разделяются запятыми и ставятся перед присваиванием
        '    знач. из таблицы см. цикл ниже
        '    а перед первым значением запятую ставить не нужно
        stRet = Nz(rstTable(stFieldName))
        rstTable.MoveNext
    End If

    Do While Not rstTable.EOF
        stRet = stRet &#038; SimvRazd &#038; Nz(rstTable(stFieldName))
        rstTable.MoveNext
    Loop

    CM_RecsInStr = stRet

Exit_:
    Exit Function

Err_:
    Err.Raise Err.Number, "CM_RecsInStr() ->" &#038; Err.Description, Err.Description
    Resume Exit_
    Resume
End Function

Public Function CM_RecsInStrExt(ByVal stSQL As String _
                                , ByVal stFieldName As String _
                                , Optional ByVal SimvRazd As String = ", ") As String
' Скоков С.А.
' Формирует строку из записей таблицы, разделяя их разделителями (запятыми)
' stSQL - запрос (может быть и именем таблицы или сохраненного запроса)
' stFieldName - имя поле, из которого брать данные
' SimvRazd - символ разделитель значений
On Error GoTo Err_

    Dim stRet As String
    Dim rstTable As Recordset

    Set rstTable = CurrentDb.OpenRecordset(stSQL, dbOpenDynaset)
    ' если есть записи то
    If rstTable.RecordCount > 0 Then
        ' это потому что эти значения разделяются запятыми и ставятся перед присваиванием
        '    знач-я из таблицы (см. цикл ниже),
        '    а перед первым значением запятую ставить не нужно
        stRet = Nz(rstTable(stFieldName))
        rstTable.MoveNext
    End If

    Do While Not rstTable.EOF
        stRet = stRet &#038; SimvRazd &#038; Nz(rstTable(stFieldName))
        rstTable.MoveNext
    Loop

    rstTable.Close

    CM_RecsInStrExt = stRet

Exit_:
    Exit Function

Err_:
    Err.Raise Err.Number, "CM_RecsInStrExt() ->" &#038; Err.Description, 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>
]]></content:encoded>
			<wfw:commentRss>http://5codelines.net/kak-preobrazovat-zapisi-tablicy-v-stroku/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Как отключить скролинг записей формы</title>
		<link>http://5codelines.net/mouse-wheel/?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=mouse-wheel</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) DoCmd.CancelEvent '-- [...]]]></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="http://5codelines.net/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>
]]></content:encoded>
			<wfw:commentRss>http://5codelines.net/mouse-wheel/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Как из номера квартала получить дату или период для поиска</title>
		<link>http://5codelines.net/kvartal-v-datu/?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=kvartal-v-datu</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[Недавно на моем любимом форуме проскакивал одноименный ответ. Сперва я сам как-то задумался, а как же. Но как оказалось задача &#171;По номерам недель получить временной промежуток для фильтра по датам&#187; оказалось проще простого. Для этого я воспользовался любимым методом &#171;Разделяй и властвуй&#187;. И так, задача разбилась на три части: 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>Недавно на моем любимом форуме проскакивал одноименный ответ. Сперва я сам как-то задумался, а как же. Но как оказалось задача &#171;По номерам недель получить временной промежуток для фильтра по датам&#187; оказалось проще простого. Для этого я воспользовался любимым методом &#171;Разделяй и властвуй&#187;.</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>
]]></content:encoded>
			<wfw:commentRss>http://5codelines.net/kvartal-v-datu/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Как получить значение поля таблицы</title>
		<link>http://5codelines.net/kak-poluchit-znachenie-polya-tablicy/?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=kak-poluchit-znachenie-polya-tablicy</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>
]]></content:encoded>
			<wfw:commentRss>http://5codelines.net/kak-poluchit-znachenie-polya-tablicy/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Как создать меню в MS Access</title>
		<link>http://5codelines.net/kak-sozdat-menyu-v-ms-access/?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=kak-sozdat-menyu-v-ms-access</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 &#171;Сервис &#8212; Настройка&#187; или кликнуть в пустом месте меню и в контестном меню выбрать пункт &#171;Настройка&#187;.</p>
<p><img src="http://5codelines.net/wp-content/uploads/kak-sozdat-menyu-v-ms-access/2.png" alt="Настройка меню" /></p>
<p>Теперь все внимание на вкладку &#171;Команды&#187; нового окошка.</p>
<p>В категории &#171;Файл&#187; вы найдете пункт меню &#171;Специальная&#187;. Это рабочая лошадка меню. На самом деле это кнопка.</p>
<p><img src="http://5codelines.net/wp-content/uploads/kak-sozdat-menyu-v-ms-access/1_3.png" alt="Пункты меню" /></p>
<p>В категории &#171;Новое меню&#187; найдете выпадающее меню &#171;Новое меню&#187;. На самом деле это поле с выпадающим списком.</p>
<p>Еще в категории &#171;Все формы&#187; и т.п. вы найдете соостветственно готовые пункты меню. У них есть свои особенности. Об этом ниже.</p>
<p>Это все &#171;многообразие&#187; элементов можно при помощи перетаскивания перенести на свою строку меню или панель инструментов (я надеюсь вы прочитали предыдущую статью и знаете как это делать).</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;">Только не закрывайте чудесное окошко &#171;Настройка&#187;.</span> Кликните правой кнопочкой мыши на любом пункте меню (не список!) и в контекстном меню выберете пункт &#171;Свойства&#187;. У вас откроется следующее окошко:</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 />
А теперь давайте таким же образом откроем пункт меню, созданный перетаскиванием пункта из группы &#171;Все формы&#187;, например.</p>
<p><img src="http://5codelines.net/wp-content/uploads/kak-sozdat-menyu-v-ms-access/6.png" alt="Свойства пункта меню" /></p>
<p>В свойстве &#171;Параметр&#187; вы обнаружите имя формы. Так вот, если прописать это же имя в пункте меню из группы &#171;File&#187;, то форма не откроется. Вот такой чудесный нюанс.</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>
]]></content:encoded>
			<wfw:commentRss>http://5codelines.net/kak-sozdat-menyu-v-ms-access/feed/</wfw:commentRss>
		<slash:comments>5</slash:comments>
		</item>
		<item>
		<title>Недостатки DoCmd.GoToRecord и достоинства CodeContextObject</title>
		<link>http://5codelines.net/gotolastrecord/?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=gotolastrecord</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 Как-то мне понадобилось перейти к последней записи в подчиненной форме. Перейти к последней записи можно разными способами, простейший &#8212; это вот эта команда: DoCmd.GoToRecord , , acLast. Вот с подчиненненными формами есть нюанс &#8212; нужно вызывать ее в обработчике события или методе подчиненной формы. В моем случае события не подходили, [...]]]></description>
			<content:encoded><![CDATA[<p><strong>Пара камней в огород DoCmd</strong><br />
Как-то мне понадобилось перейти к последней записи в подчиненной форме. Перейти к последней записи можно разными способами, простейший &#8212; это вот эта команда: <code>DoCmd.GoToRecord , , acLast</code>. Вот с подчиненненными формами есть нюанс &#8212; нужно вызывать ее в обработчике события или методе подчиненной формы. В моем случае события не подходили, метод было реализовывать влом и очень хотелось реализовать это на главной форме.</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>
]]></content:encoded>
			<wfw:commentRss>http://5codelines.net/gotolastrecord/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Как получить доступ к свойствам диаграммы и других ActiveX объектов</title>
		<link>http://5codelines.net/activex1/?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=activex1</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” и изменим название диаграммы программно. Далее необходимо [...]]]></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>
]]></content:encoded>
			<wfw:commentRss>http://5codelines.net/activex1/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
	</channel>
</rss>

