Ассоциация ЭБНИТ    ИРБИС-корпорация    Вики-Ирбис    Online/CHM справка Ирбис   
Опыт и разработки пользователей ИРБИС :  ИРБИС Irbis
 
Страницы: 12345678>>
Страница: 1 из 8
Клиентская библиотека ИРБИС64 на языке C#
Пользователь: amironov73 (IP-адрес скрыт)
Дата: 17, October, 2013 10:42

Вниманию программирующих ирбисоводов предлагается библиотека функций для сетевого доступа к серверу ИРБИС64.

Библиотека не содержит неуправляемого кода и не требует irbis64_client.dll. Успешно работает на 32-битных и 64-битных десктопных и серверных версиях Windows под управлением .NET Framework 4.0 и выше (проверено на Windows XP, Vista, 7, Server 2003, Server 2008). Также работает на Windows Mobile 6 под управлением Mobile Framework 3.5 (проверено на HP iPaq и HTC HD Mini).
Возможно, работает на MONO, Silverlight или Windows RT (не проверялось).

Библиотека проверена и работает с ИРБИС64 как минимум 2010-2012, для более ранних версий не проверялась, но, скорее всего, тоже работает.

Ниже прилагается пример простой программы. Сначала находятся и загружаются 10 первых библиографических записей, в которых автор начинается на букву "A" (кириллица). Показано нахождение значения поля с заданным тегом и подполя с заданным кодом. Также показано расформатирование записи в формат brief.

Затем создается и отправляется на сервер 10 записей. Показано добавление в запись полей с подполями.

using System;
using System.Linq;

using ManagedClient;

namespace TestApplication
{
    class Program
    {
        private static void Main()
        {
            try
            {
                using (ManagedClient64 client = new ManagedClient64())
                {
                    // Подключаемся к серверу
                    client.ParseConnectionString("host=127.0.0.1;port=6666;"
                                                 + "user=1;password=1;");
                    client.Connect();

                    // Ищем все книги, у которых автор начинается на А (кириллица)
                    int[] foundRecords = client.Search("\"A={0}$\"", "А");

                    // Чтобы не распечатывать все найденные записи,
                    // ограничимся первыми 10
                    int recordsToShow = Math.Min(foundRecords.Length, 10);

                    for (int i = 0; i < recordsToShow; i++)
                    {
                        int thisMfn = foundRecords[i];

                        // Считываем запись
                        IrbisRecord record = client.ReadRecord(thisMfn);

                        // Получаем основное заглавие
                        string mainTitle = record
                            .Fields
                            .GetField("200")
                            .GetSubField('a')
                            .GetSubFieldText()
                            .FirstOrDefault();

                        // Можно было просто написать: 
                        // string mainTitle = record.FM("200", 'a');

                        Console.WriteLine
                            (
                                "MFN={0}, Main title={1}",
                                thisMfn,
                                mainTitle
                            );

                        // Расформатируем запись
                        Console.WriteLine
                            (
                                "BRIEF: {0}",
                                client.FormatRecord("@brief", record)
                            );

                        // Создаем запись
                        IrbisRecord newRecord = new IrbisRecord();
                        newRecord.AddField
                            (
                                "700",
                                'a',
                                "Управляемый клиент ИРБИС64"
                            )
                        .AddField
                            (
                                "200",
                                'a', 
                                string.Format ("Новая Запись от {0}", DateTime.Now),
                                'f',
                                "Управляемый клиент"
                            );

                        // Отсылаем вновь созданную запись на сервер
                        client.WriteRecord
                            (
                                newRecord, 
                                false, 
                                true
                            );

                        Console.WriteLine(new string('-', 60));
                    }

                    // По выходу из using автоматически вызывается client.Disconnect ()
                }
            }
            catch (Exception ex)
            {
                Console.WriteLine(ex);
            }
        }
    }
}

Код применяется в Иркутской областной государственной универсальной научной библиотеке в течение двух лет. Код рабочий, ориентированный на быстрое получение результата (а не на вылизывание кода), поэтому далеко не везде логичный и откомментированный. Просьба отнестись с пониманием.

Для ирбисоводов, не программирующих на C# или VB.Net или имеющих ИРБИС32 данная библиотека не представляет интереса.

--------------------

Библиотека размещена на хостинге NuGet.

Теперь все обладатели IDE Visual Studio (начиная с версии 2010) и SharpDevelop, могут скачать её и подключить к своему проекту буквально в два клика мышкой:

http://irbis.elnit.org/file.php?24,file=20737

--------------------

Те, кому нужны исходные коды библиотеки, могут скачать их с GitHub: https://github.com/amironov73/ManagedIrbis



Редактировано 12 раз. Последний раз 23.12.2020 06:44 пользователем amironov73.

Вложения: 2015-12-27_114130.png (356.6KB)   2020-12-23_113954.png (56.5KB)  
Re: Клиентская библиотека ИРБИС64 на языке C#
Пользователь: S-presso (IP-адрес скрыт)
Дата: 17, October, 2013 12:25

Большое спасибо. Вот на чём должен быть написан новый АРМ для ИРБИС64! Ведь, как никак, неуправляемый код и архитектура x86 уходят в прошлое, как и сама концепция десктопа. Почитать об этом можно, например, здесь - [www.3dnews.ru], здесь - [habrahabr.ru] (много интересного про WinAPI, Windows 8 и Modern UI) или на англ.: [www.zdnet.com].

В общем, надеюсь на скорое возрождение своего проекта БАРСиК, если меня окончательно не замучает лень.

Re: Клиентская библиотека ИРБИС64 на языке C#
Пользователь: amironov73 (IP-адрес скрыт)
Дата: 17, October, 2013 13:08

S-presso написал(а):
-------------------------------------------------------
> Большое спасибо. Вот на чём должен быть написан
> новый АРМ для ИРБИС64!

Тут есть «подводные грабли»: клиенты ИРБИС64 без зазрения совести используют функции из irbis64.dll (в том числе для уменьшения нагрузки на сервер), которые в управляемом коде, насколько я знаю, пока никто не воспроизвёл. А без функций из irbis64.dll клиент будет довольно хиленьким (в смысле конкуренции с оригинальными клиентами).

Разве что брать красотой и дизайном? На WPF можно сделать потрясающей красоты клиента eye rolling smiley

Re: Клиентская библиотека ИРБИС64 на языке C#
Пользователь: vo-vam (IP-адрес скрыт)
Дата: 17, November, 2013 19:06

Доброе время суток.

Демонстрационный код отработал без проблем.
Хотел бы узнать: есть ли где почитать подробнее про функции этой библиотеки? Хотелось бы вникнуть в логику и структуру.

У меня одна из конечных задач - это вывести список взятой конкретным студентом литературы.

Спасибо.

Re: Клиентская библиотека ИРБИС64 на языке C#
Пользователь: amironov73 (IP-адрес скрыт)
Дата: 18, November, 2013 05:01

К сожалению, подробной и полной документации к библиотеке нет, т. к. её просто некому было написать. Ниже приводится краткое введение в библиотеку, поясняющее основные аспекты её функционирования.

В библиотеке два главных класса: ManagedClient64 и IrbisRecord – собственно, они и выполняют основную работу, а остальные классы являются «обвязкой» к ним.

ManagedClient64 – «рабочая лошадка». Этот класс осуществляет связь с сервером, всю необходимую «перепаковку» данных и прочее и прочее. Собственно, это и есть управляемый клиент ИРБИС64.

Экземпляр клиента создаётся конструктором по умолчанию:
var client = new ManagedClient64 ();
Подключение к серверу и отключение от него

Параметры подключения к серверу определяются следующими свойствами
public string Host { get; set; } // Адрес сервера, по умолчанию "127.0.0.1", т. е. локальный
public int Port { get; set; } // Порт сервера, по умолчанию 6666
public string Username { get; set; } // Имя пользователя, по умолчанию "1"
public string Password { get; set; } // Пароль, по умолчанию "1"
public string Database { get; set; } // Имя базы данных, по умолчанию "IBIS"
public IrbisWorkstation Workstation { get; set; } // АРМ, по умолчанию «Каталогизатор»
Обратите внимание, что адрес сервера задаётся строкой, так что может принимать как значения вроде "192.168.1.1", так и "irbis.yourlib.com".
Если какой-либо вышеперечисленных из параметров подключения не задан явно, используется значение по умолчанию. По умолчанию, клиент готов к работе с локально установленной демо-версией ИРБИС64. :)
За подключение и отключение отвечают два метода:
public void Connect ();
public void Disconnect ();
При возникновении ошибки при подключении метод Connect выбросит исключение.

После успешного установления соединения повторные вызовы Connect не выполняют никаких действий. Аналогично после успешного отключения повторные вызовы Disconnect не выполняют никаких действий.

Проверить, подключены ли мы в данный момент к серверу, можно с помощью свойства Connected:
public bool Connected { get; }
Вместо индивидуального задания каждого из параметров Host, Port, Username, Password и Database, можно использовать метод ParseConnectionString:
public void ParseConnectionString ( string connectionString );
Рекомендуется заключать всю работу с клиентом в контекстные скобки using языка C# для корректного освобождения ресурсов при возникновении нештатных ситуаций.
После успешного подключения к серверу свойство Configuration содержит серверный INI-файл для указанного клиента:
public string Configuration { get; }
Метод GetMaxMfn возвращает максимальный номер MFN в базе данных:
public int GetMaxMfn ();
Метод IsDatabaseLocked, определяет, не установлена ли в данный момент монопольная блокировка на базу данных:
public bool IsDatabaseLocked ( string databaseName ); // Необходимо указать имя базы данных
Пример подключения к серверу:
using (var client = new ManagedClient64 ())
{
	string connectionString = System.Configuration.AppSettings["connection-string"];
	client.ParseConnectionString ( connectionString );
	client.Connect ();

	// Теперь мы подключены к серверу и можем работать с ним.
	// Например, можем получить количество записей в базе данных.
	Console.WriteLine ( "Записей в базе: {0}", client.GetMaxMfn() - 1 );

	// по выходу из блока using отключение от сервера произойдёт само
	// поэтому вызывать Disconnect необязательно
}
Многопоточность и состояние занятости

Клиент написан в наивном однопоточном стиле, поэтому не поддерживает одновременное выполнение команд из разных потоков. Во время обращения к серверу устанавливается флаг
public bool Busy { get; }
Подтверждение подключения

Библиотека самостоятельно не посылает на сервер подтверждений того, что клиент всё ещё подключен. Этим должно заниматься приложение, например, по таймеру.

Подтверждение посылается серверу методом NoOp:
public void NoOp ();
Чтение/сохранение записей

Методы для чтения и сохранения записей (класс IrbisRecord будет рассмотрен позже, пока воспринимайте его как «чёрный ящик»):
public IrbisRecord ReadRecord ( int mfn ); // Чтение одной записи по её MFN
public IrbisRecord[] ReadRecords ( IEnumerable<int> mfns ); // Чтение массива записей с указанными MFN
public void WriteRecord ( IrbisRecord record, bool needLock, bool ifUpdate ); // Сохранение одной записи
				// needLock – оставить запись заблокированной
				// ifUpdate – обновить инвертированный файл (поисковый индекс)
public void WriteRecords ( IrbisRecord[] records, bool ifUpdate ); // Сохранение массива записей
				// ifUpdate – обновить инвертированный файл (поисковый индекс)
Запись «помнит» свой MFN, поэтому заботиться о том, чтобы модифицированная запись встала на нужное место, не нужно. Вновь созданная запись имеет MFN=0, поэтому будет помещена в конец мастер-файла.

Поиск записей

Метод для поиска записей:
public int[] Search ( string format, params object[] args ); // возвращает массив MFN записей, 
			// удовлетворяющих запросу
Если ни одной записи не найдено, возвращается массив из 0 элементов.

Пример вызова:
string authorName = "Иванов"; // фамилия автора книги
int[] mfns = client.Search ( "\"A={0}$\"", authorName ); // поиск по соответствующему префиксу
// обратите внимание на знак доллара, означающий усечение справа
// и на кавычки, обрамляющие запрос
Поиск с одновременным чтением:
public IrbisRecord[] SearchRead ( string format, params object[] args ); // Возвращает записи,
			// удовлетворяющие запросу. По факту совмещает методы Search и ReadRecord

Если ни одной записи не найдено, возвращается массив из 0 элементов.
Пример вызова:
foreach ( var record in client.SearchRead ( "J=CHI" ) ) // ищем книги на китайском языке
{
	// Обрабатываем записи по одной
	Console.WriteLine ( "Найдено: {0}", record );
}
Форматирование записей

Во всех нижеперечисленных методах строка format может принимать одно из трёх значений:

* Собственно формат на языке ИРБИС, например "v200^a, ' : ', v200^e";
* Ссылку на серверный pft-файл, начинающуюся с символа "@" (без расширения pft), например: "@brief";
* Ссылку на оптимизированный формат (какой формат использовать, определит сам сервер, основываясь на механизме оптимизации форматов просмотра), состоящую из единственного символа "@".

Методы для форматирования записей:
public string FormatRecord ( string format, int mfn ); // Форматирует запись по её MFN
public string FormatRecord ( string format, IrbisRecord record ); // Форматирует заданную запись
public string[] FormatRecords ( string format, int[] mfns ); // Форматирует массив записей по их MFN
public string[] SearchFormat ( string expression, string format ); // Форматирует записи, 
				// удовлетворяющие поисковому запросу

Пример вызова:
foreach ( var description in client.SearchFormat ( "G=2000", "@brief" ) ) // Ищем книги 2000-года издания
{
	// Выводим их краткое биб. описание
	Console.WriteLine ( description );
}
Классы IrbisRecord, RecordField и SubField

Каждый экземпляр класса IrbisRecord соответствует одной записи в базе данных ИРБИС. Он содержит следующие элементы:
public string Database { get; } // Имя базы данных, из которой считана запись. 
			// Для вновь созданных записей содержит null
public int Mfn { get; } // Номер записи в мастер-файле.
			// Для вновь созданных записей равен 0
public RecordStatus Status { get; } // Статус записи – логически удалена, 
			// физически удалена и т. д.
public int Version { get; } // Версия записи. 
			// Устанавливается сервером автоматически
public bool Deleted { get; set; } // Признак удалённой записи
			// (чтобы не возиться лишний раз с полем Status)
public List<RecordField> Fields { get; } // Список полей записи
Запись хранит поля в списке Fields. Каждое поле соответствует экземпляру класса RecordField, который содержит следующие элементы:
public string Tag { get; set;} // Метка поля
public string Text { get; set; } // Значение поля
public string List<SubField> SubFields { get; } // Список подполей
Поле хранит подполя в списке SubFields. Каждое подполе соответствует экземпляру класса SubField, который содержит следующие элементы:
public char Code { get; set; } // Код подполя
public string Text { get; set; } // Значение подполя
Манипуляции с записями

Получаем значение первого повторения поля (Field Match):
string language = record.FM ( "101" ); // Язык основного текста документа
Если такого поля нет, возвращается null.
Получаем массив всех повторений данного поля (Field Match All):
string[] keywords = record.FMA ( "610" ); // Все ключевые слова
Если таких полей нет, возвращается массив из 0 элементов.
Получаем значение первого повторения подполя:
string title = record.FM ( "200", 'a' ); // Основное заглавие
Если такого поля/подполя нет, возвращается null.
Получаем массив всех повторений данного подполя:
string[] subjects = record.FMA ( "606", 'a' ); // Все предметные заголовки
Если таких полей/подполей нет, возвращается массив из 0 элементов.
Выясняем, есть ли в записи хоть одно поле из перечисленных:
if (record.HaveField ( "606", "607" ))
{
	Console.WriteLine ( "Есть рубрики!");
}
Проверяем отсутствие всех перечисленных полей:
if (record.HaveNotField ( "700", "701", "702" ))
{
	Console.WriteLine ( "Нет точек доступа на авторов!" );
}
Удаляем все повторения указанного поля (если поля нет, ничего не происходит):
record.RemoveField ( "331" ); // Удалили аннотацию
Добавляем поле с текстом:
record.AddField ( "300", "Авторы указаны на корешке" );
Добавляем поле с подполями:
record.AddField ( "200", 'a', "Заглавие",
	'e', "подзаголовочные сведения",
	'f', "сведения об ответственности" );
Устанавливаем первое повторение поля с текстом (если поля с такой меткой нет, оно будет создано):
record.SetField ( "102", "RU" ); // Код страны
Обратите внимание, что вызовы AddField, SetField и RemoveField могут «цепляться» друг за друга для повышения читабельности программы:
record.RemoveField ( "331" )
	.SetField ( "102", "RU" )
	.AddField ( "300", "Авторы указаны на корешке" );
Конечно же, запись и все её поля/подполя могут быть созданы «с нуля» с помощью соответствующих конструкторов, после чего запись можно сохранить:
var record = new IrbisRecord (); // Создали запись

// Создаём поле 900 и подполя в нём
var field900 = new RecordField ( "900" ); // Коды: тип, вид, характер документа
var sub900b = new SubField ( 'b', "05" ); // Однотомное издание
var sub900t = new SubField ( 't', "a" ); // Текстовый материал
field900.SubFields.Add ( sub900b ); // Добавили подполя в поле
field900.SubFields.Add ( sub900t );
record.Fields.Add ( field900 ); // Добавили поле в запись

var field102 = new RecordField ( "102" ); // Страна
field102.Text = "RU"; // Россия
record.Fields.Add ( field102 );

var field101 = new RecordField ("101"); // Язык основного текста
field101.Text = "rus"; // Русский язык
record.Fields.Add ( field101 );

. . .

// Сохраняем запись, блокировка записи нам не нужна, 
// зато нужно обновление поискового индекса
client.WriteRecord ( record, false, true );

Надеюсь, этот короткий экскурс поможет освоить библиотеку-клиент ИРБИС64.



Редактировано 1 раз. Последний раз 18.11.2013 07:06 пользователем amironov73.

Re: Клиентская библиотека ИРБИС64 на языке C#
Пользователь: amironov73 (IP-адрес скрыт)
Дата: 18, November, 2013 05:54

В качестве примера рассмотрим конкретную проблему: нам необходимо составить список литературы, числящейся за данным читателем и не возвращённой им в библиотеку.

Для этого мы должны:

1. В базе данных RDR найти читателя по его идентификатору или ФИО.
2. В найденной записи найти все повторения поля 40, в которых присутствует подполе a (шифр выданного документа), а подполе f (дата фактического возврата) содержит звёздочки (т. е. возврата ещё не было).
3. В отобранных повторениях 40-го поля подполе c содержит краткое библиографическое описание выданной книги. Выведем его на экран.

Ниже приводится текст программы, которая реализует данный алгоритм:
using System;
using System.Linq;
using ManagedClient;

class Program
{
	static void Main ()
	{
		// Отредактируйте эту строку!!!
		string connectionString = "Host=127.0.0.1;User=1;Password=1;Db=RDR;";
		
		using (var client = new ManagedClient64 ())
		{
			client.ParseConnectionString (connectionString);
			client.Connect ();
			
			while (true)
			{
				Console.Write ( "ФИО или идентификатор читателя: " );
				string id = Console.ReadLine();
				if (string.IsNullOrEmpty (id))
				{
					// Пустая строка означает завершение работы с программой
					break;
				}
				
				// Ищем читателя с указанным идентификатором
				IrbisRecord record = client.SearchRead ( "\"RI={0}\"", id )
						.FirstOrDefault ();
				if (record == null)
				{
					Console.WriteLine ( "Нет такого читателя!" );
					continue;
				}
				
				// Выбираем поля 40, в которых присутствует поле a
				// (шифр документа в базе), а подполе f (дата 
				// фактического возврата) состоит из звёздочек
				RecordField[] loans = record.Fields
								.GetField ( "40" )
								.Where ( field => field.HaveSubField ( 'a' ) 
									&& field.GetSubFieldText ( 'f', 0 ).StartsWith ("*") )
								.ToArray ();
				
				Console.WriteLine ( "Список задолженных книг для читателя {0}:", id );
				
				foreach ( var loan in loans )
				{
					// Получаем краткое библиографическое описание книги
					string description = loan.GetSubFieldText ( 'c', 0 );
					
					Console.WriteLine (description);
				}
				
				Console.WriteLine ( new string ( '-', 60 ) );
			}
		}
	}
}



Редактировано 1 раз. Последний раз 18.11.2013 07:16 пользователем amironov73.

Re: Клиентская библиотека ИРБИС64 на языке C#
Пользователь: vo-vam (IP-адрес скрыт)
Дата: 21, November, 2013 05:59

amironov73 написал(а):
-------------------------------------------------------
> В качестве примера рассмотрим конкретную проблему:
> нам необходимо составить список литературы,
> числящейся за данным читателем и не возвращённой
> им в библиотеку.

Доброе время суток.
Спасибо за пример.

Можно попросить ещё один пример привести? На этот раз записи данных:
Оформить заказ литературы конкретным студентом.

> Надеюсь, этот короткий экскурс поможет освоить библиотеку-клиент ИРБИС64.

В целом всё понятно, но как можно узнать какие теги и коды использовать в перечислениях? В частности в приведенном примере вывода взятой литературы: как понять, что поле с описанием находится с кодом 'с' и почему выданная литература идёт с тегом 40?



Редактировано 1 раз. Последний раз 21.11.2013 06:00 пользователем vo-vam.

Re: Клиентская библиотека ИРБИС64 на языке C#
Пользователь: amironov73 (IP-адрес скрыт)
Дата: 21, November, 2013 09:39

vo-vam написал(а):
-------------------------------------------------------
> Можно попросить ещё один пример привести? На этот
> раз записи данных:
> Оформить заказ литературы конкретным студентом.

Заказы создаются в базе данных RQST, записи в ней содержат следующие поля (конечно же, не все сразу):
1: Имя базы данных электронного каталога
30: Идентификатор читателя
31: Краткое описание читателя
40: Дата создания заказа
41: Дата выполнения заказа
42: Дата предполагаемого возврата издания
43: Дата бронирования
44: Сведения об отказе
50: Ответственное лицо
100: Дополнительные сведения при заказе периодики
101: Примечания читателя
102: Место выдачи
200: Заказ по ретрофонду
201: Краткое описание заказанного издания
903: Шифр заказанного издания
910: Сведения о выданном/забронированном экземпляре
911: Пометка о распечатке заказа
952: Ссылка на образ КК

Подполей в этих полях нет.

Для создания заказа достаточно полей 1, 30, 31, 40, 102, 201 и 903.

Заказ литературы заключается в получении сведений сначала из базы RDR (вход читателя в систему), затем из базы IBIS (поиск нужного издания), затем записи в базу данных RQST.

Для работы попеременно с несколькими базами данных может пригодиться метод PushDatabase(string) у класса ManagedClient64. Он временно меняет название базы данных, к которой подключен клиент. Последующий вызов метода PopDatabase восстанавливает предыдущее имя базы данных.

Предполагая, что на данный момент уже известны идентификатор читателя (ведь он как-то вошёл в систему?) и заказываемое издание, сформировать заказ можно следующим образом:

try
{
  client.PushDatabase ( "RQST" ); // Временно переключаемся на базу RQST

  string thisMoment = DateTime.Now // Формируем строку с текущими датой и временем
	.ToString ( "dd-MM-yyyy  HH:mm:ss"); 
  IrbisRecord record = new IrbisRecord();
  record.AddField ( "1", "IBIS") // Имя электронного каталога
	.AddField ( "30", "C42678F6" ) // Идентификатор читателя
	.AddField ( "31", "Власова Наталья Александровна" ) // ФИО читателя
	.AddField ( "40", thisMoment ) // Дата создания заказа
	.AddField ( "102", "ЧЗ" ) // Предполагаемое место выдачи
	.AddField ( "201", "Брэдбери, Рей. Вино из одуванчиков, 1988. – 656 с." ) // Биб. описание книги
	.AddField ( "903", "84(7США)/Б89-041205" ); // Шифр заказываемого издания

  client.WriteRecord ( record, false, true ); // Сохраняем запись
}
finally
{
  client.PopDatabase (); // Возвращаем предыдущий контекст работы
}



Редактировано 1 раз. Последний раз 21.11.2013 09:51 пользователем amironov73.

Re: Клиентская библиотека ИРБИС64 на языке C#
Пользователь: amironov73 (IP-адрес скрыт)
Дата: 21, November, 2013 09:50

vo-vam написал(а):
-------------------------------------------------------
> В целом всё понятно, но как можно узнать какие
> теги и коды использовать в перечислениях? В
> частности в приведенном примере вывода взятой
> литературы: как понять, что поле с описанием
> находится с кодом 'с' и почему выданная литература
> идёт с тегом 40?

Описание полей приведено в документации к ИРБИС в разделе «Приложения». Взглянуть на него можно, например, здесь.

Выдайте кому-нибудь любую книгу через АРМ «Книговыдача», затем откройте базу данных RDR в АРМ «Каталогизатор», посмотрите на вкладку «3 Сведения о взятой литературе». Вопросы отпадут сами собой :)

Поле 40 в RDR традиционно используется для регистрации посещений и фиксации выданной литературы. Описание подполей этого поля можно посмотреть в файле V40.WSS в папке RDR на сервере.

Re: Клиентская библиотека ИРБИС64 на языке C#
Пользователь: amironov73 (IP-адрес скрыт)
Дата: 11, January, 2014 13:03

Внимание! Архив с библиотекой заменён на новый: исправлены ошибки, обнаруженные пользователями библиотеки.

Выражаю благодарность Ивану Батраку, протестировавшему библиотеку на совместимость со старыми версиями ИРБИС-сервера.

Вложения: ManagedIrbis.zip (772.6KB)  
Re: Клиентская библиотека ИРБИС64 на языке C#
Пользователь: S-presso (IP-адрес скрыт)
Дата: 12, January, 2014 11:09

У меня такой вопрос: если я хочу написать с помощью этой библиотеки Web-приложение для доступа к электронному каталогу ИРБИС64 (т.е. свой Web-аналог АРМа "Читатель"), должен ли каждый клиент подключаться отдельно, создавая свой экземпляр класса ManagedClient64 и регистрируясь, или же достаточно создать один объект уровня Application и выполнить процедуру регистрации один раз при запуске сервера, а впоследствии для каждого пользователя отслеживать занятость клиента с помощью свойства Busy?

Re: Клиентская библиотека ИРБИС64 на языке C#
Пользователь: amironov73 (IP-адрес скрыт)
Дата: 12, January, 2014 12:02

S-presso написал:
-------------------------------------------------------
> У меня такой вопрос: если я хочу написать с
> помощью этой библиотеки Web-приложение для доступа
> к электронному каталогу ИРБИС64 (т.е. свой
> Web-аналог АРМа "Читатель"), должен ли каждый
> клиент подключаться отдельно, создавая свой
> экземпляр класса ManagedClient64 и регистрируясь,
> или же достаточно создать один объект уровня
> Application и выполнить процедуру регистрации один
> раз при запуске сервера, а впоследствии для
> каждого пользователя отслеживать занятость клиента
> с помощью свойства Busy?

Я в подобном случае создавал экземпляр ManagedClient64 на каждую сессию ASP.NET: так проще разбираться с кешированием и многопоточностью – пусть у сервера болит голова обо всём этом smiling smiley.

Во-первых, читатели могут входить персонализированно (с номером своего читательского) и проще всё хранить «в одной корзине», т. е. в одной сессии – и экземпляр ManagedClient64, и авторизационные данные для заказа и прочее, чем накручивать логику вокруг синглтона.

Во-вторых, если что-нибудь пойдёт не так, рухнет или заглючит одна пользовательская сессия, а не всё приложение в целом.

В-третьих, лицензии на читательские подключения (т. е. если подключаться как АРМ «Читатель») не расходуются.

В-четвёртых, накладные расходы как со стороны ManagedClient64, так и со стороны irbis_server.exe на поддержание подключения, не настолько велики, чтобы стоило заморачиваться переиспользованием подключения. По крайней мере, пока у вас в каталоге не сидят одновременно сотни уникальных посетителей.

Так что, хотя технически возможно использовать синглтон ManagedClient64, я за то, чтобы клиент создавался отдельно в каждой сессии.

Re: Клиентская библиотека ИРБИС64 на языке C#
Пользователь: S-presso (IP-адрес скрыт)
Дата: 12, January, 2014 13:11

Спасибо за такой подробный ответ. Где-то полтора года назад я уже пытался создать Web-приложение ASP.NET для доступа к серверу ИРБИС64, используя собственный программный интерфейс к библиотеке IRBIS64_CLIENT.DLL [irbis.gpntb.ru] - это был мой курсовой проект. Но до практического внедрения дело тогда не дошло. Одна из проблем, с которой я столкнулся - это то, что сервер при невозможности выполнить какую-либо операцию в связи с потерей соединения выдавал MessageBox с предложением повторить операцию, и для продолжения работы клиента кто-то должен был бы подойти к серверу и кликнуть "OK". Я так понимаю, что использование библиотеки ManagedIrbis поможет справиться с этой проблемой. А как здесь отслеживаются подобные ситуации? Возможно, при каждом вызове метода взаимодействия с сервером надо производить операцию в цикле вроде:

public IrbisRecord ReadRecord(int id)
        {
            IrbisRecord record = null;
            int result = -1;
            while (result != (int)IrbisReturnCode.Zero)
                try
                {
                    record = client.ReadRecord(id);
                    result = (int)IrbisReturnCode.Zero;
                }
                catch (IrbisException ex)
                {
                    result = ex.ErrorCode;
                }

            return record;
        }



Ещё один вопрос. Можно ли как-то получить список ключевых слов на основе произведённого поискового запроса? Я хочу выделять все найденные ключевые слова в библиографическом описании каждого документа из числа найденных по данному запросу, а также позволить пользователю переходить к очередному найденному слову в тексте биб. описания (так же, как это сделано в браузерах: в ASP.NET приложениях тоже можно использовать компонент WebBrowser). Или для этого придётся собственноручно парсить все поисковые запросы?

Re: Клиентская библиотека ИРБИС64 на языке C#
Пользователь: amironov73 (IP-адрес скрыт)
Дата: 12, January, 2014 13:44

S-presso написал):
-------------------------------------------------------

> А как здесь отслеживаются подобные ситуации?

Управляемый клиент написан в наивном стиле: если что-то пошло не так, он просто кидается исключениями. grinning smiley

Так что отслеживание сбоев полностью возложено на прикладного программиста.

> Возможно, при каждом вызове метода
> взаимодействия с сервером надо производить
> операцию в цикле вроде:

Всё так, только немного сложнее. Во-первых, каждое повторение обращения к серверу увеличивает время ожидания, а пользователь нынче пошёл взыскательный, убегает при малейшем разочаровании smiling smiley Так что имеет смысл вставить callback, выводящий надпись «Операция потребовала больше времени, чем ожидалось» или что-то в этом роде.

Во-вторых, имеет смысл анализировать код возврата. Например, если сервер сообщил, что запись физически удалена, то, очевидно, повторять попытку обращения не имеет смысла.

В-третьих, надо аккуратно обрабатывать исключительные ситуации, например, когда ASP.NET «убил» сессию по таймауту, или когда сервер IIS «убил» весь пул ASP.NET «за плохое поведение», или когда ИРБИС «убил» клиентское подключение (например, сервер ИРБИС64 был перезапущен).

В-четвёртых, возможна ситуация, когда сервер не отвечает слишком долго (например, заглючило сетевое оборудование), и придётся прерывать обращение вручную (чтобы не создавать излишней нагрузки на сервер IIS).

А вообще, да, не помешал бы набор обёрток для основных функций (таких как подключение, поиск, чтение записей, расформатирование), при необходимости повторяющих обращение к серверу. Эх, кто бы написал! eye rolling smiley

> Или для этого придётся собственноручно парсить все поисковые запросы?

Скорее всего, придётся делать всё самостоятельно (и парсить поисковые запросы, и подсвечивать слова в результатах), т. к. готовых решений я не встречал.

Re: Клиентская библиотека ИРБИС64 на языке C#
Пользователь: S-presso (IP-адрес скрыт)
Дата: 12, January, 2014 14:19

Кстати, при последовательном поиске поисковые запросы на ЯФ, очевидно, не парсятся, т.к. Каталогизатор не подсвечивает удовлетворяющие условию значения полей. Ну, а всё остальное распарсить особых проблем не составляет.

А нет ли случайно примера создания списков терминов, каждому из которых соответствует определённое количество документов, в ответ на поисковые запросы вроде "A=", "T=", "K="?

Re: Клиентская библиотека ИРБИС64 на языке C#
Пользователь: amironov73 (IP-адрес скрыт)
Дата: 12, January, 2014 14:54

S-presso написал:
-------------------------------------------------------
> А нет ли случайно примера создания списков
> терминов, каждому из которых соответствует
> определённое количество документов, в ответ на
> поисковые запросы вроде "A=", "T=", "K="?

Честно говоря, не очень понял смысл вопроса…

Список терминов можно получить с сервера вызовом метода

public SearchTermInfo[] GetSearchTerms ( string startTerm, int count );

Здесь startTerm — начальный элемент списка (включая префикс вроде «K=»).


Класс SearchTermInfo содержит всю необходимую информацию:

public sealed class SearchTermInfo
{
        /// <summary>
        /// Количество ссылок.
        /// </summary>
        public int Count { get; set; }

        /// <summary>
        /// Поисковый термин.
        /// </summary>
        public string Text { get; set; }
}

Или речь идёт о каком-то другом списке терминов?

Re: Клиентская библиотека ИРБИС64 на языке C#
Пользователь: S-presso (IP-адрес скрыт)
Дата: 12, January, 2014 15:24

amironov73 написал(а):
-------------------------------------------------------

> Здесь startTerm — начальный элемент списка
> (включая префикс вроде «K=»).

А что такое вообще начальный элемент списка? Он определяется поисковым запросом, или ещё как-то?

>
> Или речь идёт о каком-то другом списке терминов?
>

Нет, видимо, о том же.

Хотелось спросить ещё вот о чём. У Вас на страничке присутствует раздел Natural Language Processing – автоматическая обработка текста [future-library.ru]. Насколько я понимаю, поиск в Ирбисе по-прежнему не учитывает падежей и склонений. А интересно, есть ли какая-нибудь готовая реализация анализа поисковых запросов с учётом морфологии слов? Например, ввёл строку в поиске, а программа сама разделила её на отдельные термины для запроса, выделила из них минимальную неизменяющуюся форму, к которой можно применить усечение, и отбросила незначащие слова (как предлоги и союзы). И если делать свою такую систему на базе сервера ASP.NET, то какой из перечисленных морфологических процессоров для этого лучше использовать (Morphology.NET, Stemmers.NET, Solarix...)?

Re: Клиентская библиотека ИРБИС64 на языке C#
Пользователь: amironov73 (IP-адрес скрыт)
Дата: 12, January, 2014 16:03

S-presso написал:

> Насколько я понимаю, поиск в Ирбисе
> по-прежнему не учитывает падежей и склонений.

Вообще-то, с 2013-й версии поддерживает, хоть и не так мощно, как Яндекс smiling smiley

Цитирую сообщение разработчиков:

АРМ Читатель, АРМ Каталогизатор, Web-шлюз (ИРБИС64): Обеспечена возможность применения механизма МОРФОЛОГИИ при поиске по КЛЮЧЕВЫМ СЛОВАМ. Соответствующее дополнение вносится в язык запросов ИРБИС (который применяется в пакетных заданиях и при создании пользовательских приложений): для того чтобы указать для поискового термина применение механизма морфологии в поисковом выражении его (термин) необходимо ограничить справа символом '@'

> A интересно, есть ли какая-нибудь готовая реализация
> анализа поисковых запросов с учётом морфологии
> слов? Например, ввёл строку в поиске, а программа
> сама разделила её на отдельные термины для
> запроса, выделила из них минимальную
> неизменяющуюся форму, к которой можно применить
> усечение, и отбросила незначащие слова (как
> предлоги и союзы).

Пока не встречал.

> И если делать свою такую
> систему на базе сервера ASP.NET, то какой из
> перечисленных морфологических процессоров для
> этого лучше использовать (Morphology.NET,
> Stemmers.NET, Solarix...)?

К сожалению, ситуация пока очень неутешительная. Коммерческие NLP-процессоры с поддержкой русского языка очень дорогие, а открытые – поддерживают русский язык на уровне «так себе», что неудивительно, учитывая общий уровень развития машинной лингвистики в российской университетской среде.

Со всеми библиотеками NLP, с которыми я имел дело, имеется одна общая проблема – они довольно сильно нагружают процессор и отъедают немало памяти. Постоянно загружать-выгружать их слишком накладно, а держать постоянно загруженную версию – необходимо обеспечить быстрое и надёжное межпроцессное взаимодействие. Поэтому я пока не воспользовался ни одной из рассмотренных мною библиотек.

Рекомендую рассмотреть тот вариант, по которому пошли создатели ИРБИС: база данных русской морфологии (такую базу создал Максим Панев, он выкладывал её на этом форуме) загружается как обычная база данных ИРБИС, и лемматизация производится простым поиском по этой базе.

Недостающие в базе слова можно обрабатывать (яндексовским майстемом), вроде бы они не особо возражают против применения в некоммерческих проектах.

Re: Клиентская библиотека ИРБИС64 на языке C#
Пользователь: artgonch (IP-адрес скрыт)
Дата: 16, January, 2014 12:35

Спасибо, очень интересная вещь. А вот я хочу узнать (м.б., невнимательно читал описание библиотеки): если метод последовательного поиска? Например, мне нужны все записи, содержащие один и тот же термин. При последовательном поиске в Каталогизаторе это выглядело бы так:
val(&unifor('J,',"I="v903)) >= 2
А можно ли подобное реализовать с помощью Вашей библиотеки?

Re: Клиентская библиотека ИРБИС64 на языке C#
Пользователь: amironov73 (IP-адрес скрыт)
Дата: 16, January, 2014 20:43

artgonch написал(а):
-------------------------------------------------------
> Спасибо, очень интересная вещь. А вот я хочу
> узнать (м.б., невнимательно читал описание
> библиотеки): если метод последовательного поиска?
> Например, мне нужны все записи, содержащие один и
> тот же термин. При последовательном поиске в
> Каталогизаторе это выглядело бы так:
> val(&unifor('J,',"I="v903)) >= 2
> А можно ли подобное реализовать с помощью Вашей
> библиотеки?

Полную информацию по данному термину можно запросить при помощи метода

public SearchPostingInfo[] GetSearchPostings
    (
         string startTerm,
         int count,
         int first
    );

class SearchPostingInfo
{
    public int Mfn { get; set; }
    public string Tag { get; set; }
    public int Occurences { get; set; }
    public int Count { get; set; }
}

Re: Клиентская библиотека ИРБИС64 на языке C#
Пользователь: artgonch (IP-адрес скрыт)
Дата: 21, January, 2014 03:44

amironov73 написал(а):
-------------------------------------------------------
> artgonch написал(а):
> --------------------------------------------------
> -----
> > Спасибо, очень интересная вещь. А вот я хочу
> > узнать (м.б., невнимательно читал описание
> > библиотеки): если метод последовательного
> поиска?
> > Например, мне нужны все записи, содержащие один
> и
> > тот же термин. При последовательном поиске в
> > Каталогизаторе это выглядело бы так:
> > val(&unifor('J,',"I="v903)) >= 2
> > А можно ли подобное реализовать с помощью Вашей
> > библиотеки?
>
> Полную информацию по данному термину можно
> запросить при помощи метода
>
>
> public SearchPostingInfo[] GetSearchPostings
> (
> string startTerm,
> int count,
> int first
> );
>
> class SearchPostingInfo
> {
> public int Mfn { get; set; }
> public string Tag { get; set; }
> public int Occurences { get; set; }
> public int Count { get; set; }
> }

Спасибо.

Re: Клиентская библиотека ИРБИС64 на языке C#
Пользователь: artgonch (IP-адрес скрыт)
Дата: 21, January, 2014 09:24

Хочу применить Вашу библиотеку в конкретной разработке. И вот появился конкретный вопрос. Как в методах поиска, чтения и записи МФНов задать имя каталога, с которым библиотека будет проводить операции? Ни в одном методе я не нашел параметра, который бы позволял передать эту информацию.

Re: Клиентская библиотека ИРБИС64 на языке C#
Пользователь: amironov73 (IP-адрес скрыт)
Дата: 21, January, 2014 10:46

artgonch написал:
-------------------------------------------------------
> Хочу применить Вашу библиотеку в конкретной
> разработке. И вот появился конкретный вопрос. Как
> в методах поиска, чтения и записи МФНов задать имя
> каталога, с которым библиотека будет проводить
> операции? Ни в одном методе я не нашел параметра,
> который бы позволял передать эту информацию.

Имя текущей базы данных (каталога), с которой работает клиент, хранится в поле Database:
public string Database { get; set; }
Кроме того, имеются два полезных метода:
/// Временно устанавливает новое имя текущей базы данных.
/// Запоминает, к какой базе был подключен
/// клиент на момент смены.
/// Возвращает имя предыдущей текущей базы данных.
public string PushDatabase(string newDatabase);

/// Восстанавливает подключение к предыдущей базе данных,
/// сменённой методом PushDatabase().
/// Возвращает имя базы данных, к которой был подключен 
/// клиент на момент восстановления состояния.
public string PopDatabase()
Оба метода работают по принципу стека: предыдущие базы данных запоминаются в стеке и постепенно возвращаются по мере вызова метода PopDatabase(). Пример:
// Мы работали с базой IBIS, 
// но решили временно подключиться к RDR
client.PushDatabase ("RDR"); // IBIS запоминается в стеке
IrbisRecord reader = client.SearchReadOneRecord ("I=1234");

// Теперь временно подключаемся к RQST
client.PushDatabase ("RQST"); // RDR также запоминается в стеке
IrbisRecord request = new IrbisRecord ();
...
client.WriteRecord (request, false, true); // Запись пойдёт в RQST

...
// Возвращаемся к базе RDR
client.PopDatabase ();
client.WriteRecord (reader, false, true); // Запись пойдёт в RDR

...
// Возвращаемся к исходной базе IBIS
client.PopDatabase ();
Рекомендую временные переключения между базами оформлять в блоке try-finally:
client.PushDatabase ("CMPL");
try
{
   // Какие-то манипуляции с базой
}
finally
{
  // Гарантированно возвращаемся в правильный контекст
  // работы с базой данных
  client.PopDatabase();
}

Re: Клиентская библиотека ИРБИС64 на языке C#
Пользователь: artgonch (IP-адрес скрыт)
Дата: 21, January, 2014 11:05

спасибо

Re: Клиентская библиотека ИРБИС64 на языке C#
Пользователь: artgonch (IP-адрес скрыт)
Дата: 23, January, 2014 12:36

Здравствуйте.

Дошел в изучении C# до такого уровня, что могу уже позволить себе запрограммировать поиск. Но вот незадача: он выдает нулевой результат, хотя в БД записи, удовлетворяющие запросу, есть. Вот мой код:
        private string GetKsuInformation()
        {
            ManagedClient64 srcClient = new ManagedClient64();

            srcClient.Host = SrcHost;
            srcClient.Port = Int32.Parse(SrcPort);
            srcClient.Username = SrcLogin;
            srcClient.Password = SrcPassword;
            srcClient.Database = SrcDb;

            try
            {
                Подключение происходит без сбоев. Указанная БД на сервере присутствует.
                srcClient.Connect();

                int bookInstanceCounter = 0;

                // Подсчет количества наименований.
                // NKsuPreffix содержит значение NKSU=
                string qwery = string.Format("\"{0}\"", NKsuPreffix);

                // KsuNum содержит 2013/001. Такая есть в БД.
                IrbisRecord[] foundRecords = srcClient.SearchRead(qwery, KsuNum);

                // Выдает пустой массив.
                int bookNamesCounter = foundRecords.Length;

                return string.Format("Всего наименований - {0}, экземпляров - {1}", bookNamesCounter, bookInstanceCounter);
            }
            finally
            {
                srcClient.Disconnect();
            }

            return null;
        }

Re: Клиентская библиотека ИРБИС64 на языке C#
Пользователь: amironov73 (IP-адрес скрыт)
Дата: 23, January, 2014 13:19

Проблема, по-моему, в этом коде:
// Подсчет количества наименований.
// NKsuPreffix содержит значение NKSU=
string qwery = string.Format("\"{0}\"", NKsuPreffix);
// KsuNum содержит 2013/001. Такая есть в БД.
IrbisRecord[] foundRecords = srcClient.SearchRead(qwery, KsuNum);
На сервер отправляется запрос следующего вида: "NKSU="2013/01
Естественно, он ничего не находит, т. к. отправлять надо "NKSU=2013/01"
Перепишите код следующим образом:
IrbisRecord[] foundRecords = srcClient.SearchRead
    (
      "\"{0}{1}\"",
      NKsuPreffix,
      KsuNum
    );

Re: Клиентская библиотека ИРБИС64 на языке C#
Пользователь: artgonch (IP-адрес скрыт)
Дата: 23, January, 2014 13:45

amironov73 написал(а):
-------------------------------------------------------

>
> IrbisRecord[] foundRecords = srcClient.SearchRead
> (
> "\"{0}{1}\"",
> NKsuPreffix,
> KsuNum
> );
>


А вот это сработало, спасибо!

Re: Клиентская библиотека ИРБИС64 на языке C#
Пользователь: S-presso (IP-адрес скрыт)
Дата: 01, February, 2014 18:32

Цитата:
amironov73
> Пока приходится получать текст отдельных полей
> таким вот хитроумным способом:
...

Вполне рабочий способ smiling smiley . Но лучше воспользоваться следующим:

string FieldToText (RecordField field)
{
StringBuilder result = new StringBuilder();

if (!string.IsNullOrEmpty (field.Text))
{
result.Append (Text);
}

foreach (SubField subField in field.SubFields)
{
string subText = subField.ToString ();
if (!string.IsNullOrEmpty ( subText ))
{
result.Append ( subText );
}
}

return result.ToString ();
}

Вот этот фрагмент неплохо бы добавить к документации, а то всё-таки не совсем очевидно. Хотя, если я Вас правильно понял, в новых версиях библиотеки всё то же самое делается одним вызовом field.ToText()? Ну, и мой собственный вариант этой же функции:

string FieldToText (RecordField field)
{
string fieldStr = field.ToString().Substring(field.ToString().IndexOf('#') + 1);
// отбрасываем метку, получаем текст поля с мусором на конце

index = fieldStr.IndexOf((char)31);
if (index == -1)
index = fieldStr.Length;
return fieldStr.Substring(0, index); // наконец получаем текст поля
}



Редактировано 1 раз. Последний раз 02.02.2014 16:10 пользователем S-presso.

Re: Клиентская библиотека ИРБИС64 на языке C#
Пользователь: S-presso (IP-адрес скрыт)
Дата: 02, February, 2014 16:44

Если можно, ещё несколько вопросов к Topic starter'у.

1. Для удаления определённого повторения поля нужно точно так же "пробегаться" в цикле по всем полям данной записи и пересобирать её по кусочкам? Или есть более действенный способ?
Просто у функции RemoveField() не нашёл перегрузок для отдельных повторений, как и у функции AddField() (хотя, возможно, её вариант, принимающий массив параметров others, делает нечто подобное?). В то же время функции IC_fldadd и IC_fldrep библиотеки IRBIS64_CLIENT.DLL позволяют работать с заданными повторениями нужных полей, добавляя, заменяя и удаляя их. Проясните, пожалуйста, этот вопрос.

2. При вызове функций библиотеки ManagedIrbis никаких всплывающих сообщений от сервера ИРБИС64 (в MessageBox'ах) замечено не было. Для реализации ASP.NET-сервера это именно то, что нужно - а вот как быть с десктопными Windows-приложениями (собственными АРМами)? Они-то при занятости сервера как раз должны отображать соответствующий MessageBox с предложением повторить попытку. Эти окошка с сообщениями никак нельзя активировать посредством библиотеки (чтобы они сами вызывались при выбрасывании исключений)? Или всё, как водится, придётся делать "ручками"?

3. Не удаётся вызвать оптимизированный формат для записей, представленных экземплярами своего класса IrbisRecord, а не MFN (client.FormatRecord("@", record) возвращает пустую строку). Впрочем, при использовании функций IRBIS64_CLIENT.DLL происходило то же самое. Это какая-то специфическая особенность работы сервера ИРБИС64?

Чтобы решить эту проблему, мне пришлось делать собственную реализацию разбора .OPT-файлов (на основе своего понимания этого формата). Может, стоит добавить в библиотеку ManagedIrbis методы для чтения .MNU, .OPT, .SCH и других ирбисовских форматов?

Re: Клиентская библиотека ИРБИС64 на языке C#
Пользователь: amironov73 (IP-адрес скрыт)
Дата: 03, February, 2014 00:46

S-presso написал(а):
-------------------------------------------------------
> 1. Для удаления определённого повторения поля
> нужно точно так же "пробегаться" в цикле по всем
> полям данной записи и пересобирать её по кусочкам?
> Или есть более действенный способ?

Пересобирать запись не нужно. Достаточно такого кода:
void RemoveFieldN ( IrbisRecord record, string tag, int n )
{
   RecordField found = record.Fields.GetField(tag)
        .Skip(n).FirstOrDefault();
   if (found != null)
   {
      record.Fields.Remove (found);
   }
}
Впрочем, в следующей версии клиента я добавлю соответствующую перегрузку метода RemoveField.

> Просто у функции RemoveField() не нашёл перегрузок
> для отдельных повторений, как и у функции
> AddField() (хотя, возможно, её вариант,
> принимающий массив параметров others, делает нечто
> подобное?).

Я так понял, речь идёт о методе с сигнатурой
public IrbisRecord AddField
(
    string tag,
    char code,
    string text,
    params object[] others
);
Он предназначен для добавления полей с подполями следующим образом:
record.AddField ( "200", 'a', "Введение в заборостроение", 'e', "учеб. для вузов", 'f', "И. И. Иванов" );
> В то же время функции IC_fldadd и
> IC_fldrep библиотеки IRBIS64_CLIENT.DLL позволяют
> работать с заданными повторениями нужных полей,
> добавляя, заменяя и удаляя их. Проясните,
> пожалуйста, этот вопрос.

Просто пока ещё не возникало необходимости в таком функционале. smiling smiley

> 2. При вызове функций библиотеки ManagedIrbis
> никаких всплывающих сообщений от сервера ИРБИС64
> (в MessageBox'ах) замечено не было. Для реализации
> ASP.NET-сервера это именно то, что нужно

Более того, ManagedClient без переделок идёт не только под ASP.NET, но и под Windows Mobile 6, Mono (Linux), Android и Silverlight. Именно поэтому в нём не предусмотрено никакого пользовательского интерфейса.

> - а вот как быть с десктопными Windows-приложениями
> (собственными АРМами)? Они-то при занятости
> сервера как раз должны отображать соответствующий
> MessageBox с предложением повторить попытку. Эти
> окошка с сообщениями никак нельзя активировать
> посредством библиотеки (чтобы они сами вызывались
> при выбрасывании исключений)? Или всё, как
> водится, придётся делать "ручками"?

На данный момент никаких идей, как сделать индикацию занятости элегантно, не порушив совместимость с вышеперечисленными системами, нет. Предлагайте варианты – включим в клиент. smiling smiley

> 3. Не удаётся вызвать оптимизированный формат для
> записей, представленных экземплярами своего класса
> IrbisRecord, а не MFN (client.FormatRecord("@",
> record) возвращает пустую строку). Впрочем, при
> использовании функций IRBIS64_CLIENT.DLL
> происходило то же самое. Это какая-то
> специфическая особенность работы сервера ИРБИС64?

Взглянуть бы на запись. И неплохо бы знать версию сервера/клиента. eye rolling smiley

> Чтобы решить эту проблему, мне пришлось делать
> собственную реализацию разбора .OPT-файлов (на
> основе своего понимания этого формата). Может,
> стоит добавить в библиотеку ManagedIrbis методы
> для чтения .MNU, .OPT, .SCH и других ирбисовских
> форматов?

Соответствующие классы в последних сборках клиента есть, потихоньку доводятся до ума.

Если ничего не помешает, на неделе выложу очередную версию клиента.

Страницы: 12345678>>
Страница: 1 из 8


Извините, только зарегистрированные пользователи могут писать в этом форуме.
This forum powered by Phorum.