Утилита для просмотра содержимого полей документа

  • Автор темы osmor
  • Дата начала
T

TIA

Omh

БД хорошая. Много изучено. Дизайн красивый. Но не всё работает. Некоторые действия никак не проявляют своей работы.

Я в своё время, для управления кучей БД разных проектов тоже похожую тулзу сделал. Поэтому сразу обратил внимание на свою первую граблю. Ты на неё тоже наступил. Когда устанавливаешь св-ва "Is master" и "Master" , т.е. что БД является шаблоном или наследует, мало менять св-во БД, надо ещё в ноту иконки в $Title эту инфу прописывать. Иначе, наверно замечал, что наследование иногда неожиданно исчезает или рефреш не проходит.
С 6ки св-во NotesDatabase.Title доступно на запись. Через неё тоже можно записывать (тогда только один раз), но что-то в ней глючило. Кажется, большой совокупный размер титла БД+имени шаблона+мастер шаблона+категории БД, т.е. того, что в $TITLE хранится. Т.е. через API надёжней.

Схема:
Dim Info As String
Dim iconDoc As NotesDocument

Info = String$(256, Chr(0))
NSFDbInfoGet(hDb, Info)
NSFDbInfoModify( Info, INFOPARSE_CLASS, TmplName )
NSFDbInfoSet( Me.hDb, Info)
Set iconDoc = m_Db.GetDocumentByID("FFFF0010")
rc = NSFItemSetText( iconDoc.Handle,"$TITLE", Info,65535)

Omh
У тебя есть функция "Check shared actions", а как ты проверяшь, все ли shared-экшены скомпилированы? Простого наличия $SCRIPTOBJ_* ведь недостаточно.
 
O

Omh

Посмотрел сейчас, что я когда-то выкладывал.
По идее должно работать всё ;)
Если что-то интересное не работает - скажи, может там условия какие-то соблюдены должны быть.

Насчёт ноты иконки: насколько я помню, при изменении тайтла базы было обязательно обновлять эту инфу.
При изменении Master template/Inherit from пропертей это было не обязательно.
У меня кстати тоже есть 2 этих строчки в классе, но закомменчены ;)
Честно говоря, Master template/Inherit from у меня не глючит, но я попробую апдейтить эту ноту тоже.

"Check shared actions" на самом деле просто обвязка для одного экзешника actchk.exe, который я нашёл 100 лет назад на просторах интеренета.
Даже нашёл, где я его брал: вот .
Сам экзешник в базе есть, если интересно, идёшь во view Administration, открываешь документ и там лежат все аттачменты, которые юзаются данной базой.

Сейчас это всё дело развилось и коммерциализовалось, но в том, что выкладывал тогда, тоже есть что глянуть.
 
T

TIA

По идее должно работать всё
Теоретически, теория совпадает с практикой. Практически - нет. :)
Вобщем, разобрался. Как раз во вьюшке Administration БД DBHelper2 не было документа и дефолтный редактор не был настроен.
При изменении Master template/Inherit from пропертей это было не обязательно.
Было и есть обязательно. Установи у БД наследование и посмотри значение $Title иконки.

"Check shared actions" на самом деле просто обвязка для одного экзешника actchk.exe,
Хм. Судя по описанию, он не совсем честно работает. Бывают:
1) "висячие" "$SCRIPTOBJ_n", т.е. не связанные с акцией объектники,
2) что n убегает далеко вперёд.
3) что в последовательности нумерации присутствуют "дырки".

Но по факту, со случаем 2 и 3 работает корректно. Со случаем 1 не попробовал - не нашёл подходящей БД.
 
O

Omh

Окей, посмотрю насчёт $Title.
Я уже чуток посморел, но у меня не у всех баз находит Icon note по этому предефайненому NoteID.
Пока ещё не копал, но с ходу не допетрил почему так может быть.

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

Странно что не было админ дока: там при открытии база проверяет, и если этого дока нет, то экспортирует его из DXL, который приложен в этой же базе. Этот DXL, кстати, одна из причин почему дизайн так много весит...
------------------------------------------
C иконкой что-то протупил.
Есть у базы.
Действительно надо бы её обновлять.
Сенк, ща покопаю в этом направлении....
 

NickProstoNick

Статус как статус :)
Lotus Team
22.08.2008
1 851
27
BIT
0
скрины в студию плиз!
Я вот пользуюсь такой тулзой DocumentViewer. Валяется в сети
 
T

TIA

Странно что не было админ дока: там при открытии база проверяет, и если этого дока нет, то экспортирует его из DXL, который приложен в этой же базе. Этот DXL, кстати, одна из причин почему дизайн так много весит...
Возможно, потому что к моменту открытия БД, в "Settings" не был установлен "DBH root folder". А у меня не в любую папку можно писать. Юзай темповую.
 
O

Omh

Уже всё сделано.
Пишется именно в темповую.

Вопрос насчёт $TITLE игнорь, ща уже сам разберусь.
 
O

Omh

Так, туплю.
После сего чудесного кода $Title в icon note пропадает просто с концами.
TIA, ани айдиас?

Me.Handle - хендл базы данных
Parse - что меняем
NewValues - на что меняем
NSF_INFO_SIZE = 128

Код:
If (Parse = INFOPARSE_TITLE) Or _
(Parse = INFOPARSE_CATEGORIES) Or _
(Parse = INFOPARSE_CLASS) Or _
(Parse = INFOPARSE_DESIGN_CLASS) Then
Dim dbInfoBuffer As String
dbInfoBuffer = String(NSF_INFO_SIZE, 0)

Call NSFDbInfoGet(Me.handle, dbInfoBuffer)
Call NSFDbInfoModify(dbInfoBuffer, Parse, NewValue)
Call NSFDbInfoSet(Me.handle, dbInfoBuffer)

Dim IconNoteHandle As Long
If NSFNoteOpen(Me.handle, NOTE_ID_SPECIAL + NOTE_CLASS_ICON, 0, IconNoteHandle) = NOERROR Then
Call NSFItemSetText(IconNoteHandle, "$TITLE", dbInfoBuffer, Len(dbInfoBuffer))
Call NSFNoteUpdate(IconNoteHandle, UPDATE_FORCE)
Call NSFNoteClose(IconNoteHandle)
End If

cNSFDbInfoModify = NOERROR

Exit Function		
End If
Всё-таки не понимаю, где косяк.
 
T

TIA

Call NSFItemSetText(IconNoteHandle, "$TITLE", dbInfoBuffer, Len(dbInfoBuffer))

У NSFItemSetText 3й параметр "as lmbcs string"?
Последний параметр должен быть длиной в LMBCS-кодировке. Len - возвращает в кол-ве символов.
Для определения длины в LMBCS можно поместить значение во временный NotesItem и взять его ValueLength минус 2.

И ещё, что-то из скрипта
NSFNoteOpen(Me.handle, NOTE_ID_SPECIAL + NOTE_CLASS_ICON
у меня глючил. Проверь, что именно иконка получается.
Работал именно Set iconDoc = m_Db.GetDocumentByID("FFFF0010")
 
O

Omh

TIA, ну вроде апдейтит, правда не в таком виде, как апдейтится, если менять из пропертей базы: оставляет ещё хвост данных примерно в таком виде (это с нотеспика инфа):

Код:
name	"$TITLE"
type	Text
class	Text
flags	Summary
length	32я504
value	"2\n"
"#1NewTN1\n"
"#2NewDTN1\0n:\x01\xf9\xd3\xbf\x02\xa9n:\x01\xd0\x9d\x13\0t\x9f\x18`\x14\0\xc9\0\xad"
"n:\x01\xa9n:\x01\xf9\xd3\xbf\x02\xe4\x9d\x13\0\xb4\xd5\0`\xa9n:\x01\xe8\x9d\x13\0"
"\x10\x17\0`\xafn:\x01\xfc\x9d\x13\0\x1f(\x05`\xdcn:\x01\0\0\x03\0lh:\x01lh:\x01\xe4"
"\xd2\xbf\x02d^\0`U\xd3\xbf\x02\x91h:\x01\x08\0\0\0\xe4\xd2\xbf\0\0\0\0\0\0\0\0\0\0"
"\0\0\0\0\0\0\0\0\0\xba\0 \0(\xa0+\x07\x06\0\0\0>\x01\x06\0\x01\0\0\0\0\0$TITLE\0\0"
"N1\0\0@\x14\0`\xafn\xbf\0x\0:\x01\xf9\xd3\xbf\x02\xa9n:\x01\xd0\x9d\x13\0t\x9f\x18"
"`\x14\0\xc9\0\xadn:\x01\xa9n:\x01\xf9\xd3\xbf\x02\xe4\x9d\x13\0\xb4\xd5\0`\xa9n:\x01"
"\xe8\x9d\x13\0\x10\x17\0`\xafn:\x01\xfc\x9d\x13\0\x1f(\x05`\xdcn:\x01\0\0\x03\0lh"
":\x01lh:\x01\xe4\xd2\xbf\x02d^\0`U\xd3\xbf\x02\x91h:\x01\x08\0\0\0\xe4\xd2\xbf\0\0"
"\0\0\0\0\0\0\0\0\0\xbf\0\x80\x01\0\0\0\0\xbf\0 \0(\xa0+\x07\x06\0\0\0fm\x06\0\0\0"
"\0\0\0\0$TITLE\0\0\0\0\0\0\0\0\0\0\0\0\xbf\0 \0(\xa0+\x07\x06\0\0\0fm\x06\0\0\0\x01"
и т.д.
 
T

TIA

Что-то не то с длиной буфера. Как задекларированы

NSFDbInfoGet
NSFDbInfoModify
NSFDbInfoSet
NSFItemSetText
?
 
O

Omh

Ну если с длиной буффера, буду в ту сторону копать.
Спасибо!
 
K

Kee_Keekkenen

вот декларация NSFItemSetText
Declare Private Function NSFItemSetText Lib "NNOTES" Alias "NSFItemSetText" ( Byval hNT As Long, Byval N As String, Byval T As String, Byval nT As Integer) As Integer

вот использование
Call NSFItemSetText( NoteHandle, "$TITLE", userName, Len(userName))

и это работает в агенте, который выставляет формулы репликаций

правда в NSFNoteUpdate вторым параметром использовалось значение 0, вместо 1
 
T

TIA

Declare Private Function NSFItemSetText Lib "NNOTES" Alias "NSFItemSetText" ( Byval hNT As Long, Byval N As String, Byval T As String, Byval nT As Integer) As Integer

Это работает до тех пор, пока userName английские. Т.к. в LMBCS английские буквы занимают 1 байт.
Второй косяк в том, что при передаче параметров в dll, строки конвертятся из UNICODE в ASCII, если не указать явно LMBCS. Вот так:

Declare Private Function NSFItemSetText Lib "NNOTES" Alias "NSFItemSetText" ( Byval hNT As Long, Byval N As lmbcs String, Byval T As lmbcs String, Byval nT As Integer) As Integer
 
K

Kee_Keekkenen

в моей задаче это не критично, т.к. userName по умолчанию английские буквы, а документ репликационный..
хотя саму формулу репликации я конвертирую lmbcsToNative и это значение используется как lmbcs String
 
T

TIA

в моей задаче это не критично, т.к. userName по умолчанию английские буквы, а документ репликационный..
хотя саму формулу репликации я конвертирую lmbcsToNative и это значение используется как lmbcs String
Ну, Вам виднее. Главное, что б решение принималось с учётом всех нюансов.
А lmbcsToNative и следом в lmbcs String, мне кажется странноватым. Возможно, есть лишний шаг конвертации.
 
K

Kee_Keekkenen

Ну, Вам виднее. Главное, что б решение принималось с учётом всех нюансов.
А lmbcsToNative и следом в lmbcs String, мне кажется странноватым. Возможно, есть лишний шаг конвертации.

если написать, например, формулу вида fl_RTP = "Региональное представительство"
т.е.
dim replformula as string
replformula = {fl_RTP = "Региональное представительство"}
и это значение засунуть в NSFFormulaCompile(Byval N As Long, Byval nN As Integer, Byval F As Lmbcs String и.т.д)
как и положено третьим параметром, то после отработки такого значение в свойствах репликации базы
мы увидим что-то вроде fl_RTP = "????? ???????"..
одним словом не то что на входе, таким образом конвертация lmbcsToNative является необходимым условие для получения правильной формулы..

возможно, в других случаях это и не обязательно..
 
T

TIA

Kee_Keekkenen , ну и славно. Раз всё работает, то и обсуждать нечего.
 
Мы в соцсетях:

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