Ftsearch [period] = "декабрь"

Bob84

Well-known member
16.05.2012
48
0
#1
Здравствуйте.
Есть база с документами, индекс создан, падает при следующем запросе (как в коде, так и через поиск в представлении выдает сообщение "Query is not understable"):
[Period] = "декабрь"

Поле текстовое. С другими полями проблем нет. В другой базе на аналогичный запрос не плюется ошибкой.
Пересоздал индекс - не помогло.
 

hosm

* so what *
18.05.2009
2 442
6
#2
Проблема возникла у заказчика или на стенде разработки? Где-то это поле было или есть нетекстовым (дата, например) и так записано в таблице полей базы.
Если было - удалить индекс и пересоздать реплику. Если есть - переименовать поле в существующих документах или отказаться от использования фт-индекса. Спроси у Тохи нашего, он с этим сталкивался при поиске.

P.S.: Насколько я помню, удаление индекса и компакт в моем случае не помогли (compact обычный и copy-style вроде делала тоже, уже не помню точно), хотя где-то в вариантах гугления было описано, что помогает, а локальная реплика без индекса помогла, но на сервер разработки ее не заливала - в итоге тогда приняли решение обойтись без ft.
Ссыль от вендора -
Для просмотра контента необходимо: Войти или зарегистрироваться
 

Bob84

Well-known member
16.05.2012
48
0
#4
Почитал ссылка
Сделал следующее
1. Удалил поле Period из всех форм (в подформах у меня его не было).
2. Выполнил следующий агент:

Код:
Sub Initialize
Dim s As New NotesSession
Dim db As NotesDatabase
Dim dc As NotesDocumentCollection
Dim doc As NotesDocument
Dim i As Integer
Dim nc As NotesNoteCollection
Dim noteid As String
Dim nextnoteid As string

Const ITEM_NAME = "Period"

Set db = s.Currentdatabase
Set dc = db.Alldocuments

i = 1
Set doc = dc.Getfirstdocument()
While Not doc Is Nothing
If doc.Hasitem( ITEM_NAME ) Then
Call doc.Removeitem( ITEM_NAME )
Call doc.Save( true, false )
End If

Print CStr( i ) & "\" & CStr( dc.Count )
i = i + 1
Set doc = dc.Getnextdocument( doc )		
Wend

'погромист-кун не должен забывать про наличие итемов в формах...	
Set nc = db.CreateNoteCollection(False)	
nc.SelectForms = true
Call nc.BuildCollection
noteid = nc.Getfirstnoteid()
For i = 1 To nc.Count
Set doc = db.Getdocumentbyid( noteid )
noteid = nc.Getnextnoteid( noteid )
If doc.Hasitem( ITEM_NAME ) Then
Call doc.Removeitem( ITEM_NAME )
Call doc.Save( True, False )
End If
Print CStr( i ) & "\" & CStr( nc.Count )
Next	

End Sub
3. Удалил индекс
4. Через администратор выполнил команду (перед этим закрыл базу, в том числе в дизайнере удалил ссылку на нее):
lo compact <путь к базе> –c
5. Вернул поле Period в формы.
6. Выполнил компакт базы.
7. Создал индекс.

Проблема решена.
Еще раз спасибо за помощь.
 

hosm

* so what *
18.05.2009
2 442
6
#5
>5. Вернул поле Period в формы.
Проверил, оно везде на формах текстовое? Если нет, лучше переименовать нетекстовое. Одно имя с разными типами - плохая практика для доминохи.
Хотя, возможно, для таких полей галочка на форме "не добавлять в индекс" поможет.
Какой-то странный вариант работы с доками - разве это поле темповое, что везде грохнули без разбору:)
 

Bob84

Well-known member
16.05.2012
48
0
#6
Я на сервере разработки все это делал грохнул, оно везде текст. У заказчика так видимо не выйдет... У меня еще одна ошибка такая есть, потренируюсь :)
 

Bob84

Well-known member
16.05.2012
48
0
#7
В результате выяснено, что (в моем случае ) не нужно удалять итемы в документах и поля в формах. Достаточно удалить индекс и выполнить такой агент (надо было убрать пару полей, поэтому немного изменил):
Код:
Sub Initialize
Dim s As New NotesSession
Dim db As NotesDatabase
Dim dc As NotesDocumentCollection
Dim doc As NotesDocument
Dim i As Integer
Dim nc As NotesNoteCollection
Dim noteid As String
Dim nextnoteid As string
Dim itemArr As Variant
Dim NeedSave As Boolean

Const ITEM_NAME = "ItemName1|ItemName2"

itemArr = Split( ITEM_NAME, "|" )
'погромист-кун не должен забывать про наличие итемов в формах...
Set db = s.Currentdatabase	
Set nc = db.CreateNoteCollection(False)	
nc.SelectForms = true
Call nc.BuildCollection
noteid = nc.Getfirstnoteid()
For i = 1 To nc.Count
Set doc = db.Getdocumentbyid( noteid )
noteid = nc.Getnextnoteid( noteid )
NeedSave = false
ForAll IA In itemArr
If doc.Hasitem( IA ) Then
Call doc.Removeitem( IA )
NeedSave = true
End If
End ForAll
If NeedSave Then
Call doc.Save( True, False )
End If
Print CStr( i ) & "\" & CStr( nc.Count )
Next	

End Sub
В этом случае с данными в документах ничего не произойдет.