<?xml version="1.0"?>
<?xml-stylesheet type="text/css" href="http://wiki.linuxformat.ru/wiki/skins/common/feed.css?303"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="ru">
		<id>http://wiki.linuxformat.ru/wiki/index.php?action=history&amp;feed=atom&amp;title=LXF82%3AOOo_Basic</id>
		<title>LXF82:OOo Basic - История изменений</title>
		<link rel="self" type="application/atom+xml" href="http://wiki.linuxformat.ru/wiki/index.php?action=history&amp;feed=atom&amp;title=LXF82%3AOOo_Basic"/>
		<link rel="alternate" type="text/html" href="http://wiki.linuxformat.ru/wiki/index.php?title=LXF82:OOo_Basic&amp;action=history"/>
		<updated>2026-05-13T06:56:31Z</updated>
		<subtitle>История изменений этой страницы в вики</subtitle>
		<generator>MediaWiki 1.19.20+dfsg-0+deb7u3</generator>

	<entry>
		<id>http://wiki.linuxformat.ru/wiki/index.php?title=LXF82:OOo_Basic&amp;diff=5535&amp;oldid=prev</id>
		<title>Yaleks в 10:40, 23 ноября 2008</title>
		<link rel="alternate" type="text/html" href="http://wiki.linuxformat.ru/wiki/index.php?title=LXF82:OOo_Basic&amp;diff=5535&amp;oldid=prev"/>
				<updated>2008-11-23T10:40:18Z</updated>
		
		<summary type="html">&lt;p&gt;&lt;/p&gt;
&lt;a href=&quot;http://wiki.linuxformat.ru/wiki/index.php?title=LXF82:OOo_Basic&amp;amp;diff=5535&amp;amp;oldid=4678&quot;&gt;Внесённые изменения&lt;/a&gt;</summary>
		<author><name>Yaleks</name></author>	</entry>

	<entry>
		<id>http://wiki.linuxformat.ru/wiki/index.php?title=LXF82:OOo_Basic&amp;diff=4678&amp;oldid=prev</id>
		<title>Yaleks: /* Медиа-библиотека */ оформление</title>
		<link rel="alternate" type="text/html" href="http://wiki.linuxformat.ru/wiki/index.php?title=LXF82:OOo_Basic&amp;diff=4678&amp;oldid=prev"/>
				<updated>2008-05-21T10:36:50Z</updated>
		
		<summary type="html">&lt;p&gt;‎&lt;span dir=&quot;auto&quot;&gt;&lt;span class=&quot;autocomment&quot;&gt;Медиа-библиотека: &lt;/span&gt; оформление&lt;/span&gt;&lt;/p&gt;
&lt;table class='diff diff-contentalign-left'&gt;
				&lt;col class='diff-marker' /&gt;
				&lt;col class='diff-content' /&gt;
				&lt;col class='diff-marker' /&gt;
				&lt;col class='diff-content' /&gt;
			&lt;tr valign='top'&gt;
			&lt;td colspan='2' style=&quot;background-color: white; color:black;&quot;&gt;← Предыдущая&lt;/td&gt;
			&lt;td colspan='2' style=&quot;background-color: white; color:black;&quot;&gt;Версия 10:36, 21 мая 2008&lt;/td&gt;
			&lt;/tr&gt;&lt;tr&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot;&gt;Строка 313:&lt;/td&gt;
&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot;&gt;Строка 313:&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class='diff-marker'&gt;&amp;#160;&lt;/td&gt;&lt;td style=&quot;background: #eee; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;поле, содержащее имя. Вы-то знаете, что Б Гейтс, Уильям Гейтс и&lt;/div&gt;&lt;/td&gt;&lt;td class='diff-marker'&gt;&amp;#160;&lt;/td&gt;&lt;td style=&quot;background: #eee; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;поле, содержащее имя. Вы-то знаете, что Б Гейтс, Уильям Гейтс и&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class='diff-marker'&gt;&amp;#160;&lt;/td&gt;&lt;td style=&quot;background: #eee; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;Властелин Зла означают одно и то же лицо, но ваш компьютер не знает, и это затруднит процесс создания запроса. Взгляните на таблицу:&lt;/div&gt;&lt;/td&gt;&lt;td class='diff-marker'&gt;&amp;#160;&lt;/td&gt;&lt;td style=&quot;background: #eee; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;Властелин Зла означают одно и то же лицо, но ваш компьютер не знает, и это затруднит процесс создания запроса. Взгляните на таблицу:&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class='diff-marker'&gt;−&lt;/td&gt;&lt;td style=&quot;background: #ffa; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;{|&lt;/div&gt;&lt;/td&gt;&lt;td class='diff-marker'&gt;+&lt;/td&gt;&lt;td style=&quot;background: #cfc; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;{| &lt;ins class=&quot;diffchange diffchange-inline&quot;&gt;style=&amp;quot;background:white;color:black;&amp;quot; border=&amp;quot;1&amp;quot; cellspacing=&amp;quot;0&amp;quot; align=&amp;quot;center&amp;quot;&lt;/ins&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td colspan=&quot;2&quot;&gt;&amp;#160;&lt;/td&gt;&lt;td class='diff-marker'&gt;+&lt;/td&gt;&lt;td style=&quot;background: #cfc; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;&lt;ins class=&quot;diffchange diffchange-inline&quot;&gt;|- style=&amp;quot;background:#dfcfe6;color:black&amp;quot;&lt;/ins&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class='diff-marker'&gt;&amp;#160;&lt;/td&gt;&lt;td style=&quot;background: #eee; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;|+Таблица: item&lt;/div&gt;&lt;/td&gt;&lt;td class='diff-marker'&gt;&amp;#160;&lt;/td&gt;&lt;td style=&quot;background: #eee; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;|+Таблица: item&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class='diff-marker'&gt;&amp;#160;&lt;/td&gt;&lt;td style=&quot;background: #eee; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;!Title (Название)&lt;/div&gt;&lt;/td&gt;&lt;td class='diff-marker'&gt;&amp;#160;&lt;/td&gt;&lt;td style=&quot;background: #eee; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;!Title (Название)&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot;&gt;Строка 325:&lt;/td&gt;
&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot;&gt;Строка 326:&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class='diff-marker'&gt;&amp;#160;&lt;/td&gt;&lt;td style=&quot;background: #eee; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;|}&lt;/div&gt;&lt;/td&gt;&lt;td class='diff-marker'&gt;&amp;#160;&lt;/td&gt;&lt;td style=&quot;background: #eee; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;|}&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class='diff-marker'&gt;&amp;#160;&lt;/td&gt;&lt;td style=&quot;background: #eee; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;Взамен можно использовать две таблицы — одна с описанием предметов, другая с авторами:&lt;/div&gt;&lt;/td&gt;&lt;td class='diff-marker'&gt;&amp;#160;&lt;/td&gt;&lt;td style=&quot;background: #eee; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;Взамен можно использовать две таблицы — одна с описанием предметов, другая с авторами:&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class='diff-marker'&gt;−&lt;/td&gt;&lt;td style=&quot;background: #ffa; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;{|&lt;/div&gt;&lt;/td&gt;&lt;td class='diff-marker'&gt;+&lt;/td&gt;&lt;td style=&quot;background: #cfc; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;{| &lt;ins class=&quot;diffchange diffchange-inline&quot;&gt;style=&amp;quot;background:white;color:black;&amp;quot; border=&amp;quot;1&amp;quot; cellspacing=&amp;quot;0&amp;quot; align=&amp;quot;center&amp;quot;&lt;/ins&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td colspan=&quot;2&quot;&gt;&amp;#160;&lt;/td&gt;&lt;td class='diff-marker'&gt;+&lt;/td&gt;&lt;td style=&quot;background: #cfc; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;&lt;ins class=&quot;diffchange diffchange-inline&quot;&gt;|- style=&amp;quot;background:#dfcfe6;color:black&amp;quot;&lt;/ins&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class='diff-marker'&gt;&amp;#160;&lt;/td&gt;&lt;td style=&quot;background: #eee; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;|+Таблица: item&lt;/div&gt;&lt;/td&gt;&lt;td class='diff-marker'&gt;&amp;#160;&lt;/td&gt;&lt;td style=&quot;background: #eee; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;|+Таблица: item&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class='diff-marker'&gt;&amp;#160;&lt;/td&gt;&lt;td style=&quot;background: #eee; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;!Title (Название)&lt;/div&gt;&lt;/td&gt;&lt;td class='diff-marker'&gt;&amp;#160;&lt;/td&gt;&lt;td style=&quot;background: #eee; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;!Title (Название)&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot;&gt;Строка 336:&lt;/td&gt;
&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot;&gt;Строка 338:&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class='diff-marker'&gt;&amp;#160;&lt;/td&gt;&lt;td style=&quot;background: #eee; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;|1&lt;/div&gt;&lt;/td&gt;&lt;td class='diff-marker'&gt;&amp;#160;&lt;/td&gt;&lt;td style=&quot;background: #eee; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;|1&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class='diff-marker'&gt;&amp;#160;&lt;/td&gt;&lt;td style=&quot;background: #eee; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;|}&lt;/div&gt;&lt;/td&gt;&lt;td class='diff-marker'&gt;&amp;#160;&lt;/td&gt;&lt;td style=&quot;background: #eee; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;|}&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class='diff-marker'&gt;−&lt;/td&gt;&lt;td style=&quot;background: #ffa; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;{|&lt;/div&gt;&lt;/td&gt;&lt;td class='diff-marker'&gt;+&lt;/td&gt;&lt;td style=&quot;background: #cfc; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;&amp;#160;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td colspan=&quot;2&quot;&gt;&amp;#160;&lt;/td&gt;&lt;td class='diff-marker'&gt;+&lt;/td&gt;&lt;td style=&quot;background: #cfc; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;{| &lt;ins class=&quot;diffchange diffchange-inline&quot;&gt;style=&amp;quot;background:white;color:black;&amp;quot; border=&amp;quot;1&amp;quot; cellspacing=&amp;quot;0&amp;quot; align=&amp;quot;center&amp;quot;&lt;/ins&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td colspan=&quot;2&quot;&gt;&amp;#160;&lt;/td&gt;&lt;td class='diff-marker'&gt;+&lt;/td&gt;&lt;td style=&quot;background: #cfc; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;&lt;ins class=&quot;diffchange diffchange-inline&quot;&gt;|- style=&amp;quot;background:#dfcfe6;color:black&amp;quot;&lt;/ins&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class='diff-marker'&gt;&amp;#160;&lt;/td&gt;&lt;td style=&quot;background: #eee; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;|+Таблица: author&lt;/div&gt;&lt;/td&gt;&lt;td class='diff-marker'&gt;&amp;#160;&lt;/td&gt;&lt;td style=&quot;background: #eee; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;|+Таблица: author&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class='diff-marker'&gt;&amp;#160;&lt;/td&gt;&lt;td style=&quot;background: #eee; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;!ID&lt;/div&gt;&lt;/td&gt;&lt;td class='diff-marker'&gt;&amp;#160;&lt;/td&gt;&lt;td style=&quot;background: #eee; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;!ID&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot;&gt;Строка 347:&lt;/td&gt;
&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot;&gt;Строка 351:&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class='diff-marker'&gt;&amp;#160;&lt;/td&gt;&lt;td style=&quot;background: #eee; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;автора вы обойдётесь его идентификационным номером. Аналогично,&lt;/div&gt;&lt;/td&gt;&lt;td class='diff-marker'&gt;&amp;#160;&lt;/td&gt;&lt;td style=&quot;background: #eee; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;автора вы обойдётесь его идентификационным номером. Аналогично,&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class='diff-marker'&gt;&amp;#160;&lt;/td&gt;&lt;td style=&quot;background: #eee; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;вам не надо хранить слова cd, lp, book в таблице, содержащей заголовок. Вместо этого можно использовать что-то вроде:&lt;/div&gt;&lt;/td&gt;&lt;td class='diff-marker'&gt;&amp;#160;&lt;/td&gt;&lt;td style=&quot;background: #eee; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;вам не надо хранить слова cd, lp, book в таблице, содержащей заголовок. Вместо этого можно использовать что-то вроде:&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class='diff-marker'&gt;−&lt;/td&gt;&lt;td style=&quot;background: #ffa; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;{|&lt;/div&gt;&lt;/td&gt;&lt;td class='diff-marker'&gt;+&lt;/td&gt;&lt;td style=&quot;background: #cfc; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;{| &lt;ins class=&quot;diffchange diffchange-inline&quot;&gt;style=&amp;quot;background:white;color:black;&amp;quot; border=&amp;quot;1&amp;quot; cellspacing=&amp;quot;0&amp;quot; align=&amp;quot;center&amp;quot;&lt;/ins&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td colspan=&quot;2&quot;&gt;&amp;#160;&lt;/td&gt;&lt;td class='diff-marker'&gt;+&lt;/td&gt;&lt;td style=&quot;background: #cfc; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;&lt;ins class=&quot;diffchange diffchange-inline&quot;&gt;|- style=&amp;quot;background:#dfcfe6;color:black&amp;quot;&lt;/ins&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class='diff-marker'&gt;&amp;#160;&lt;/td&gt;&lt;td style=&quot;background: #eee; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;|+Таблица: item&lt;/div&gt;&lt;/td&gt;&lt;td class='diff-marker'&gt;&amp;#160;&lt;/td&gt;&lt;td style=&quot;background: #eee; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;|+Таблица: item&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class='diff-marker'&gt;&amp;#160;&lt;/td&gt;&lt;td style=&quot;background: #eee; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;!Title&lt;/div&gt;&lt;/td&gt;&lt;td class='diff-marker'&gt;&amp;#160;&lt;/td&gt;&lt;td style=&quot;background: #eee; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;!Title&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot;&gt;Строка 359:&lt;/td&gt;
&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot;&gt;Строка 364:&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class='diff-marker'&gt;&amp;#160;&lt;/td&gt;&lt;td style=&quot;background: #eee; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;|1&lt;/div&gt;&lt;/td&gt;&lt;td class='diff-marker'&gt;&amp;#160;&lt;/td&gt;&lt;td style=&quot;background: #eee; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;|1&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class='diff-marker'&gt;&amp;#160;&lt;/td&gt;&lt;td style=&quot;background: #eee; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;|}&lt;/div&gt;&lt;/td&gt;&lt;td class='diff-marker'&gt;&amp;#160;&lt;/td&gt;&lt;td style=&quot;background: #eee; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;|}&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class='diff-marker'&gt;−&lt;/td&gt;&lt;td style=&quot;background: #ffa; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;{|&lt;/div&gt;&lt;/td&gt;&lt;td class='diff-marker'&gt;+&lt;/td&gt;&lt;td style=&quot;background: #cfc; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;&amp;#160;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td colspan=&quot;2&quot;&gt;&amp;#160;&lt;/td&gt;&lt;td class='diff-marker'&gt;+&lt;/td&gt;&lt;td style=&quot;background: #cfc; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;{| &lt;ins class=&quot;diffchange diffchange-inline&quot;&gt;style=&amp;quot;background:white;color:black;&amp;quot; border=&amp;quot;1&amp;quot; cellspacing=&amp;quot;0&amp;quot; align=&amp;quot;center&amp;quot;&lt;/ins&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td colspan=&quot;2&quot;&gt;&amp;#160;&lt;/td&gt;&lt;td class='diff-marker'&gt;+&lt;/td&gt;&lt;td style=&quot;background: #cfc; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;&lt;ins class=&quot;diffchange diffchange-inline&quot;&gt;|- style=&amp;quot;background:#dfcfe6;color:black&amp;quot;&lt;/ins&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class='diff-marker'&gt;&amp;#160;&lt;/td&gt;&lt;td style=&quot;background: #eee; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;|+Таблица: media&lt;/div&gt;&lt;/td&gt;&lt;td class='diff-marker'&gt;&amp;#160;&lt;/td&gt;&lt;td style=&quot;background: #eee; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;|+Таблица: media&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class='diff-marker'&gt;&amp;#160;&lt;/td&gt;&lt;td style=&quot;background: #eee; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;!ID&lt;/div&gt;&lt;/td&gt;&lt;td class='diff-marker'&gt;&amp;#160;&lt;/td&gt;&lt;td style=&quot;background: #eee; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;!ID&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;/table&gt;</summary>
		<author><name>Yaleks</name></author>	</entry>

	<entry>
		<id>http://wiki.linuxformat.ru/wiki/index.php?title=LXF82:OOo_Basic&amp;diff=4587&amp;oldid=prev</id>
		<title>Yaleks: викификация</title>
		<link rel="alternate" type="text/html" href="http://wiki.linuxformat.ru/wiki/index.php?title=LXF82:OOo_Basic&amp;diff=4587&amp;oldid=prev"/>
				<updated>2008-05-15T12:59:48Z</updated>
		
		<summary type="html">&lt;p&gt;викификация&lt;/p&gt;
&lt;a href=&quot;http://wiki.linuxformat.ru/wiki/index.php?title=LXF82:OOo_Basic&amp;amp;diff=4587&amp;amp;oldid=4586&quot;&gt;Внесённые изменения&lt;/a&gt;</summary>
		<author><name>Yaleks</name></author>	</entry>

	<entry>
		<id>http://wiki.linuxformat.ru/wiki/index.php?title=LXF82:OOo_Basic&amp;diff=4586&amp;oldid=prev</id>
		<title>Yaleks: Новая: {{цикл/OOo_Basic}} == Работа с базой данных == ''ЧАСТЬ 3 Очередной шанс поумнеть при помощи '''Марка Бэйна''' – на ...</title>
		<link rel="alternate" type="text/html" href="http://wiki.linuxformat.ru/wiki/index.php?title=LXF82:OOo_Basic&amp;diff=4586&amp;oldid=prev"/>
				<updated>2008-05-15T12:58:14Z</updated>
		
		<summary type="html">&lt;p&gt;Новая: {{цикл/OOo_Basic}} == Работа с базой данных == &amp;#039;&amp;#039;ЧАСТЬ 3 Очередной шанс поумнеть при помощи &amp;#039;&amp;#039;&amp;#039;Марка Бэйна&amp;#039;&amp;#039;&amp;#039; – на ...&lt;/p&gt;
&lt;p&gt;&lt;b&gt;Новая страница&lt;/b&gt;&lt;/p&gt;&lt;div&gt;{{цикл/OOo_Basic}}&lt;br /&gt;
== Работа с базой данных ==&lt;br /&gt;
''ЧАСТЬ 3 Очередной шанс поумнеть при помощи '''Марка Бэйна''' – на этот раз его макросы и советы по работе с базами данных помогут вам запускать запросы, создавать отчеты в OpenOffice.org и вести учет ваших книг и''&lt;br /&gt;
&lt;br /&gt;
До чего ж я люблю OpenOffice.org – особенно когда использую его вместе с OOo Basic. Не только потому, что он высвобождает меня из клещей ProprietarySoft, Inc – больше потому,&lt;br /&gt;
что он действительно хорош. В предыдущих выпусках мы увидели, как&lt;br /&gt;
легко можно манипулировать текстовыми документами и таблицами с&lt;br /&gt;
помощью OOo Basic. На сей раз –посмотрим, как извлекать информацию из базы данных.&lt;br /&gt;
&lt;br /&gt;
Главное, надо быть как можно ленивее. Представьте, например, что&lt;br /&gt;
вы хотите подготовить счет для ужасно популярного Linux-журнала, в&lt;br /&gt;
который вы пописываете. Зачем терять время, перепечатывая то, что у&lt;br /&gt;
вас уже хранится? Это руководство даст вам инструменты, пресекающие&lt;br /&gt;
лишнюю трату времени, а заодно, естественно, позволит насладиться&lt;br /&gt;
исследованием Unix.&lt;br /&gt;
&lt;br /&gt;
=== Ингредиент №1: сервер базы данных ===&lt;br /&gt;
Начинать – так с начала. Раз уж это руководство по макросам для&lt;br /&gt;
извлечения информации из базы данных, вам понадобится база данных.&lt;br /&gt;
Однако я не намерен рассказывать о ее установке: это выходит за рамки&lt;br /&gt;
руководства. Конечно, если бы вы объявили, что базы данных у вас нет&lt;br /&gt;
и вы даже не знаете, с чего начать, то я ответил бы: «Без паники, это&lt;br /&gt;
легко». Затем я предположил бы, что вам нужен сервер баз данных –&lt;br /&gt;
так ведь можно использовать любой старый компьютер, подсоединить&lt;br /&gt;
его к сети и затем установить Debian (если у вас нет второго компьютера,&lt;br /&gt;
запустите сервер на своей машине). Вы сами можете создать минимальный загрузочный диск с http://www.debian.org, вставить в привод, перезагрузиться и следовать инструкциям. Об установке дополнительного программного обеспечения (рабочего стола, файл-сервера, web-сервера и&lt;br /&gt;
т.д.) беспокоиться нечего: достаточно необходимого минимума.&lt;br /&gt;
&lt;br /&gt;
Тут я велел бы вам превратить ваш компьютер в сервер баз данных&lt;br /&gt;
с помощью команды apt-get install mysql-server, а затем отредактировать файл /etc/mysql/my.cnf, закомментировав строку bind-address&lt;br /&gt;
= 127.0.0.1 (чтоб она выглядела как #bind-address = 127.0.0.1). Это&lt;br /&gt;
позволит подключаться к серверу с любого компьютера вашей сети.&lt;br /&gt;
&lt;br /&gt;
Вам, небось, захотелось бы создать и базу данных, и пользователя&lt;br /&gt;
для доступа к ней. Тогда бы я посоветовал сделать следующее:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;sql&amp;quot;&amp;gt;&lt;br /&gt;
mysql -uroot mysql&lt;br /&gt;
set password for ‘root’@’localhost’ = password(‘put your own password here’);&lt;br /&gt;
create database accounts;&lt;br /&gt;
grant all privileges on accounts.* to ‘your user’@’%’&lt;br /&gt;
identified by ‘your user password’;&lt;br /&gt;
exit;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Наконец, я предложил бы задать вашему новому серверу статический IP-адрес, отредактировав файл /etc/network/interfaces так, чтобы конец файла был похож на следующее:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;ini&amp;quot;&amp;gt;&lt;br /&gt;
#iface eth0 inet dhcp&lt;br /&gt;
iface eth0 inet static&lt;br /&gt;
address 192.168.1.3&lt;br /&gt;
netmask 255.255.255.0&lt;br /&gt;
gateway 192.168.1.1&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
В этом пункте я бы отметил, что вам пора перегрузиться и зайти на&lt;br /&gt;
компьютер, где у вас стоит OpenOffice.org.&lt;br /&gt;
&lt;br /&gt;
Но так как наше руководство исключительно про OOo Basic, а не про&lt;br /&gt;
создание баз данных, всего этого я делать не буду.&lt;br /&gt;
&lt;br /&gt;
=== Доступ к базе данных ===&lt;br /&gt;
{{Врезка&lt;br /&gt;
|Заголовок=«СВОИЖ БЕЗУМСТВА ИХ И ПОГУБИЛИ»&lt;br /&gt;
|Содержание=&lt;br /&gt;
Удивлены выбором имен хостов? Они из Илиады Гомера.&lt;br /&gt;
При всей моей любви к&lt;br /&gt;
Властелину колец (источник&lt;br /&gt;
большинства имен хостов) я&lt;br /&gt;
нахожу удивительным, что история из бронзового века так&lt;br /&gt;
схожа с сегодняшним днем и&lt;br /&gt;
что человечество ничуть не изменилось за этот долгий срок.&lt;br /&gt;
|Ширина=150px}}&lt;br /&gt;
OpenOffice.org пока не запускайте. Чтобы облегчить себе жизнь (для&lt;br /&gt;
того и придуманы макросы), воспользуемся UnixODBC, это API для&lt;br /&gt;
доступа к источникам данных, который избавит нас от трудностей создания соединений к серверу и базам данных – протоколы, посылка сигналов и все такое прочее. Самое сложное, что предстоит сделать – это&lt;br /&gt;
установить UnixODBC и его библиотеки MySQL на машину, где вы будете&lt;br /&gt;
использовать OOo. На Debian это делается всего-навсего через&lt;br /&gt;
 apt-get install unixodbc&lt;br /&gt;
 apt-get install libmyodbc&lt;br /&gt;
Очевидно, если у вас другой дистрибутив, то придётся проверить&lt;br /&gt;
для него процесс установки – взгляните на UnixODBC на странице http://www.unixODBC.org. Когда вы установите UnixODBC, понадобятся еще две&lt;br /&gt;
вещи. Первое – отредактировать /etc/hosts так, чтобы он включал&lt;br /&gt;
ссылку на сервер вашей базы данных, то есть 192.168.1.3 acamas.&lt;br /&gt;
Второе – отредактировать /etc/odbc.ini, чтобы он включал примерно&lt;br /&gt;
следующее:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;ini&amp;quot;&amp;gt;&lt;br /&gt;
(accounts)&lt;br /&gt;
Description = MySQL db test&lt;br /&gt;
Driver = MySQL&lt;br /&gt;
Server = acamas&lt;br /&gt;
Database = accounts&lt;br /&gt;
Port = 3306&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Теперь – глубокий вдох, сосчитать до пяти, медленный выдох, и&lt;br /&gt;
готово дело: нет больше командных строк.&lt;br /&gt;
&lt;br /&gt;
=== Разборки с базой данных ===&lt;br /&gt;
Откройте OpenOffice.org. Тип документа безразличен; пусть, например,&lt;br /&gt;
это будет документ Writer. В меню Tools [Сервис, иногда нужный вам&lt;br /&gt;
пункт оказывается в меню View (Вид), – прим.ред.] среди подменю имеется одно под названием Data Sources (Источники данных). Кликните&lt;br /&gt;
на нем, и вы увидите форму Data Source Administration (Управление&lt;br /&gt;
источникам данных).&lt;br /&gt;
&lt;br /&gt;
С ней все просто: нажмите New Data Source (Новый источник данных) и установите тип базы MySQL на вкладке General (Общие). Затем&lt;br /&gt;
перейдите на вкладку MySQL, добавьте имя базы данных в Data Source&lt;br /&gt;
URL (Адрес источника данных) и введите имя пользователя (не забудьте&lt;br /&gt;
создать пустую базу данных и пользователя, прежде чем получать к ней&lt;br /&gt;
доступ из OOo). Далее нажмите на закладку Tables (Таблицы). Там ничего не будет (потому что никаких таблиц вы еще не создали). Угадайте,&lt;br /&gt;
что мы теперь сделаем? Правильно, рванём в пивбар, с вас причитается.&lt;br /&gt;
Нет? Ладно, оставим это на потом: время создавать данные.&lt;br /&gt;
&lt;br /&gt;
Если вы любитель командной строки (должен сознаться, что я из&lt;br /&gt;
них), вернитесь на сервер с базой данных, зайдите в базу и создайте&lt;br /&gt;
таблицы. Не забывайте, что вы можете подключиться прямо с текущей&lt;br /&gt;
машины.&lt;br /&gt;
&amp;lt;source lang=&amp;quot;sql&amp;quot;&amp;gt;&lt;br /&gt;
bainm@hector:~/ooobasic3$ mysql -hacamas -ubainm -pmypassword accounts&lt;br /&gt;
mysql &amp;gt; create database accounts;&lt;br /&gt;
create table accounts.customer (id int auto_increment,&lt;br /&gt;
surname varchar(50), firstname varchar(50),&lt;br /&gt;
address1 varchar(50), address2 varchar(50), city varchar(50), county&lt;br /&gt;
varchar(50), country varchar(50), postcode varchar(50),primary key (id));&lt;br /&gt;
create table accounts.invoice (id int auto_increment,customer_id int,&lt;br /&gt;
sent_date date,paid_date date,primary key (id));&lt;br /&gt;
create table accounts.item (id int auto_increment,customer_id int,&lt;br /&gt;
invoice_id int,title varchar(50),details varchar(255),value double,&lt;br /&gt;
primary key (id));&lt;br /&gt;
insert into accounts.customer&lt;br /&gt;
(surname,firstname,address1, address2,city,county,country,postcode)&lt;br /&gt;
values&lt;br /&gt;
(‘Smith’,’John’,’The Big House’,’1 The Street’,’Thistown’,’Thisshire’,’UK’,’TH 1 1HT’);&lt;br /&gt;
insert into accounts.customer&lt;br /&gt;
(surname,firstname,address1, address2,city,county,country,postcode)&lt;br /&gt;
values&lt;br /&gt;
(‘Jones’,’Mary’,’Building A’,’Industrial Est.’,’Hereton’,’Herehire’,’UK’,’HE1 1EH’);&lt;br /&gt;
insert into accounts.item (customer_id,title,value) values (1,’A fine piece of work’,500);&lt;br /&gt;
insert into accounts.item (customer_id,title,value) values (1,’A great job’,500);&lt;br /&gt;
insert into accounts.item (customer_id,title,value) values (2,’Day 1’,1500);&lt;br /&gt;
insert into accounts.item (customer_id,title,value) values (2,’Day 2’,1600);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Кого это в восторг не приводит, пусть возьмёт форму Data Source&lt;br /&gt;
Administration (Управление источникам данных), перейдёт на вкладку&lt;br /&gt;
Tables (Таблицы) и нажмёт на кнопку New Table Design (Создать новую&lt;br /&gt;
таблицу). Можете воспользоваться формой Table Design (Создание&lt;br /&gt;
таблицы), с её помощью таблицы создавать легко.&lt;br /&gt;
&lt;br /&gt;
=== Работа с новыми таблицами ===&lt;br /&gt;
Мы извели довольно много времени на разборки с базой данных – без&lt;br /&gt;
её правильной работы не обойтись, а все остальное само встанет на свои&lt;br /&gt;
места. Теперь можно заняться нашим первым макросом для работы с&lt;br /&gt;
базой данных. Если вы следовали руководству прошлого выпуска, то&lt;br /&gt;
привыкли к функции OOo CreateUnoService (вы ведь практиковались,&lt;br /&gt;
не так ли?). Мы снова собираемся использовать ее здесь, на сей раз&lt;br /&gt;
для доступа к RowSet. Это имя OOo для набора записей, оно позволяет&lt;br /&gt;
выполнять запросы к базе данных и получать от нее информацию.&lt;br /&gt;
 RowSet = createUnoService(“com.sun.star.sdb.RowSet”)&lt;br /&gt;
Осталось только сказать RowSet о базе данных, к которой вы&lt;br /&gt;
хотите подключиться (то есть к той, что вы установили в Data Source&lt;br /&gt;
Administration (Управление источникам данных)): сообщите имя пользователя, пароль и запрос, который хотите выполнить. RowSet получит&lt;br /&gt;
результат запроса и представит его вам.&lt;br /&gt;
&lt;br /&gt;
Поэтому вы, видимо, захотите сделать следующее:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;oobas&amp;quot;&amp;gt;&lt;br /&gt;
sub main&lt;br /&gt;
sql1&lt;br /&gt;
end sub&lt;br /&gt;
Sub sql1&lt;br /&gt;
Dim RowSet&lt;br /&gt;
RowSet = createUnoService(“com.sun.star.sdb.RowSet”)&lt;br /&gt;
RowSet.DataSourceName = “Accounts”&lt;br /&gt;
RowSet.User=”bainm”&lt;br /&gt;
RowSet.Password = “password”&lt;br /&gt;
RowSet.Command = “SELECT count(*) c FROM item”&lt;br /&gt;
RowSet.execute()&lt;br /&gt;
RowSet.next()&lt;br /&gt;
MsgBox “There are “ + rowSet.getString(1) + “ items”&lt;br /&gt;
End Sub&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Отлично, теперь рассмотрим следующий пример:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;oobas&amp;quot;&amp;gt;&lt;br /&gt;
Dim RowSet&lt;br /&gt;
Sub Main&lt;br /&gt;
connectToDatabase (“Accounts”, “bainm”, “kawasaki”)&lt;br /&gt;
sql1&lt;br /&gt;
End Sub&lt;br /&gt;
Sub connectToDatabase(database as string, username as string, password&lt;br /&gt;
as string)&lt;br /&gt;
RowSet = createUnoService(“com.sun.star.sdb.RowSet”)&lt;br /&gt;
RowSet.DataSourceName = database&lt;br /&gt;
RowSet.User = username&lt;br /&gt;
RowSet.Password = password&lt;br /&gt;
End Sub&lt;br /&gt;
Sub updateRowSet(sql as string)&lt;br /&gt;
RowSet.Command = sql&lt;br /&gt;
RowSet.execute()&lt;br /&gt;
End Sub&lt;br /&gt;
Sub sql1&lt;br /&gt;
updateRowSet(“SELECT count(*) c FROM item”)&lt;br /&gt;
RowSet.next()&lt;br /&gt;
MsgBox “There are “ + rowSet.getString(1) + “ items”&lt;br /&gt;
End Sub&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Теперь понятно, как легко расширить функциональность макроса.&lt;br /&gt;
Взгляните:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;oobas&amp;quot;&amp;gt;&lt;br /&gt;
Sub sql2&lt;br /&gt;
updateRowSet(“SELECT id, surname, firstname FROM&lt;br /&gt;
customer”)&lt;br /&gt;
while RowSet.Next()&lt;br /&gt;
MsgBox “Customer No. “ + rowSet.getString(1) +&lt;br /&gt;
“ “ + rowSet.getString(2) + _&lt;br /&gt;
“ “ + rowSet.getString(3)&lt;br /&gt;
wend&lt;br /&gt;
End Sub&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Написание отчетов ===&lt;br /&gt;
Мы увидели, что с помощью макроса легко получить доступ к базе&lt;br /&gt;
данных и отобразить результаты. Но пока не увидели ничего такого,&lt;br /&gt;
чего нельзя сделать столь же легко из командой строки. Вспомните&lt;br /&gt;
LXF80: там мы осуществляли запись напрямую в документы OOo Writer.&lt;br /&gt;
Видимо, неглупо будет аналогично поступить с информацией из нашей&lt;br /&gt;
базы данных.&lt;br /&gt;
&lt;br /&gt;
Замечательно то, что мы можем делать впечатляющие вещи&lt;br /&gt;
добавкой всего нескольких строк кода. Мы уже разбирали процедуру&lt;br /&gt;
loadNewFile (мы познакомились с ней в LXF80 и модифицировали в&lt;br /&gt;
LXF81) для создания нового документа Writer, и у нас есть процедура&lt;br /&gt;
add_paragraph для записи в документ (не пугайтесь, весь нужный код&lt;br /&gt;
содержится на прилагаемом диске). Надо только добавить процедуры&lt;br /&gt;
для создания отчетов по информации в базе данных. Вот простой способ создания документа, содержащего список всех покупателей в базе&lt;br /&gt;
данных Accounts:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;oobas&amp;quot;&amp;gt;&lt;br /&gt;
Dim RowSet&lt;br /&gt;
Sub Main&lt;br /&gt;
connectToDatabase (“Accounts”, “bainm”, “kawasaki”)&lt;br /&gt;
loadNewFile&lt;br /&gt;
createCustomerReport&lt;br /&gt;
End Sub&lt;br /&gt;
Sub createCustomerReport&lt;br /&gt;
updateRowSet(“SELECT id, surname, firstname FROM&lt;br /&gt;
customer”)&lt;br /&gt;
while RowSet.Next()&lt;br /&gt;
add_paragraph(“Customer No. “ + _&lt;br /&gt;
rowSet.getString(1) + “ “ + rowSet.getString(2) +&lt;br /&gt;
“ “ + rowSet.getString(3))&lt;br /&gt;
wend&lt;br /&gt;
End Sub&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Вот и вся любовь. Процесс прост: посылаете запрос в базу данных, а&lt;br /&gt;
затем отображаете результат в документ. Конец истории? Вообще-то не&lt;br /&gt;
совсем. В LXF80 мы обнаружили: никто не любит менять функцию Main&lt;br /&gt;
под создание каждого нового отчета – ну разве что мазохисты. И снова,&lt;br /&gt;
ключевым моментом является создание диалогового окна для управления требуемыми работами.&lt;br /&gt;
&lt;br /&gt;
Вам уже не понадобится вручную набирать содержимое элементов в виде списка. Нет, на этот раз вы загрузите их прямо из базы&lt;br /&gt;
данных. Представим, что вы добавили элемент list box и назвали его&lt;br /&gt;
lstCustomers в диалоговом окне dlgAccounts. Чем его загружать? Вы&lt;br /&gt;
меня опередили: можно послать запрос в базу данных на получение&lt;br /&gt;
списка покупателей:&lt;br /&gt;
 updateRowSet(“SELECT surname, firstname FROM customer”)&lt;br /&gt;
Теперь в цикле переберите набор записей и загрузите их в элемент&lt;br /&gt;
&amp;lt;source lang=&amp;quot;oobas&amp;quot;&amp;gt;&lt;br /&gt;
list box:&lt;br /&gt;
lstCustomers.AddItem(rowSet.getString(2) + “ “ + rowSet.&lt;br /&gt;
getString(1), i)&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Просмотрите процедуру loadlstCustomers, расположенную на&lt;br /&gt;
нашем диске, чтобы разобраться, как она работает.&lt;br /&gt;
&lt;br /&gt;
Новый элемент list box пригодится как фильтр для создания произвольных отчетов. Допустим, вам захотелось увидеть все предметы,&lt;br /&gt;
купленные определенным покупателем – ну так используйте свойство&lt;br /&gt;
selectedItem из list box и получите выбранный текст, а затем примените его для создания SQL-запроса:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;oobas&amp;quot;&amp;gt;&lt;br /&gt;
sql = “ select title,value from customer, item “ + _&lt;br /&gt;
“ where cutomer.id = item.customer_id “ + _&lt;br /&gt;
“ and concat(customer.firstname,concat(‘ ‘,customer.surname))&lt;br /&gt;
= ‘” + _&lt;br /&gt;
lstCustomers.selectedItem +”’”&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Ешё лучше встроить SQL в функцию. Зачем? Таким образом вы&lt;br /&gt;
сможете использовать запрос в любой процедуре без необходимости&lt;br /&gt;
переписывания кода. Теперь добавьте в окно кнопку, ассоциируйте с ней&lt;br /&gt;
процедуру и начинайте пользоваться. Для начала сделайте процедуру,&lt;br /&gt;
выводящую на экран окно с вашим построенным SQL-запросом. Теперь&lt;br /&gt;
используйте SQL для получения нового набора записей и запишите&lt;br /&gt;
итог в документ Writer. cmdItemReport с нашего диска покажет вам&lt;br /&gt;
это в действии.&lt;br /&gt;
&lt;br /&gt;
Я уверен: вы поймете, как всё это просто (запомните хорошенько:&lt;br /&gt;
это просто), и автоматизация извлечения информации из базы данных&lt;br /&gt;
в документ OOo Writer тоже проста. Вас, наверное, не удивит, что данные можно передавать и в таблицу Calc. Взаимодействие с базой данных происходит таким же образом. Единственное отличие – вы должны&lt;br /&gt;
писать в отдельные ячейки, а не в абзацы, а это даёт даже больше гибкости в отображении вашей информации.&lt;br /&gt;
&lt;br /&gt;
А теперь я вас покидаю – придумайте сами, что теперь делать: всё&lt;br /&gt;
необходимое мы обсудили в LXF80, LXF81 и в этом выпуске. И если вы&lt;br /&gt;
всё ещё в тупике, то загляните в раздел «Журнал» на диске – готовые&lt;br /&gt;
программы уже ждут вас не дождутся.&lt;br /&gt;
&lt;br /&gt;
=== Медиа-библиотека ===&lt;br /&gt;
На закуску рассмотрим простое приложение – оно поможет вам хранить и просматривать список всех ваших CD- и DVD-дисков, пластинок&lt;br /&gt;
или книг.&lt;br /&gt;
&lt;br /&gt;
Начните с создания таблиц в вашей базе данных. Вам придется&lt;br /&gt;
задаться вопросом: работать ли с отдельной базой данных для каждого&lt;br /&gt;
проекта или поместить все таблицы в одну базу? Я бы порекомендовал первое – так проще управлять информацией. Однако, выбрав этот&lt;br /&gt;
метод, не забудьте добавить запись о новой базе в /etc/odbc.ini и&lt;br /&gt;
добавьте ее как новый источник данных в OpenOffice.org. Понадобится&lt;br /&gt;
также подсказать макросу, чтобы он использовал новую базу данных –&lt;br /&gt;
поменяв connectToDatabase (“Accounts”, “bainm”, “kawasaki”) на&lt;br /&gt;
connectToDatabase (“library”, “bainm”, “kawasaki”).&lt;br /&gt;
&lt;br /&gt;
Далее: не пытайтесь вбить всё в одну таблицу – получите только&lt;br /&gt;
проблемы. Какие именно? Что ж, давайте рассмотрим простой пример –&lt;br /&gt;
поле, содержащее имя. Вы-то знаете, что Б Гейтс, Уильям Гейтс и&lt;br /&gt;
Властелин Зла означают одно и то же лицо, но ваш компьютер не знает, и это затруднит процесс создания запроса. Взгляните на таблицу:&lt;br /&gt;
{|&lt;br /&gt;
|+Таблица: item&lt;br /&gt;
!Title (Название) &lt;br /&gt;
!Author (Автор)&lt;br /&gt;
|-&lt;br /&gt;
|Колыбель для кошки &lt;br /&gt;
|Курт Воннегут&lt;br /&gt;
|-&lt;br /&gt;
|Бойня номер 5 &lt;br /&gt;
|К Воннегут&lt;br /&gt;
|}&lt;br /&gt;
Взамен можно использовать две таблицы – одна с описанием предметов, другая с авторами:&lt;br /&gt;
{|&lt;br /&gt;
|+Таблица: item&lt;br /&gt;
!Title (Название) &lt;br /&gt;
!Author (Автор)&lt;br /&gt;
|-&lt;br /&gt;
|Табакерка Багомбо &lt;br /&gt;
|1&lt;br /&gt;
|-&lt;br /&gt;
|Сирены Титана &lt;br /&gt;
|1&lt;br /&gt;
|}&lt;br /&gt;
{|&lt;br /&gt;
|+Таблица: author&lt;br /&gt;
!ID &lt;br /&gt;
!Name (Имя)&lt;br /&gt;
|-&lt;br /&gt;
|1 &lt;br /&gt;
|Курт Воннегут-младший&lt;br /&gt;
|}&lt;br /&gt;
Таким образом, вместо запоминания всевозможных написаний имени&lt;br /&gt;
автора вы обойдётесь его идентификационным номером. Аналогично,&lt;br /&gt;
вам не надо хранить слова cd, lp, book в таблице, содержащей заголовок. Вместо этого можно использовать что-то вроде:&lt;br /&gt;
{|&lt;br /&gt;
|+Таблица: item&lt;br /&gt;
!Title &lt;br /&gt;
!Media ID (Тип носителя)&lt;br /&gt;
|-&lt;br /&gt;
|Бомба для мозгов &lt;br /&gt;
|2&lt;br /&gt;
|-&lt;br /&gt;
|Дзен и искусство ухода&lt;br /&gt;
за мотоциклом&lt;br /&gt;
|1&lt;br /&gt;
|}&lt;br /&gt;
{|&lt;br /&gt;
|+Таблица: media&lt;br /&gt;
!ID &lt;br /&gt;
!Type&lt;br /&gt;
|-&lt;br /&gt;
|1 &lt;br /&gt;
|Book&lt;br /&gt;
|-&lt;br /&gt;
|2 &lt;br /&gt;
|CD&lt;br /&gt;
|}&lt;br /&gt;
Теперь с помощью SQL-запроса вы можете получить из базы данных&lt;br /&gt;
полезную информацию:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;sql&amp;quot;&amp;gt;&lt;br /&gt;
select item.title, author.name, media.type&lt;br /&gt;
from item, author, media&lt;br /&gt;
where item.author_id = author.id&lt;br /&gt;
and item.media_id = media.id;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Используйте этот SQL-запрос в процедуре заполнения таблицы&lt;br /&gt;
результатом запроса – изучите showFullLibrary на диске, чтобы понять,&lt;br /&gt;
как это работает (там же вы найдете SQL-запрос для создания базы&lt;br /&gt;
данных и пример файла /etc/odbc.ini). Внимательно посмотрев на&lt;br /&gt;
этот макрос, вы обнаружите, что в нем не содержится жестко заданного&lt;br /&gt;
числа столбцов, когда осуществляется запись в документ; вместо этого&lt;br /&gt;
для создания цикла используется свойство RowSet.Columns.Count. И&lt;br /&gt;
что? А вот что: неважно, если вы измените число записей, получаемых&lt;br /&gt;
в запросе – макрос автоматически вставит правильное число столбцов&lt;br /&gt;
в таблицу.&lt;br /&gt;
&lt;br /&gt;
=== Фильтрация данных ===&lt;br /&gt;
Так и слышу ваш крик: «Да не хочу я видеть все, что содержится в базе&lt;br /&gt;
данных! Мне надо смотреть только CD-диски, или только книги, или&lt;br /&gt;
только работы одного художника». Что ж, легко – если вы создадите&lt;br /&gt;
новую форму, то можете добавить на нее несколько элементов list box&lt;br /&gt;
и заполнить их из таблиц author и media (так же, как мы сделали в примере с покупателями). Элементы list box можно использовать как фильтры для построения запроса. На диске, showFilteredLibrary показывает,&lt;br /&gt;
как использовать опциональный ввод для построения такого фильтра и&lt;br /&gt;
последующего отображения результата в таблицу.&lt;br /&gt;
&lt;br /&gt;
Чтобы добавить в базу новые предметы, авторов или типы носителей, вам пригодится выражение insert, например:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;sql&amp;quot;&amp;gt;&lt;br /&gt;
insert into library.author (name) values (‘Hawkwind’);&lt;br /&gt;
insert into library.item (title,author_id,media_id) values (‘The Ambient Anarchists’,4,1);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Можно это сделать и из командной строки, но приобретённые знания помогут вам создать форму, которая выполнит всю&lt;br /&gt;
работу за вас.&lt;br /&gt;
&lt;br /&gt;
=== Домашнее задание ===&lt;br /&gt;
Задание на месяц (и никаких экивоков типа «если&lt;br /&gt;
у вас будет время, то...» –&lt;br /&gt;
это нужно не мне, а вам):&lt;br /&gt;
проанализируйте свои каждодневные задачи и выберите те, которые можно автоматизировать рассмотренным нами способом.&lt;br /&gt;
Не ради увеличения производительности и тому подобной ерунды, а исключительно из лени. Рекомендую также взглянуть на запросы&lt;br /&gt;
update – почему бы не записывать данные в базу так же, как и читать&lt;br /&gt;
их из нее?&lt;/div&gt;</summary>
		<author><name>Yaleks</name></author>	</entry>

	</feed>