<?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; xml</title>
	<atom:link href="http://5codelines.net/category/xml/feed/" rel="self" type="application/rss+xml" />
	<link>http://5codelines.net</link>
	<description>Как писать комерческие приложения на MS Access</description>
	<lastBuildDate>Sat, 28 Jan 2012 21:20:45 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.3.1</generator>
		<item>
		<title>Экспорт/импорт XML. Часть 2. Средства ADO</title>
		<link>http://5codelines.net/eksportimport-xml-chast-2-sredstva-ado/?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=eksportimport-xml-chast-2-sredstva-ado</link>
		<comments>http://5codelines.net/eksportimport-xml-chast-2-sredstva-ado/#comments</comments>
		<pubDate>Thu, 27 Dec 2007 16:06:37 +0000</pubDate>
		<dc:creator>Сергей Скоков</dc:creator>
				<category><![CDATA[xml]]></category>

		<guid isPermaLink="false">http://5codelines.net/eksportimport-xml-chast-2-sredstva-ado/</guid>
		<description><![CDATA[Как выполнить экспорт/ипорт данных в xml при помощи ADO]]></description>
			<content:encoded><![CDATA[<p><strong>1	Средства библиотеки ADO</strong><br />
Для экспорта или импорта можно воспользоваться возможностями библиотеки ADO. Чтобы воспользоваться этими возможностями сполна придется написать немного кода.</p>
<p><strong>2	Экспорт в файл</strong><br />
Для экспорта данных испльзуется метод:<br />
<code>recordset.Save Destination, PersistFormat</code><br />
<code>Destination</code> – имя файла или объект типа <code>Stream</code>.<br />
<code>PersistFormat</code> – формат вывода.</p>
<p>Параметр PersistFormat в нашем случае всегда будет равен adPersistXML. Параметр <code>Destination</code> открывает простор для творчесва, подробнее в примерах. Рассмотрим пример:<span id="more-8"></span></p>
<pre name="code" class="vb">Public Function SaveRstToXml(ByRef rst As ADODB.Recordset _
                                 , ByVal stFileName As String)
'-- сохранить xml файл в Recordset
	If Dir(stFileName) &lt;&gt; "" Then
		Kill stFileName
	End If

	rst.Save stFileName, adPersistXML
End Function</pre>
<p>В метод <code>Save</code> мы передали путь с именем файла. Перед тем как сохранить файл необходимо убедиться, что похожего файла нет или удалить его (стр. 9). Иначе произойдет ошибка выполнения. В результате получим xml файл такой же структуры, как и при использовании средств MS Access.<br />
В документации указанно, что данные сохраняются в кодировке UTF-8. И в загловке файла нет привычного для XML заголовка, похожего на:<code>&lt;?xml version="1.0" encoding ="windows-1251"?&gt;</code>. Чтобы сохранить данные любой в другой кодировке можно восользоваться объектом <code>ADO.Stream</code>.<br />
Смотрим:</p>
<pre name="code" class="vb">Public Function SaveRstToXml2(ByRef rst As ADODB.Recordset _
                                 , ByVal stFileName As String)
'-- сохранить xml файл в Recordset
	Dim sm As ADODB.Stream               

	Set sm = New ADODB.Stream
	sm.Charset = "KOI8-R"       '-- любимая кодировка
	rst.Save sm, adPersistXML	'-- сохраняем в поток               

	If Dir(stFileName) &lt;&gt; "" Then
		Kill stFileName
	End If               

	sm.SaveToFile stFileName	'-- сохраняем поток в файл
	sm.Close
End Function</pre>
<p>Обратите внимение, что тут в метод Save передан объект Stream.</p>
<p>Функции <code>SaveRstToXml</code> и <code>SaveRstToXml2</code> являются библиотечными. При рельном использовании в них необходимо добавить обработку ошибок. Я не стал этого делать, чтобы не увеличивать код. Для удобства использования написана специализированая функция:</p>
<pre name="code" class="vb">Public Function EportTblToXml(ByVal imTblFrom As String _
                             , ByVal imFileTo As String)
'-- экспортировать таблицу в xml файл
	Dim rstData As ADODB.Recordset
	Dim cnn As ADODB.Connection               

	Set cnn = CurrentProject.Connection
	Set rstData = New ADODB.Recordset     

	rstData.Open "SELECT * FROM " &amp; imTblFrom, cnn _
	                 , adOpenKeyset, adLockOptimistic
	Call SaveRstToXml(rstData, imFileTo)
	rstData.Close
End Function</pre>
<p>Ее задача подготовить данные для библиотечной фукнции. Таблица открывается в текущей базе данных. При изменении требований, именно эту фукнцию можно спокойно менять, например, добавить соединение с базой или фильтр экспортируемых данных.</p>
<p><strong>3	Импорт из файла</strong><br />
Для экспорта данных испльзуется метод:<br />
<code>recordset.Open</code><br />
<code>Source</code> – источник: SQL запрос, имя файла, объект Stream и п.р.<br />
<code>ActiveConnection</code> – соединение.<br />
<code>CursorType</code> – тип курсора.<br />
<code>LockType</code> – тип блокировки.<br />
<code>Options</code> – дополнительные опции.</p>
<p>Имя файла указывается на месте первого праметра Source. Если опустить все остальные параметры, то в результате откроется последовательный набор в режиме только для чтения. Быстро &#8212; то что нужно для импорта. Если нужно редактировать, то придется поиграть с параметрами <code>CursorType</code> и <code>LockType</code>.</p>
<p>Рассмотрим пример:</p>
<pre name="code" class="vb">Public Function LoadXmlToRst(ByVal stFileName As String) As ADODB.Recordset
'-- загрузить в Recordset из xml файла
	Dim rst As ADODB.Recordset
	Set rst = New ADODB.Recordset     

	rst.Open stFileName	'-- открыть файл
	Set LoadXmlToRst = rst
End Function</pre>
<p>Как оказывается все просто. Для надежного использования не хватает проверки наличия файла или обработки ошибок.<br />
Также рассмотрим пример при чтении из потока с изменением кодировки:</p>
<pre name="code" class="vb">Public Function LoadXmlToRst2(ByVal stFileName As String) As ADODB.Recordset
'-- загрузить в Recordset из xml файла
	Dim sm As ADODB.Stream
	Dim rst As ADODB.Recordset               

	Set sm = New ADODB.Stream     

	sm.Charset = "KOI8-R"       '-- любимая кодировка
	sm.Open
	sm.LoadFromFile stFileName  '-- загружаем файл в поток     

	Set rst = New ADODB.Recordset
	rst.Open sm       			'-- загружаем Recordset из потока
	sm.Close
	Set LoadXmlToRst2 = rst
End Function</pre>
<p>Как и с экспортом написана специализированая функция <code>ImportXmlToTbl</code>. После открытия импортируемого файла в виде объекта Recordset импорт только начинается. Теперь данные необходимо обработать и поместить в базу. В примере все просто – данные добавляются без обарботки, но перед добавлением таблицу небоходимо очистить. Это происходит перед вызовом этой фукции.<br />
Пример:</p>
<pre name="code" class="vb">Public Function ImportXmlToTbl(ByVal imFileFrom As String _
                             , ByVal imTblTo As String)
'-- импортировать xml файл в БД
	Dim rstData As ADODB.Recordset
	Dim rstTo As ADODB.Recordset
	Dim fld As ADODB.Field
	Dim cnn As ADODB.Connection       

	Set cnn = CurrentProject.Connection
	Set rstTo = New ADODB.Recordset
	rstTo.Open "SELECT * FROM " &amp; imTblTo, cnn _
	                 , adOpenKeyset, adLockOptimistic
	Set rstData = LoadXmlToRst(imFileFrom)       '-- добавляем данные из xml в таблицу
	'-- тут может происходить обновление данных
	'-- или любая другая обработка
	Do While Not rstData.EOF
		rstTo.AddNew         

		For Each fld In rstData.Fields
			rstTo(fld.Name) = fld.Value
		Next fld         

		rstTo.Update
		rstData.MoveNext
	Loop     

	rstData.Close
	rstTo.Update
	rstTo.Close
End Function</pre>
<p><strong>4	Итог</strong><br />
Данный метод хорошо тем, что позволяет с минимальными усилиями экспортировать и импортировть таблицы максимально гибко. Не так много кода нужно будет написать, чтобы экспортировать данные из стороннего mdb файла.<br />
Недостатки не очень серьезные: структуру результирующего файла определяет сама библиотека ADO; нет возможности экспортировать данные в иеррахическом ввиде.</p>
<p>Подробности в <a href="http://5codelines.net/wp-content/uploads/xml_2_sampe.rar">примере</a>.</p>
<p>Продолжение следует. В нем рассмотрим свой генератор XML.</p>
<p>Использованная литература: встроенная справка.</p>
<p align="right">(с) Скоков Сергей</p>
<div></div>]]></content:encoded>
			<wfw:commentRss>http://5codelines.net/eksportimport-xml-chast-2-sredstva-ado/feed/</wfw:commentRss>
		<slash:comments>26</slash:comments>
		</item>
		<item>
		<title>Экспорт/импорт XML. Часть 1. Средства MS Access</title>
		<link>http://5codelines.net/eksportimport-xml-chast-1-sredstva-ms-access/?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=eksportimport-xml-chast-1-sredstva-ms-access</link>
		<comments>http://5codelines.net/eksportimport-xml-chast-1-sredstva-ms-access/#comments</comments>
		<pubDate>Thu, 20 Dec 2007 18:12:57 +0000</pubDate>
		<dc:creator>Сергей Скоков</dc:creator>
				<category><![CDATA[xml]]></category>

		<guid isPermaLink="false">http://5codelines.net/eksportimport-xml-chast-1-sredstva-ms-access/</guid>
		<description><![CDATA[Как выполнить экспорт/импорт в xml средсвами MS Access]]></description>
			<content:encoded><![CDATA[<p><strong>1	Зачем нужен XML</strong></p>
<p>Надеюсь всем известно, что такое XML. Если нет, то осведомляться <a href="http://www.citforum.ru/internet/xml/index.shtml">сюда</a>. В какой-то момент жизни может возникнуть необходимость обмена данными с другими приложениями. Есть уже много форматов данных и много решений. Например, данные можно передавать в непосредственно mdb или dbf, cvs и п.р. Каждый формат имеет свои ограничения. Выгружать данные для сайта в mdb можно, но возникнут сложности с его обработкой. Формат XML хорош тем, что он текстовый и может содержать иерархические данные. Т.е. разбор текста можно написать и самому, чего в большинстве случаев не требуется, и вместо нескольких файлов можно передать один. Рассмотрим способы работы с XML для начала стандартные.</p>
<p><strong>2	Средства MS Access</strong></p>
<p>В Access 2003 реализовано две функции ExportXML и ImportXML.</p>
<p>Функция ExportXML позволяет экспортировать различные объекты базы данных. Такие как таблицы, отчеты, формы и т.п. Также позволяет экспортировать таблицы в иерархическом виде. При этом умеет формировать файл схемы данных и представления.</p>
<p>Синтаксис функции следующий:</p>
<p><em>ExportXML(ObjectType, DataSource, DataTarget, SchemaTarget, PresentationTarget, ImageTarget, Encoding, OtherFlags, FilterCriteria, AdditionalData)</em><br />
<span id="more-7"></span><br />
<em>ObjectType</em> – тип экспортируемого объекта,<br />
<em>DataSource</em> – имя источника данных,<br />
<em>DataTarget</em> – имя файла назначения,<br />
<em>SchemaTarget</em> – имя файла схемы,<br />
<em>PresentationTarget</em> – имя файла представления<br />
<em>ImageTarget</em> – путь для экспорта изображений,<br />
<em>Encoding</em> – кодировка (UTF-8, UTF-16),<br />
<em>OtherFlags</em> – параметры определяющие поведение при экспорте (см. в справке),<br />
<em>FilterCriteria</em> – фильтр,<br />
<em>AdditionalData</em> – Определяет дополнительные таблицы для экспорта.</p>
<p>В <em>AdditionalData</em> и кроется весь секрет экспорта иерархических данных. Функция проста в обращении. Примеры (я опустил нюансы, их можно посмотреть в примере):</p>
<p>Объявления переменных, чтобы не повторятся:</p>
<pre name="code" class="vb">
    Dim objInfoSub As AdditionalData
    Dim objInfoSubSub As AdditionalData</pre>
<p>Экспорт данных:</p>
<pre name="code" class="vb">
    Set objInfoSub = Application.CreateAdditionalData
    Set objInfoSubSub = objInfoSub.Add("tblSub")
    objInfoSubSub.Add "tblSubSub"
    ExportXML acExportTable, "tblMain", CM_GetDBPath() &amp; "AccessFunc_Tbl.xml" _
			 , CM_GetDBPath() &amp; "AccessFunc_TblShema.xml", CM_GetDBPath() &amp; "AccessFunc_Tbl.xsl" _
			 , "Images", , acEmbedSchema, , objInfoSub
</pre>
<p>Экспорт формы:</p>
<pre name="code" class="vb">
Set objInfoSub = Application.CreateAdditionalData
Set objInfoSubSub = objInfoSub.Add("tblSub")
objInfoSubSub.Add "tblSubSub"
ExportXML acExportForm, "frmMain", CM_GetDBPath() &amp; "AccessFunc_Frm.xml" _
		 , CM_GetDBPath() &amp; "AccessFunc_FrmShema.xml", CM_GetDBPath() &amp; "AccessFunc_Frm.xsl" _
		 , "Images", , acEmbedSchema, , objInfoSub
</pre>
<p>Экспорт отчета:</p>
<pre name="code" class="vb">
ExportXML acExportReport, "rptMain", CM_GetDBPath() &amp; "AccessFunc_Rpt.xml" _
        , CM_GetDBPath() &amp; "AccessFunc_RptShema.xml", CM_GetDBPath() &amp; "AccessFunc_Rpt.xsl" _
        , "Images", , acEmbedSchema
</pre>
<p><em>CM_GetDBPath()</em> – возвращает путь к текущей базе. Ее можно увидеть в исходниках.</p>
<p>Самый главный интерес представляет экспорт данных, остальные для меня имею смутное представление. Файлы в результате сохранятся в каталог с базой. А полученные файлы html будут работать в IE, насчет остальных браузеров уверенности нет. Чтобы выгрузить иерархию необходимо заполнить схему данных. Тоже маленький минус.</p>
<p>Функция импорта <em>ImportXML</em> еще проще:</p>
<p><em>ImportXML(DataSource, ImportOptions)</em></p>
<p><em>DataSource</em> – Имя файла.<br />
<em>ImportOptions</em> – Опции импорта: <em>acAppendData</em> – добавить данные в таблицы, <em>acStructureAndData</em> – создать новые структуры таблиц и добавить данные, <em>acStructureOnly</em> – создать только структуры таблиц.</p>
<p>Код импорта прост:</p>
<pre name="code" class="vb">
ImportXML CM_GetDBPath() &amp; "AccessFunc_Tbl.xml", acAppendData
</pre>
<p>Спрашивается: «Куда это все будет импортировано?», «Что будет, если подобные таблицы уже существуют?».</p>
<p>Имена таблиц берутся из xml файла. В результате &#8212; не любой xml подойдет. В нашем случае это тот, который был выгружен ExportXML (или с MS SQL сервера). Чтобы с этим подробнее разобраться, нужно посмотреть структуру полученных в прошлый раз файлов. Ничего сложного там нет. XML файл содержит две секции: структуры данных и самих данных. Воссоздать по образцу и подобию при необходимости не составит особого труда.</p>
<p>Если таблица с таким именем уже существует то, при загрузке данных они добавятся. А при создании новой структуры создадутся с номером.</p>
<p>Еще один недостаток. Импорт производится в текущую базу. При разделении интерфейса и данных придется отдельно запускать MSAccess, открывать отдельно базу (или создавать временную) и импортировать. Например, так:</p>
<pre name="code" class="vb">
Dim apAccess As Access.Application
'--открываем приложение и базу
apAccess.ImportXML ...
</pre>
<p>Если слепой импорт не устраивает, то это единственный вариант. Без дополнительной обработки и программирования никак.</p>
<p>Подробности в <a href="http://5codelines.net/wp-content/uploads/xml_1_sampe.rar">примере</a>.</p>
<p>Продолжение следует. В нем рассмотрим <a href="http://5codelines.net/eksportimport-xml-chast-2-sredstva-ado/">средства библиотеки ADO</a>.</p>
<p>Использованная литература: встроенная справка.</p>
<p align="right">(с) Скоков Сергей</p>
]]></content:encoded>
			<wfw:commentRss>http://5codelines.net/eksportimport-xml-chast-1-sredstva-ms-access/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
	</channel>
</rss>

