Ассоциация ЭБНИТ    ИРБИС-корпорация    Вики-Ирбис    Online/CHM справка Ирбис   
Опыт и разработки пользователей ИРБИС :  ИРБИС Irbis
 
Страницы: <<12345678>>
Страница: 5 из 8
Re: Клиентская библиотека ИРБИС64 на языке C#
Пользователь: amironov73 (IP-адрес скрыт)
Дата: 19, February, 2015 13:32

Barkoff написал(а):
-------------------------------------------------------
> Здравствуйте! Я пытаюсь смастерить ASP.NET MVC
> приложение, а так как я в этом деле не шибко
> ядрёный специалист, столкнулся с массой
> трудностей. Совсем запутался.
> Подскажите в какую сторону следует копать?
> Я вижу несколько вариантов:
> - Если Библиотека остаётся такой какая она есть,
> то как будет выглядеть Модель?
> - Переносим некоторые классы из библиотеки в
> Модель приложения, например: ReaderInfo,
> ExemplarInfo. Тогда прикрутить какой-нибудь ORM не
> вижу возможным.
> - Можно и не использовать Модель, Не менять
> ничего в библиотеке, просто передавать данные из
> Контроллера в Представление.
>
> Извиняюсь за сумбурную формулировку.

К сожалению, я слабо знаком с ASP.NET MVC, поэтому сам бы с интересом послушал бы ответ кого-нибудь разбирающегося в этой проблематике. eye rolling smiley

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

Просто используем библиотеку как есть, обращаемся к ней по мере надобности, пример кода есть чуть выше, в NET хорошо что просто из консольного переделать ASP и наоборот :)

Re: Клиентская библиотека ИРБИС64 на языке C#
Пользователь: Barkoff (IP-адрес скрыт)
Дата: 20, February, 2015 10:29

Эх.. Много думал, ночь не спал. Решил. Надо всё же написать хоть небольшой ORM. Тем более, что все механизмы уже есть (чтение / запись...). Похоже, библиотека уже не будет прежней.

О результатах сообщу, если не запутаюсь окончательно и не брошу эту затею.

Re: Клиентская библиотека ИРБИС64 на языке C#
Пользователь: Barkoff (IP-адрес скрыт)
Дата: 18, March, 2015 12:37

Здравствуйте!
Стесняюсь спросить. Подумал не использовать в приложении различные MemberShip'ы. Авторизовать пользователей сразу в Ирбисе. Только вот погряз в дебрях ManagedClient и уже ничего не понимаю.
Подскажите, пожалуйста, как и что для этого использовать.

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

Barkoff написал(а):
-------------------------------------------------------
> Стесняюсь спросить. Подумал не использовать в
> приложении различные MemberShip'ы. Авторизовать
> пользователей сразу в Ирбисе. Только вот погряз в
> дебрях ManagedClient и уже ничего не понимаю.
> Подскажите, пожалуйста, как и что для этого
> использовать.

А Вы пишете приложение для библиотекаря или для читателя? Если последнее, то, по-моему, достаточно хранить в данных сессии идентификатор читателя (например, номер читательского билета). По крайней мере, мне хватало (правда, в приложениях WebForms, а не ASP.NET MVC).

Re: Клиентская библиотека ИРБИС64 на языке C#
Пользователь: Barkoff (IP-адрес скрыт)
Дата: 18, March, 2015 13:58

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

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

Barkoff написал(а):
-------------------------------------------------------
> Приложение для библиотекаря.
> Основная идея в том,что когда пользователь входит
> в систему для него создаётся отдельный экземпляр
> клиента и не отключается пока пользователь не
> завершит работу с системой или не наступит
> таймаут.
> Вот и не знаю, в какую сторону копать.

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

1. ASP.NET-приложение регистрируется на ИРБИС-сервере. Если регистрация прошла успешно, мы сохраняем состояние клиента в строку:
client = new ManagedClient64();
client.ParseConnectionString("...");
client.Connect();
...
// Поработали с клиентом, сохраняем его состояние
string savedState = ManagedClient64.SerializeToString(client);
storage.SaveClientState(savedState); // Сохранили
// storage - некое хранилище, работающее на уровне сессии 
// (подойдёт даже сохранение в файл)
client.Shutdown(); // Чтобы клиент не пытался отключиться от сервера
2. При необходимости десериализируем клиента и производим нужные действия, после чего снова сохраняем состояние:
string savedState = storage.RestoreClientState ();
ManagedClient64 client = ManagedClient64
      .DeserializeFromString (savedState);
// Продолжаем работу с сервером
IrbisRecord record = client.ReadRecord(mfn);

...

// Снова сохраняем состояние
storage.SaveClientState(savedState);
client.Shutdown();
3. Когда пользователь явно нажимает кнопку «Log Out», отключаемся и мы:
string savedState = storage.RestoreClientState ();
ManagedClient64 client = ManagedClient64
     .DeserializeFromString(savedState);
client.Disconnect ();
storage.RemoveClientState ();

В обычном ASP.NET приложении это вполне работает (главное, чтобы длительность веб-сессии была настроена меньшей, чем таймаут для ИРБИС-сервера). Насчёт MVC не знаю.

Re: Клиентская библиотека ИРБИС64 на языке C#
Пользователь: Barkoff (IP-адрес скрыт)
Дата: 18, March, 2015 18:33

Почти получилось. Только у восстановленных клиентов _waitHandle=null;
А это им не нравится, когда они делают _waitHandle.Reset();

Даже поблагодарить забыл.
Спасибо Вам большое!



Редактировано 1 раз. Последний раз 18.03.2015 18:35 пользователем Barkoff.

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

Barkoff написал(а):
-------------------------------------------------------
> Почти получилось. Только у восстановленных
> клиентов _waitHandle=null;
> А это им не нравится, когда они делают
> _waitHandle.Reset();

О! Спасибо за баг-репорт! Добавляя _waitHandle, я забыл добавить его обработку в DeserializeFromString().

Re: Клиентская библиотека ИРБИС64 на языке C#
Пользователь: Barkoff (IP-адрес скрыт)
Дата: 18, March, 2015 23:39

Всегда пожалуйста!
Обработку дадите?
Оно, вроде, не сериализуемое.

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

Barkoff написал(а):
-------------------------------------------------------
> Всегда пожалуйста!
> Обработку дадите?
> Оно, вроде, не сериализуемое.

Обработка состоит из одной строчки в DeserializeFromString:
result._waitHandle = new ManualResetEvent(true);

Учитывая, что десериализация клиента может произойти даже на другой машине, больше ничего сделать нельзя.

Re: Клиентская библиотека ИРБИС64 на языке C#
Пользователь: Barkoff (IP-адрес скрыт)
Дата: 19, March, 2015 10:10

А у Вас работает?
Ведь это свойство только для чтения.
Не даёт присвоить.

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

Barkoff написал(а):
-------------------------------------------------------
> А у Вас работает?
> Ведь это свойство только для чтения.
> Не даёт присвоить.

Ну да, пришлось убрать модификатор readonly при объявлении поля _waitHandle.

Re: Клиентская библиотека ИРБИС64 на языке C#
Пользователь: Barkoff (IP-адрес скрыт)
Дата: 23, March, 2015 17:56

Здравствуйте! Я добрался до того момента, когда уже можно начать сохранять записи. Найдены нужные записи, из них созданы объекты (reader, book). Но не знаю как преобразовать их обратно в IrbisRecord.
У Вас, случайно, нет примера такого преобразования? Например, выдача читателю одного экземпляра книги. Метод ToField() очень похож на то, что мне нужно.

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

Здравствуйте, Алексей.

Понадобилось мне реализовать в своей библиотеке на Java еще и интерфейс для команды последовательного поиска (код команды такой же, как и для поиска с помощью словаря). Все вроже бы проходит без ошибок, но нужный результат я не получаю...
Вот, например, задаю такой запрос к БД RDR:
v30='304DB75F19600021E0452956'
И получаю в ответ, 299 000 записей, хотя должна быт только одна!
Смотрю документацию на команду (точнее, пример):
K
R
K
240954
6





IBIS
"K=A$"
1
1
@brief
1
250000
!if p(v102) then '1' else '0' fi
=========
Мои отличия только в том, что я не задаю запрос, выполняемый с помощью словаря (т.е. у меня вторая строка, после имени БД, пустая).
И что означает восклицательный знак перед ключевым словом if? Или это просто опечатка?
Почему в строке запроса на последовательный поиск нужно возвращать '1' иои '0'? Ведь в Каталогизаторе можно просто задать строку свободного поиска: p(v102).

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

artgonch написал(а):
-------------------------------------------------------
> И получаю в ответ, 299 000 записей, хотя должна быт только одна!

Мало информации, чтобы сказать, что Вы делаете не так.

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

Надо искать, чем Вы не угодили Ирбису. smiling smiley

> Мои отличия только в том, что я не задаю запрос,
> выполняемый с помощью словаря (т.е. у меня вторая
> строка, после имени БД, пустая).

В этом случае сервер начинает «перелопачивать» всю базу данных и вполне может отвалиться по тайм-ауту протокола. Для больших баз надо либо повторять поиск в сравнительно небольшом окне, передвигая его с помощью параметров минимального и максимального MFN, либо всё-таки завести какой-нибудь словарь.

Ну, или выставить большой-пребольшой тайм-аут соединения, запастись терпением и скрестить пальцы на удачу. smiling smiley

> И что означает восклицательный знак перед ключевым
> словом if? Или это просто опечатка?

Что означает восклицательный знак, не имею ни малейшего понятия. Однако, он там нужен, это факт.

> Почему в строке запроса на последовательный поиск
> нужно возвращать '1' иои '0'? Ведь в
> Каталогизаторе можно просто задать строку
> свободного поиска: p(v102).

Каталогизатор незаметно добавляет !if <ваше выражение> then '1' else '0' fi, так что сервер видит то, что полагается по протоколу.

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

Здравствуйте! Подскажите, пожалуйста, такую вещь:
Пытаюсь выдать книгу (поменять статус у экземпляра в 910 поле). Получилось поменять статус таким образом:


foreach (var s in BVM.SearchTextList)
{
for (int i = 0; i <= BVM.RecordList.Count - 1; i++)
{
RecordField CurrentRecordField =
(from v in BVM.RecordList[i].Fields.GetField("910")
where v.GetSubFieldText('h', 0) == s
select v).First();

BVM.RecordList[i].Fields.Remove(CurrentRecordField);
CurrentRecordField.SetSubField('a', "1");
BVM.RecordList[i].Fields.Add(CurrentRecordField);

BVM.Client.PushDatabase(BVM.RecordList[i].Database);
BVM.Client.WriteRecord(BVM.RecordList[i], false, true);

}

}


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

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

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

> Пытаюсь выдать книгу (поменять статус у
> экземпляра в 910 поле). Получилось поменять статус
> таким образом: ...

Во-первых, я не понял, зачем Вы удаляете поле и затем вставляете его обратно? Что Вы этим пытаетесь добиться? Мне эти удаления-добавления кажутся совершенно излишними.

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

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

Если я правильно понял смысл Вашего кода, то его можно записать гораздо прозрачнее:
foreach ( string s in BVM.SearchTextList )
{
    foreach ( IrbisRecord record in BVM.RecordList )
    {
       RecordField currentField = record.Fields
          .GetField ( "910" )
          .GetField ( 'h', s )
          .FirstOrDefault ();

       if ( currentField != null )
       {
          currentField.SetSubField ( 'a', "1" );
          BVM.Client.WriteRecord ( record, false, true );
       }
    }
}
Кстати, при выдаче книги необходимо ещё увеличивать на единицу счётчик выдач, хранящийся в поле 999. Примерно так:
int counter;
int.TryParse ( record.FM ( "999" ), out counter );
counter++;
record.SetField ( "999", counter.ToString () );

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

Спасибо большое! Хорошее решение получилось.

Re: Клиентская библиотека ИРБИС64 на языке C#
Пользователь: BARGO (IP-адрес скрыт)
Дата: 05, August, 2015 06:16

Спасибо за код. Мне интересно написать клиент на PHP для загрузки читателей в RDR. Можете посоветовать те материалы по сетевому общению клиента и сервера, которыми Вы руководствовались для написания своего решения (помимо справки)?

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

BARGO написал(а):
-------------------------------------------------------
> Спасибо за код. Мне интересно написать клиент на
> PHP для загрузки читателей в RDR. Можете
> посоветовать те материалы по сетевому общению
> клиента и сервера, которыми Вы руководствовались
> для написания своего решения (помимо справки)?

Я активно использовал ИРБИС-Прокси (http://irbis.gpntb.ru/read.php?24,81713) и WireShark (https://www.wireshark.org/) для изучения реальных пакетов, передающихся от клиента к серверу и обратно.

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

Такой вопрос, а что с последовательным поиском? Как им воспользоваться? Не увидел в документации этого и на форуме не особо обсуждалось.



Редактировано 1 раз. Последний раз 09.02.2016 10:06 пользователем MeowExort.

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

MeowExort написал(а):
-------------------------------------------------------
> Такой вопрос, а что с последовательным поиском?
> Как им воспользоваться? Не увидел в документации
> этого и на форуме не особо обсуждалось.

В простейшем случае этот поиск состоит из указания двух выражений: 1) обычное поисковое выражение, отбирающее записи по словарю, 2) булево выражение, которое будет применено к каждой найденной записи.

Пример такого поиска: сначала мы отбираем все книги с фамилией автора "Пушкин", а затем проверяем, не содержит ли поле 200 буквосочетания "сказк":
// Выполняем последовательный поиск
int[] found = Client.SequentialSearch
    (
        "\"A=Пушкин$\"", // отбор по словарю
        "v200:'сказк'"   // булево выражение
    );

// Выводим найденные записи на консоль
foreach (int mfn in found)
{
    string description = Client.FormatRecord
        (
            "@brief",
            mfn
        );
    Console.WriteLine(description);
}
На экран будет выведено что-то вроде:

Пушкин, Александр Сергеевич. Сказка о царе Салтане, о сыне его славном и могучем богатыре князе Гвидоне Салтановиче и о прекрасной царевне Лебеди / А.С. Пушкин ; Послесл. М. Сокольникова; Ил. А.М. Куркина (Палех), 1972. - 39 c.

Пушкин, Александр Сергеевич. Сказки / А.С. Пушкин; Ил. А. Кокорина, 1976. - 72 с.

Пушкин, Александр Сергеевич. Собрание сочинений : В 10 т. Т.3. : Поэмы. Сказки, 1982. - 671 с.

Пушкин, Александр Сергеевич. Сказка о царе Салтане,о сыне его славном и могучем богатыре князе Гвидоне Салтановиче и о прекрасной царевне Лебеди / А.С. Пушкин, 1971. - 94 с.

Пушкин, Александр Сергеевич. Сочинения : в 2 т. Т. 1 : Стихотворения, поэмы, сказки, 1982. - 365 с.

Есть вариант этого же метода, предоставляющий больший контроль:
Client.SequentialSearch
    (
        "\"A=Пушкин$\"",
        100,   // запрашиваемое количество записей
        1,     // номер первой записи (смещение)
        10000, // минимальный MFN
        20000, // максимальный MFN
        "v200:'сказк'"        
    );
Если вместо "\"A=Пушкин$\"" передать null, то будет выполнен последовательный поиск по всей базе данных, что, скорее всего, создаст большую нагрузку на сервер.

Подробнее см. документацию на протокол ИРБИС.



Редактировано 2 раз. Последний раз 09.02.2016 12:54 пользователем amironov73.

Re: Клиентская библиотека ИРБИС64 на языке C#
Пользователь: Barkoff (IP-адрес скрыт)
Дата: 25, May, 2016 00:07

Здравствуйте. Помогите, пожалуйста, я так и не понял про добавление поля 907. Как с этим, в итоге, бороться?

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

Barkoff написал(а):
-------------------------------------------------------
> Здравствуйте. Помогите, пожалуйста, я так и не
> понял про добавление поля 907. Как с этим, в
> итоге, бороться?

Если Вас раздражает то, что ИРБИС добавляет поле 907 при сохранении записи, создайте ИРБИС-пользователя (назовите его, например, Ninja) с примерно таким INI-файлом:
[@irbisc]

[Main]
AutoinFile=autoin_none.gbl
В autoin_none.gbl напишите что-нибудь вроде:
0
//
XXXXXXXXXXXXXXXXXXX
XXXXXXXXXXXXXXXXXXX
Пустое задание
Второй возможный способ: работайте через глобальную корректировку, для неё штатно предусмотрена возможность отключить autoin.gbl

Re: Клиентская библиотека ИРБИС64 на языке C#
Пользователь: ivikis (IP-адрес скрыт)
Дата: 06, June, 2016 08:37

Добрый день. Попробовал воспользоваться функцией чтения записи:

int n = 1;
IrbisRecord ReadRecord(n);

В ответ получил сообщение: " Неявное преобразование типа "int" в "ManagedClient.IrbisRecord" ".

Прошу Вашей помощи. С уважением, Александр

Разобрался: client.ReadRecord(1);



Редактировано 1 раз. Последний раз 06.06.2016 08:59 пользователем ivikis.

Re: Клиентская библиотека ИРБИС64 на языке C#
Пользователь: zagzag (IP-адрес скрыт)
Дата: 24, June, 2016 13:52

Вот на PHP класс, может пригодится кому-нибудь

http://irbis.gpntb.ru/read.php?29,101880,102212

Re: Клиентская библиотека ИРБИС64 на языке C#
Пользователь: ivikis (IP-адрес скрыт)
Дата: 18, August, 2016 08:40

Добрый день, Алексей.
Не могли бы Вы привести пример - как изменить значение подполя в i-м повторении. Ну скажем, изменить дату возврата книги (БД - RDR, поле - 40, подполе - ^e, повторение - 5).

Возможно о сходной ситуации шла речь в сообщении от 09, June, 2015. Но я не понял как это работает.
С уважением, Александр.

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

ivikis написал(а):
-------------------------------------------------------
> Не могли бы Вы привести пример - как изменить
> значение подполя в i-м повторении. Ну скажем,
> изменить дату возврата книги (БД - RDR, поле - 40,
> подполе - ^e, повторение - 5).

// Как-нибудь добываем запись из базы RDR
IrbisRecord record = ...;

// Получаем 5-е повторение поля 40 (внимание, нумерация с нуля!)
RecordField fieldToModify = record.Fields.GetField("40").GetOccurrence(4);
if (fieldToModify == null)
{
  // нет такого повторения
}
else
{
  // устанавливаем значение подполя и отсылаем запись на сервер
  fieldToModify.SetSubField ( 'e', "20160901" ); // 1 сентября
  client.WriteRecord ( record, false, true );
}

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

Вообще, процедура продления может выглядеть так. Допустим, нам известен номер читательского билета, штрих-код или RFID-метка продлеваемого документа и новая дата предполагаемого возврата. Тогда код будет выглядеть примерно так:
void Prolongation
    (
        ManagedClient64 client, // подключение
        string ticket, // номер читательского билета
        string barcode, // штрих-код или RFID книги
        string newDate // новая дата предполагаемого возврата
    )
{
    IrbisRecord record = client.SearchReadOneRecord
        (
            "\"RI={0}\"",
            ticket
        );
    if (record != null)
    {
        RecordField field = record.Fields
            .GetField("40")
            .GetField('f', "******")
            .GetField('h', barcode)
            .FirstOrDefault();
        if (field != null)
        {
            field.SetSubField('e', newDate);
            client.WriteRecord(record, false, true);
        }
    }
}



Редактировано 1 раз. Последний раз 18.08.2016 12:47 пользователем amironov73.

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


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