Das Notes Forum

Domino 9 und frühere Versionen => ND6: Entwicklung => Thema gestartet von: cfiber am 16.12.05 - 09:17:33

Titel: Problem: DocLink im RTField anhängen
Beitrag von: cfiber am 16.12.05 - 09:17:33
Hallo zusammen,

wieder mal folgender Ärger mit dem Richtextfield:

-Dokument ist offen
-Button wird gedrückt, damit ein DocLink angehangen wird

Problem: Ich muss ja mit Set rtitem = New NotesRichTextItem(doc,"linkstodocs") dieses erstmal setzen, dadurch wird der Link aber nie angehangen, sondern überschrieben. Wenn ich Set rtitem = doc.GetFirstItem("linkstodocs") benutze meckert der Compiler, dass er rtitem nicht setzen kann.

Ich habe schon versucht, dass alles abzufangen, abzufragen,...aber nix tuts.


Hat da jemand eine Idee?


Danke!!
Titel: Re: Problem: DocLink im RTField anhängen
Beitrag von: m3 am 16.12.05 - 09:26:32
Zitat
AppendDocLink method 
Inserts a doclink in a rich text item.

Syntax
Call notesRichTextItem.AppendDocLink( linkTo, comment$ [, HotSpotText$ ] )

Code
Dim session As New NotesSession
Dim db As NotesDatabase
Dim newDoc As NotesDocument
Dim rtitem As NotesRichTextItem
Set db = session.CurrentDatabase
Set newDoc = New NotesDocument( db )
Set rtitem = New NotesRichTextItem( newDoc, "Body" )
Call rtitem.AppendDocLink( db, db.Title )
newDoc.Subject = "Here is a link to the database"
newDoc.SendTo = "Lauri Nodwell"
newDoc.Send( False )

So gehts nicht?
Titel: Re: Problem: DocLink im RTField anhängen
Beitrag von: cfiber am 16.12.05 - 09:29:53
Hier mein Code: (es ist ein bestehendes Dokument, was nicht gesendet wird)

Code
Dim uiws As New NotesUIWorkspace
	Dim session As New NotesSession
	
	Set db = session.CurrentDatabase
	Set uidoc = uiws.CurrentDocument
	Set doc = uidoc.Document
	
	pick =uiws.Pickliststrings(PICKLIST_CUSTOM,  False, db.Server, db.FilePath,"All","Selection","Choose the doc to link:", 7)
	
	If Isempty(pick) Then Exit Sub
	
	unid = Strleft(pick(0), "~")
	docsubject = Strright(pick(0), "~")
	Set temp = db.GetDocumentByUNID(unid)
	
	[b]Set rtitem = New NotesRichTextItem(doc,"linkstodocs")
	Set rtitem = doc.GetFirstItem("linkstodocs")[/b]
	Call rtitem.AddNewline(1)	
	Call rtitem.appendDoclink(temp,docsubject)
	Call rtitem.AppendText(" - " + docsubject)
	Call doc.save(True, False)
	doc.saveoptions = "0"
	Call uidoc.Close
	Set uidoc = uiws.EditDocument(True, doc)
	Set doc = uidoc.Document

Ich habe keine Idee mehr, wie ich es mit dem fettgedruckten Teil handhaben soll....
Titel: Re: Problem: DocLink im RTField anhängen
Beitrag von: Axel am 16.12.05 - 09:33:44
Hi,

Das kann so auch nicht gehen.

Set rtitem = New NotesRichTextItem(doc,"linkstodocs")
Set rtitem = doc.GetFirstItem("linkstodocs")

Du musst sich für eine Zeile entscheiden. Wenn in dem Dokument bereits ein RTF-FEld enthalten ist, dann nimm die zweite Zeile und lass die erste weg.

Axel
Titel: Re: Problem: DocLink im RTField anhängen
Beitrag von: m3 am 16.12.05 - 09:35:09
GetFirstItem liefert je nach Feldtyp NotesItem oder NotesRitchTextItem zurück. Also reicht ein:
Code
Dim rtitem As NotesRichTextItem
...
%Rem Set rtitem = New NotesRichTextItem(doc,"linkstodocs")
Das braucht man nicht.
%End Rem
Set rtitem = doc.GetFirstItem("linkstodocs")
Titel: Re: Problem: DocLink im RTField anhängen
Beitrag von: cfiber am 16.12.05 - 09:37:11
Dann kommt aber die Fehlermeldung "Object Variable Not Set"
Titel: Re: Problem: DocLink im RTField anhängen
Beitrag von: m3 am 16.12.05 - 09:45:15
Auf RTF-Inhalte kann man nur zugreifen, NACHDEM das Dok gespeichert wurde. Kann es sein, dass es sich bei dem Dokument um ein neues handelt, das noch nicht gespeichert wurde? Wenn ja, dann ist die Fehlermeldung normal.

Titel: Re: Problem: DocLink im RTField anhängen
Beitrag von: flaite am 16.12.05 - 09:46:46
Ich hab letztens auch festgestellt, dass new RichTextItem ein neues RichTextItem erstellt, egal ob schon eins da ist.
Die Aufgabe des Scripts bestand darin von aussen Attachments von Tif-Dateien aus einem RT-Feld zu löschen.
Ging dann mit RTItem = doc.getFirstItem("itemName").
Wenn du das Dokument im Frontend geöffnet hast, ist es schwieriger.

Versuch mal im PostSave oder im QueryClose Event das DocLink im Backend zu setzen.
Besorg dir das RichTextItem mit doc.getFirstItem(itemName). Du mußt aber nach not nothing und nach item.type checken.
Gegebenenfalls ist es notwendig, dass du dir das gerade geschlossene Dokument über db.getDocumentByUNID holst.
Die UniversalID und die Daten für das Ziel des Doclinks kannst du dir in globalen Masken-Variablen speichern.

Gruß Axel
Titel: Re: Problem: DocLink im RTField anhängen
Beitrag von: cfiber am 16.12.05 - 09:53:50
@kennwort

Genau das ist das Problem. Man hat nur Ärger mit den Richtextfeldern. Gibt es da keine einfachere Lösung? So brech ich mir wieder einen ab....
Titel: Re: Problem: DocLink im RTField anhängen
Beitrag von: Axel am 16.12.05 - 10:14:37
Man hat nur Ärger mit den Richtextfeldern. Gibt es da keine einfachere Lösung? So brech ich mir wieder einen ab....

Es gibt keine einfachere Lösung mit RTF-Feldern. Ich habe mir da auch schon sehr oft einen abgebrochen.

Bei einem neuen Dokument kannst du auf ein RTF-Feld mit Script-Methoden nur zugreifen wenn das Dokument einmal gespeichert, geschlossen und wieder geöffnet wurde. Mit den normalen Script-Befehlen uidoc.Reload, uidoc.Refresh usw. kommst du hier nicht weit.

Forumsmitglied ata hat da mal eine kleine Funktion für sowas erstellt.

Code
REM Das aktuelle Dokument schließen und wieder öffnen...... 
    Function ReOpen(docThis As NotesDocument) As Integer 
        Dim ws As New NotesUIWorkspace 
        Dim uidoc As NotesUIDocument 
        Dim dbThis As NotesDatabase 
        Dim unid As String 
 
        ReOpen = 0 
        Set dbThis = docThis.ParentDatabase 
        Call docThis.Save(True , True) 
        unid = docThis.UniversalID 
        docThis.SaveOptions = "0" ' # ... Speicherabfrage vermeiden 
        Set uidoc = ws.CurrentDocument 
        Call uidoc.Close 
        Set docThis = dbThis.GetDocumentByUNID(unid) 
        Set uidoc = ws.EditDocument(True , docThis) 
        Set docThis = uidoc.Document 
        If docThis.HasItem("SaveOptions") Then  
            ' # ... das Feld SaveOptions wieder entfernen... 
            docThis.RemoveItem("SaveOptions") 
            Call docThis.Save( True , True ) 
        End If 
        ReOpen = 1 
        Print "Das Dokument wurde erneut geöffnet" 
    End Function 


Axel