Autor Thema: LS - Per Button editierbare Mail aus einer DB erstellen mit Datenübernahme  (Gelesen 5881 mal)

Offline deepsee3

  • Senior Mitglied
  • ****
  • Beiträge: 426
  • Geschlecht: Männlich
  • Notes ... be back on track ;)
    • Baustelle
Bin nicht so fit im Lotusscript ... obwohl es sich ja sehr Ähnelt mit vb.net ...
Möchte aus einer DB eine Mail öffnen die Daten übergeben bekommt ... hier mal abgespeckt ...
Problem ... neue Mail wird erstellt (Mail DB öffnet sich mit neuer Mail ) aber null Daten  ???


Public Sub CreateMail()
   
   On Error GoTo ERRORHANDLER

   Dim ws As New NotesUIWorkspace
   Dim uidoc As NotesUIDocument
   Dim session As New NotesSession
   Dim doc As NotesDocument ' Notesdokument ->
   Dim docm As NotesDocument ' Neue Mail
   Dim vMailDB As Variant 'Mail DB
   Dim varindex As Variant ' aus Dokument gelesene EMail Adresse
      
   'Datenindex aus Dokument einlesen
   Set uidoc = ws.CurrentDocument  
   Set doc = uidoc.Document
   varindex = doc.GetItemValue( "KontaktMail" )
      
   ' # ... die Parameter der Mail-Datenbank einlesen.
   vMailDB = Evaluate("@MailDBName")
      
   'Mail erstellen
   Dim maildoc As NotesUIDocument
   Set Maildoc = ws.ComposeDocument(vMailDB(0), vMailDB(1), "Memo")
   
   'Erstelltes Dokument mit Daten füllen
   Set docm = Maildoc.Document
   docm.sendto = varindex(0)
   docm.Subject = "Test"

   
      
EXIT_SCRIPT:
   Exit Sub
   
ERRORHANDLER:
   MsgBox "Error: " & Err & " - " & Error$ & Chr(10) & Chr(10)_
   & "Line: " & Erl & Chr(10), _
   48, "An error occured"
   Resume EXIT_SCRIPT
   
End Sub

« Letzte Änderung: 06.04.13 - 12:45:35 von deepsee3 »
Client   : notes 9.0.1 fx4
Server : notes 9.0.1 fx4 - 2012 R2

Offline deepsee3

  • Senior Mitglied
  • ****
  • Beiträge: 426
  • Geschlecht: Männlich
  • Notes ... be back on track ;)
    • Baustelle
ok ... in meinen Augen völlig beklo. ... warum das so gemacht wird ... aber so geht es ...  ;D

Direkt das Datenfeld "sendtoenter" angesprochen ....
Warum geht eine GotoField Anweisung und eine direkte klassische Zuordnung nicht ...
Wenn jemand ne elegantere bzw. bessere Idee hat ... bin für alles offen ...


Public Sub CreateMail()
   
   On Error GoTo ERRORHANDLER

   Dim ws As New NotesUIWorkspace
   Dim uidoc As NotesUIDocument
   Dim session As New NotesSession
   Dim doc As NotesDocument ' Notesdokument ->
   Dim docm As NotesDocument ' Neue Mail
   Dim vMailDB As Variant 'Mail DB
   Dim varindex As Variant ' aus Dokument gelesene EMail Adresse
      
   'Datenindex aus Dokument einlesen
   Set uidoc = ws.CurrentDocument  
   Set doc = uidoc.Document
   varindex = doc.GetItemValue( "KontaktMail" )
      
   ' # ... die Parameter der Mail-Datenbank einlesen.
   vMailDB = Evaluate("@MailDBName")
      
   'Mail erstellen
   Dim maildoc As NotesUIDocument
   Set Maildoc = ws.ComposeDocument(vMailDB(0), vMailDB(1), "Memo")
   
   Maildoc.GotoField( "sendtoEnter" ) ' -> zum Feld gehen
   Maildoc.InsertText(varindex(0)) ' -> Feld füllen ...
   
      
EXIT_SCRIPT:
   Exit Sub
   
ERRORHANDLER:
   MsgBox "Error: " & Err & " - " & Error$ & Chr(10) & Chr(10)_
   & "Line: " & Erl & Chr(10), _
   48, "An error occured"
   Resume EXIT_SCRIPT
   
End Sub

« Letzte Änderung: 06.04.13 - 12:21:32 von deepsee3 »
Client   : notes 9.0.1 fx4
Server : notes 9.0.1 fx4 - 2012 R2

Offline Tode

  • Moderatoren
  • Gold Platin u.s.w. member:)
  • *****
  • Beiträge: 6.885
  • Geschlecht: Männlich
  • Geht nicht, gibt's (fast) nicht... *g*
Du befüllst das backend dokument  und wunderst Dich, dass das Frontend das nicht anzeigt. Typisches Anfänger- Script- Problem (uidocument vs. Document). Befülle das uidoc direkt per setfield (ich glaube so heisst das) oder erstelle ein backend document (set dbmail = new notesdatabase( server, db ) dann set doc = new notesdocument (dbmail) dann replaceitemvalue, dann call ws.editdocument)

Edit: bekloppt ist es nur, wenn man nicht versteht was man tut...
Gruss
Torsten (Tode)

P.S.: Da mein Nickname immer mal wieder für Verwirrung sorgt: Tode hat NICHTS mit Tod zu tun. So klingt es einfach, wenn ein 2- Jähriger versucht "Torsten" zu sagen... das klingt dann so: "Tooode" (langes O, das r, s und n werden verschluckt, das t wird zum badischen d)

Offline deepsee3

  • Senior Mitglied
  • ****
  • Beiträge: 426
  • Geschlecht: Männlich
  • Notes ... be back on track ;)
    • Baustelle
Ok ... versuche mal zu verstehen ...
Das heisst wenn ich einmal ...

     Dim uidoc As NotesUIDocument

eingesetzt habe ...

dann bleibt der da ,auch wenn ich im laufendem Script versuch umzuschalten ...


        Dim maildoc As NotesUIDocument
   Set Maildoc = ws.ComposeDocument(vMailDB(0), vMailDB(1), "Memo")


dann verstehe ich das ... klar ... der bleibt auf meinem Hauptdokument wo ich das script starte ...
... halt Anfängerfehler ;)


Client   : notes 9.0.1 fx4
Server : notes 9.0.1 fx4 - 2012 R2

Offline WildVirus

  • Gold Platin u.s.w. member:)
  • *****
  • Beiträge: 658
  • Geschlecht: Männlich
Moinsen,

versuch mal den Unterschied zwischen NotesDocument und NotesUIDocument wirklich zu verstehen.

Dein letzter Post zeigt, dass Du das nicht verstanden hast.

CU,
Axel

Offline deepsee3

  • Senior Mitglied
  • ****
  • Beiträge: 426
  • Geschlecht: Männlich
  • Notes ... be back on track ;)
    • Baustelle
Also ... vielleicht hab ich mich "Dumm" ausgedrückt"

NotesUIDocument ist das Dokument, welches dir gerade ANGEZEIGT wird. Ein NotesDocument kann man nur zu einem NotesUIDocument machen, wenn man es öffnet.

Ich dachte es reicht wenn ich einfach UID zuweise ...

   Dim maildoc As NotesUIDocument
   Set Maildoc = ws.ComposeDocument(vMailDB(0), vMailDB(1), "Memo")


In diesem Moment sehe ich nur das "UID" ...
Die Verabeitung der Zuordnung habe ich im Backend versucht ...


   Set docm = Maildoc.Document
   docm.sendto = varindex(0)
   docm.Subject = "Test"


... das hab ich schon verstanden ...


Client   : notes 9.0.1 fx4
Server : notes 9.0.1 fx4 - 2012 R2

Offline WildVirus

  • Gold Platin u.s.w. member:)
  • *****
  • Beiträge: 658
  • Geschlecht: Männlich
Ok, Du hast es nicht verstanden !

Eine Änderung am Backend (=Notesdocument) siehst Du am Frontend (=NotesUIDocument) erst nach dem das Frontend neu geladen wurde.

Erzeuge ein Backenddokument, fülle alle Felder mit DocumentMethodenund hole dann das Dokument ins Frontend.

Oder erzeuge ein Frontenddocument, fülle alle Felder mit UIDocumentMethoden


Offline deepsee3

  • Senior Mitglied
  • ****
  • Beiträge: 426
  • Geschlecht: Männlich
  • Notes ... be back on track ;)
    • Baustelle
Wie schon gesagt ... Anfänger ...

Versuch es also nochmal zu verstehen (Danke für eure Geduld ... )

Das ist eine Frontend Erstellung  ...


Dim maildoc As NotesUIDocument
Set Maildoc = ws.ComposeDocument(vMailDB(0), vMailDB(1), "Memo")


also muss ich die über die Frontendbefehle auch füllen. In meinem Beispiel hab ich das jetzt mit einem GOTOField gemacht  ...
( ... oder wäre ein FieldSetText besser ?)

soweit richtig ?

« Letzte Änderung: 06.04.13 - 13:37:40 von deepsee3 »
Client   : notes 9.0.1 fx4
Server : notes 9.0.1 fx4 - 2012 R2

Offline Peter Klett

  • Gold Platin u.s.w. member:)
  • *****
  • Beiträge: 2.713
  • Geschlecht: Männlich
...
Eine Änderung am Backend (=Notesdocument) siehst Du am Frontend (=NotesUIDocument) erst nach dem das Frontend neu geladen wurde.
...
Das ist so nicht korrekt. Natürlich kann ich ein NotesUIDocument über das NotesUIDocument.Document im Backend mit Daten versorgen, und diese Daten sind SOFORT sichtbar, mache ich seit Notes 4 so und funktioniert auch heute noch (ausgeschlossen Richtext, aber darum geht es im Augenblick auch garnicht).

Das Problem, das hier auftritt, ist, dass beim NotesUIDocument nach einem ComposeDocument das Document nicht initiiert ist (kann man im Debugger nachvollziehen), deshalb funktioniert in genau diesem Fall es nicht.

Offline deepsee3

  • Senior Mitglied
  • ****
  • Beiträge: 426
  • Geschlecht: Männlich
  • Notes ... be back on track ;)
    • Baustelle
Tja ... in Vergangenheit habe ich nur Daten manipuliert ... als in bestehenden Dokumenten Änderungen oder Workflows angestossen.
In diesem Fall jetzt soll das Mail ja noch nicht gespeichert werden , sondern nur erstellt werden ... damit der Vertrieb noch Änderungen vermerken kann.

Also vorher speichern is leider nicht  :(

Client   : notes 9.0.1 fx4
Server : notes 9.0.1 fx4 - 2012 R2

Offline Peter Klett

  • Gold Platin u.s.w. member:)
  • *****
  • Beiträge: 2.713
  • Geschlecht: Männlich
Wie schon gesagt ... Anfänger ...

Versuch es also nochmal zu verstehen (Danke für eure Geduld ... )

Das ist eine Frontend Erstellung  ...


Dim maildoc As NotesUIDocument
Set Maildoc = ws.ComposeDocument(vMailDB(0), vMailDB(1), "Memo")


also muss ich die über die Frontendbefehle auch füllen. In meinem Beispiel hab ich das jetzt mit einem GOTOField gemacht  ...
( ... oder wäre ein FieldSetText besser ?)

soweit richtig ?


Ja, richtig, würde ich aber niemals so machen. Die Befüllung von Feldern im Frontend setzt voraus, dass die Felder bearbeitbar sind. Besser ist die Erstellung im Backend, Felder versorgen, und dann mit NotesUIWorkspace.EditDocument öffnen, wie Tode schon geschrieben hat.

Eine Ausnahme stellt die Erstellung von Dokumenten dar, die Werte aus dem markierten Dokument übernehmen sollen, wenn es so in der Maske eingestellt ist und die Feldformeln in den Feldern die Übernahme regeln. Da hilft nur ein ComposeDocument (oder alle Übernahmen in das Script auslagern). Bei genau solch einer Routine mache ich es genau so, wie Du beschrieben hast.

Hier ein singemäßer Auszug einer uralten Scriptbibliothek:

   Dim newuidoc As NotesUIDocument
   Set newuidoc = workspace.ComposeDocument ("", "", doc.Form (0))
   
   Dim newdoc As NotesDocument
   Set newdoc = newuidoc.Document
   If neueAusgabe Then
      newdoc.Version = doc.Version (0) + 1
      newdoc.VDokument = doc.Dokument (0)
      Call newuidoc.RefreshHideFormulas
   End If

Das funktioniert schon seit Notes 4 unter OS/2 bis heute, und da ist nach dem ComposeDocument das Document im NotesUIDocument gesetzt.

Offline Peter Klett

  • Gold Platin u.s.w. member:)
  • *****
  • Beiträge: 2.713
  • Geschlecht: Männlich
Tja ... in Vergangenheit habe ich nur Daten manipuliert ... als in bestehenden Dokumenten Änderungen oder Workflows angestossen.
In diesem Fall jetzt soll das Mail ja noch nicht gespeichert werden , sondern nur erstellt werden ... damit der Vertrieb noch Änderungen vermerken kann.

Also vorher speichern is leider nicht  :(


Ein Dokument im Backend zu erstellen und dann über workspace.EditDocument ins UI zu bringen, heißt nicht, es vorher speichern zu müssen. Also so:

Dim doc As New NotesDocument (db)
doc.Form = "meineForm"
doc.Feld1 = "Wert1"
doc.Feld2 = "Wert2"
Call workspace.EditDocument (True, doc)

Dann ist das im Backend erstellte Dokument im Frontend geöffnet. Verlässt der Benutzer das Dokument, ohne es zu speichern, ist es auch nicht in der Datenbank gespeichert.

Offline Peter Klett

  • Gold Platin u.s.w. member:)
  • *****
  • Beiträge: 2.713
  • Geschlecht: Männlich
Sowas macht mich immer irre:

Habe gerade beide Varianten, also die von deepsee3 und die aus unserer Bibliothek, durch den Debugger laufen lassen. Bei unserer Bibliothek ist Document des NotesUIDocument nach dem Compose gesetzt, bei der anderen Variante nicht.

Warum das so ist, kann ich im Augenblick nicht nachvollziehen. Ein Unterschied besteht darin, dass die db, in der das Ganze passiert, an unsere Routine als Parameter übergeben wird, und damit globaler definiert ist. Ansonsten kann ich nichts erkennen ...

Offline WildVirus

  • Gold Platin u.s.w. member:)
  • *****
  • Beiträge: 658
  • Geschlecht: Männlich
Vor lauter Diskussion Front-/Backend haben wir alle den entscheidenen Passus übersehen.

EnterSendTo vs. SendTo

Das Feld, dass die Benutzer im Frontend der Mail sehen, ist EnterSendTo. Und der Code im ersten Post schreibt in SendTo. Und in das Feld SendTo schreibt der Agent auch sauber rein.

Mit einem
Code
Call maildoc.fieldsettext("entersendto", varindex(0))
vor dem Aufruf von
Code
Set docm = Maildoc.Document 
klappt es hingegen.

@Peter - Kann es ein Unterschied sein, ob die MailDB als Variant oder als NotesDatabase deklariert wurde ?

Offline Peter Klett

  • Gold Platin u.s.w. member:)
  • *****
  • Beiträge: 2.713
  • Geschlecht: Männlich
@Peter - Kann es ein Unterschied sein, ob die MailDB als Variant oder als NotesDatabase deklariert wurde ?
Die Datenbank ist beide Male als NotesDatabase deklariert, es dreht sich aber bei der Scriptbibliothek nicht um die Maildatenbank, da geht es allgemein um die Erstellung von Dokumenten in beliebigen Datenbanken.

Bei meinen Tests mit der Routine von deepsee3 habe ich auch keine Maildatenbank verwendet, sondern eine einfache sinnfreie, die ich für Testzwecke benutze.

Mich hat gewundert, dass deepsee3 nie von Fehlermeldungen geschrieben hat, bei mir trat nämlich ein Object variable not set auf, als ich auf das NotesUIDocument.Document zugegriffen hatte.

Offline deepsee3

  • Senior Mitglied
  • ****
  • Beiträge: 426
  • Geschlecht: Männlich
  • Notes ... be back on track ;)
    • Baustelle
Also bei mir kommt kein Fehler ... habe bei den Test mit gotofield auch das datenfeld sendtoenter verwendet (siehe Code )
Ich versuche mich jetzt an der Backend Variante ... Will ja was lernen :) ... Hab gerade die Nase in die Bücher gesteckt ... Danke für eure Tipps ...
Client   : notes 9.0.1 fx4
Server : notes 9.0.1 fx4 - 2012 R2

Offline pram

  • Gold Platin u.s.w. member:)
  • *****
  • Beiträge: 1.170
  • Geschlecht: Männlich
    • Foconis Object Framework
Etwas OT, aber zur Ergänzung, falls mal wer in das gleiche Problem läuft:

Das Verfahren (dim mailDoc as new NotesDocument(mailDB), ws.editDocument(mailDoc)) hat einen Bug, welcher zwar sehr selten auftritt aber dennoch auftreten kann:

-> Wenn man in seiner Anwendung gerade eine Ansicht geöffnet hat, welche die gleiche NoteID wie die z.B. Papierkorb-Ansicht der MailDB hat, dann wird die Form-Formula der Papierkorb-Ansicht verwendet und es erscheint die Meldung:

"Elemente im Papierkorb können nicht bearbeitet werden. Klicken Sie auf die Schaltfläche 'Wiederherstellen', um zunächst das Element wiederherzustellen."

http://www-01.ibm.com/support/docview.wss?uid=swg1LO65953

Es gibt dafür keinen wirklichen Workaround.


Gruß
Roland
Roland Praml

IBM Certified Application Developer - Lotus Notes and Domino 8
Ich verwende das Foconis Object Framework

 

Impressum Atnotes.de  -  Powered by Syslords Solutions  -  Datenschutz