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

Тема в разделе "Lotus - Программирование", создана пользователем Medevic, 28 фев 2005.

  1. Medevic

    Medevic Что это ? :)
    Lotus team

    Регистрация:
    10 дек 2004
    Сообщения:
    3.346
    Симпатии:
    2
    Пытаюсь в событии QueryOpen документа вставить в ричтекст ссылку на документ из другой базы.
    Все вставляется, только получаю при открытии документа и выходе из него сообщение:
    "You may not save a Document Link into this field unless the linked-to database is the current database".

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

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

    nor Гость

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

    Medevic Что это ? :)
    Lotus team

    Регистрация:
    10 дек 2004
    Сообщения:
    3.346
    Симпатии:
    2
    Не совсем верно, а верно только для нового документа. ;)
    Проблему решил.
    На форме есть текстовое поле (тип Text, чтобы поставить ему ComputeForDisplay). Назовем его Temp.
    Я создаю ричтекст (всё в QueryOpen).
    Код (Text):
    Dim rt As New NotesRichTextItem(Source.Document, "Temp")
    и вставляю ссылки. Все прекрасно работает с документами из текущей базы.
    С документами из другой базы - сразу ошибка.
    Первое решение - если добавить 3-ий параметр в AppendDocLink (HotSpotText), то все нормально работает:
    Код (Text):
    Call rt.AppendDocLink(doc, "ссылка", "ссылка")
    Второе решение - сменить тип поля Temp на Rich Text. Тогда все нормально будет работать. Правда оно не может быть ComputedForDisplay (а мне это надо)

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

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

    nor Гость

    ну конечно интересно - запости, пожалуйста. мог бы и не спрашивать...
     
  5. Medevic

    Medevic Что это ? :)
    Lotus team

    Регистрация:
    10 дек 2004
    Сообщения:
    3.346
    Симпатии:
    2
    Вот. С оригинальным письмом. Я запихнул это в Queryrecalc и теперь по F9 обновляет.

    Код (Text):
    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
     
  6. fvoice

    fvoice Гость

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

    Код (Text):
    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
    Документ открывается, сохраняется, все без ошибок, а поле все пустое.
    Помогите разобраться пожалуйста.
     
  7. Medevic

    Medevic Что это ? :)
    Lotus team

    Регистрация:
    10 дек 2004
    Сообщения:
    3.346
    Симпатии:
    2
    Делай это в QueryOpen.
     
  8. fvoice

    fvoice Гость

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

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

    Medevic Что это ? :)
    Lotus team

    Регистрация:
    10 дек 2004
    Сообщения:
    3.346
    Симпатии:
    2
    <!--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, либо при создании документа.
    В первый раз я не заметил, что у тебя новый документ. Значит тебе нужно добавлять ссылку при создании документа.
     
  10. fvoice

    fvoice Гость

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

    Medevic Что это ? :)
    Lotus team

    Регистрация:
    10 дек 2004
    Сообщения:
    3.346
    Симпатии:
    2
    <!--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 сразу после добавления ссылку.
     
  12. fvoice

    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 оказывается пустым.
     
  13. oshmianski

    oshmianski Гость

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

    зы: хотя вот думаю, не будет ли зацикливания?
    зызы: но вроде можно обойти выставление флага на пример
    Код (Text):
    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
     
  14. fvoice

    fvoice Гость

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

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

    Код (Text):
    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 дня промучался пока разобрался!
     
  15. Medevic

    Medevic Что это ? :)
    Lotus team

    Регистрация:
    10 дек 2004
    Сообщения:
    3.346
    Симпатии:
    2
    По-моему, это не очень хорошо.
    Ты практически создаешь новый документ в PostOpen, а открытый закрываешь. Что нелогично, и некрасиво.
    Почему бы тебе этот кусок создания нового документа не перенести в нужное место, а именно, в код создания нового документа? Разницы никакой, зато всё правильно.
     
  16. fvoice

    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, а открытый закрываешь...."

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

    Medevic Что это ? :)
    Lotus team

    Регистрация:
    10 дек 2004
    Сообщения:
    3.346
    Симпатии:
    2
    Вроде этого (закомментировал лишнее):
    Код (Text):
     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]
    Нет.
     
  18. fvoice

    fvoice Гость

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

    Код (Text):
    Call curdoc.Save(False,False)
    зато остальное действительно можно было упростить!!!
     
  19. Medevic

    Medevic Что это ? :)
    Lotus team

    Регистрация:
    10 дек 2004
    Сообщения:
    3.346
    Симпатии:
    2
    <!--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):
    Код (Text):
    Call rtitem.Update
    А сохранение убери. Оно здесь не нужно. ;)
     
  20. fvoice

    fvoice Гость

    Все работает.
    Спасибо за сотрудничество! ;)
     
Загрузка...

Поделиться этой страницей