Autor Thema: Tipp zur Umsetzung eines Links zum Kontakt  (Gelesen 8645 mal)

Offline dabjoern

  • Junior Mitglied
  • **
  • Beiträge: 95
  • Geschlecht: Männlich
Tipp zur Umsetzung eines Links zum Kontakt
« 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

Offline Axel

  • Moderator
  • Gold Platin u.s.w. member:)
  • *****
  • Beiträge: 8.658
  • Geschlecht: Männlich
  • It's not a bug, it's Notes
Re: Tipp zur Umsetzung eines Links zum Kontakt
« Antwort #1 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
Ohne Computer wären wir noch lange nicht hinterm Mond!

Offline dabjoern

  • Junior Mitglied
  • **
  • Beiträge: 95
  • Geschlecht: Männlich
Re: Tipp zur Umsetzung eines Links zum Kontakt
« Antwort #2 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

Offline dabjoern

  • Junior Mitglied
  • **
  • Beiträge: 95
  • Geschlecht: Männlich
Re: Tipp zur Umsetzung eines Links zum Kontakt
« Antwort #3 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

Offline Axel

  • Moderator
  • Gold Platin u.s.w. member:)
  • *****
  • Beiträge: 8.658
  • Geschlecht: Männlich
  • It's not a bug, it's Notes
Re: Tipp zur Umsetzung eines Links zum Kontakt
« Antwort #4 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
Ohne Computer wären wir noch lange nicht hinterm Mond!

Offline Axel

  • Moderator
  • Gold Platin u.s.w. member:)
  • *****
  • Beiträge: 8.658
  • Geschlecht: Männlich
  • It's not a bug, it's Notes
Re: Tipp zur Umsetzung eines Links zum Kontakt
« Antwort #5 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
Ohne Computer wären wir noch lange nicht hinterm Mond!

Offline dabjoern

  • Junior Mitglied
  • **
  • Beiträge: 95
  • Geschlecht: Männlich
Re: Tipp zur Umsetzung eines Links zum Kontakt
« Antwort #6 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

Offline koehlerbv

  • Moderator
  • Gold Platin u.s.w. member:)
  • *****
  • Beiträge: 20.460
  • Geschlecht: Männlich
Re: Tipp zur Umsetzung eines Links zum Kontakt
« Antwort #7 am: 19.07.05 - 17:21:09 »
Du setzt ja auch SaveOptions ="0" vorher - das ist der Casus Knacktus.

Bernhard

Offline dabjoern

  • Junior Mitglied
  • **
  • Beiträge: 95
  • Geschlecht: Männlich
Re: Tipp zur Umsetzung eines Links zum Kontakt
« Antwort #8 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

Offline Axel

  • Moderator
  • Gold Platin u.s.w. member:)
  • *****
  • Beiträge: 8.658
  • Geschlecht: Männlich
  • It's not a bug, it's Notes
Re: Tipp zur Umsetzung eines Links zum Kontakt
« Antwort #9 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




Ohne Computer wären wir noch lange nicht hinterm Mond!

Offline dabjoern

  • Junior Mitglied
  • **
  • Beiträge: 95
  • Geschlecht: Männlich
Re: Tipp zur Umsetzung eines Links zum Kontakt
« Antwort #10 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

Offline dabjoern

  • Junior Mitglied
  • **
  • Beiträge: 95
  • Geschlecht: Männlich
Re: Tipp zur Umsetzung eines Links zum Kontakt
« Antwort #11 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

Offline Axel

  • Moderator
  • Gold Platin u.s.w. member:)
  • *****
  • Beiträge: 8.658
  • Geschlecht: Männlich
  • It's not a bug, it's Notes
Re: Tipp zur Umsetzung eines Links zum Kontakt
« Antwort #12 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
Ohne Computer wären wir noch lange nicht hinterm Mond!

Offline dabjoern

  • Junior Mitglied
  • **
  • Beiträge: 95
  • Geschlecht: Männlich
Re: Tipp zur Umsetzung eines Links zum Kontakt
« Antwort #13 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

Offline dabjoern

  • Junior Mitglied
  • **
  • Beiträge: 95
  • Geschlecht: Männlich
Re: Tipp zur Umsetzung eines Links zum Kontakt
« Antwort #14 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

Offline Axel

  • Moderator
  • Gold Platin u.s.w. member:)
  • *****
  • Beiträge: 8.658
  • Geschlecht: Männlich
  • It's not a bug, it's Notes
Re: Tipp zur Umsetzung eines Links zum Kontakt
« Antwort #15 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
Ohne Computer wären wir noch lange nicht hinterm Mond!

Offline dabjoern

  • Junior Mitglied
  • **
  • Beiträge: 95
  • Geschlecht: Männlich
Re: Tipp zur Umsetzung eines Links zum Kontakt
« Antwort #16 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
« Letzte Änderung: 26.07.05 - 15:16:43 von dabjoern »

Offline Axel

  • Moderator
  • Gold Platin u.s.w. member:)
  • *****
  • Beiträge: 8.658
  • Geschlecht: Männlich
  • It's not a bug, it's Notes
Re: Tipp zur Umsetzung eines Links zum Kontakt
« Antwort #17 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
Ohne Computer wären wir noch lange nicht hinterm Mond!

Offline dabjoern

  • Junior Mitglied
  • **
  • Beiträge: 95
  • Geschlecht: Männlich
Re: Tipp zur Umsetzung eines Links zum Kontakt
« Antwort #18 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

Offline Axel

  • Moderator
  • Gold Platin u.s.w. member:)
  • *****
  • Beiträge: 8.658
  • Geschlecht: Männlich
  • It's not a bug, it's Notes
Re: Tipp zur Umsetzung eines Links zum Kontakt
« Antwort #19 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
Ohne Computer wären wir noch lange nicht hinterm Mond!

 

Impressum Atnotes.de  -  Powered by Syslords Solutions  -  Datenschutz