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

Разбираюсь с первым вариантом ... ругается:
"SystemArray" Не содержит определения для GetOccurrence(4).
В чем я не прав?...

Вложения: prodlenie.png (11KB)  
Re: Клиентская библиотека ИРБИС64 на языке C#
Пользователь: amironov73 (IP-адрес скрыт)
Дата: 19, August, 2016 11:21

ivikis написал(а):
-------------------------------------------------------
> Разбираюсь с первым вариантом ... ругается:
> "SystemArray" Не содержит определения для
> GetOccurrence(4).
> В чем я не прав?...

Метод GetOccurrence содержится в статическом классе Utilities в пространстве имён ManagedClient. У Вас есть строчка using ManagedClient в начале CS-файла?

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

Есть:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
using ManagedClient;
using System.Text;
using System.Collections;
using System.Data.SqlClient;
using System.Threading;

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

ivikis написал(а):
-------------------------------------------------------
> Есть:
> using System.Web.UI.WebControls;
> using ManagedClient;
> using System.Text;


Вы подключали ManagedClient через NuGet? У меня всё работает для ManagedClient 1.5.19.89, подключенного через NuGet (см. приложенный скриншот).
http://irbis.gpntb.ru/file.php?24,file=14564



Редактировано 1 раз. Последний раз 19.08.2016 15:05 пользователем amironov73.

Вложения: 2016-08-19_214812.png (947.9KB)  
Re: Клиентская библиотека ИРБИС64 на языке C#
Пользователь: ivikis (IP-адрес скрыт)
Дата: 19, August, 2016 15:43

Нет.
Работаю в Visual Web Developer 2008, экспресс выпуск
Подключился, как добавить ссылку ...

Вложения: prodlenie2.png (51.8KB)  
Re: Клиентская библиотека ИРБИС64 на языке C#
Пользователь: amironov73 (IP-адрес скрыт)
Дата: 19, August, 2016 17:11

ivikis написал(а):
-------------------------------------------------------
> Нет.
> Работаю в Visual Web Developer 2008, экспресс
> выпуск
> Подключился, как добавить ссылку ...

Ой, беда-беда, не знаю, как быть, к такому чуду даже NuGet не подключается... smiling smiley

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

Вложения: ManagedClientMerged.zip (1.68MB)  
Re: Клиентская библиотека ИРБИС64 на языке C#
Пользователь: amironov73 (IP-адрес скрыт)
Дата: 19, August, 2016 17:19

ivikis написал(а):
-------------------------------------------------------
> Работаю в Visual Web Developer 2008, экспресс
> выпуск

На правах непрошеного совета: может, попробуете Visual Studio Community?

https://www.visualstudio.com/ru-ru/news/vs2013-community-vs.aspx

Совершенно бесплатно, при этом поддерживается большинство современных технологий, включая NuGet.

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

К сожалению, ругается:
Сборка собрана в более поздней версии ...

Спасибо большое за библиотеку и Visual Studio Community - обязательно посмотрю ...

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

ivikis написал(а):
-------------------------------------------------------
> К сожалению, ругается:
> Сборка собрана в более поздней версии ...
>
> Спасибо большое за библиотеку и Visual Studio
> Community - обязательно посмотрю ...

Вот это странно, ведь собирал я её в той же самой Visual Studio 2008, что и предыдущие версии. confused smiley

Если единственное затруднение -- метод GetOccurrence, вернитесь к исходной сборке ManagedClient и просто добавьте в свой проект следующий класс:
#region Using directives

using System;
using System.Collections.Generic;
using System.Linq;

#endregion

namespace ManagedClient
{
	/// <summary>
	/// Несколько утилит, упрощающих код.
	/// </summary>
	public static class NewUtilities
	{
		/// <summary>
		/// Выборка элемента из массива.
		/// </summary>
		public static T GetOccurrence<T>
			(
				this T[] array,
				int occurrence
			)
		{
			T result = default(T);
			if ((occurrence >= 0) && (occurrence < array.Length))
			{
				result = array[occurrence];
			}
			return result;
		}

		public static T GetOccurrence<T>
			(
				this IList<T> list,
				int occurrence
			)
		{
			T result = default(T);
			if ((occurrence >= 0) && (occurrence < list.Count))
			{
				result = list[occurrence];
			}
			return result;
		}
	}
}

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

Добрый день, Алексей.
Добавил ... и все РАБОТАЕТ !!! Просто здорово !!!
Огромное спасибо !!!

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

Добрый день!

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

Однако недавно возникла странная проблема: нами написан метод (могу предоставить код), реализующий фиксацию выдачи книги читателю. Метод неоднократно тестировался и прекрасно работает. Однако недавно одна из библиотек начала жаловаться на создание пустых записей читателя при выдаче книг (с использованием данного метода). Естественно, никаких запросов на создание "пустого" читателя в методе не используется.
Ранее таких проблем не наблюдалась, в демо-версии ИРБИС 2014 (на которой тестировались все методы) новые читатели не создаются.

Не могли бы Вы помочь разобраться с данной проблемой?
Заранее большое спасибо.


С уважением, Маргарита.

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

Margo21 написал(а):
-------------------------------------------------------
> Не могли бы Вы помочь разобраться с данной
> проблемой?

Хотелось бы услышать более полное описание Вашего сценария, какую версию ManagedClient Вы используете (и в каком окружении), и, само собой, увидеть Ваш код (можно ЛС).

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

* другая версия ИРБИС-сервера/клиентов;

* повреждена база данных/поисковые индексы;

* проблемы с сетью/антивирусом;

* специфичные данные (могут включать недопустимые символы);

* и т. д.

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

Спасибо за ответ!

Используется ManagedClient версии 1.5.14.75, код отправила в ЛС.

Такая проблема наблюдается на данный момент как минимум в двух библиотеках, версию Ирбиса уточню.

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

Здравствуйте! Теперь и у нас при выдаче и возврате беда. Очищается запись книги которую выдаём.
Используем ManagedIrbis 1.6.5.1154. Версию Ирбиса уточню.
Проблема воспроизводится с экземплярами, инвентарный номер которых начинается с 500000.

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

Barkoff написал(а):
-------------------------------------------------------
> Здравствуйте! Теперь и у нас при выдаче и возврате
> беда. Очищается запись книги которую выдаём.
> Используем ManagedIrbis 1.6.5.1154. Версию Ирбиса
> уточню.
> Проблема воспроизводится с экземплярами,
> инвентарный номер которых начинается с 500000.

1. Хотелось бы увидеть код, который отвечает за данные операции.

2. На сервере никаких изменений не было? Например, обновлялся ИРБИС, редактировались форматы и т. п.

3. Можете снять дамп сетевого обмена «клиент-сервер» для проблемной книговыдачи?

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

Снять дамп сетевого обмена можно, добавив в строку подключения элемент "log=C:/Logs;" (обратите внимание на прямой слэш). При подключении к серверу папка будет очищена, в ней будут созданы файлы с захваченными пакетами:
 Содержимое папки C:\Logs

10.02.2017  15:53    <DIR>          .
10.02.2017  15:53    <DIR>          ..
10.02.2017  15:53            30 780 00000001dn.packet
10.02.2017  15:53                29 00000001up.packet
10.02.2017  15:53                37 00000002dn.packet
10.02.2017  15:53                30 00000002up.packet
10.02.2017  15:53                 0 00000003dn.packet
10.02.2017  15:53                27 00000003up.packet
               6 файлов         30 903 байт
               2 папок  24 994 889 728 байт свободно
Подробнее см. здесь:https://github.com/amironov73/ManagedIrbis/wiki/How-to-capture-network-packets

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

Здравствуйте! Объект IrbisConnection я использую следующим образом:

1. Создаю:

public IrbisConnection GetConnection()
{
var connection = new IrbisConnection();
connection.Host = Properties.Settings.Default.Host;
connection.Port = Properties.Settings.Default.Port;
connection.Username = Username;
connection.Password = Password;
connection.Workstation = IrbisWorkstation.Circulation;
try
{
connection.Connect();
}
catch (Exception ex)
{
connection.Dispose();
Dispatcher.BeginInvoke(new Action(() => MessageBox.Show(ex.ToString())));
}
return connection;
}

2. Например, возврат книг:

public void ReturnBooks(Book[] list, MarcRecord record)
{
var returnDate = DateTime.Now.ToString("yyyyMMdd");
using (var connection = GetConnection())
{
if (connection == null) return;
try
{
foreach (var b in list.Where(b => b != null && !b.IsPeriodic))
{
RecordField currentField;
if (!string.IsNullOrEmpty(b.ExBarcode))
{
currentField = b.Record.Fields
.GetField("910")
.GetField('h', b.ExBarcode)
.FirstOrDefault();
}
else
{
currentField = b.Record.Fields
.GetField("910")
.GetField('B', b.ExInventory)
.FirstOrDefault();
}

if (currentField != null)
{
currentField.SetSubField('a', "0");
connection.Database = b.Database;
connection.WriteRecord(b.Record, false, false);
}
}

connection.Database = "RDR";
foreach (var b in list)
{
RecordField readerField;
if (!string.IsNullOrEmpty(b.ExBarcode))
{
readerField = record.Fields
.GetField("40")
.GetField('h', b.ExBarcode)
.GetField('F', "******")
.FirstOrDefault();
}
else
{
readerField = record.Fields
.GetField("40")
.GetField('b', b.ExInventory)
.GetField('F', "******")
.FirstOrDefault();
}

readerField?.SetSubField('F', returnDate);
}
connection.WriteRecord(record, false, true);
}
catch (Exception ex)
{
Dispatcher.BeginInvoke(new Action(() => MessageBox.Show(ex.ToString())));
}
}
}


После того, как включил запись логов, воспроизвести проблему не удалось. Завтра восстановим повреждённую запись и попробуем воспроизвести.
На сервере изменений не было. Форматы, вроде не трогали.
Приложил файл, тот, что побольше. В остальных:
47
B
C
B
4286216
4
pass
login



login

Вложения: 00000001dn.packet (26.3KB)  
Re: Клиентская библиотека ИРБИС64 на языке C#
Пользователь: amironov73 (IP-адрес скрыт)
Дата: 14, February, 2017 05:51

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

По Вашему описанию, к сожалению, ситуация пока яснее не стала.

1. В методе ReturnBooks не видно происхождения записи record, видно лишь, что в одном из полей 40 устанавливается значение подполя F (дата возврата). Очевидно, это не может являться причиной очищения записи. Надо искать в других местах. Можете показать путь записи от считывания из базы до передачи в метод ReturnBooks? Можно в ЛС.

2. Показанные Вами дампы относятся к командам A (регистрация на сервере) и B (отключение от сервера). Они никак не помогают понять, какие данные отсылаются на сервер при попытке сохранения записи. Пришлите, пожалуйста, UP-пакеты, в которых вторая строчка D (сохранение записи).

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

Здравствуйте. Не удалось собрать логи при записи той проблемной книги (перезаписались) Прикрепил архив с логами записи других книг.
Ещё в архиве файлы: IrbisClient (который выполняет основные операции с записями) и ReturnViewModel. К сожалению, комментариев там не очень много.

У классов BOOK и READER есть поле: public MarcRecord Record { get; set; } в котором они хранят сами себя в виде MarcRecord.

Вложения: log.rar (38.3KB)  
Re: Клиентская библиотека ИРБИС64 на языке C#
Пользователь: Barkoff (IP-адрес скрыт)
Дата: 15, February, 2017 22:17

Здравствуйте! СОбрал логи для неудачного возврата. Архив прилагаю.

Вложения: log.rar (92.7KB)  
Re: Клиентская библиотека ИРБИС64 на языке C#
Пользователь: amironov73 (IP-адрес скрыт)
Дата: 16, February, 2017 03:37

Barkoff написал(а):
-------------------------------------------------------
> Здравствуйте! СОбрал логи для неудачного возврата.
> Архив прилагаю.

Здравствуйте! Кажется, причина "обнуления записей" начала проясняться! См. дамп пакета, отправляемого на сервер:

http://irbis.gpntb.ru/file.php?24,file=15531

Поле 902 (держатель документа) содержит неверно закодированный символ UTF8 (отмечен красным фоном), из-за чего сервер воспринимает эту запись следующим образом:
18306#0
0#44
920#PAZK
900#^ta^b05^c21
102#RU
101#rus
919#^arus^n02^kPSBO
902#^

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

Осталось только понять происхождение "битых" символов в записи с MFN 18306.

Можете провести диагностику файла документов в базе GBASE?
http://irbis.gpntb.ru/file.php?24,file=15532



Редактировано 1 раз. Последний раз 16.02.2017 03:39 пользователем amironov73.

Вложения: packet2up.png (159.5KB)   encoding.png (222.4KB)  
Re: Клиентская библиотека ИРБИС64 на языке C#
Пользователь: Barkoff (IP-адрес скрыт)
Дата: 16, February, 2017 10:30

Здравствуйте! Спасибо за помощь. Сделали проверку, ошибок не обнаружено.

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

Barkoff написал(а):
-------------------------------------------------------
> Здравствуйте! Спасибо за помощь. Сделали проверку,
> ошибок не обнаружено.

Действительно, такие ошибки не обнаруживаются IRBISA.exe. Я попробовал испортить аналогичным образом записи в MST-файле -- заменил нулём первый байт в фамилии автора "Головатенко-Абрамова" (см. снимок экрана).

http://irbis.gpntb.ru/file.php?24,file=15540

IRBISA.exe ошибок не обнаружил (((

Не знаю, что и посоветовать в Вашем случае, однако в полях/подполях записи не должно быть символов с кодами, меньшими 0x20. Такие символы приводят к ошибкам, подобным Вашей.



Редактировано 1 раз. Последний раз 16.02.2017 11:05 пользователем amironov73.

Вложения: broken.png (12.5KB)  
Re: Клиентская библиотека ИРБИС64 на языке C#
Пользователь: Barkoff (IP-адрес скрыт)
Дата: 19, February, 2017 22:30

Здравствуйте! Подскажите, пожалуйста, почему результаты поиска содержат не более 256 записей?
Как получить список задолжников? (Читателей, на руках у которых есть книги, дата предполагаемого возврата которых уже наступила)

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

Barkoff написал(а):
-------------------------------------------------------
> Здравствуйте! Подскажите, пожалуйста, почему
> результаты поиска содержат не более 256 записей?

Покажите код, в котором это происходит.

Следующий код для ManagedIrbis 1.6.5.1154 и сервера 2016.1 возвращает 479 записей:
using (IrbisConnection connection = new IrbisConnection(connectionString))
{
  MarcRecord[] records = connection.SearchRead
    (
       "\"K={0}\"",
       "бег"
    );
  Console.WriteLine(records.Length);
}
Поэтому надо понять, чем Ваша ситуация отличается от моей.

> Как получить список задолжников? (Читателей, на
> руках у которых есть книги, дата предполагаемого
> возврата которых уже наступила)

Примерно так:
using System;
using System.Diagnostics;

using ManagedIrbis;
using ManagedIrbis.Readers;

class Program
{
    static void Main()
    {
        const string connectionString = "host=127.0.0.1;port=6666;user=1;password=1;";
        using (IrbisConnection connection = new IrbisConnection(connectionString))
        {
            Stopwatch stopwatch = new Stopwatch();
            stopwatch.Start();

            DebtorManager manager = new DebtorManager(connection)
            {
                ToDate = DateTime.Today.AddDays(-1.0)
            };
            
            manager.BatchRead += (sender, args) => Console.Write(".");
            DebtorInfo[] allDebtors = manager.GetDebtors();
            Console.WriteLine();

            foreach (DebtorInfo debtor in allDebtors)
            {
                Console.WriteLine
                    (
                        "Задолжник: {0}, должен {1} книг",
                        debtor.Name,
                        debtor.Debt.Length
                    );
            }

            stopwatch.Stop();
            Console.WriteLine("Заняло времени: {0}", stopwatch.Elapsed);
        }
    }
}
Для нашей базы данных RDR (около 50 тыс. записей) процесс занимает примерно 70 секунд.

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

Здравствуйте! Спасибо за помощь.
Поиск осуществляю аналогично:
baseRecords = connection.SearchRead("{0}{1}", dictionary, searchText);
Возможно, в настройках Ирбиса что-то есть про 256.

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

Barkoff написал(а):
-------------------------------------------------------
> Поиск осуществляю аналогично:
> baseRecords = connection.SearchRead("{0}{1}",
> dictionary, searchText);

Лучше так:
baseRecords = connection.SearchRead("\"{0}{1}\"",
dictionary, searchText);
> Возможно, в настройках Ирбиса что-то есть про 256.

Если есть такая возможность, обновите сервер ИРБИС64. Также в качестве "костыля" можно попробовать такую конструкцию:
MarcRecord[] records = BatchRecordReader.Search
    (
        connection,
        connection.Database,
        "\"K=бег\"",
        100
    )
    .ToArray();



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

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

Здравствуйте! Скажите, есть ли смысл пытаться получить список задолжников путём поиска в базе напрямую? Если есть, покажите, пожалуйста, пример.

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

Barkoff написал(а):
-------------------------------------------------------
> Здравствуйте! Скажите, есть ли смысл пытаться
> получить список задолжников путём поиска в базе
> напрямую? Если есть, покажите, пожалуйста, пример.

Смотря что Вы называете "списком задолжников". Если Вам необходим простой перечень читателей, имеющих на руках библиотечные книги, достаточно провести простой поиск в базе данных по запросу "RB=$".

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

http://irbis.gpntb.ru/file.php?24,file=15620

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

Вас интересует именно такой вариант или какой-либо другой?



Редактировано 1 раз. Последний раз 07.03.2017 15:26 пользователем amironov73.

Вложения: debtors.png (702.9KB)  
Re: Клиентская библиотека ИРБИС64 на языке C#
Пользователь: Barkoff (IP-адрес скрыт)
Дата: 07, March, 2017 16:31

Да, второй вариант нужен.

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


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