Das Notes Forum

Domino 9 und frühere Versionen => Entwicklung => Thema gestartet von: chock am 26.07.04 - 07:53:37

Titel: Bookmarks anlegen
Beitrag von: chock am 26.07.04 - 07:53:37
Hallo,

ich möchte über einen Button Bookmarks direkt als Symbol in die Lesezeichenleiste legen.
Wenn ich es mit dieser Formal versuche funktioniert es zwar aber man muss noch einen Ordner auswählen, wo es hin soll.

@Command([FileOpenDatabase];"Server":"xy.NSF");
@Command( [AddBookmark] ; Name Bookmark ; Ordner )

Wie könnte ich dies automatisieren d.h. Button drücken -> Symbol in der Lesezeichenleiste?

Danke
Titel: Re:Bookmarks anlegen
Beitrag von: chock am 27.07.04 - 09:40:33
Habe jetzt was gefunden wie es funktioniert.
Nur weiß ich jetzt noch nicht wo ich die UNID$ meiner Bildresource finde.

I needed to do the same thing for a "Corporate Portal" database. We wanted all Notes users to have an icon on the bookmark bar to open the "Corporate Portal". The below code is what we used to achieve this. Basically the "Create_NACHOME_Bookmark" sub is called from the PostOpen event of the Database Script of the Corporate Portal database. (we sent a db link to users and when they clicked on the link this code was executed). You'll notice I have a variable called "unid$". This is the unid of a custom icon image that is in the Image Resource area of the corporate portal database. This unid$ is used to find the image resource in the Corporate Portal db and copy it to the users bookmark.nsf database. Good Luck

/Jack


Sub Create_NACHOME_Bookmark
Dim outline As NotesOutline
Dim oeNew As NotesOutlineEntry
Dim oeRef As NotesOutlineEntry
Dim oeTmp As NotesOutlineEntry
Dim NoMore As Variant
Dim session As New NotesSession
Dim db As NotesDatabase
Dim imageDocument As NotesDocument
Dim currentDB As NotesDatabase
Dim s As New NotesSession
Dim Done, Found As Variant
Dim unid$

unid$ = "FB43BB676B7A3DF8852568200071AC2C"
Set currentDB = s.CurrentDatabase
Set db = New NotesDatabase( "", "bookmark.nsf" )

'Set doc = db.getdocumentbyUNID(unid$)
'If doc Is Nothing Then
Set imageDocument = currentDB.GetDocumentByUNID( unid$ )
Call imageDocument.CopyToDatabase( db )
'End If

Set outline = db.GetOutline("UserBookmarkOrder")

Set oeTmp = outline.GetFirst()
label$ = ""
Done = False
referenceFound = False
nacEntryFound = False

Do While Done = False
If oeTmp Is Nothing Then
Done = True
Else
label$ = oeTmp.Label
If label$ = "NACHOME" And oeTmp.Level = 0 Then '..entry already exists
nacEntryFound = True
Done = True
Else
If label$ = "To Do" Then
referenceFound = True '..found where we normally put the bookmark, but let's keep looking incase the user has placed the bookmark somewhere else
Set oeRef = oeTmp
End If
Set oeTmp = outline.GetNextSibling(oeTmp)
End If
End If
Loop

Set oeNew = outline.CreateEntry("NACHOME")
Call oeNew.SetNoteLink(currentDB)

If nacEntryFound Then
Exit Sub
Else
If referenceFound Then
Call outline.AddEntry(oeNew, oeRef,True,False)
Else
Call outline.AddEntry(oeNew, ,True,False)
End If

oeNew.ImagesText = "NACHOME"
Call outline.save()
End If


End Sub

Titel: Re:Bookmarks anlegen
Beitrag von: Driri am 27.07.04 - 10:14:46
Die UNID solltest Du über die Eigenschaften der Bildressource auslesen können (der Tab mit "Karlsson auf dem Dach"). Sonderzeichen mußt Du aus dem String entfernen.
Titel: Re:Bookmarks anlegen
Beitrag von: chock am 27.07.04 - 11:15:43
Habe jetzt diese ID komplett eingetragen ohne Sonderzeichen. Fehlermeldung "Invalid ID".
Habe diese ID genommen siehe Anhang
Titel: Re:Bookmarks anlegen
Beitrag von: Driri am 27.07.04 - 11:19:17
Oopsa, da hab ich mich etwas mißverständlich ausgedrückt  ;)

Du brauchst nur die ID in der zweitletzten Zeile (DB...)
Titel: Re:Bookmarks anlegen
Beitrag von: chock am 27.07.04 - 11:34:25
irgendwie klappt das nicht, so sieht jetzt der Eintrag aus:

unid$ = "DBC1256E9B002CDB22"
Titel: Re:Bookmarks anlegen
Beitrag von: koehlerbv am 27.07.04 - 11:36:25
Dass führende "DB" ist noch zuviel.
Titel: Re:Bookmarks anlegen
Beitrag von: chock am 27.07.04 - 11:43:19
funktioniert auch nicht, ich glaube es muss eine 32 stellige ID rein.
Titel: Re:Bookmarks anlegen
Beitrag von: koehlerbv am 27.07.04 - 11:49:20
Ich hätte mal alles lesen sollen ;-(
Die DocumentUNID sind die ersten Werte, die in den Properties angezeigt werden, also hinter "OF" und "ON" und dann LS-mässig ohne Doppelpunkte.

HTH,
Bernhard
Titel: Re:Bookmarks anlegen
Beitrag von: Driri am 27.07.04 - 11:58:11
Sorry für die Verwirrung, was ich gepostet hatte war die ReplikID. Mea Culpa  :-[
Titel: Re:Bookmarks anlegen
Beitrag von: chock am 27.07.04 - 14:49:25
Wenn ich jetzt das Script mit dem Debugger kontrolliere wird das richtige Bild aus der DB geholt und auch in die bookmark.nsf kopiert.
Starte ich nun Notes neu erscheint ein ganz anderes Bild in der Lesezeichenleiste. Vielleicht hat noch jemand eine Idee.

Dim outline As NotesOutline
   Dim oeNew As NotesOutlineEntry
   Dim oeRef As NotesOutlineEntry
   Dim oeTmp As NotesOutlineEntry
   Dim NoMore As Variant
   Dim db As NotesDatabase
   Dim imageDocument As NotesDocument
   Dim MDB As NotesDatabase
   Dim s As New NotesSession
   Dim Done, Found As Variant
   Dim ws As New NotesUIWorkspace
   Dim unid$
   
   unid$ = "8F7D685C19ACBE55C1256E530037312A"
   server$ = "kh_dom01"
   filename$ = "db/protoeg.NSF"
   labeltext$ = "Protokolle EG-Sitzungen"
   
   Call ws.AddDatabase(server$ , filename$ )
   Set MDB = s.GetDatabase(server$,filename$)
   Set db = New NotesDatabase( "", "bookmark.nsf" )
   Set outline = db.GetOutline("UserBookmarkOrder")
   Set oeTmp = outline.GetFirst()
   
   label$ = ""
   Done = False
   referenceFound = False
   nacEntryFound = False
   
   Do While Done = False
   If oeTmp Is Nothing Then
   Done = True
   Else
   label$ = oeTmp.Label
   If label$ = labeltext$ And oeTmp.Level = 0 Then '..entry already exists
   nacEntryFound = True
   Done = True
   Else
   If label$ = "More Bookmarks" Then
   referenceFound = True '..found where we normally put the bookmark, but let's keep looking incase the user has placed the bookmark somewhere else
   Set oeRef = oeTmp
   End If
   Set oeTmp = outline.GetNextSibling(oeTmp)
   End If
   End If
   Loop
   
   Set oeNew = outline.CreateEntry(labeltext$)
   Call oeNew.SetNoteLink(MDB)
   
   If nacEntryFound Then
   Dim vorhanden As String
   vorhanden = |Das Lesezeichen '| & labeltext$ & |' existiert bereits!
Wenn Sie es an der linken Seite noch nicht sehen, schließen
und starten Sie ihr Lotus Notes bitte erneut!|
   Messagebox vorhanden, 0+48, "Lesezeichen vorhanden"
   Exit Sub
   Else
   If referenceFound Then
   Call outline.AddEntry(oeNew, oeRef,True,False)
   Else
   Call outline.AddEntry(oeNew, ,True,False)
   End If
   Set imageDocument = MDB.GetDocumentByUNID (unid$)
   Call imageDocument.CopyToDatabase(db)
   oeNew.ImagesText = labeltext$
   Call outline.save()
   End If
   Dim Zeilen As String
   Zeilen = |Das Lesezeichen '| & labeltext$ &|' wurde angelegt.
Sie können es erst nach einem Neustart von Lotus Notes
an der linklen Seite sehen!|
   Messagebox Zeilen, 0+64, "Lesezeichen erstellen"
Titel: Re:Bookmarks anlegen
Beitrag von: TMC am 28.07.04 - 00:03:23
Ich werde mir das mal gelegentlich ansehen. Lösungen für Part 2 (also Bookmark-Icon setzen) gab es ja schon öfter mal im www.
Aber vielleicht kann man da mal eine Copy&Paste - fähige Lösung machen.

Der Ersteller des Scripts hat leider "Option Declare" nicht eingeschaltet und Variablennamen nicht sauber definiert, daher liest sich der Code nicht schön. Ich werde also erstmal den Code bereinigen und mir das dann mal die nächsten Tage anschauen, weil ich mittelfristig auch mal so eine Lösung brauche.

Was beim 1. Blick auffällt: Da steht hardcodiert "To Do" drin, was passiert wenn der Client deutschsprachig ist?

Titel: Re:Bookmarks anlegen
Beitrag von: TMC am 28.07.04 - 22:45:01
Hab mich jetzt mal etwas damit beschäftigt. Dazu hab ich das Script auf's wesentliche gekürzt:
Code
Public Sub CreateBookmark(strUNID As String, strImageResourceName As String)
   Dim session As New NotesSession   
   Dim dbThis As NotesDatabase      
   Dim dbBookmark As NotesDatabase   
   Dim docImage As NotesDocument
   
   Dim outlineBookmark As NotesOutline   
   Dim oeNew As NotesOutlineEntry
   
   Set dbThis = session.CurrentDatabase
   Set dbBookmark = New NotesDatabase( "", "bookmark.nsf" ) 'the user's bookmark.nsf
   
   'Copy image to bookmark.nsf
   Set docImage = dbThis.GetDocumentByUNID(strUNID)
   Call docImage.CopyToDatabase( dbBookmark )
   Set outlineBookmark = dbBookmark.GetOutline("UserBookmarkOrder")   
   
   'We create the new Outline Entry
   Set oeNew = outlineBookmark.CreateEntry(dbThis.title)
   Call oeNew.SetNoteLink(dbThis)
   oeNew.ImagesText = strImageResourceName   'Name of the image resource
   Call outlineBookmark.save()
   Msgbox "New entry created. Please restart the client.....", 64, dbThis.title
   
End Sub 

Funktioniert so auch.
strUNID = UNID der Bildressource der QuellDB (aus der dieser Code ausgeführt wird)
strImageResourceName = Name der Bildressource

Was mich viel mehr interessierte.

a) Wie kann ich die Bookmark-Bar refreshen ohne Client-Neustart?
Habe keinen Weg gefunden  :P Beispielsweise ein view.refresh der bookmark.nsf-View "(All Bookmarks)" bringt überhaupt nichts. Habe auch sonst keinen Weg gefunden.... Ist wohl sehr stark mit dem Client verdrahtet und ein Refresh wohl einfach nicht vorgesehen....

b) Wie vermeide ich das Kopieren der Bildressource?
Habe auch hier keinen Weg gefunden (nochmal  :P). Wenn man manuell ein Bookmark auf die Leiste zieht, steht als Bild-Name "$Image" drin. Setzt man das programmatisch, dann erscheint das Icon der bookmark.nsf.
Unterschiede zwischen programmatisch und per Hand erzeugte Einträge konnte ich mit bloßem Auge keine sehen. Und Notes läst keine weiteren Einblicke zu.

Nett zu wissen wäre, in wie weit man hier mit API arbeiten könnte.
Titel: Re:Bookmarks anlegen
Beitrag von: Glombi am 28.07.04 - 23:31:56
Hier ein vielversprechendes Tool:
http://www.icodex.com/corpdesk/sitemanager/sitestore.nsf/pages/index.html (http://www.icodex.com/corpdesk/sitemanager/sitestore.nsf/pages/index.html)

Andreas
Titel: Re:Bookmarks anlegen
Beitrag von: TMC am 29.07.04 - 00:16:09
Hat mir jetzt doch keine Ruhe gelassen. Halblösung zu (b) (wie vermeide ich die Kopie eines Bildes in die bookmark.nsf) habe ich gefunden:

1.) Code ausführen:
@Command( [AddBookmark]; ""; "IchBinDieNeueDB"; "Databases")
2.) User muss Client neu starten
3.) Agent ausführen:
Code
Sub Initialize
   Dim session As New NotesSession   
   Dim dbThis As NotesDatabase      
   Dim dbBookmark As NotesDatabase   
   
   Dim outlineBookmark As NotesOutline   
   Dim oeNew As NotesOutlineEntry
   
   Set dbThis = session.CurrentDatabase
   Set dbBookmark = New NotesDatabase( "", "bookmark.nsf" ) 'the user's bookmark.nsf
   Set outlineBookmark = dbBookmark.getOutline("UserBookmarkOrder")
   Dim oeFirst As NotesOutlineEntry
   Dim oeTarget As NotesOutlineEntry   
   
   Set oeFirst  = outlineBookmark.GetFirst()
   
   Set oeTarget  = outlineBookmark.GetFirst()
   Dim bFinished As Integer
   bFinished = False
   Do While bFinished = False
      If oeTarget Is Nothing Then
         Msgbox "Kein Eintrag gefunden"
         Exit Sub
      End If
      
      If (oeTarget.Label = "IchBinDieNeueDB") Then
         Msgbox "Wir haben was gefunden"
         Call outlineBookmark.MoveEntry(oeTarget, oeFirst, 1)
         Msgbox "Und jetzt den Eintrag verschoben"
         Call outlineBookmark.save()      
         bFinished = True
      End If
      Set oeTarget = outlineBookmark.GetNext(oeTarget)   
   Loop
   
   
End Sub

Dann wieder Client-Neustart, und siehe da, das Bookmark steht dort wo man es braucht.
Praktikabel ist das natürlich überhaupt nicht  >:(