Autor Thema: Tipp zur Umsetzung eines Links zum Kontakt  (Gelesen 8839 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