• 15 апреля стартует «Курс «SQL-injection Master» ©» от команды The Codeby

    За 3 месяца вы пройдете путь от начальных навыков работы с SQL-запросами к базам данных до продвинутых техник. Научитесь находить уязвимости связанные с базами данных, и внедрять произвольный SQL-код в уязвимые приложения.

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

    Запись на курс до 25 апреля. Получить промодоступ ...

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

  • Автор темы Bob84
  • Дата начала
B

Bob84

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

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

hosm

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

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

Bob84

Почитал
Сделал следующее
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. Создал индекс.

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

hosm

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

Bob84

Я на сервере разработки все это делал грохнул, оно везде текст. У заказчика так видимо не выйдет... У меня еще одна ошибка такая есть, потренируюсь :)
 
B

Bob84

В результате выяснено, что (в моем случае ) не нужно удалять итемы в документах и поля в формах. Достаточно удалить индекс и выполнить такой агент (надо было убрать пару полей, поэтому немного изменил):
Код:
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
В этом случае с данными в документах ничего не произойдет.
 
Мы в соцсетях:

Обучение наступательной кибербезопасности в игровой форме. Начать игру!