Ассоциация ЭБНИТ    ИРБИС-корпорация    Вики-Ирбис    Online/CHM справка Ирбис   
Опыт и разработки пользователей ИРБИС :  ИРБИС Irbis
 
Последовательный поиск в Delphi
Пользователь: Rebel (IP-адрес скрыт)
Дата: 13, February, 2014 03:36

Как выполнить последовательный поиск rsum((if p(v40) then if v40^F : '*' then '1,' fi fi))=0 используя функцию IC_searchscan в делфи.


пробовал так
IC_searchscan('RDR','',0,1,'',0,0,rsum((if p(v40) then if v40^F : '*' then '1,' fi fi))=0,rp,32000);
ничего не получилось

Re: Последовательный поиск в Delphi
Пользователь: Gena (IP-адрес скрыт)
Дата: 13, February, 2014 06:23

Из инструкции:
Язык последовательного поиска
Запрос (или поисковое выражение) для последовательного поиска представляет собой формат на языке форматирования ИРБИС (см. Приложение 4 Общего описания системы).
Собственно процесс последовательного поиска состоит в последовательном расформатировании исходных записей (т.е. тех записей, которые участвуют в поиске): если результатом расформатирования записи является строка ‘1’ (или точнее – строка, содержащая символ ‘1’), то соответствующая запись удовлетворяет поисковому запросу, в противном случае – не удовлетворяет.
Таким образом, в обобщенном виде запрос для последовательного поиска можно представить как следующий формат:

if <логическое выражение> then ‘1’ else ‘0’ fi

где <логическое выражение> - логическое выражение, в котором можно использовать все возможности языка форматирования ИРБИС.



Следовательно:

IC_searchscan('RDR','',0,1,'',0,0,if rsum((if p(v40) then if v40^F : '*' then '1,' fi fi))=0 then '1' else '0' fi,rp,32000);

Re: Последовательный поиск в Delphi
Пользователь: Rebel (IP-адрес скрыт)
Дата: 13, February, 2014 06:59

Так тоже не получается ничего найти
условия нужно ставить в ""?

Re: Последовательный поиск в Delphi
Пользователь: Gena (IP-адрес скрыт)
Дата: 13, February, 2014 07:15

Да, нужно. Но тут, на самом деле, несколько ошибок. Начнем с того, что тут несоответствие форматов в функции.

function IC_searchscan(Adbn,Asexp: Pchar; Anumb,Afirst: integer; Aformat: Pchar; Amin,Amax: integer; Aseq: Pchar; answer: Pchar; abufsize: integer): integer;

В функции база, прямой и последовательный запросы, формат передаются как Pchar, а вы используете string.


Вот пример из работающей программы

var
  retval  : integer;
  Adbn    : Pchar;
  Asexp   : Pchar;
  Anumb   : integer;
  Afirst  : integer;
  Aformat : Pchar;
  Amin    : integer;
  Amax    : integer;
  Aseq    : Pchar;
  mas     : TStringList.Create;
begin


  {
      Регистрация на сервере Ирбиса, прочие нужные действия
  }

  GetMem(answer,buffer); //Выделяем память для буфера
  Asexp := #0; //Пустая строка, так как прямой поиск сейчас не используется
  Anumb := 0;
  Afirst := 1;
  Aformat := '@exportfoto'; //Имя файла формата, который используется для расформатирования найденных записей
  Amin := 0;
  Amax := 0;
  Aseq := 'if v954='+#39+'1'+#39+' and v950<>' + #39 + #39 +' then '+#39+'1'+#39+' else '+#39+'0'+#39+' fi'; //"сборка" поискового запроса. #39 используется для вставки в текст в этом месте одинарной кавычки. Другими словами, этот формат соответствует следующему: if v954='1' and v950<>'' then '1' else '0' fi
  retval := IC_searchscan(Adbn,
                        Asexp,
                        Anumb,
                        Afirst,
                        Aformat,
                        Amin,
                        Amax,
                        Aseq,
                        answer,
                        buffer);
  
  mas            := TStringList.Create;
  mas.Text       := utf8toansi(answer);//Результат выполнения функции преобразуем из УТВ8 в АНСИ и заносим в переменную типа TStringList

  FreeMem(answer); //Освобождаем память



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

Re: Последовательный поиск в Delphi
Пользователь: Rebel (IP-адрес скрыт)
Дата: 13, February, 2014 08:58

С поиском разобрался но ищется только по первому полю как сделать чтоб поиск шел по всем повторениям
пробовал так
Aseq := 'if v40^F:'+#39+'******'+#39+' then '+#39+'1'+#39+' else '+#39+'0'+#39+' fi';
ничего не находит
а так только первое подполе проверяет
Aseq := 'if v40^F='+#39+'******'+#39+' then '+#39+'1'+#39+' else '+#39+'0'+#39+' fi';

Re: Последовательный поиск в Delphi
Пользователь: Gena (IP-адрес скрыт)
Дата: 13, February, 2014 09:38

Попробуйте так

Aseq := 'if rsum((if p(v40) then if v40^F='+#39+'******'+#39+' then '+#39+'1;'+#39+' fi fi))>0 then '+#39+'1;'+#39+' fi';

Re: Последовательный поиск в Delphi
Пользователь: Rebel (IP-адрес скрыт)
Дата: 13, February, 2014 09:46

так тоже не ищет

Re: Последовательный поиск в Delphi
Пользователь: Gena (IP-адрес скрыт)
Дата: 13, February, 2014 12:18

Проверил. Работает. Вы делайте проверку на коды, которые вам возвращают функции. Возможно у вас мал буфер, или у вас не прошла регистрация, или еще что-нибудь. Какой код возвращает функция поиска в конце?

Проверил у себя, срабатывает поиск по такому формату, как я показал

Re: Последовательный поиск в Delphi
Пользователь: Rebel (IP-адрес скрыт)
Дата: 14, February, 2014 05:10

Спасибо все заработало, проблема была в буфере

Re: Последовательный поиск в Delphi
Пользователь: Gena (IP-адрес скрыт)
Дата: 14, February, 2014 05:21

Убедительно рекомендую проверять коды выполненных функций после каждого их выполнения. Выполнили регистрацию? Проверьте что вам вернула функция прежде, чем идти дальше. Совершили поиск? Убедитесь, что в результате что-то было найдено. Это значительно облегчает поиск того момента, на котором работать перестало.

Re: Последовательный поиск в Delphi
Пользователь: Rebel (IP-адрес скрыт)
Дата: 14, February, 2014 09:14

появился еще один вопрос как в поисковой запрос добавить значение с edit

Re: Последовательный поиск в Delphi
Пользователь: Gena (IP-адрес скрыт)
Дата: 14, February, 2014 10:37

Aseq := 'if v920='+#39+' + Edit1.text + '+#39+' then '+#39+'1'+#39+' else '+#39+'0'+#39+' fi';

Re: Последовательный поиск в Delphi
Пользователь: Rebel (IP-адрес скрыт)
Дата: 14, February, 2014 11:03

Сделал такой запрос поиск ничего не нашел
Aseq := 'if (v40^f):'+#39+'******'+#39+' and (v40^e)<'+#39+' + Edt1.text + '+#39+' then '+#39+'1'+#39+' else '+#39+'0'+#39+' fi';

по отдельности запрос работает
Aseq := 'if (v40^f):'+#39+'******'+#39+'then '+#39+'1'+#39+' else '+#39+'0'+#39+' fi';

Aseq := 'if (v40^e)<'+#39+' + Edt1.text + '+#39+' then '+#39+'1'+#39+' else '+#39+'0'+#39+' fi';

Re: Последовательный поиск в Delphi
Пользователь: Gena (IP-адрес скрыт)
Дата: 14, February, 2014 12:12

Опечатался, пробуйте так

Aseq := 'if v920='+#39+Edit1.text+#39+' then '+#39+'1'+#39+' else '+#39+'0'+#39+' fi';



Редактировано 1 раз. Последний раз 14.02.2014 12:13 пользователем Gena.

Re: Последовательный поиск в Delphi
Пользователь: Rebel (IP-адрес скрыт)
Дата: 17, February, 2014 04:32

Почему то поиск так и не работает если вместо and написать or то результат выводится
Пробовал в АРМ Каталогизаторе в последовательном поиске набирать конструкцию с and все работает а в делфи почему то не хочет

Re: Последовательный поиск в Delphi
Пользователь: Gena (IP-адрес скрыт)
Дата: 17, February, 2014 05:53

ищите ошибку в синтаксисе. В своем первом примере я привел поиск с AND из живого проекта

Re: Последовательный поиск в Delphi
Пользователь: Ivan88 (IP-адрес скрыт)
Дата: 24, February, 2014 07:25

Добрый день!
У меня возникла проблема с реализацией этой функции, пишу на delphi XE5

вот мой код:


procedure TForm1.Button2Click(Sender: TObject);
Var
k:Pchar;
answer : PChar;
s: string;
abufsize,d: integer;
Asexp : Pchar;

begin


Memo1.Lines.Add(IRBIS_Connects('192.168.34.345','6666','qwer','qwer2'));

Asexp:=#0;
k:=#39+'if v30='+#39+'E0040100718D1FDC'+#39+' then (if v40^c='+#39+#39+' then v40/ fi) fi'+#39;


abufsize:=35000;
GetMem(answer,abufsize);

d:=IC_searchscan(PChar(AnsiToUtf8(PAnsiChar('RDR'))),
Asexp,
0,
1,
Asexp,
0,
0,
PChar(AnsiToUtf8(trim(k))),
PChar(answer),
abufsize);


s:=Utf8ToAnsi(answer);
Form1.Memo1.Lines.Add('Size:'+intToStr(Length(s))+' res:'+intToStr(d)+' > '+s);
FreeMem(answer);

IRBIS_Disconnects('qwer2');
end;



Должно выводить все книги из 40'го поля, но не выходит.
Функция выдает результат выполнения 0, а буфер пуст.
Что может быть не так? (может что то с кодировкой напутал?))



Редактировано 2 раз. Последний раз 24.02.2014 08:32 пользователем Ivan88.

Re: Последовательный поиск в Delphi
Пользователь: Gena (IP-адрес скрыт)
Дата: 24, February, 2014 07:43

Откуда вы взяли функции IRBIS_Connects и IRBIS_Disconnects? И с форматами вы напутали. Еще раз прочитайте в документации назначение передаваемых аргументов у функции IC_searchscan

Re: Последовательный поиск в Delphi
Пользователь: Ivan88 (IP-адрес скрыт)
Дата: 24, February, 2014 07:53

IRBIS_Connects и IRBIS_Disconnects
это мои функции, соединение и отключение проходит верно.
Формат в смысле тип данных?
если вы про "Asexp" просто передаю в двух местах пустое значение на название не смотрите.



Редактировано 1 раз. Последний раз 24.02.2014 07:55 пользователем Ivan88.

Re: Последовательный поиск в Delphi
Пользователь: Ivan88 (IP-адрес скрыт)
Дата: 24, February, 2014 08:47

Мне форматирование ненужно, вот написано в документации:

(– пустая строка. В этом случае расформатирование записей не производится;)


поиск IC_Search у меня прекрасно работает.

первое поле в IC_searchscan
имя базы RDR, второе поле не используется (пустое значение), 3 поле у меня 0, четвертое поле 1, формат не нужен пустая строка, минимум и максимум 0, восьмое поле язык последовательного поиска есть, буфер и размер передаваемого буфера есть, скажите плиз, без загадок где не так?
возможно что то с кодировкой, я уже по разному пробовал.
В самом начале когда пытался сделать, у меня все сработало, выдал mfn всех книг 40 го поля. При повторном компилировании перестало работать, чудеса*)



Редактировано 1 раз. Последний раз 24.02.2014 08:49 пользователем Ivan88.

Re: Последовательный поиск в Delphi
Пользователь: Gena (IP-адрес скрыт)
Дата: 24, February, 2014 09:18

1. Вы передаете в параметре Aseq формат, который начинается и заканчивается кавычками. Фактически, это просто текст, а не формат. Кавычки там не должны быть.
2. С точки зрения составления форматов и использования повторяющихся полей это не самый лучший формат, лучше ввести доп проверку на наличие повторений поля
k:='if v30='+#39+'E0040100718D1FDC'+#39+' then (if p(v40) then if v40^c='+#39+#39+' then v40 fi fi/) fi';
3. Вы в принципе неправильно передаете в параметре Aseq данные. Ваш формат - показ полей, а параметр Aseq - это поисковое выражение.



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