Ассоциация ЭБНИТ    ИРБИС-корпорация    Вики-Ирбис    Online/CHM справка Ирбис   
Опыт и разработки пользователей ИРБИС :  ИРБИС Irbis
 
Страницы: <<12
Страница: 2 из 2
Re: Автосчетчик для поля в каталогизаторе
Пользователь: Куделя (IP-адрес скрыт)
Дата: 11, January, 2007 13:16

Во первых: не CORRECT а CORREC
Во вторых: а где собственно оператор обработки? Посмотрите доументацию насчет CORREC и разложите что вы написали:
Корректировать в БД COUNT запись найденную по термину CN=Ncount (тут кстати не знаю значимо ли это, но во избежание выяснений в дальнейшем написал бы я CN=NCOUNT, т.к. термины в верхнем регистре все равно). Перед корректировкой добавить в эту запись поле 1001 которое почему то должно содержать строку val(v5000)+1 (заче она там? или вы просто случайно включили ее в литерал?). А дальше вся ваша корректировка свелась к удалению модельного поля 1001...
В-третьих: CORREC должен быть закрыт оператором END

Или вы не весь код привели или я не знаю.

Кстати в списке кодов ошибок (25) что-то не нашел...

Иркутская ОГУНБ
ИРБИС64.21Турбо
WebИРБИС-PHP

Re: Автосчетчик для поля в каталогизаторе
Пользователь: Кирилл Соколинский (СЗТУ) (IP-адрес скрыт)
Дата: 11, January, 2007 17:11

Извиняюсь, переделав код с учётом повторяемости 927, я сделал не все требующиеся исправления и, кроме того, допустил опечатку, поставив лишнюю скобку. К сожалению, времени было очень мало, поэтому я его не тестировал.
Правильный вариант должен выглядеть так:
ADD
927^m
F
(if p(v927) then if a(v927^m) then &uf('+1W200#',&uf('G0.',v927^h)),&uf('DCOUNT,|VD=CNT|,',|(if p(v5000) then if v5000^a=&uf('+1R200') then v5000^b, break fi,fi)|d927),&uf('+1W200#') fi,fi#)
XXXXXXXXXXXXXXXXXXX

Полагаю, будет не лишним пояснить, зачем я записываю значение поля v927^h в глобальную переменную. Цель этого - передать значение в формат, который расформатируется на ДРУГОЙ записи, ОТЛИЧНОЙ от текущей - записи счётчике. Других способов сделать этого нет.
Для чего глобальную переменную применяете Вы, мне не совсем понятно. Но могу только заметить, что без необходимости UNIFORы лучше не использовать. Они выполняются приблизительно в три раза медленнее, чем стандартные функции CDS\ISIS.

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

Re: Автосчетчик для поля в каталогизаторе
Пользователь: -AND- (IP-адрес скрыт)
Дата: 11, January, 2007 18:07

Да, да, END был, а вот с полем 1001 - я сделал не правильно, теперь понял, нужно было вот так:

ADD
'927^M'
F
if p(v927^H) then if a(v927^M) then &uf('+1W22#',&uf('DCOUNT,|CN=NCOUNT|',"if p(v5000) then v5000 fi"d920,fi)),&uf('+1R22') fi
XXXXXXXXXXXXXXXXXXX
CORREC
'COUNT'
if p(v5000) then if val(&uf('+1R22'))=val(v5000) then 'val(v5000)+1' fi,fi
'CN=NCOUNT'
XXXXXXXXXXXXXXXXXXX
REP
'5000'
F
v1001
XXXXXXXXXXXXXXXXXXX
DEL
1001
XXXXXXXXXXXXXXXXXXX
END


Кстати символы XXXXXXXXXXXXXXXXXXX что-нить значат, или просто для читаемости?

Формат не работает, при сохранении документа пишет так: Item out of bounds.



Редактировано 1 раз. Последний раз 11.01.2007 18:37 пользователем -AND-.

Re: Автосчетчик для поля в каталогизаторе
Пользователь: Куделя (IP-адрес скрыт)
Дата: 12, January, 2007 09:18

-AND- написал(а):
-------------------------------------------------------
> ADD
> '927^M'

А зачем в литералах?

> F
> if p(v927^H) then if a(v927^M) then
> &uf('+1W22#',&uf('DCOUNT,|CN=NCOUNT|',"if p(v5000)
> then v5000 fi"d920,fi)),&uf('+1R22') fi
> XXXXXXXXXXXXXXXXXXX
> CORREC
> 'COUNT'
> if p(v5000) then if val(&uf('+1R22'))=val(v5000)
> then 'val(v5000)+1' fi,fi

Еще раз спрашиваю почему увеличение счетчика на единицу пишется в 1001 поле в виде литерала (т.е. строки с формулой). Если вы хотите дать в 1001 макс. значение + 1, то у вас должно быть наверное вот так:
if p(v5000) then if val(&uf('+1R22'))=val(v5000) then f(val(v5000)+1,0,0) fi,fi

> 'CN=NCOUNT'
> XXXXXXXXXXXXXXXXXXX
> REP
> '5000'
> F
> v1001
> XXXXXXXXXXXXXXXXXXX
> DEL
> 1001
> XXXXXXXXXXXXXXXXXXX
> END

> Кстати символы XXXXXXXXXXXXXXXXXXX что-нить
> значат, или просто для читаемости?
"Хвостовые" точно для нее, а вот между значимыми строками одного оператора глобальной корректировки - врать не буду не проверял

Иркутская ОГУНБ
ИРБИС64.21Турбо
WebИРБИС-PHP

Re: Автосчетчик для поля в каталогизаторе
Пользователь: ochagova (IP-адрес скрыт)
Дата: 12, January, 2007 11:01

У вас непонятный формат.
Не вдаваясь в суть, а чисто формально конструкция
&uf('DCOUNT,|CN=Ncount|',"if p(v5000) then v5000 fi"d920,fi)
по-моему, должна выглядеть так:
&uf('DCOUNT,|CN=Ncount|,"if p(v5000) then v5000 fi"d920')

Re: Автосчетчик для поля в каталогизаторе
Пользователь: -AND- (IP-адрес скрыт)
Дата: 17, January, 2007 09:57

ochagova
Да вы абсолютно правы там должно быть именно так.

Re: Автосчетчик для поля в каталогизаторе
Пользователь: -AND- (IP-адрес скрыт)
Дата: 17, January, 2007 13:46

Вот теперь уж вроде все правильно:
ADD
927^M
F
if p(v927^H) then if a(v927^M) then &uf('DCOUNT,|CN=NCOUNT|,v5000'd920)fi,fi
XXXXXXXXXXXXXXXXXXX
CORREC
'COUNT'
if p(v5000) then f(val(v5000)+1,0,0) fi
'CN=NCOUNT'
XXXXXXXXXXXXXXXXXXX
REP
5000
F
if f(val(v5000),0,0)<f(val(v1001),0,0)then v1001 fi
XXXXXXXXXXXXXXXXXXX
DEL
1001
XXXXXXXXXXXXXXXXXXX
END
XXXXXXXXXXXXXXXXXXX
XXXXXXXXXXXXXXXXXXX
XXXXXXXXXXXXXXXXXXX
XXXXXXXXXXXXXXXXXXX

Значение переносится, но в части начиная с CORREC какая-то ошибка. Если в CORREC стоит 'CN=NCOUNT' - пишет Item out of bounds.
Если там же стоит |CN=NCOUNT| - не ругается, но счетчик на единицу не увеличивает. Но что ему не нравится в 'CN=NCOUNT', там же должна быть строка порождающая термин словаря, а термин именно такой.



Редактировано 2 раз. Последний раз 18.01.2007 14:08 пользователем -AND-.

Re: Автосчетчик для поля в каталогизаторе
Пользователь: -AND- (IP-адрес скрыт)
Дата: 17, January, 2007 18:41

Еще вычислил что когда я сохраняю первую запись в которой присутствует полем 927^M, запись в базе данных, где находится счетчик блокируется. Вот может по этому не происходит увеличение на единицу. Только эта запись блокируется не временно, а нужно с администратора ее разблокировать. В чем может быть причина этого?
Отсюда и сообщение Item out of bounds.

Re: Автосчетчик для поля в каталогизаторе
Пользователь: -AND- (IP-адрес скрыт)
Дата: 23, February, 2007 14:06

Жаль что счетчик не заработал, но там подозреваю где-то маленькая заноза, которая мешает. Синтаксис вроде уже правильный, буду разбираться.
Я уже немного остыл, было время подумать, и додумал до того, что Соколинский Кирилл был прав, по поводу того, что автосчетчик не убыстрит процесс ввода. Заместь того, как Соколинский и говорил нужно организовать изготовление ссылки в поле 951^i, это намного существенней будет. Я так и сделал, в поле 951^i организовал формирование исходя из данных в других полях.

Re: Автосчетчик для поля в каталогизаторе
Пользователь: -AND- (IP-адрес скрыт)
Дата: 23, February, 2007 15:18

И еще вопрос по словарям. Я так и не уяснил это для себя.
Вот например если у меня задача сделать ввод в какое-либо поле через словарь, обязательно ли в ТВП базы данных должен присутствовать формат отбора для этого поля? Насколько я понял, чтобы запись попала в словарь, формат выбора должен обязательно присутствовать в ТВП этой базы. И тогда зачем нужно другие .FST, для организации поиска, и только?

Re: Автосчетчик для поля в каталогизаторе
Пользователь: Кирилл Соколинский (СЗТУ) (IP-адрес скрыт)
Дата: 25, February, 2007 19:55

-AND- написал(а):
-------------------------------------------------------
> Жаль что счетчик не заработал

Ошибка здесь:
if f(val(v5000),0,0)<f(val(v1001),0,0) then v1001 fi
Как и во многих языках программирования, в ИРБИС Script предусмотрены два типа данных: числовой и текстовый. Числовые данные могут сравниваться между собой, складываться, вычитаться и умножаться. С текстовыми данными эти операции невозможны.
Чтобы система интерпретировала некоторую строку как число, используется функция val(). Чтобы добиться противоположного результата, используется f(). Ваша конструкция f(val(v1001),0,0) вначале преобразовывает содержимое поля v1001 в числовой тип, а затем снова в строковый. В итоге для сравнения используются строковые значения, что недопустимо. Синтаксис должен быть таким:
if val(v5000)<val(v1001) then v1001 fi
А вообще, с типами данных в ИРБИС страшная путаница. Например, &unifor() возвращает значение, которое может интерпретироваться и как строковое, и как числовое...

> Синтаксис
> вроде уже правильный, буду разбираться.

В остальном, формальном плане у Вас всё корректно. Только "d920" лучше убрать - это здесь уже не нужно.

Re: Автосчетчик для поля в каталогизаторе
Пользователь: Кирилл Соколинский (СЗТУ) (IP-адрес скрыт)
Дата: 25, February, 2007 19:57

Поскольку Вы всё-таки хотите использовать счётчик, а я обещал Вам написать вторую часть кода с учётом повторяющихся полей, выполняю своё обязательство. Очень рекомендую использовать для хранения значений счётчика именно запись POLZV базы CMPL. Это самое простое и логичное решение. Кроме того, для работы скрипта Вам потребуется format32.dll, выпущенная не раньше 27.10.05.
0
ADD
927^m
F
&uf('MI927'),(if p(v927) then if a(v927^m) then, if v927^h<>&uf('+1R200') then, &uf('+1W200#',v927^h),&uf('+1W201#',&uf('DCMPL,|VD=POLZV|,',|(if p(v5000) then if v5000^h=&uf('+1R200') then v5000^m, break fi,fi)|d927)),fi,if &uf('+1R201')='' then &uf('+1W201#1') else, &uf('+1W201#',f(val(&uf('+1R201'))+1,0,0)),fi,&uf('+1R201'),fi,fi#)
XXXXXXXXXXXXXXXXXXX
CORREC
'CMPL'
&uf('+1W1001#',(v927/))
'VD=POLZV'
XXXXXXXXXXXXXXXXXXX
ADD
5000

&uf('+1W301#',(v5000^h'*')),(if p(g1001) then if &uf('+1R301'):s(g1001^h'*') then else '^H'g1001^h,'^M1',&uf('+1W301#',g1001^h,'*',&uf('+1R301')), fi,fi/)
XXXXXXXXXXXXXXXXXXX
REP
5000^m
F
(if p(v5000) then &uf('+1W300#',v5000^h),ref(mfn,(if p(g1001) then if &uf('+1R300')=g1001^h then &uf('+1W203#',g1001^m) fi,fi)), if &uf('+1R203')<>'' then &uf('+1R203'),&uf('+1W203#') else v5000^m fi, fi#)
XXXXXXXXXXXXXXXXXXX
DEL
1001

XXXXXXXXXXXXXXXXXXX
XXXXXXXXXXXXXXXXXXX
END
XXXXXXXXXXXXXXXXXXX
XXXXXXXXXXXXXXXXXXX
XXXXXXXXXXXXXXXXXXX
XXXXXXXXXXXXXXXXXXX

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

Совершенно верно.

> И тогда зачем нужно другие .FST, для организации
> поиска, и только?

Другие ТВП используются при переносе данных из одной базы в другую и качестве конвертеров.

> Я уже немного остыл, было время подумать, и
> додумал до того, что Соколинский Кирилл был прав,
> по поводу того, что автосчетчик не убыстрит
> процесс ввода. Заместь того, как Соколинский и
> говорил нужно организовать изготовление ссылки в
> поле 951^i, это намного существенней будет. Я так
> и сделал, в поле 951^i организовал формирование
> исходя из данных в других полях.

Я предлагал гораздо более радикальное решение. ;) Как ни странно, у меня тоже возникла необходимость написать счётчик. Администрация, чтобы залатать показатели, решила высчитывать читаемость, складывая количество взятых книг с количеством скаченных электронных пособий. :)
Я готов предоставить Вам готовое решение, которое даст возможность полностью автоматизировать процесс загрузки и переименования документов. Кроме того, в ближайшее время я напишу счётчик. Если Вы сможете установить и настроить WEB Сервер и PHP для своей внутренней сети, эти скрипты решат Ваши проблемы. WEB ИРБИС не потребуется.

Re: Автосчетчик для поля в каталогизаторе
Пользователь: Кирилл Соколинский (СЗТУ) (IP-адрес скрыт)
Дата: 25, February, 2007 20:33

Уважаемые коллеги, может быть вы можете указать на какой-нибудь какой-нибудь PHP-шный анализатор закачек? Я почти уверен, что соответствующий код должен присутствовать в составе всех крупных систем управления сайтом. Очень не хочется заниматься изобретением велосипеда и потом выяснить, что для нормального анализа в таблице БД не хватает какого-нибудь важного поля. Как только счётчик будет готов, обязательно выложу исподники. Мне кажется, сейчас проблема сбора статистики актуальна для многих...

Re: Автосчетчик для поля в каталогизаторе
Пользователь: -AND- (IP-адрес скрыт)
Дата: 28, February, 2007 11:56

Кирилл у меня несколько вопросов:
1.POLZV - почему не отдельная настроечная база?
2.Зачем сортировать &uf('MI927') ?
3.Зачем тут (v5000^h'*') '*' ?
4.Что значит p(g1001) "g" ?

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

По поводу преобразования типов данных - протормозил. Даже не подумал что такая запись(f(val(v5000),0,0)<f(val(v1001),0,0)) противоречит сама себе, если нужно сравнивать числовой тип данных.

И еще вопрос к программистам: все же если прицепить Format32.DLL от нового к старому Ирбису - он будет работать? Я спрашивал у своего программиста, он сказал что для этого нужно, чтобы в программе было организовано обращение к новым командам из Format32.DLL. Но почему спрашиваю - тут ведь не автоматически идет обращение, тут пользователь явно указывает обращение, так что надежда есть?

Re: Автосчетчик для поля в каталогизаторе
Пользователь: -AND- (IP-адрес скрыт)
Дата: 28, February, 2007 14:10

И еще глупый вопрос: повторяющееся поле - это когда поле имеет несколько экземпляров,или же это поле, в котором есть подполя? А то я, читая формат выше начал сомневаться в понимании термина "повторяющееся поле"?

Re: Автосчетчик для поля в каталогизаторе
Пользователь: Кирилл Соколинский (СЗТУ) (IP-адрес скрыт)
Дата: 01, March, 2007 15:26

-AND- написал(а):
-------------------------------------------------------
> Кирилл у меня несколько вопросов:
> 1.POLZV - почему не отдельная настроечная база?
> 2.Зачем сортировать &uf('MI927') ?
> 3.Зачем тут (v5000^h'*') '*' ?
> 4.Что значит p(g1001) "g" ?

1. Потому, что создавать отдельную базу для изменения значения одного поля в одной записи нецелесообразно.
2. Чтобы исключить обнуление счётчика в случае, если пользователь будет вводить индексы не по порядку.
927: ^h32
927: ^h24
927: ^h32
(вот это, как раз, пример повторяющегося поля. Посмотрите любую запись в формате ALL, а не Оптимизированном)
Использование различных систематических индексов для одной записи – крайне редкая ситуация, но я решил её предусмотреть.
4. &uf('+1W301#',(v5000^h'*')),(if p(g1001) then if &uf('+1R301'):s(g1001^h'*') . . . . . . применяется для исключения повторного добавления уже имеющихся индексов. Того же результата можно было достигнуть при помощи ref()(как это сделано в REP), но ref() потребовала бы больших ресурсов.
3. G - форматный вывод глобальной переменной. Используется здесь, поскольку ref() не работает с модельными полями типа 1001. Простейший пример использования вывода найдёте тут: [irbis.gpntb.ru] Более полная информация находится в RELEASE_OVERALL.doc из дистрибутива демоверсии(ftp://ftp.gpntb.ru/pub/irbis/).

Эта корректировка включает ряд достаточно сложных для понимания решений. Она не может выступать в качестве учебного пособия. Я рекомендую Вам начать изучение языка с чтения четвёртого приложения Irbis1.doc. Но сейчас, надеюсь, Вы убедились, что некоторые задачи лучше решать с помощью PHP, чем средствами ИРБИС Script...



Редактировано 2 раз. Последний раз 01.03.2007 15:33 пользователем Кирилл Соколинский (СЗТУ).

Re: Автосчетчик для поля в каталогизаторе
Пользователь: -AND- (IP-адрес скрыт)
Дата: 01, March, 2007 16:26

Да, нужно только дождаться пока мне новый Ирбис купят, надеюсь летом на конференции...

Re: Автосчетчик для поля в каталогизаторе
Пользователь: -AND- (IP-адрес скрыт)
Дата: 23, March, 2007 10:56

И еще вопрос:
Если в ТВП сделать не так(поле 5000 вымышленное но повторяющееся):

if p(v5000^a) then (|PR=|v5000^a /) fi

а так:

(|PR=|v5000^a /)

то:
с условным понятно, проверка условия, и если подполе 5000^a есть то оно будет проиндексировано.
А вот во втором случаи как будет? Если подполе 5000^a будет пустым, то префикс не появится и пустое подполе не проиндексируется? Так ли это?

И что будет если сделать так:
('PR='v5000^a /)

и при этом поле 5000^a - пустое?

Re: Автосчетчик для поля в каталогизаторе
Пользователь: Куделя (IP-адрес скрыт)
Дата: 23, March, 2007 12:36

Во втором случае ничего не будет - поскольку условный литерал "приклеивается" только к непустой выходной строке
В случае же использования безусловного литерала будет вам безусловно одна строка в словаре со значением PR=, поскольку один проход цикла все равно будет выполнен

Иркутская ОГУНБ
ИРБИС64.21Турбо
WebИРБИС-PHP

Re: Автосчетчик для поля в каталогизаторе
Пользователь: Gena (IP-адрес скрыт)
Дата: 05, August, 2015 08:51

Сейчас посмотрел дистрибутива Ирбис64 2014.1. В нем есть файл "Сервер 64.doc" с описанием всех пакетов, структуры баз и файлов. В принципе, для написания своего клиента, общающегося с сервером ирбиса напрямую, без каких бы то ни было других прослоек (длл), этого хватает.

Re: Автосчетчик для поля в каталогизаторе
Пользователь: amironov73 (IP-адрес скрыт)
Дата: 05, August, 2015 10:36

Gena написал(а):
-------------------------------------------------------
> Сейчас посмотрел дистрибутива Ирбис64 2014.1. В
> нем есть файл "Сервер 64.doc" с описанием всех
> пакетов, структуры баз и файлов. В принципе, для
> написания своего клиента, общающегося с сервером
> ирбиса напрямую, без каких бы то ни было других
> прослоек (длл), этого хватает.

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

Чтобы не быть голословным, в качестве примера приведу описание команды "D", с помощью которой клиент просит сервер сохранить некую запись в базе данных. В документации на странице 36 приводится следующий формат пакета:
Db_name – имя БД
Lock – блокировать ли запись. 1 – блокировать, 0 – не блокировать.
IfUpdate – актуализировать ли запись. 1 – актуализировать, 0 – не актуализировать
Rec – строка, состоящая из группы следующих параметров:
MFN#STATUS#30#310#VERSION#30#31TAG1#FIELD1#30#31 … TAG1#FIELD1#30#31
Т. е. в качестве разделителей полей предлагается использовать двухбайтовую последовательность 1E 1F, в то время как стандартные клиенты на самом деле используют последовательность 1F 1E (см. дамп, полученный WireShark):

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

Было бы неплохо, если бы авторы привели документацию в соответствие с реальным протоколом.

Re: Автосчетчик для поля в каталогизаторе
Пользователь: Gena (IP-адрес скрыт)
Дата: 05, August, 2015 11:20

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

Страницы: <<12
Страница: 2 из 2


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