Проблемы с AppendDocLink

  • Автор темы KLif
  • Дата начала
K

KLif

#1
Call rtitem.AppendDocLink(temp_doc,"ссылка") - на этой строчке вылазиет ошибка "couldn't get default View id for database (Helpdesk.nsf)". Из-за чего такое может появляться?

doc: Set doc = Source.Document
rtitem: Set rtitem = New NotesRichTextItem(doc, "tt")
temp_doc: Set temp_doc = collection.GetFirstDocument
 

VladSh

начинающий
Lotus team
11.12.2009
1 262
6
#3
У меня сейчас вылезла такая хрень.

По идее ошибка возникает при вставке ссылки в RT-поле, если в БД, в которой находится документ, на который формируется ссылка нет вида "по умолчанию" (у меня он есть).

Начал искать дальше, в зарубежных интернетах пишут, что нужен ещё какой-то доступ по умолчанию для базы... у меня там стоит Editor...

Итого: пока отказался от формирования ссылки в RT-поле (благо это не критично). Но хотелось бы всё-таки разобраться.
 

nvyush

Lotus team
22.04.2009
2 317
0
#4
У меня такая ошибка вылетала, когда представление по умолчанию в БД было, но у пользователя не было к нему доступа (ограничен по $Readers).
 

VladSh

начинающий
Lotus team
11.12.2009
1 262
6
#5
Не тот случай. У меня представление "по умолчанию" общее (наследуется из самого верхнего шаблона во все другие шаблоны).

Почитал ещё инфу в инете по формированию ссылок..
Предполагаю, что это из-за того, что я, находясь в локальной БД, беру док с серверной БД и хочу сохранить на него ссылку также в локальной БД.

Добавлено:
Разобрался. Думал, что с серверной БД работаю, оказалось с локальной, а когда сервера нет, то он ссылку, видимо, не может создать.
 
A

Anonimous

#6
Можно тоже кое-что спросить? Есть 2 базы, база А и база Б. В одной документ А обрабатывается, потом в другой базе на основе данных из первого документа создается документ Б. В документе А создается ссылка на документ Б.
Все так

'Проставляем ссылку на созданный документ Б в документе А

Dim rtitemRE As NotesRichTextItem
Set rtitemRE = docA.GetFirstItem ("LinkToB")
If rtitemRE Is Nothing Then Set rtitemRE = docRe.Createrichtextitem("LinkToB")

rtitemRE.AppendStyle rtiStyle
rtitemRE.AppendDocLink docA, "Док Б от документа " & nomer_doc_A, "Док Б от документа " & nomer_doc_A
rtitemRE.AddNewline 1

docRe.Save True , True

Все работает. Но в некоторых документах такая особенность возникает. Когда в документе А щелкаем ссылку на документ Б, вместо документа Б открывается локальная база names.nsf.
В обеих базах есть форма и вьюха по умолчанию.
Думал, что дело в том, что в этих документах с глючными ссылками у РТ-поля LinkToB нет флага SIGN SEAL. Поставил признаки. Все равно документ Б не открывает.
База А и база Б лежат на разных серверах, локальных реплик нет, документы только на серверах создаются.
Если кто поделится опытом, буду очень благодарен )
 

Dragon108

Well-known member
19.01.2010
265
0
#7
Можно тоже кое-что спросить? Есть 2 базы, база А и база Б. В одной документ А обрабатывается, потом в другой базе на основе данных из первого документа создается документ Б. В документе А создается ссылка на документ Б.
Все так

'Проставляем ссылку на созданный документ Б в документе А

Dim rtitemRE As NotesRichTextItem
Set rtitemRE = docA.GetFirstItem ("LinkToB")
If rtitemRE Is Nothing Then Set rtitemRE = docRe.Createrichtextitem("LinkToB")

rtitemRE.AppendStyle rtiStyle
rtitemRE.AppendDocLink docA, "Док Б от документа " & nomer_doc_A, "Док Б от документа " & nomer_doc_A
rtitemRE.AddNewline 1

docRe.Save True , True

Все работает. Но в некоторых документах такая особенность возникает. Когда в документе А щелкаем ссылку на документ Б, вместо документа Б открывается локальная база names.nsf.
В обеих базах есть форма и вьюха по умолчанию.
Думал, что дело в том, что в этих документах с глючными ссылками у РТ-поля LinkToB нет флага SIGN SEAL. Поставил признаки. Все равно документ Б не открывает.
База А и база Б лежат на разных серверах, локальных реплик нет, документы только на серверах создаются.
Если кто поделится опытом, буду очень благодарен )
Возникала такая вещь, причина вот в чем:
Это основное свойство rich-text поля - все изменения туда вносятся ПОСЛЕ СОХРАНЕНИЯ.

Что же получается у вас: вы работаете с рич текст полем в ОТКРЫТОМ доке- вносите туда изменения, и сохраняете так скажем БЭКЭНДНЫЙ док - просто doc.Save(true,true), но ФРОНТЭНДНЫЙ док у вас остался на экране, и если вы его сохраните через UISave (неважно как - просто ручками через ctrl+s или программно через UIDoc.Save) то у вас БЭКЭНДНОЕ рич текст поле перетрется ФРОНТЭНДНЫМ и ссылка потеряется - т.е. будет вести в никуда, поэтому собственно и открывается локальная names.nsf.

Вся эта ситуация - так называемая рассинхронизация фронтэндного и бэкэндного документов ... где то тут уже на форуме читал про это.

После сохранения ссылки в рич-текст поле - переоткрывайте документ, куда сохраняете ссылку, откроется "свежий док", который можно уже будет сейвить как угодно.
 
A

Anonimous

#8
Прошу прощение, при описании забыл. Документ А не открыт, его обрабатывает агент (выполняется по расписанию), на основе данных из дока А создает документ Б. В документ А пихает ссылку на документ Б. Никакого UI. Все так в агенте

' Документ Б создался как новый в базе Б
docB.Save True, True

' Создаем поле ссылки в доке А и суем в него ссылку на документ Б
Dim rtitemRE As NotesRichTextItem
Set rtitemRE = docA.GetFirstItem ("LinkToDocB")

rtitemRE.AppendDocLink docB, "Ссылка на документ Б", "Ссылка на документ Б"
docA.Save True , True
 

oshmianski

Достойный программист
Lotus team
25.04.2012
556
8
#9
попробовать в DXL выгрузить "глючный" док. посмотреть что за ссылка: там по-идее будет ReplicaID базы, UNID вьюхи и дока.
вьюхи по-умолчанию не менялись? дизайн не заменялся?
это я к тому, что в ссылках скорее всего прописывается UNID вьюхи, и если заменить ее как элемент дизайна, то UNID ее поменяется.
как бы бред, но все же.
 

Dragon108

Well-known member
19.01.2010
265
0
#10
Прошу прощение, при описании забыл. Документ А не открыт, его обрабатывает агент (выполняется по расписанию), на основе данных из дока А создает документ Б. В документ А пихает ссылку на документ Б. Никакого UI. Все так в агенте

' Документ Б создался как новый в базе Б
docB.Save True, True

' Создаем поле ссылки в доке А и суем в него ссылку на документ Б
Dim rtitemRE As NotesRichTextItem
Set rtitemRE = docA.GetFirstItem ("LinkToDocB")

rtitemRE.AppendDocLink docB, "Ссылка на документ Б", "Ссылка на документ Б"
docA.Save True , True
А что с конфликтами?
Не может быть такого что в момент когда шедульный агент обрабатывает доки, эти же доки открыты на редактирование?
 
A

Anonimous

#11
Выгрузил в DXL.
В документе с нормальной ссылкой и реплика, UNID и вьюхи, и документа, и сервер
В документе с глючной ссылкой только атрибут server, атрибутов database, document, view с UNID-ми нет.
Вьюхи по ум. и дизайн не менялись, с даты последнего их изменения создавались документы с нормальными ссылками
 
A

Anonimous

#13
docB как находится агентом?

Все так. Документ А обработали, на нем признак проставляется, и его кидает во вьюху. Агент бежит по этой вьюхе. Документ Б не ищется, он просто создается в коде агента как новый документ
' Агент обрабатывает документ А

Dim docB As New NotesDocument (dbB)
' поля его заполняем
docB.Save True, True

И документ Б искать не надо, он определен, на него создаем ссылку в документе А с помощью AppendDocLink
 

savl

Lotus team
28.10.2011
2 136
105
#14
1. меняем сейв на этот:
Код:
docB.Save True, docB.IsResponse
Не понятно зачем докБ делать все время ответным, достаточно проверять на необходимость.
Для докА тоже самое.
2. в представлении отключаем галку "show response documents in hierarchy"
Если там отбор только по признаку - ничего не изменится, но документов может стать гораздо больше.
И опять же из-за сейва, без родителя ответный не отобразится
3. по мимо ссылки пропишите в докА поле: DocBItem = docB.UniversalID
Это поможет найти док, на который не создалась ссылка.
4. Ошибки в агенте не возникает? Может что в логи пишет?
 
A

Anonimous

#15
Не понятно зачем докБ делать все время ответным, достаточно проверять на необходимость.

Да нет, документ Б ответным не делается, документ А в одной базе, документ Б - в другой. Их просто ссылка связывает.

В доке А поле с UNID дока Б есть )
Лог, к сожалению, чистится, еще половлю, посмотрю
 

Dragon108

Well-known member
19.01.2010
265
0
#16
Не понятно зачем докБ делать все время ответным, достаточно проверять на необходимость.

Да нет, документ Б ответным не делается, документ А в одной базе, документ Б - в другой. Их просто ссылка связывает.

В доке А поле с UNID дока Б есть )
Лог, к сожалению, чистится, еще половлю, посмотрю
Напишите потом в чем проблема была.


P.S.
А если уж совсем не получится, то я бы переделал на документы-ссылки (третий док - по клику на который открывается нужный док) + эмбедед вью в доках А и В, где эти документы-ссылки отображаются
 

savl

Lotus team
28.10.2011
2 136
105
#17
А если уж совсем не получится, то я бы переделал на документы-ссылки (третий док - по клику на который открывается нужный док) + эмбедед вью в доках А и В, где эти документы-ссылки отображаются
Ради связи "один к одному" не стоит делать такую систему... Только если на будущее, как общий механизм.
У самого сейчас такая задумка есть, даже набросок базы.

Для связки строго двух документов можно использовать HotSpot или кнопку.
Поле с UNID'ом документа, поле с базой где этот документ, лучше реплику.
В коде получать базу по реплике или пути, затем искать в ней документ по UNID.
Лучше для поиска использовать вьюху, где все документы отображаются по UNID и иерархия не отображается.
Если документ не найден, то либо его снесли, либо доступа к нему нет.
Обрабатываем это как сообщение "Документ не найден или Вы не имеете к нему доступа."
Но это только при условии, что связь "один к одному", если связь "один ко многим" или "многие ко многим", то да, надо делать ссылочную систему.
 

ToxaRat

Чёрный маг
Lotus team
06.11.2007
3 231
18
#18
лучше использовать другую функцию а не эту, там где передаётся не док а репликаИД и унид
 

savl

Lotus team
28.10.2011
2 136
105
#19
ToxaRat
По моему она недокументированная, не?
Подскажи название, пож-та.