Ассоциация ЭБНИТ    ИРБИС-корпорация    Вики-Ирбис    Online/CHM справка Ирбис   
Опыт и разработки пользователей ИРБИС :  ИРБИС Irbis
 
Новая запись (irbis64_client.dll)
Пользователь: ivikis (IP-адрес скрыт)
Дата: 23, December, 2015 12:33

Разобрался как редактируется существующая запись. А вот как создать новую запись (например: добавить читателя) не понимаю. Прошу помощи. Если можно небольшой пример на Pascal (Delphi).

Re: Новая запись (irbis64_client.dll)
Пользователь: ivikis (IP-адрес скрыт)
Дата: 23, December, 2015 16:10

Вопрос снят !!!

Re: Новая запись (irbis64_client.dll)
Пользователь: skiph (IP-адрес скрыт)
Дата: 08, August, 2019 12:11

Здравствуйте! 2018.1
Подскажите, как добавлять новую запись?
Использую следующую связку:
IC_recdummy(answer - создается пустая запись
IC_fldadd(answer - добавляю в пустую запись новые поля
.....
IC_changemfn(answer,MFN); - задаю MFN, который на 1 больше последнего в базе
IC_update - записываю

Программа выдает ошибку "При записи обнаружено несоответствие версий".

Что я делаю не так? Заранее благодарен.

Второй вопрос. Программа проходит последовательно по всем записям базы (RDR) и вносит свои коррективы практически в каждую. Проблема в том, что после нескольких редакций, она зависает (без ошибок, без вылетов, просто не отвечает). Есть серьезные подозрения, что это ИРБИС-сервер перестает отвечать моей программе. Причем сам ИРБИС продолжает работать. Посоветуйте, как этого избежать? (sleep(1000) для искусственного замедления процесса не помогает)
PS. Использование глобальной корректировки вместо собственной разработки не подойдет, т.к. данные у меня берутся из другой программы.

Re: Новая запись (irbis64_client.dll)
Пользователь: Gena (IP-адрес скрыт)
Дата: 08, August, 2019 13:31

skiph написал(а):
-------------------------------------------------------
> Здравствуйте! 2018.1
> Подскажите, как добавлять новую запись?
> Использую следующую связку:
> IC_recdummy(answer - создается пустая запись
> IC_fldadd(answer - добавляю в пустую запись новые
> поля
> .....
> IC_changemfn(answer,MFN); - задаю MFN, который на
> 1 больше последнего в базе

Попробуйте указівать МФН = 0

> IC_update - записываю
>
> Программа выдает ошибку "При записи обнаружено
> несоответствие версий".
>
> Что я делаю не так? Заранее благодарен.
>
> Второй вопрос. Программа проходит последовательно
> по всем записям базы (RDR) и вносит свои
> коррективы практически в каждую. Проблема в том,
> что после нескольких редакций, она зависает (без
> ошибок, без вылетов, просто не отвечает). Есть
> серьезные подозрения, что это ИРБИС-сервер
> перестает отвечать моей программе. Причем сам
> ИРБИС продолжает работать.


Попробуйте логировать в текстовый файл все действия и текущие параметры в теле цикла. Тогда по последней записи в логе вы увидите, на чем упала программа. А еще может быть и такая ситуация, если вы запустили цикл в основном потоке программы, то может зависнуть именно обновление внешнего вида, а поток с циклом будет продолжать работать. Это легко проверить: в тот момент, когда ваша программа зависнит, посмотрите в клиентском АРМ Админсртатор в меню Сервер в разделе Список зарегистрированных клиентов. Если вы увидите там своего клиента, и у него не меняется количество обращений, значит программа зависла и ничего не шлет серверу, если количество обращений будет меняться, значит у вас визуалка зависла, а поток с циклом продолжает слать серверу запросы


Посоветуйте, как этого
> избежать? (sleep(1000) для искусственного
> замедления процесса не помогает)
> PS. Использование глобальной корректировки вместо
> собственной разработки не подойдет, т.к. данные у
> меня берутся из другой программы.


Делаете модуль синхронизации студентов из АСУ ВУЗа в базу читателей?

Re: Новая запись (irbis64_client.dll)
Пользователь: skiph (IP-адрес скрыт)
Дата: 08, August, 2019 18:41

Спасибо! Попробую

> Делаете модуль синхронизации студентов из АСУ ВУЗа в базу читателей?

Да, именно так

Re: Новая запись (irbis64_client.dll)
Пользователь: skiph (IP-адрес скрыт)
Дата: 09, August, 2019 11:57

Спасибо! С нулями при добавлении новых записей помогло.

Насчет зависания программы, выяснилось, что это возникает во время обращения к функции IC_field. Заменил ее на рукописную и все заработало.

Для интересующихся привожу код функции. Чур ногами не пинать
function FindField(Strings:TStrings; fld:integer;Sign:char=#0):String;
Var i,j:integer;
 strtmp:string;
 begin
 result:='';
 strtmp:=inttostr(fld)+'#';
 j:=length(strtmp);
  for i := 4 to Strings.Count - 1 do
   if copy(Strings.Strings[i],1,j)=strtmp then
    // строка найдена
     if Sign=#0
      then Result:=copy(Strings.Strings[i],j+1,length(Strings.Strings[i]))
      else // отыскиваю нужную букву
       if POS('^'+Sign,Strings.Strings[i])<>0 then
        begin
        strtmp:=copy(Strings.Strings[i],POS('^'+Sign,Strings.Strings[i])+2,length(Strings.Strings[i]));
        if POS('^',strtmp)<>0
         then result:=copy(strtmp,1,POS('^',strtmp)-1)
         else result:=strtmp;
        end;
 end;

Пример использования:

Var Strs:TStrings;
rec:string;

begin

Strs:=TStringList.Create;
I:=IC_read(PCHAR('RDR'),j,0,answer,32000);
Strs.Text:=UTF8toAnsi(answer);

rec:=FindField(Strs,10); // фамилия
...
rec:=FindField(Strs,90,'E'); // номер группы
if rec=''
 then // поле/подполе не найдено или пустое
 else // поле/подполе найдено



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