Ассоциация ЭБНИТ    ИРБИС-корпорация    Вики-Ирбис    Online/CHM справка Ирбис   
Опыт и разработки пользователей ИРБИС :  ИРБИС Irbis
 
Delphi, Irbis64, создание читателя?
Пользователь: sergey.pratsuk@gmail.com (IP-адрес скрыт)
Дата: 16, April, 2012 15:00

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

Нет ли примера кода создания читателя с использованием модуля IRBIS64_CLIENT.pas?
Для редактирования использую функцию IC_update, а вот соответствующей функции для вставки я не нашёл.

Re: Delphi, Irbis64, создание читателя?
Пользователь: S-presso (IP-адрес скрыт)
Дата: 16, April, 2012 22:05

Новая запись создается с помощью функции IC_recdummy. Вот кусок кода из моего модуля по работе с читателями на ASP.NET (C#):

public int CreateReader(string surname, string name, string middlename, string password)
{
IntPtr record = IntPtr.Zero;
if (CreateRecord(ref record) != IRBIS64_Client.ZERO)
return -1;
if (AddField(ref record, 10, 0, surname) != IRBIS64_Client.ZERO)
return -1;
if (AddField(ref record, 11, 0, name) != IRBIS64_Client.ZERO)
return -1;
if (AddField(ref record, 12, 0, middlename) != IRBIS64_Client.ZERO)
return -1;
if (AddField(ref record, 30, 0, password) != IRBIS64_Client.ZERO)
return -1;
string dbPrev = dbCurrent;
dbCurrent = "RDR";
int result = SaveRecord(ref record);
dbCurrent = dbPrev;
return result;
}

public int CreateRecord(ref IntPtr record)
{
int result;
record = Marshal.AllocHGlobal(32000);
result = IRBIS64_Client.IC_recdummy(record, 32000);
return result;
}

public int SaveRecord(ref IntPtr record)
{
int result = IRBIS64_Client.IC_update(dbCurrent, 0, 1, out record, 32000);
return result;
}


public int AddField(ref IntPtr rp, ushort fieldId, int repeats, string field)
{
int result = IRBIS64_Client.IC_fldadd(rp, fieldId, repeats, Encoding.UTF8.GetBytes(field), 32000);
return result;
}

Re: Delphi, Irbis64, создание читателя?
Пользователь: sergey.pratsuk@gmail.com (IP-адрес скрыт)
Дата: 17, April, 2012 07:07

Спасибо, использование IC_recdummy и IC_update было очевидно, но уточнить не мешало. :)

Re: Delphi, Irbis64, создание читателя?
Пользователь: sergey.pratsuk@gmail.com (IP-адрес скрыт)
Дата: 17, April, 2012 14:17

Ещё один вопрос.
По IC_search('RDR', Pchar('RI='+expr), 0, 1, '', rp, 32000); можно найти читателя по фамилии. Как можно найти читателя по фамилии и идентификатору читателя?

Re: Delphi, Irbis64, создание читателя?
Пользователь: S-presso (IP-адрес скрыт)
Дата: 17, April, 2012 18:05

Насколько я понимаю, поисковое выражение задается одинаковым образом при поиске по идентификатору и ФИО. Просто если поисковый термин состоит из трех слов, они идентифицируются как ФИО. Если нужен поиск только по фамилии, используем усечение: IC_search('RDR', Pchar('RI='+expr+'$'), 0, 1, '', rp, 32000). А для поиска по фамилии и идентификатору я бы сначала искал все записи, соответствующие данному идентификатору, а потом уже среди них выбрал читателей с данной фамилией. Можно вернуть массив нужных записей следующей функцией (на C#):

public int SearchDirect(string s_exp, out int[] mfn)
{
IntPtr answer = Marshal.AllocHGlobal(32000);
byte[] strBytes = Encoding.UTF8.GetBytes(s_exp);
int count = IRBIS64_Client.IC_search(dbCurrent, strBytes, 0, 1, "", answer, 32000);
answer = IRBIS64_Client.IC_delim_reset(answer);
byte[] foundBytes = new byte[32000];
Marshal.Copy(answer, foundBytes, 0, 32000);
string result = Encoding.GetEncoding(1251).GetString(foundBytes);

if (count != 0)
mfn = new int[count];
else
mfn = null;
int index = 0;
int i = 0, i0;
while (foundBytes[i] != '\0')
{
if (foundBytes[i] != '\r')
{
i0 = i;
i = result.IndexOf('#', i);
mfn[index++] = Convert.ToInt32(result.Substring(i0, i - i0));
}
else
i++;
i++;
}
return index;
}

Ее вызов для поиска по идентификатору:

int[] mfn = null;
SearchDirect("RI=" + id, out mfn);

Далее считываем каждую запись, беря ее номер из массива mfn, и находим поле "Фамилия".

Re: Delphi, Irbis64, создание читателя?
Пользователь: sergey.pratsuk@gmail.com (IP-адрес скрыт)
Дата: 25, April, 2012 09:32

Спасибо.
Немного неясно, каким образом формируется строка поискового выражения RI='+expr+'$'.
RI — это поиск по идентификатору или таки по фамилии?
Можно ли задать прямой поиск по номеру читательского билета с помощью этого выражения? Без необходимости перебирать записи с подходящими по условиям фамилиями читателей?

Re: Delphi, Irbis64, создание читателя?
Пользователь: Gena (IP-адрес скрыт)
Дата: 25, April, 2012 10:01

Вы можете использовать любые имеющиеся в Ирбисе словари и поиск по ним. В словаре RI= данные из полей:

"RI="v30,/ - Идентификатор
"RI="v10," "v11," "v12/ - ФИО
(|RI=|v27/),/ - Предыдущее ФИО
"RI="v24 - Номер читательского

Re: Delphi, Irbis64, создание читателя?
Пользователь: sergey.pratsuk@gmail.com (IP-адрес скрыт)
Дата: 25, April, 2012 11:16

Большое спасибо!
Что-то типа вот этого:
ri:=IC_search('RDR', Pchar('"RI="v24'+AnsiToUtf8(expr)), 0, 1, '', rp, 32000);
Где-то что-то я пропустил, не работает.

Re: Delphi, Irbis64, создание читателя?
Пользователь: Gena (IP-адрес скрыт)
Дата: 25, April, 2012 11:21

Погодь-те! Вы меня не правильно поняли! Я привел выдежку из файла ФСТ, который в Ирбисе формирует словарь. Приведеные мною строки должны будут сформировать такие термины:

"RI="v30,/ - Идентификатор
"RI="v10," "v11," "v12/ - ФИО
(|RI=|v27/),/ - Предыдущее ФИО
"RI="v24 - Номер читательского

По идентификатору:
RI=1234567890

По ФИО
RI=Пупкина Василиса Васильевна

По предыдущему ФИО
RI=Иванова Василиса Васильевна
RI=Сидорова Василиса Васильевна

RI=0987654321

Re: Delphi, Irbis64, создание читателя?
Пользователь: sergey.pratsuk@gmail.com (IP-адрес скрыт)
Дата: 25, April, 2012 12:33

Ура, работает! Спасибо!



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