О компании  |  Услуги  |  Партнёрам  |  OpenOffice.org  |  OpenOffice-Enterprise  |  Купить  |  Скачать  |  Форум 
 
OpenOffice.org
История версий
Статьи и переводы
Глоссарий











Rambler's Top100

Главная OpenOffice.org Статьи и переводы

OpenOffice.org и библиотечные технологии. Есть контакт?!


«Живут же люди, в библиотеку ходят...»

Данная статья предназначена для сотрудников работающих над автоматизацией библиотечных процессов в библиотеке учебного заведения, и возможно найдёт дальнейшее развитие, пожалуй, как создание библиографических баз данных опубликованных в сети интернет. Статья состоит из двух частей: разработка и использование.
В частности статья направлена на связь библиотечной программы MarcSQL разработанной фирмой Информсистема, и пакта OpenOffice.org в части базы данных библиографии. Принцип разработки может быть применён и в других библиотечных программах.

В первую очередь необходимо создать базу данных чтобы в неё можно было записывать или обновлять данные из библиотечной программы и чтобы её можно было использовать в качестве базы данных библиографии в OpenOffice.org. Для того, чтобы эта база соответствовала второму условию, необходимо иметь в ней таблицу с названием biblio и поля таблицы должны быть Identifier, Type, Address, Annote, Author, Booktitle, Chapter, Edition, Editor, Howpublish, Institutn, Journal, Month, Note, Number, Organizat, Pages, Publisher, School, Series, Title, RepType, Volume, Year, URL, Custom1, Custom2, Custom3, Custom4, Custom5, ISBN, а SQL запрос для создания этой таблицы выглядит так:

CREATE TABLE biblio (  "Identifier" varchar(50) NOT NULL,  "Type" varchar(50),  
"Address" varchar(50),  "Annote" varchar(50),  "Author" varchar(75),  
"Booktitle" varchar(50),  "Chapter" varchar(50),  "Edition" varchar(50),  
"Editor" varchar(50),  "Howpublish" varchar(50),  "Institutn" varchar(50),  
"Journal" varchar(50),  "Month" varchar(50),  "Note" varchar(50),  
"Number" varchar(50),  "Organizat" varchar(50),  "Pages" varchar(50),  
"Publisher" varchar(50),  "School" varchar(50),  "Series" varchar(50),  
"Title" varchar(75),  "RepType" varchar(50),  "Volume" varchar(50),  
"Year" varchar(50),  "URL" varchar(50),  "Custom1" varchar(50),  
"Custom2" varchar(50),  "Custom3" varchar(50),  "Custom4" 
varchar(50),  "Custom5" varchar(50),  "ISBN" varchar(50))


хотя длину полей можно сделать больше, и тип может быть MIME.
Программа MarcSQL умеет работать с многими базами данных, и умеет выполнять, как видно из названия, SQL запросы, в принципе мы не будем менять стандартной базы данных MarcSQL, а оставим «родную» в формате MSAccess. Как правило в библиотеках существуют несколько каталогов (баз данных), это каталог книги и каталог статьи. Возможно использовать как совместно, так и отдельно, о преимуществах и недостатках использования совместного или раздельного использования каталогов я напишу ниже.
Создадим базу в формате MSAccess именем biblio и таблицей biblio содержащей поля описанные выше. Далее есть 2 способа, либо зарегистрировать эту базу в ODBC, либо открыть базу каталога и сделать из неё связь с таблицей biblio в базе biblio.
Либо не создавать базу, а добавить таблицу biblio в базу данных каталога, в этом случае будут использоваться раздельные базы библиографии в OpenOffice.org.
Далее нам надо написать скрипт для добавления или обновления таблицы biblio из программы MarcSQL. Скрипт должен лежать в каталоге MarcSQL папка scp, создайте файл с именем OpenOffice.scp

~Comment(Начало скрипта)
~Comment(поле УРЛ, получение значения)
~IfExists(~GetSubTag(856u),~SetParam(856uss,. - Режим доступа: ~CondText(,~GetSubTag(856u),)))
~Comment(SQL запросы для библиографического описания )
~SqlSetQuery(INV5,SELECT INV.INV_ID,INV.REGDATE,INV.T090f,INV.T876c FROM INV WHERE INV.DOC_ID=~GetDocId() ORDER BY INV.T090f)
~SqlSetQuery(INV6,SELECT INV.INV_ID,INV.REGDATE,INV.T090f,INV.T876c FROM INV WHERE INV.DOC_ID=~GetDocId() ORDER BY INV.T090f)
~Comment(Построение библиографического описания, присвоение его переменной bibliogr)
~SetParam(bibliogr, ~IfExists( ~GetSubTag(100a), ~GetSubTag(100a)) ~IfExists( ~GetSubTag(130a), ~GetSubTag(130a)) ~GetSubTag(245a) ~IfExists(~GetSubTag(245h), [~GetSubTag(245h)]) ~IfExists( ~GetSubTag(245o),= ~GetSubTag(245o)) ~ArrayClear(245bm) ~ForSubTags(245b,val, ~ArrayAdd(245bm, ~GetParam(val))) ~SetParam(245bs, ~ArrayToString(245bm,: )) ~IfExists( ~GetParam(245bs) ,: ~GetParam(245bs)) ~IfExists( ~GetSubTag(245n), ~GetSubTag(245n)) ~IfExists( ~GetSubTag(245p),: ~GetSubTag(245p)) ~IfExists( ~GetSubTag(245c),/ ~GetSubTag(245c)) ~IfExists( ~GetSubTag(773a) ~GetSubTag(773t) ~GetSubTag(773d),// ) ~IfExists( ~GetSubTag(773a), ~GetSubTag(773a)) ~IfExists( ~GetSubTag(773t), ~GetSubTag(773t)) ~IfExists( ~GetSubTag(773d),. - ~GetSubTag(773d)) ~IfExists( ~GetSubTag(773g),. - ~GetSubTag(773g)) ~IfExists( ~GetSubTag(250a),. - ~GetSubTag(250a)) ~IfExists( ~GetSubTag(250b),; ~GetSubTag(250b)) ~IfExists( ~GetSubTag(247a),. - ~GetSubTag(247a)) ~IfExists( ~GetSubTag(247f), ~IfExists( ~GetSubTag(247a),; ,. - ) ~GetSubTag(247f)) ~IfExists( ~GetSubTag(256a),. - ~GetSubTag(256a)) ~IfExists( ~GetSubTag(260a),. - ~GetSubTag(260a)) ~IfExists( ~GetSubTag(260b),: ~GetSubTag(260b)) ~IfExists( ~GetSubTag(260c),\, ~GetSubTag(260c)) ~IfExists( ~GetSubTag(300a),. - ~GetSubTag(300a)) ~IfExists( ~GetSubTag(300b),: ~GetSubTag(300b)) ~IfExists( ~GetSubTag(300c),. - ~GetSubTag(300c)) ~ArrayClear(490am) ~ForSubTags(490a,val4, ~ArrayAdd(490am, ~GetParam(val4))) ~SetParam(490as, ~ArrayToString(490am,\). - \()) ~IfExists( ~GetParam(490as) ,. - \( ~GetParam(490as)\)) ~ArrayClear(773km) ~ForSubTags(773k,val4, ~ArrayAdd(773km, ~GetParam(val4))) ~SetParam(773ks, ~ArrayToString(773km,\). - \()) ~IfExists( ~GetParam(773ks) ,. - \( ~GetParam(773ks)\)) ~ArrayClear(500am) ~ForSubTags(500a,val, ~ArrayAdd(500am, ~GetParam(val))) ~SetParam(500as, ~ArrayToString(500am,. - )) ~IfExists( ~GetParam(500as) ,. - ~GetParam(500as)) ~IfExists( ~GetSubTag(306a), ~SetParam(hh, ~SubString( ~GetSubTag(306a),0,2)) ~SetParam(mm, ~SubString( ~GetSubTag(306a),2,2)) ~SetParam(ss, ~SubString( ~GetSubTag(306a),-2))) ~IfExists( ~GetSubTag(306a),. - Продолжительность: ~GetParam(hh) час. ~GetParam(mm) мин. ~GetParam(ss) сек. )~IfExists(~GetSubTag(020a),. - ISBN ~GetSubTag(020a)) ~SetParam(020cs,) ~IfExists( ~GetSubTag(020c), ~SetParam(020cs, ~GetSubTag(020c))) ~SqlForEveryRow(INV5, ~IfExists( ~SqlGetColumn(INV5,4), ~SetParam(020cs, ~SqlGetColumn(INV5,4)))) ~IfExists( ~GetParam(020cs), ~IfExists( ~GetSubTag(020a),: ,. - ) ~GetParam(020cs)) ~IfExists( ~GetSubTag(856u), ~IfExists( ~GetParam(856uss), ~GetParam(856uss))))
~Comment(Построение Заголовка для title, присвоение его переменной title)
~SetParam(title, ~GetSubTag(245a) ~IfExists( ~GetSubTag(245h), [ ~GetSubTag(245h)]) ~IfExists( ~GetSubTag(245o),= ~GetSubTag(245o)) ~ArrayClear(245bm) ~ForSubTags(245b,val, ~ArrayAdd(245bm, ~GetParam(val))) ~SetParam(245bs, ~ArrayToString(245bm,: )) ~IfExists( ~GetParam(245bs) ,: ~GetParam(245bs)) ~IfExists( ~GetSubTag(245n), ~GetSubTag(245n)) ~IfExists( ~GetSubTag(245p),: ~GetSubTag(245p)) ~IfExists( ~GetSubTag(245c),/ ~GetSubTag(245c)))
~Comment(Замена в переменных, участвующих в запросах на добавление и обновление таблицы, для исключения ошибок при запросе в случае использования знака ' )
~SetParam(bibliogr,~Replace(~GetParam(bibliogr),',`))
~SetParam(title,~Replace(~GetParam(title),',`))
~Comment(Проверка поля 993x, если есть то обновление таблицы biblio поле Identifier равно полю 993x, добавление в biblio)
~IfExists(~GetSubTag(933x),
~Comment(Выполнение SQL запроса на обновление таблицы biblio)
~SqlExecQuery(UPDATE biblio SET AUTHOR='~GetSubTag(100a)', TITLE='~GetParam(title)', CUSTOM1='~GetParam(bibliogr)' WHERE IDENTIFIER= '~GetSubTag(933x)')
,
~SetSubTag(933x,)
~Comment(Получение библиографического уровня)
~RecType(urov1,urov2)
~Comment(если не статья то Type=1)
~SetParam(urov3,1)
~Comment(если статья то Type=0)
~If(~GetParam(urov1),=,a,~SetParam(urov3,0))
~If(~GetParam(urov1),=,b,~SetParam(urov3,0))
~Comment(получение идентефикатора (Сокращённое название) документа сторится из уникального номера документа в базе, и названия каталога (переменная OpenOfficeDB) для OpenOffice.org, , если надо только номер, в случае если базы данных предпологается использовать отдельно, то замените строку на ~SetParam(ident, ~GetDocId()) либо ~SetParam(ident, ~GetDBTextRes(OpenOfficeDB) ~GetDocId()) если идентефикатор будет состоять из названия каталога, а затем номера записи)
~SetParam(ident, ~GetDocId() ~GetDBTextRes(OpenOfficeDB))
~Comment(Записать идентефикатор (Сокращённое название) документа в поле 993x)
~SetSubTag(933x, ~GetParam(ident))
~Comment(Выполнение SQL запроса на добавление в таблицу biblio)
~SqlExecQuery(INSERT INTO biblio (Identifier, Type, Author, Title, Custom1) VALUES ('~GetParam(ident)', '~GetParam(urov3)', '~GetSubTag(100a)', '~GetParam(title)', '~GetParam(bibliogr)'))
)
~Comment(Конец скрипта)

Скрипт заполняет следующие поля: Сокращённое название: номер документа и имя переменной OpenOfficeDB в базе данных каталога, Автор: Автор, Заголовок: Вся область заглавия, Поле пользователя 1: Библиографическое описание.
В скрипте не показаны строчки при подключении к базе данных через ODBC думаю это не составит труда после прочтения руководства по макроязыку, а именно использование ~SqlSetConnection и ~SqlCloseConnection соответственно перед и после ~SqlExecQuery.
Теперь нам необходимо, если вы используете одну базу данных прописать переменную OpenOfficeDB в базе данных каталога, на основе этой переменной будет формироваться идентификатор (Сокращённое название), откройте базу данных каталога, откройте таблицу DBRES и вставьте новую строку с значением поля NAME=OpenOfficeDB, поле TRES=имя базы, можно просто латинскую букву. проделайте это со всеми базами каталогов.
Теперь необходимо чтобы скрипт, описанный выше, выполнялся при сохранении записи в электронном каталоге программы MarcSQL, для этого откройте файл marc.ini в каталоге Bin программы MarcSQL, найдите секцию [Scripts] добавьте строку OnDocSave=~CallScript(scp/OpenOffice.scp), если есть строка с началом OnDocSave и она не содержит точки с запятой в начале, то необходимо добавить строку ~CallScript(scp/OpenOffice.scp) в начало файла находящегося по пути написанном в скобках в строке OnDocSave=~CallScript... в файле marc.ini. всё, теперь база будет обновляться из программы автоматически при создании записи или её редактировании. Для того, чтобы обновить все существующие уже записи, необходимо открыть программу MarcSQL, открыть необходимый каталог, выполнить команду «Найти все», нажать меню Правка – Групповая корректировка...

Рисунок 1: Обновление базы библиографии из каталога MarcSQL

Выберите Операция: Выполнить скрипт и либо загрузите файл scp/OpenOffice.scp, либо вставьте в окно Справка/скрипт, скрипт описанный выше, если у вас база данных повредилась или все записи удалены, то при обновлении через групповую корректировку необходимо удалить поле 933x, выполнив скрипт ~DelSubTag(933x) через групповую корректировку, а затем выполнить скрипт в файле OpenOffice.scp.
Для того чтобы при поиске в программе MarcSQL выходило Сокращённое название, необходимо добавить строку:
< br />Сокращённое название в OpenOffice.org ~GetSubTag(933x)

в соответствующие файлы, например после скрипта ~GetBiblio().
Собственно перейдём к подключению базы данных библиографии в OpenOffice.org, для этого необходимо зарегистрировать базу в OpenOffice.org.
Откройте OpenOffice.org Baze

Рисунок 2: Подключение к базе

установите переключатель «Подключится к существующей базе данных» и выберите тип базы «Microsoft Access» либо ODBC (если она зарегистрирована в ODBC).

Рисунок 3: Выбор файла базы

выберите файл базы или имя базы в ODBC

Рисунок 4: Регистрация базы

Теперь зарегистрируйте базу, уберите галочку «Открыть базу на редактирование», нажмите готово, вам выйдет окно для сохранения, выберите место для сохранения базы и присвойте название, у вас сохранится с расширением .odb и база зарегистрируется. Если у вас несколько баз библиографии, тоже самое надо проделать с другими.
Собственно на этом часть относящаяся к разработке заканчивается, теперь переходим к использованию, в принципе подключение базы тоже можно отнести к использованию, я поставил её в раздел «разработка», т. к. предполагаю зарегистрировать базу на всех компьютерах стоящих в библиотеке и объяснять студентам только принципы вставки библиографических ссылок, которые в принципе описаны в моей статье «Свободный полёт в OpenOffice.org. Как правильно написать реферат, курсовую, диплом: начальный уровень.»
Использование заключается в выборе базы и принципе перехода к необходимой записи, для того чтобы выбрать базу необходимо нажать меню Сервис – База данных библиографии в открывшемся окне нажать кнопку Источник данных

Рисунок 5: Выбор базы

нажмите ОК и перейдите обратно в окно Writer, в окне База данных библиографии возможно искать необходимую запись, можно впрочем закрыть окно База данных библиографии если известно сокращённое название из других источников поиска.
Для того чтобы вставить библиографическую ссылку, необходимо нажать меню Вставка – Оглавление и указатели – Элемент списка литературы, причём данное окно закрывать совсем не обязательно.

Рисунок 6: Вставка библиографической ссылки

Выбираем Элемент «Из базы данных библиографии», выберите из выпадающего списка одно из сокращённых названий документа, быстро перейти к нужному названию можно открыв список набрать первые символы сокращённого названия, и нажмите кнопку Вставить.
В заключение хочу дать несколько рекомендаций:
При использовании нескольких баз есть преимущество по скорости работы с базой при вставке ссылки, однако возникает необходимость выбирать источник данных в отличии от работы в одной базе, источник данных выбирать не надо, но записей в базе становится больше, соответственно медленнее работает при вставке ссылки.
По поводу сокращённого названия: рекомендую использовать номер в начале, а затем идентификатор базы, или имя файла базы, лучше наверно одну букву, в случае с использованием одной буквы, ставить её лучше вперёд номера.
Теперь когда вы изучили данный труд и сделали со своей программой то, что я тут описал, необходимо оформить инструкцию для пользователя о применении данной технологии.
Хочу выразить благодарность в помощи советами при написании данной статьи: Азату Газизову из Уфы и Михаилу из Волгограда.





Об авторе

Подробнее: Кушеев Сергей Сергеевич
Дата создания: 11.01.2007

Обсудить

на форуме: community.i-rs.ru

Присоединенные файлы

_immortal3.odt
_immortal3.pdf



| Версия для печати |
Copyright © 2002-2007 Infra Resource