Ссылка на документ

Medevic

Что это ? :)
Green Team
10.12.2004
3 334
1
BIT
6
Пытаюсь в событии QueryOpen документа вставить в ричтекст ссылку на документ из другой базы.
Все вставляется, только получаю при открытии документа и выходе из него сообщение:
"You may not save a Document Link into this field unless the linked-to database is the current database".

Что это значит ?
Делаю так:
Код:
Set db = New NotesDatabase("", "DB.NSF")
Set view = db.GetView("View")
Set doc = view.GetDocumentByKey(key, True)

Call rt.AppendDocLink(doc, "ссылка")
Call rt.AppendText("ссылка")
 
N

nor

Medevic
!?
как это ты в QueryOpen вставил ссылку?! в QueryOpen еще документа самого нету, не говоря уже о поле, в которое ты пытаешься ссылку вставить... приведи, пожалуйста, весь свой код целиком, очень интересно посмотреть! :) а рич текст у тебя обновляется сразу же? без переоткрытия документа ты видишь ссылку? как так может быть?
 

Medevic

Что это ? :)
Green Team
10.12.2004
3 334
1
BIT
6
QueryOpen еще документа самого нету
Не совсем верно, а верно только для нового документа. ;)
Проблему решил.
На форме есть текстовое поле (тип Text, чтобы поставить ему ComputeForDisplay). Назовем его Temp.
Я создаю ричтекст (всё в QueryOpen).
Код:
Dim rt As New NotesRichTextItem(Source.Document, "Temp")
и вставляю ссылки. Все прекрасно работает с документами из текущей базы.
С документами из другой базы - сразу ошибка.
Первое решение - если добавить 3-ий параметр в AppendDocLink (HotSpotText), то все нормально работает:
Код:
Call rt.AppendDocLink(doc, "ссылка", "ссылка")

Второе решение - сменить тип поля Temp на Rich Text. Тогда все нормально будет работать. Правда оно не может быть ComputedForDisplay (а мне это надо)

без переоткрытия документа ты видишь ссылку? как так может быть?
Вижу. То, что добавим в RichText в событии QueryOpen отобразится в нем на форме.

Кстати, на форуме IBM по лотусу вычитал как обновить Rich Text.
Если интересно, то могу запостить пример.
 
N

nor

Кстати, на форуме IBM по лотусу вычитал как обновить Rich Text.
Если интересно, то могу запостить пример.
ну конечно интересно - запости, пожалуйста. мог бы и не спрашивать...
 

Medevic

Что это ? :)
Green Team
10.12.2004
3 334
1
BIT
6
Вот. С оригинальным письмом. Я запихнул это в Queryrecalc и теперь по F9 обновляет.

Hello,

I think I have come up with a way to use AppendDocLink so that doc links can be added to a new document open in the Client without having to save and re-open the document. Because a doc is held in memory, the code uses it to add a doc link to the backend doc and then creates a new NotesUIDocument using that doc in memory. In my testing, any changes made to the uidoc are carried over to the new instance even though the doc is never saved.

I have tested the code in r6 only and it seems to work well. Note that the NotesRichTextItem field is computed to itself. Please review the code and try it out. let me know if you come across any problems.

BTW Yes, I still have to add errorhandling.

Thanks,
Bryce

Код:
Sub Click(Source As Button)
Dim s As New NotesSession
Dim ws As New NotesUIWorkspace
Dim thisdb As NotesDatabase
Dim coll As NotesDocumentCollection ' collection returned from PickListCollection
Dim otherdoc As NotesDocument ' this is the doc to create a link to
Dim thisdoc As NotesDocument ' the new doc that the link is being added to
Dim rtitem As NotesRichTextItem ' required for AppendDocLink
Dim nitem As Variant ' used to get a handle on the NotesRichTextField
Dim olduidoc As NotesUIDocument ' the original instance of the uidoc
Dim newuidoc As NotesUIDocument ' the new instance of the uidoc after the doc link has been added

Set thisdb = s.CurrentDatabase
Set olduidoc = ws.CurrentDocument ' current uidoc
Set thisdoc = olduidoc.Document ' doc in memory but hasn't been saved yet

' select the doc to link to
Set coll = ws.PickListCollection( PICKLIST_CUSTOM, False, thisdb.Server, thisdb.FilePath, "luProject", "Project List", "Please select a project." )

' if a doc isn't selected exit
If coll.Count = 0 Then
Messagebox "User canceled" ,,"No project was selected."
Exit Sub
End If

' get the doc to link to
Set otherdoc = coll.GetFirstDocument

' grab some values from that doc
thisdoc.ProjectName = otherdoc.ProjectName
thisdoc.CustomerName = otherdoc.CustomerName

' get the RichTextField in the current uidoc
Set nitem = thisdoc.GetFirstItem( "ProjectDocLink" )

' add the doc link
' NOTE: this is being done to the backend doc that exists in memory
If ( nitem.Type = RICHTEXT ) Then
Set rtitem = nitem
Call rtitem.AppendDocLink(otherdoc, "Original Doc Link", "")
Call rtitem.Update
End If

' set the SaveOptions field so that when the uidoc is closed, the user won't be asked to save
thisdoc.SaveOptions = "0"

' close the uidoc. It won't actually happen until the code is finished executing
Call olduidoc.Close(True)

' create a new uidoc and open the backend doc that is still in memory with added doc link
Set newuidoc = ws.EditDocument(True, thisdoc)

' delete the reference to the old uidoc
' this is necessary because the code below affects it if left in memory
Delete olduidoc

' re-associate the variable with the backend doc
' have to do this because the olduidoc reference was deleted
Set thisdoc = newuidoc.Document

' remove the SaveOptions field so the doc can be saved
Call thisdoc.RemoveItem( "SaveOptions" )
End Sub
 
F

fvoice

Почитал статьи, в хелпе порылся...
Никак не пойму почему в документе не появляется ссылка на документ... :)
Вот код:

Код:
Sub Postopen(Source As Notesuidocument)
Dim db As New NotesDatabase ("Server1/KarSU","CC\\KarSUDoc.nsf")
Dim profdoc As NotesDocument
Dim doc As NotesDocument
Dim curdoc As NotesDocument
Dim rtitem As NotesRichTextItem

If source.IsNewDoc Then
Set curdoc=source.Document
Set rtitem = New NotesRichTextItem ( curdoc, "CCZadanieUNID" )
Set profdoc = db.GetProfileDocument("($Zadanie)")
Set doc = db.GetDocumentByUNID(profdoc.CCZadanieUNID(0))
Call rtitem.AppendDocLink(doc,"Comment","Text")
End If
End Sub

Документ открывается, сохраняется, все без ошибок, а поле все пустое.
Помогите разобраться пожалуйста.
 
F

fvoice

QueryOpen еще документа самого нету...
...а верно только для нового документа.

Обьясни поподробнее пожалуйста, у меня в QueryOpen нет еще документа...
Для поиска документа из вида необходимо видимо его программно создать, сохранить, а затем заново открыть, а если пользователь не будет сохранять документ удалять его...?

Да и вообще мне не принципиально важно чтобы ссылка появлялась сразу после создания документа, она у меня не создается вообще!!! Может я чего не понимаю или неправильно делаю, обясните поподробнее основные правила создания ссылок, может что-то где-то дополнительно нужно указывать?
 

Medevic

Что это ? :)
Green Team
10.12.2004
3 334
1
BIT
6
<!--QuoteBegin-fvoice+3:10:2006, 06:30 -->
<span class="vbquote">(fvoice @ 3:10:2006, 06:30 )</span><!--QuoteEBegin-->Да и вообще мне не принципиально важно чтобы ссылка появлялась сразу после создания документа, она у меня не создается вообще!!! Может я чего не понимаю или неправильно делаю, обясните поподробнее основные правила создания ссылок, может что-то где-то дополнительно нужно указывать?
[snapback]44828" rel="nofollow" target="_blank[/snapback]​
[/quote]
Она создается.
Ты добавляешь ссылку в поле в бак-энд документе. При этом во фрот-энд документе ты не увидишь это изменение, пока не переоткроешь документ. Следовательно ссылку нужно добавлять до открытия фронт-энд документа. А это либо в QueryOpen, либо при создании документа.
В первый раз я не заметил, что у тебя новый документ. Значит тебе нужно добавлять ссылку при создании документа.
 
F

fvoice

В том-то и проблема что даже после переоткрытия документа ссылка не отображается...
Может ее вообще нет... в каком свойстве это можно посмотреть? В отладчике в свойствах ричтекста я не вижу ничего похожего.
 

Medevic

Что это ? :)
Green Team
10.12.2004
3 334
1
BIT
6
<!--QuoteBegin-fvoice+3:10:2006, 08:59 -->
<span class="vbquote">(fvoice @ 3:10:2006, 08:59 )</span><!--QuoteEBegin-->В том-то и проблема что даже после переоткрытия документа ссылка не отображается...
Может ее вообще нет... в каком свойстве это можно посмотреть? В отладчике в свойствах ричтекста я не вижу ничего похожего.

[snapback]44832" rel="nofollow" target="_blank[/snapback]​
[/quote]
А сохраняешь документ? Только нужно сохранять не фронт-энд документ (т.к. во фронт-энде у тебя пустое поле.), а бак-энд. Т.е. метод NotesDocument.Save сразу после добавления ссылку.
 
F

fvoice

Добавил curdoc.save(false,false) - ничего не меняется.

А при сохранении UI формы документа ругается
"Ошибка в UNID. UNID должен представлять 32-х разрадную шестнадцатеричную строку"

Set rtitem = New NotesRichTextItem ( curdoc, "CCZadanieLink" )
Set profdoc = db.GetProfileDocument("($Zadanie)")
Set doc = db.GetDocumentByUNID(profdoc.CCZadanieUNID(0))
Call rtitem.AppendDocLink(doc,"Comment","Text")

- doc находится нормально и создание ссылки проходит, но не сохраняется, т.к. после переоткрытия документа поле CCZadanieLink оказывается пустым.
 
O

oshmianski

Для: fvoice
лень выгребать лишнее, поэтому выкладываю как есть. смысл = переокрытие дока без сохранения.
думаю, что эта беда должна быть помещена в PostOpen документа, хотя могу и ошибаться, ибо не проверял.

зы: хотя вот думаю, не будет ли зацикливания?
зызы: но вроде можно обойти выставление флага на пример
Код:
Sub BuildExtendedInfo(session As NotesSession, uiws As NotesUIWorkspace, uidoc As notesuidocument, doc As notesdocument, colFilter As NotesDocumentCollection)
Dim rtitem As NotesRichTextItem
Dim rtitem1 As NotesRichTextItem
Dim richStyle As NotesRichTextStyle
Dim docT As notesdocument
Dim n As Variant
Dim count As Double

'подробно распишу, что за инциденты попали в фильтр
Set rtItem=New NotesRichTextItem(doc, "BadIncidentsNumber")
Set rtItem1=New NotesRichTextItem(doc, "ReportBody")
Set richStyle = session.CreateRichTextStyle
richStyle.NotesFont = FONT_COURIER
richStyle.FontSize = 8
Call rtItem.AppendStyle(richStyle)

count=1
doc.Go="0"		

If colFilter.count>0 Then
'запускаю прогресс бар
Dim pb As New LNProgressBar(True)
Call pb.SetText("Creating extended info...","Total incidents to process: " & Cstr(colFilter.Count))
Call pb.SetProgressRange(colFilter.Count)

Set docT = colFilter.GetFirstDocument
rtitem.AddNewline 1
While Not(docT Is Nothing)
rtItem.AppendText Cstr(count) & ". Инцидент: " & Cstr(docT.Code(0)) & " "

'''''ExtInfoViewLink
If doc.ExtInfoViewLink(0)="1" Then
rtItem.AppendDocLink docT, "Инцидент"			
End If

rtitem.AddNewline 1

'''ExtInfoViewChief
If doc.ExtInfoViewChief(0)="1" Then
rtItem.AppendText "-----Руководитель: " & docT.CHIEFFULLNAME(0)
rtitem.AddNewline 1
End If

''''ExtInfoViewDeputy
If doc.ExtInfoViewDeputy(0)="1" Then
rtItem.AppendText "-----Зам.: " & docT.DEPUTYCHIEFFULLNAME(0)
rtitem.AddNewline 1
End If

''''ExtInfoViewExpert
If doc.ExtInfoViewExpert(0)="1" Then
rtItem.AppendText "-----Эксперт: " & docT.ManagerFullName(0)
rtitem.AddNewline 1
End If

rtItem.AppendText "-----Дата реакции: " & Cstr(docT.dateTermination(0))
rtitem.AddNewline 1
Set docT = colFilter.GetNextDocument(docT)
Call pb.SetProgressPos(Clng(count))
count=count+1
Wend
doc.Go="1"
Delete pb
n=Evaluate({@If($MainPage = "ExtInfo"; @Return(""); "");FIELD $MainPage := "ExtInfo"; @Command([RefreshHideFormulas])}, doc)
End If
'magic line for opening back-end document with RichText which wasn't saved
Call rtitem.copyItemToDocument(doc,"Body1")
Call doc.removeItem("Body1")

'open current back-end doc. in a new window
doc.Form="Remainder1"
Call uiws.EditDocument(True, doc)

'close current window
doc.SaveOptions="0"
Call uidoc.Close
End Sub
 
F

fvoice

Огромное спасибо Medevic и oshmianski !!!

Приведенный ниже код отображает ссылку на документ т.к. программно переоткрывает документ:

Код:
Sub Postopen(Source As Notesuidocument)
Dim db As New NotesDatabase ("Server1/KarSU","CC\\KarSUDoc.nsf")
Dim ws As New NotesUIWorkspace
Dim profdoc As NotesDocument
Dim doc As NotesDocument
Dim curdoc As NotesDocument
Dim rtitem As NotesRichTextItem

If source.IsNewDoc Then
Set curdoc=source.Document
Set rtitem = New NotesRichTextItem ( curdoc, "CCZadanieLink" )
Set profdoc = db.GetProfileDocument("($Zadanie)")
Set doc = db.GetDocumentByUNID(profdoc.CCZadanieID(0))
Call rtitem.AppendDocLink(doc,"Ссылка на документ")
Call curdoc.Save(False,False)
Call source.Close
curdoc.form = "CCDiagAkt"
Call ws.EditDocument(True,curdoc)
End If
End Sub

Дешево и сердито... ;) , правда 2 дня промучался пока разобрался!
 

Medevic

Что это ? :)
Green Team
10.12.2004
3 334
1
BIT
6
По-моему, это не очень хорошо.
Ты практически создаешь новый документ в PostOpen, а открытый закрываешь. Что нелогично, и некрасиво.
Почему бы тебе этот кусок создания нового документа не перенести в нужное место, а именно, в код создания нового документа? Разницы никакой, зато всё правильно.
 
F

fvoice

Что вроде этого:

Set curdoc=db.CreateDocument
curdoc.form = "CCDiagAkt"
Call ws.EditDocument(True,curdoc)
Set rtitem = New NotesRichTextItem ( curdoc, "CCZadanieLink" )
Set profdoc = db.GetProfileDocument("($Zadanie)")
Set doc = db.GetDocumentByUNID(profdoc.CCZadanieID(0))
Call rtitem.AppendDocLink(doc,"Ссылка на документ")
Call curdoc.Save(False,False)
Set uidoc= ws.CurrentDocument
Call uidoc.Close
Call ws.EditDocument(True,curdoc)

при щелчке на кнопку?

"...Ты практически создаешь новый документ в PostOpen, а открытый закрываешь...."

Этот открытый сохраняется где-нибудь?
 

Medevic

Что это ? :)
Green Team
10.12.2004
3 334
1
BIT
6
Вроде этого (закомментировал лишнее):
Код:
 Set curdoc=db.CreateDocument
curdoc.form = "CCDiagAkt"
'Call ws.EditDocument(True,curdoc)
Set rtitem = New NotesRichTextItem ( curdoc, "CCZadanieLink" )
Set profdoc = db.GetProfileDocument("($Zadanie)")
Set doc = db.GetDocumentByUNID(profdoc.CCZadanieID(0))
Call rtitem.AppendDocLink(doc,"Ссылка на документ")
'Call curdoc.Save(False,False)
'Set uidoc= ws.CurrentDocument
'Call uidoc.Close
Call ws.EditDocument(True,curdoc)

<!--QuoteBegin-fvoice+4:10:2006, 15:05 -->
<span class="vbquote">(fvoice @ 4:10:2006, 15:05 )</span><!--QuoteEBegin-->при щелчке на кнопку?
[snapback]44894" rel="nofollow" target="_blank[/snapback]​
[/quote]
Да.

<!--QuoteBegin-fvoice+4:10:2006, 15:05 -->
<span class="vbquote">(fvoice @ 4:10:2006, 15:05 )</span><!--QuoteEBegin-->Этот открытый сохраняется где-нибудь?
[snapback]44894" rel="nofollow" target="_blank[/snapback]​
[/quote]
Нет.
 
F

fvoice

Без сохранения не работает:

Код:
Call curdoc.Save(False,False)

зато остальное действительно можно было упростить!!!
 

Medevic

Что это ? :)
Green Team
10.12.2004
3 334
1
BIT
6
<!--QuoteBegin-fvoice+4:10:2006, 15:25 -->
<span class="vbquote">(fvoice @ 4:10:2006, 15:25 )</span><!--QuoteEBegin-->Без сохранения не работает:
[snapback]44901" rel="nofollow" target="_blank[/snapback]​
[/quote]
Работает.

Добавь перед Call ws.EditDocument(True,curdoc):
Код:
Call rtitem.Update

А сохранение убери. Оно здесь не нужно. ;)
 
F

fvoice

Все работает.
Спасибо за сотрудничество! ;)
 
Мы в соцсетях:

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