Das Notes Forum

Domino 9 und frühere Versionen => ND6: Entwicklung => Thema gestartet von: dabjoern am 18.07.05 - 14:26:22

Titel: Tipp zur Umsetzung eines Links zum Kontakt
Beitrag von: dabjoern am 18.07.05 - 14:26:22
Hallo liebe Forenmitglieder,
ich brauche mal wieder einen Denkanstoß. Und zwar möchte ich eine Dialogbox (o.ä.) verwenden, die aus einer View alle Namen der vorher angelegten Kontakte anzeigt. Mehrfachauswahl möglich.

Jetzt mein Problem: Wenn man jemanden (oder mehrere) Personen ausgewählt hat, möchte ich, dass ein Link für jede Person vorhanden ist. Betätigt man den Link, erhalte ich das Kontaktdokument der jeweiligen Person. Am Besten wäre es, wenn der Name der Person der Link wäre. Hat jemand Vorschläge zur Realisierung?

Gruß und Danke im Voraus
Björn
Titel: Re: Tipp zur Umsetzung eines Links zum Kontakt
Beitrag von: Axel am 18.07.05 - 14:41:58
Hi,

lass dir die Kontakte mit der Methode PicklistCollection (Klasse NotesUUIWorkspace) anzeigt. Die liefert dir eine DocumentCollection mit allen gewählten Dokumenten. Diese kannst du dann mit AppendDocLink (Klasse NotesRichTextItem) in ein RTF - Feld in deine Maske einfügen.

Das ist so ganz grob mal eine Idee.


Axel
Titel: Re: Tipp zur Umsetzung eines Links zum Kontakt
Beitrag von: dabjoern am 18.07.05 - 15:23:20
Hi Axel,
danke für deinen Beitrag. Was du da vorschlägst sind zwar alles unbekannte Sachen für mich, ich werde es aber dennoch mal austesten und in der Hilfe recherchieren.
Gruß
Björn
Titel: Re: Tipp zur Umsetzung eines Links zum Kontakt
Beitrag von: dabjoern am 19.07.05 - 15:07:12
Hallo,
ich habe mittlerweile folgenden Code zusammengestückelt:

Code
Sub Click(Source As Button)
	Dim session As New NotesSession
	Dim ws As New NotesUIWorkspace
	Dim db As NotesDatabase
	Dim collection As NotesDocumentCollection
	Dim coldoc As NotesDocument
	Dim rtitem As NotesRichTextItem
	Dim doc2 As NotesDocument
	Dim uidoc As NotesUIDocument
	Dim unid As String
	
	Set db = session.CurrentDatabase
	Set uidoc = ws.CurrentDocument
	
	Call uidoc.Save
	Set Doc2 = uidoc.Document
	
	Set collection = ws.PickListCollection(PICKLIST_CUSTOM,True,db.Server,"lehre\StrategicMarketingIS.nsf","Person","Contacts"," " )
	Set coldoc = collection.GetFirstDocument
	
	Set rtitem = New NotesRichTextItem(Doc2, "SO_EconomicBuyer")
	Call rtitem.AppendDocLink(coldoc, "Dokument")
	Doc2.Form = "Sales Opportunity"
	Doc2.Saveoptions = "0"
	Call Doc2.Save(True, False)
	unid = Doc2.UniversalID
	
	Set Doc2 = db.GetDocumentByUNID(unid)
	
	Set uidoc = ws.EditDocument(Doc2)
	
	uidoc.editmode = True	
	
End Sub

Dieser Code funktioniert soweit, jedoch wird die Mehrfachauswahl nicht beachtet. D.h. es wird -auch wenn ich mehrere Personen auswähle - nur ein Link erzeugt. Hat jemand einen Tipp, wie die Schleife aussehen müsste? Und außerdem: ist das Skript effizient und sauber? Hat jemand Verbesserungsvorschläge?
Gruß
Björn
Titel: Re: Tipp zur Umsetzung eines Links zum Kontakt
Beitrag von: Axel am 19.07.05 - 15:17:14
Hi,

die Schleife müsste so aussehen:

Code
...
Set collection = ws.PickListCollection(PICKLIST_CUSTOM,True,db.Server,"lehre\StrategicMarketingIS.nsf","Person","Contacts"," " )
Set coldoc = collection.GetFirstDocument

Set rtitem = New NotesRichTextItem(Doc2, "SO_EconomicBuyer")

While Not (coldoc Is Nothing)
  Call rtitem.AppendDocLink(coldoc, "Dokument")
  Call rtitem.AddNewLine(1) 'Einfügen einer Zeilenschaltung
  Set coldoc = collection.GetNextDocument(coldoc)
Wend

Doc2.Form = "Sales Opportunity"
...


So auf den ersten Blick ist am Code nichts auszusetzen.

Axel
Titel: Re: Tipp zur Umsetzung eines Links zum Kontakt
Beitrag von: Axel am 19.07.05 - 15:20:39
Hi,

eins ist mir im Nachhinein doch aufgefallen. Warum setzt du denn das Form-Feld der Maske nochmal?

...
Doc2.Form = "Sales Opportunity"
...

Weiter oben in deinem Code speicherst du das Dokument doch schon und spätestens ab da ist das Form-Feld gesetzt.


Axel
Titel: Re: Tipp zur Umsetzung eines Links zum Kontakt
Beitrag von: dabjoern am 19.07.05 - 17:15:15
Hi Axel,
die Schleife funktioniert super. Mir ist beim Testen aber noch was Komisches aufgefallen. Wenn ich das Skript ausführe und die Links anlege , kann ich nichts mehr speichern. D.h. sobald der Link eingefügt ist, werden keinerlei Daten mehr im Dok gespeichert. Da kann ich ändern was ich will.  :-:
MfG
Björn
Titel: Re: Tipp zur Umsetzung eines Links zum Kontakt
Beitrag von: koehlerbv am 19.07.05 - 17:21:09
Du setzt ja auch SaveOptions ="0" vorher - das ist der Casus Knacktus.

Bernhard
Titel: Re: Tipp zur Umsetzung eines Links zum Kontakt
Beitrag von: dabjoern am 19.07.05 - 17:27:37
Wenn ich die besagt Zeile entferne, dann funktioniert das obige Skript aber nicht mehr, d.h. dann sehe ich den Link nicht im Richt Text Feld. Schade, ich probier nun heute schon den ganzen Tag und ich finde keine gescheite Lösung.
MFG
Björn
Titel: Re: Tipp zur Umsetzung eines Links zum Kontakt
Beitrag von: Axel am 19.07.05 - 19:31:08
Hi,

das mit den RTF-Felder ist so eine Sache. In manchen Fällen verhalten sich die Dinger etwas störrisch.

Unser Forumsmitglied ata (Alias Anton Tauscher) hat auf seiner Webseite eine Funktion, die dein Problem löst.

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 


Binde diese Funktion in deinen Code ein, und dann sollte das funktionieren.


Axel




Titel: Re: Tipp zur Umsetzung eines Links zum Kontakt
Beitrag von: dabjoern am 20.07.05 - 10:04:21
Hi Axel,
vielen Dank für das Skript. Funktioniert super! Jetzt bin ich glücklich. Werde jetzt noch versuchen, aus der Collection Daten zu ziehen, um so neben dem Link auch noch einen Text zu setzen. Dieser soll dynamisch generiert sein (das Skript soll aus der View Vor- und Nachname ziehen). Mal sehen, ob ich es packe.  :P
Gruß
Björn
Titel: Re: Tipp zur Umsetzung eines Links zum Kontakt
Beitrag von: dabjoern am 21.07.05 - 09:19:44
Kann mir einer einen Tipp geben, warum dies nicht funktioniert?
Code
	Dim fullname As NotesItem
Set fullname = coldoc.Items(19)
Call rtitem.AppendText(fullname)

Ziel ist eigentlich das, was ich oben beschrieben habe:
Zitat
Werde jetzt noch versuchen, aus der Collection Daten zu ziehen, um so neben dem Link auch noch einen Text zu setzen. Dieser soll dynamisch generiert sein (das Skript soll aus der Collection Vor- und Nachname ziehen).

Der gesamte Code sieht jetzt so aus:
Code
Sub Click(Source As Button)
	Dim session As New NotesSession
	Dim ws As New NotesUIWorkspace
	Dim db As NotesDatabase
	Dim collection As NotesDocumentCollection
	Dim coldoc As NotesDocument
	Dim rtitem As NotesRichTextItem
	Dim doc2 As NotesDocument
	Dim uidoc As NotesUIDocument
	Dim unid As String
	
	Set db = session.CurrentDatabase
	Set uidoc = ws.CurrentDocument
	
	Call uidoc.Save
	Set doc2 = uidoc.Document
	
	Set collection = ws.PickListCollection(PICKLIST_CUSTOM,True,db.Server,db.filepath,"Person","Contacts"," " )
	Set coldoc = collection.GetFirstDocument
	
	Set rtitem = New NotesRichTextItem(doc2, "SO_EconomicBuyer")
	
	Dim fullname As NotesItem
	
	While Not (coldoc Is Nothing)		
		Set fullname = coldoc.Items(19)
		Call rtitem.AppendDocLink(coldoc, "Dokument")
		Call rtitem.AppendText(fullname)	 '<-- geht nicht
		Call rtitem.AddNewLine(1)
		Set coldoc = collection.GetNextDocument(coldoc)
	Wend
	
	Call ReOpen(doc2)
	
End Sub

Danke und Gruß
Björn
Titel: Re: Tipp zur Umsetzung eines Links zum Kontakt
Beitrag von: Axel am 21.07.05 - 14:04:35
Hi,

das ist klar warum das nicht funktioniert, denn Set fullname = coldoc.Items(19) liefert dir ein NotesItem zurück. Die Methode Call rtitem.AppendText(fullname) erwartet aber einen String. Eigentlich müsstest du eine Type Mismatch - Fehler bekommen.

Warum benutzt du denn nicht die Feldnamen?

...
Dim strfullname As String

While Not (coldoc Is Nothing)
  Set strfullname = coldoc.Vorname(0) & " " & coldoc.Nachname(0)
  Call rtitem.AppendDocLink(coldoc, "Dokument")
  Call rtitem.AppendText(strfullname)
  Call rtitem.AddNewLine(1)
  Set coldoc = collection.GetNextDocument(coldoc)
Wend
...

So sollte das funktionieren. Die Feldnamen musst du natürlich an deine anpassen.


Axel
Titel: Re: Tipp zur Umsetzung eines Links zum Kontakt
Beitrag von: dabjoern am 22.07.05 - 00:48:08
Hallo auch,
also folgender Code führt zum gewünschten Ergebnis:
Code
Sub Click(Source As Button)
	Dim session As New NotesSession
	Dim ws As New NotesUIWorkspace
	Dim db As NotesDatabase
	Dim collection As NotesDocumentCollection
	Dim coldoc As NotesDocument
	Dim rtitem As NotesRichTextItem
	Dim doc2 As NotesDocument
	Dim uidoc As NotesUIDocument
	Dim unid As String
	
	Set db = session.CurrentDatabase
	Set uidoc = ws.CurrentDocument
	
	Call uidoc.Save
	Set doc2 = uidoc.Document
	
	Set collection = ws.PickListCollection(PICKLIST_CUSTOM,True,db.Server,db.filepath,"Person","Contacts"," " )
	Set coldoc = collection.GetFirstDocument
	
	Set rtitem = New NotesRichTextItem(doc2, "SO_EconomicBuyer")
	
	Dim strfullname As String
	
	While Not (coldoc Is Nothing)
		strfullname = coldoc.FirstName(0) & " " & coldoc.LastName(0)
		Call rtitem.AppendDocLink(coldoc, "Dokument")
		Call rtitem.AppendText(strfullname)
		Call rtitem.AddNewLine(1)
		Set coldoc = collection.GetNextDocument(coldoc)
	Wend
	
	Call ReOpen(doc2)
	
End Sub

Funktion ReOpen:

Code
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"
	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
		docThis.RemoveItem("SaveOptions")
		Call docThis.Save( True , True )
	End If
	ReOpen = 1
End Function

Großes Danke an Axel, aber auch insgesamt danke für dieses Forum. Ihr seid Spitze!
Gruß
Björn
Titel: Re: Tipp zur Umsetzung eines Links zum Kontakt
Beitrag von: dabjoern am 26.07.05 - 13:30:14
Hi auch,
ich habe den Code noch ein wenig geändert. Nunmehr wird der Name nicht aus einer collection gezogen, sondern aus einer Dialog List. Das Ganze habe ich in das Exiting Event gelegt. Mein Problem ist, dass der Link, der erzeugt wird, nicht funktioniert. D.h. es wird nicht zum ldoc verlinkt, sondern zum doc (klicke ich den Link, wird das Dokument erneut geladen). Was soll das? Hier der Code:

Code
Sub Exiting(Source As Field)
	Dim session As New NotesSession
	Dim ws As New NotesUIWorkspace
	Dim db As NotesDatabase
	Dim view As NotesView
	Dim uidoc As NotesUIDocument
	Dim doc As NotesDocument
	Dim ldoc As NotesDocument
	Dim rtitem As NotesRichTextItem
	Dim key As String
	
	Set db = session.CurrentDatabase
	Set uidoc = ws.CurrentDocument
	
	Call uidoc.Save
	Set doc = uidoc.Document
	
	key = doc.SO_EconomicBuyer(0)
	
	Set view = db.GetView("Person" )
	Set ldoc = view.GetDocumentByKey(key)
	
	Set rtitem = New NotesRichTextItem(doc, "SO_EB_Link")
	
	Call rtitem.AppendDocLink(ldoc, "Link")
	
	Call ReOpen(doc)
End Sub

Funktion ReOpen siehe oben.

MfG und vielen Dank
Björn
Titel: Re: Tipp zur Umsetzung eines Links zum Kontakt
Beitrag von: Axel am 26.07.05 - 14:05:18
Hi,

so auf den ersten Blick sieht der Code richtig aus.

Auf jeden Fall solltest du noch eine Fehlerbehandlung einbauen. Zumindest nach der Suche in der Ansicht.

...
Set view = db.GetView("Person" )
Set ldoc = view.GetDocumentByKey(key)
If ldoc Is Nothing Then
  'Dokument nicht gefunden
  'Tu was
Else
  'Dokument gefunden
  'Der Link kann eingefügt werden.
End If
...

Hast du mal mit dem Debugger geprüft, ob ldoc wirklich gefüllt ist? Du kannst dir auch mal zum Test ein Feld aus ldoc anzeigen lassen. Füge nach dem GetDocumentByKey mal sowas ein wie
 
  Messagebox ldoc.NameEinesFeldesDasInDemDokumentVorhandenIst(0)


Anmerkung: Hat das einen Grund den Code in das Exiting-Event zu packen? Du solltest bedenken, dass dieses Event nicht immer ausgeführt wird.


Axel
Titel: Re: Tipp zur Umsetzung eines Links zum Kontakt
Beitrag von: dabjoern am 26.07.05 - 15:15:04
Hi Axel,
ich hab das alles schon im Debugger geprüft. ldoc und doc sind unterschiedliche Dokumente (z.B. weichen die created Zeiten ab). Also ldoc ist wirklich gefüllt. Hatte auch eine solche Ausgabe vorgenommen (ldoc.FirstName). Ging auch und hat gestimmt. Deswegen bin ich auch so verwirrt.
Das mit Exiting habe ich auch bemerkt, dass das nicht immer erfüllt ist. Bin noch beim Überlegen, wo ich das Einfügen kann. Was ist ein angemesseneres Event? Ich will es aber nicht in irgendwelche Events des Forms legen, da ich einige solcher Funktionen und Felder haben werde (4 an der Zahl). Für alle diese 4 Felder muss ich dieses Skript ausführen.
Heute abend werde ich mich mal auf weitere Fehlersuche begeben, jetzt ruft die Natur:-)
Gruß und vielen Dank
Björn
Titel: Re: Tipp zur Umsetzung eines Links zum Kontakt
Beitrag von: Axel am 26.07.05 - 15:23:00
Hi,

wenn du es nicht in ein Form-Event packen willst, dann leg de nCode doch in einen Button oder einem Hotspot in der Nähe des entsprechenden Feldes.


Axel
Titel: Re: Tipp zur Umsetzung eines Links zum Kontakt
Beitrag von: dabjoern am 28.07.05 - 22:21:45
Hi auch,
hab das Ganze jetzt in das Postrecalc Event gepackt. Mein Code sieht jetzt so aus:
Code
Sub Postrecalc(Source As Notesuidocument)	
	Dim session As New NotesSession
	Dim db As NotesDatabase
	Dim view As NotesView
	Dim uidoc As NotesUIDocument
	Dim ws As New NotesUIWorkspace
	Dim doc As NotesDocument
	Dim ldoc As NotesDocument
	Dim rtitem As NotesRichTextItem
	Dim key As Variant
	
	Set db = session.CurrentDatabase
	Set uidoc = ws.CurrentDocument
	
	Call uidoc.Save
	Set doc = uidoc.Document
	
	For i = 1 To 4
		key = doc.GetItemValue(("SO_Name_" + Cstr(i)))
		Set rtitem = New NotesRichTextItem(doc,("SO_Link_" + Cstr(i)))
		Set view = db.GetView("Person" )
		Set ldoc = view.GetDocumentByKey(key(0))
		
		If ldoc Is Nothing Then
			Exit Sub
		Else
			Call doc.ReplaceItemValue(("SO_Link_" + Cstr(i)),"")
			Call rtitem.AppendDocLink(ldoc, "Link")
			Call ReOpen(doc)
		End If
	Next i
End Sub

Mit der Zeile
Code
Call doc.ReplaceItemValue(("SO_Link_" + Cstr(i)),"")
bin ich mir unsicher. Mal geht der Code, mal nicht. Ziel ist es, das Rich Text Feld zunächst zu leeren, bevor der Link gesetzt wird. Falls man einen bestehenden Namen im Feld SO_Name_3 bspw. leert, möchte ich, dass der Link in SO_Link_3 gelöscht wird und kein Link mehr dasteht. Ist der Code so in Ordnung? Was ist euere Meinung.
Danke und viel Spaß noch
Björn
Titel: Re: Tipp zur Umsetzung eines Links zum Kontakt
Beitrag von: Axel am 29.07.05 - 08:45:27
... Mal geht der Code, mal nicht.

Hi,

was heißt das? Gibt's 'ne Fehlermeldung

Was mir aufgefallen ist, du legst immer ein neues RTF-Feld an. Vielleicht klemmts darum. Besser ist es, erstmal zu prüfen, ob es das RTF-Feld schon gibt (GetFirstItem aus der NotesDocument-Klasse). Wenn es vorhanden ist kannst du es leeren. Wenn GetFirstItem Nothing zurückliefert, kannst du ein neues anlegen.


Axel
Titel: Re: Tipp zur Umsetzung eines Links zum Kontakt
Beitrag von: dabjoern am 29.07.05 - 10:20:29
Hi Axel und natürlich auch die anderen,
das ist eine gute Idee. Aber ich hab jetzt in der Hilfe nochmal nachgelesen und mich mit getFirstItem, GetItemValue und FieldGetText beschäftigt. Ich verstehe, welche Klassen vorausgesetzt werden. Was mich verwundert, ist das folgender Code nicht funktionsfähig ist.

Code
Dim session As New NotesSession
Dim db As NotesDatabase
Dim uidoc As NotesUIDocument
Dim ws As New NotesUIWorkspace
Dim doc As NotesDocument

Set db = session.CurrentDatabase
Set uidoc = ws.CurrentDocument
	
Call uidoc.Save
Set doc = uidoc.Document
Set rtitem = doc.GetFirstItem("SO_Name_1")

Der Fehler ist: Type Mismatch in der letzten Zeile bei set rtitem. Es handelt sich doch bei doc um ein NotesDocument, welches die Methode GetFirstItem unterstützt. Ich finde in NotesUIDocument keine alternative Methode. Also, was machen? Sorry für die vielen Fragen und tausend Dank!

Gruß
Björn
Titel: Re: Tipp zur Umsetzung eines Links zum Kontakt
Beitrag von: Axel am 29.07.05 - 10:48:36
Hi,

du musst die Variable rtitem auch deklarieren.

Dim rtitem As NotesRichTextItem


Axel
Titel: Re: Tipp zur Umsetzung eines Links zum Kontakt
Beitrag von: dabjoern am 29.07.05 - 11:14:21
Die habe ich so, wie du vorschlägst, deklariert. Habe den Code nur ausschnittsweise gepostet. Hier nochmal mein Testcode:

Code
Sub Postrecalc(Source As Notesuidocument)	
	Dim session As New NotesSession
	Dim db As NotesDatabase
	Dim view As NotesView
	Dim uidoc As NotesUIDocument
	Dim ws As New NotesUIWorkspace
	Dim doc As NotesDocument
	Dim ldoc As NotesDocument
	Dim rtitem As NotesRichTextItem
	Dim key As Variant	
	Dim counter As Integer
	
	Set db = session.CurrentDatabase
	Set uidoc = ws.CurrentDocument
	
	Call uidoc.Save
	Set doc = uidoc.Document
	Set rtitem = doc.GetFirstItem("SO_Name_1")
	
	counter = uidoc.FieldGetText("EB_counter")
	
	For i = 1 To counter
		key = uidoc.FieldGetText(("SO_Name_" + Cstr(i)))
		Messagebox(key)
	Next i
End Sub

Gruß
Björn
Titel: Re: Tipp zur Umsetzung eines Links zum Kontakt
Beitrag von: Axel am 29.07.05 - 11:31:57
Hi,

ja und..., läuft?


Axel
Titel: Re: Tipp zur Umsetzung eines Links zum Kontakt
Beitrag von: dabjoern am 29.07.05 - 11:43:32
Hi auch,
Sorry, Missverständnis. Ich hatte den Code schon so. Er läuft nicht. Immer wieder Type Mismatch Fehler.
Gruß
Björn
Titel: Re: Tipp zur Umsetzung eines Links zum Kontakt
Beitrag von: Axel am 29.07.05 - 11:54:26
Hi,

was für ein Typ ist den das Feld "SO_Name_1" ?


Axel
Titel: Re: Tipp zur Umsetzung eines Links zum Kontakt
Beitrag von: dabjoern am 29.07.05 - 11:59:32
Das Feld ist vomTyp Dialog List / Editable, keine Multiple Values, mit Formel als Choices --> @DbColumn("":"NoCache";"";"Person";1)
Gruß
Björn

Edit: ich sehe gerade meinen Fehler. Danke! Ich habe das falsche Feld angesprochen, ich will ja das Feld SO_Link_(i) und nicht SO_Name_(i) --> das Feld SO_Link_(i) ist natürlich ein RichText Feld. Mist! Danke für deine Geduld. Ich probiere weiter...
Titel: Re: Tipp zur Umsetzung eines Links zum Kontakt
Beitrag von: dabjoern am 29.07.05 - 13:21:19
Was mir aufgefallen ist, du legst immer ein neues RTF-Feld an. Vielleicht klemmts darum. Besser ist es, erstmal zu prüfen, ob es das RTF-Feld schon gibt (GetFirstItem aus der NotesDocument-Klasse). Wenn es vorhanden ist kannst du es leeren. Wenn GetFirstItem Nothing zurückliefert, kannst du ein neues anlegen.

Du meinst es klemmt an der Stelle
Code
Set rtitem = New NotesRichTextItem(doc,("SO_Link_" + Cstr(i)))
? Ich verstehe nicht ganz, was das bringt, wenn ich prüfe, ob das item vorhanden ist. Ich habe doch die Felder SO_Link_1 bis SO_Link_5 als Rich Text Felder "manuell" angelegt. So würde doch eine Item Prüfung immer positiv ausfallen. Müsste ich nicht prüfen, ob rtitem schon gesetzt ist? Oder habe ich hier einen Denkfehler?
Gruß
Björn
Titel: Re: Tipp zur Umsetzung eines Links zum Kontakt
Beitrag von: koehlerbv am 29.07.05 - 13:24:39
Wenn SO_Name_1 ein Textfeld ist, warum weist Du dieses denn dann einem RichtTextItem zu ? Das muss ja schiefgehen.

Bernhard
Titel: Re: Tipp zur Umsetzung eines Links zum Kontakt
Beitrag von: koehlerbv am 30.07.05 - 00:29:14
Zur Verdeutlichung der Problematik habe ich hier nochmal den eindeutigen Hinweis aus DesignerHelp kopiert:

 4.   This script gets an existing rich text item called ProjectDescription and adds a carriage return and a text value to it. Notice how rtitem is declared a variant, since the GetFirstItem method returns a NotesItem that may or may not be a NotesRichTextItem. Since Type is a property defined in NotesItem, you can use it with a NotesRichTextItem as well. The script tests the variant to see if it is rich text; if so, it uses NotesRichTextItem methods on the variant. For more information, see the GetFirstItem method in NotesDocument.

Dim doc As NotesDocument
Dim rtitem As Variant
'...set value of doc...
Set rtitem = doc.GetFirstItem( "ProjectDescription" )
If rtitem.Type = RICHTEXT Then
  Call rtitem.AddNewLine( 1 )
  Call rtitem.AppendText _
  ( "Book is 64 pages, full color." )
End If
Call doc.Save( False, True )


Was mir aber nach wie vor unklar ist: Warum versuchst Du ein ein Item, das Dir als Nicht-RTI bekannt ist, als RTI zu instantiieren ? Du weisst doch dann schon vorher, dass dies in die Hose gehen muss ...

Bernhard
Titel: Re: Tipp zur Umsetzung eines Links zum Kontakt
Beitrag von: dabjoern am 30.07.05 - 19:23:47
@koehlerbv
Also ich hab in meinen letzten Posts die Felder verwechselt. Ich wollte das Feld SO_Link_1 auslesen (Typ Rich Text) und nicht das Feld SO_Name_1 (Typ Dialog List). In meinem Skript habe ich immer versucht, SO_Name_1 anzusprechen. Mein Fehler.
Ich weiß jetzt nicht genau, was du meinst. Sorry.

@All
Mittlerweile habe ich eine Methode gefunden, dass Rich Text Feld zu leeren:
Code
Call uidoc.FieldClear(("SO_Link_" + Cstr(i)))
Der gesamte Code sieht jetzt so aus:
Code
Sub Postrecalc(Source As Notesuidocument)
	Dim session As New NotesSession
	Dim db As NotesDatabase
	Dim view As NotesView
	Dim uidoc As NotesUIDocument
	Dim ws As New NotesUIWorkspace
	Dim doc As NotesDocument
	Dim ldoc As NotesDocument
	Dim rtitem As NotesRichTextItem
	Dim key As Variant
	Dim counter As Integer
	
	Set db = session.CurrentDatabase
	Set uidoc = ws.CurrentDocument
	
	Call uidoc.Save
	Set doc = uidoc.Document
	
	counter = uidoc.FieldGetText("EB_counter")
	
	For i = 1 To counter
		key = uidoc.FieldGetText(("SO_Name_" + Cstr(i)))
		Set rtitem = New NotesRichTextItem(doc,("SO_Link_" + Cstr(i)))
		Set view = db.GetView("Person" )
		Set ldoc = view.GetDocumentByKey(key)
		If (key <> "") Then
			If ldoc Is Nothing Then
				Messagebox("Could not find document for " & key & ".")
				Exit Sub
			Else
				Call rtitem.AppendDocLink(ldoc, "Link")
				Call ReOpen(doc)
			End If
		Else
			Call uidoc.FieldClear(("SO_Link_" + Cstr(i)))
		End If
	Next i
End Sub

Eigentlich funktioniert jetzt alles so, wie ich es haben wollte. Falls ihr noch was findet, bitte posten :-)

Kurze Frage noch: Gibt es noch ein alternatives Event zu Postrecalc, was für mein Skript zweckdienlich ist?

Gruß und schönes Wochenende. Sorry für meine blöden Fragen...
Beste Grüße
Björn