Supportnet Computer
Planet of Tech

Supportnet / Forum / SW-Sonstige

Ereignisse in LotusNotes





Frage

Hallo supportnetties, kann mir jemand sagen, wie ich einem Ereignis in einer Notes-Datenbank (z.B. Doppelklick auf eine mail in der Dokumentenübersicht) ein bereits existierendes (LotusScript-)Makro (d.h. dessen Ausführung) zuordnen kann ? Danke für die Hilfe im voraus ! Gruß Bernd

Antwort 1 von Sunnylein

Hallo,

da gibt es jede Menge 'Ereignisse', die man mit Aktionen (z. B. einem Agenten) belegen kann. Die 'gängigsten' sind wahrscheinlich PostOpen, QueryClose etc.

Anbei eine Liste aus der LN-Hilfe mit Hinweisen, wo das Ereignis stattfindet (z. B. Ansicht oder Feld etc.) und mit welcher Sprache (Formel, Script) man darauf zugreifen kann.

Ich hoffe, die Infos erschlagen dich jetzt nicht ;-).

Gruss, Sunnylein

---

The following table lists the events that can be automated using the formula language (F), LotusScript (LS), JavaScript (JS), and Java (J).

Database
Postopen (LS, F) - After a database is opened
Postdocumentdelete (LS, F) - After a document is deleted (the document is still available)
Queryclose (LS, F) - When a database is being closed
Querydocumentdelete (LS, F) - Before a document is marked for deletion
Querydocumentundelete (LS, F) - Before a document is unmarked for deletion
Querydragdrop (LS, F) - Before a drag and drop operation in a view
Postdragdrop (LS, F) - After a drag and drop operation in a view
Initialize (LS) - When a database is being loaded
Terminate (LS) - When a database is being closed

View
Queryopen (LS, F) - Before a view or folder is opened

Folder
Postopen (LS, F) - After a view or folder is opened
Regiondoubleclick (LS, F) - When a region in a calendar view is double-clicked
Queryopendocument (LS, F) - Before a document is loaded
Queryrecalc (LS, F) - Before a view or folder is refreshed
Queryaddtofolder (LS, F) - Before a document is added to a folder
Querypaste (LS, F) - Before a document is pasted
Postpaste (LS, F) - After a paste operation
Querydragdrop (LS, F) - Before a drag and drop operation in a calendar view
Postdragdrop (LS, F) - After a drag and drop operation in a calendar view
Queryclose (LS, F) - When a view or folder is being closed
Initialize (LS) - When a view or folder is loaded
Terminate (LS) - When a view or folder is being closed

Form
WebQueryOpen (F) -- form only - Before a Web document displays**

Subform
WebQuerySave (F) -- form only - Before a Web document is saved**

Page
HelpRequest (F) - When help is selected
JS Header (JS) - When a document is being loaded
onBlur (JS) - When an object is deselected
onClick (JS) - When an object is selected
onDblClick (JS) - When an object is selected with a double-click
onFocus (JS) - When an editable field is selected
onHelp (JS) - When help is selected
onKeyDown (JS) - When a key is pressed down
onKeyPress (JS) - When a key is pressed
onKeyUp (JS) - When a key is released
onLoad (JS) - After a document is opened
onMouseDown (JS) - When a mouse button is pressed down
onMouseMove (JS) - When the mouse is moved
onMouseOut (JS) - When the mouse is moved out of an object
onMouseOver (JS) - When the mouse is moved over an object
onMouseUp (JS) - When a mouse button is released
onReset (JS) -- form only- When a document is reset
onSubmit (JS) -- form only - Before a document is submitted
onUnload (JS) - Before a document is closed
Queryopen (LS, F) - Before a document is opened
Postopen (LS, F)-After a document is opened
Querymodechange (LS, F) - Before a document is changed to Read or Edit mode
Postmodechange (LS, F) - After a document is changed to Read or Edit mode
Postrecalc (LS, F) - After a document is refreshed (and values are recalculated)
Querysave (LS, F) - Before a document is saved
Postsave (LS, F) - After a document is saved
Queryclose (LS, F) - Before a document is closed
Initialize (LS) - When a document is being loaded
Terminate (LS) - After the document is closed
Click (LS) -- form only - When an object is selected

Field
onClick (JS) - When an object is selected
onChange (JS) - When an object is changed
onBlur (JS) - When an editable field is deselected
onFocus (JS) - When an editable field is selected
Entering (LS) - When an editable field is selected
Exiting (LS) - When an editable field is deselected
Initialize (LS) - When a document is being loaded -- occurs after the Form Initialize event
Terminate (LS) - When a document is being closed
Action-onBlur (JS) - When an object is deselected
Button-onClick (JS) - When an object is selected

Hotspot
onDblClick (JS) - When an object is selected with a double-click
onFocus (JS) - When an editable field is selected
onHelp (JS) - When help is selected
onKeyDown (JS) - When a key is pressed down
onKeyUp (JS) - When a key is released
onMouseDown (JS) - When a mouse button is pressed down
onMouseMove (JS) - When the mouse is moved
onMouseOut (JS) - When the mouse is moved out of an object
onMouseOver (JS) - When the mouse is moved over an object
onMouseUp (JS) - When a mouse button is released
Click (LS, F) - When an object is selected
Objectexecute (LS) - When an object is activated by an OLE2 server that is FX/NotesFlow™ enabled
Initialize (LS) - When an object is being loaded
Terminate (LS) - When an object is being closed

Agent
Action (F) - When an agent is run
JavaAgent (J) - When an agent is run
Initialize (LS) - When an agent is being loaded
Terminate (LS) - When an agent is being closed


** WebQueryOpen and WebQuerySave must be a formula with the following syntax: @Command([ToolsRunMacro];"agentname").

Antwort 2 von Sunnylein

Sorry, ich vergass...

Zuordnen kannst du die Reaktion auf ein Ergeigniss in einer Ansicht z. B. zu einem Aktionsbutton bzw. einem Agenten oder in einem Dokument zu einem Hotspot.

Vielleicht sagst du uns, was genau du umsetzen möchtest?

Gruss Sunnylein

Antwort 3 von bernd wegener

Hallo sunnylein,

so weit, so gut. Aber wie ordne ich jetzt einem Ereignis ein Makro zu ? Mein Problem ist speziell, daß ich in der Dokumentenübersicht auf eine mail doppelklicken möchte und das LS dann ausgeführt werden soll.

Vielleicht kennst Du ja den Weg.

Gruß


Bernd

Antwort 4 von Sunnylein

Hi,

also soll vor dem/beim Öffnen des Dokumentes (Mail) etwas passieren (die Ausführung eines Scripts)?

Das wäre dann normalerweise der PostOpen Event der (Memo-)Maske...
...dazu müßtest du die Möglichkeit haben, die Maske zu programmieren - also den DesignerClient und die nötigen Rechte haben (bei deiner eigenen Mailbox sollte das kein Problem sein).

Wenn du die Maske im Designer geöffnet hast, kannst du in das Feld für den PostOpen Event deine Formel bzw. dein Script eintragen.

Bei großen Firmen (z. B. bei uns) kann es allerdings sein, dass deine individuellen Änderungen beim 'Drüberbügeln' der Standard-Mailschablone allerdings wieder verloren gehen, wenn du in den Eigenschaften deiner Maildatenbank nicht das Häkchen bei "Gestaltung übernehmen" rausnimmst.

Falls du keinen DesignerClient hast, kannst du wahrscheinlich nur versuchen, dir einen Agenten zu erstellen (über das Menü "Erstellen" -> "Agent".
Dabei wird aber bei der Auswahl allerdings nicht angeboten, dass etwas beim Öffnen geschehen soll... was die Sache für dich wahrscheinlich uninteressant macht, oder?

Bye, Sunnylein

Antwort 5 von bernd wegener

Hallo sunnylein,

nein, den Designer habe ich zur Verfügung und bin auch mittlerweile so weit, daß ich im Maskeneditor dem QueryOpen-Ereignis mein Makro zuordnen konnte (o.k., vielleicht etwas primitiv durch Hineinkopieren des Skript-Textes; gibt es da einen professionelleren Weg?).

Ich bekomme jetzt aber beim Doppelklick auf eine mail in der Ansicht einen Laufzeitfehler.

Da wir ohne nicht weiter komme, habe ich jetzt hier einmal den Skript-Text eingefügt:

Sub QueryOpen(Source As Notesuidocument, Mode As Integer, Isnewdoc As
Variant, Continue As Variant)

Dim doc As NotesDocument
Dim Receipt As String
Dim Antwort As Integer

Dim cMemoObject As Variant

Set cMemoObject = New UIMemoDocument
Call cMemoObject.Init(Source,Isnewdoc)

Set doc = source.document
If ((doc Is Nothing) Or (Source.IsNewDoc)) Then
Exit Sub
End If
Receipt = doc.ReturnReceipt(0)
If Receipt = "1" Then
Antwort = Msgbox ("Achtung! Soll die enthaltene
Empfangsbestätigunggelöscht werden?", 19, "Empfangsbestätigung aktiv!")
Select Case Antwort
Case 2 ' ------------------------- Abbrechen
Continue = False
Exit Sub
Case 6 ' -------------------------- Ja
Call doc.ReplaceItemValue("ReturnReceipt", "")
Call doc.Save(True, True)
Case 7 ' ------------------------Nein
End Select
End If
End Sub

Die Fehlermeldung lautet wie folgt:

"Variant does not contain an object"

Der Fehler tritt auf in der Zeile, in der cMemoObject initialisiert wird:

Call cMemoObject.Init(Source,Isnewdoc)

Die cMemoObject zugrundeliegende Klasse UIMemoDocument stammt aus der Skript-Library CoreEmailClasses, die ich mit "use" unter options (hoffentlich) korrekt eingebunden habe.

Hast Du eine Idee, was hier schief läuft ?

Wäre nett, wenn Du Dich noch einmal melden könntest.

Danke !


Bernd

Antwort 6 von bernd wegener

hallo sunnylein,

ein Fehler in dem vorigen Beitrag: Der Fehler tritt NICHT in der angegebenen Zeile auf. Ich kann die Ursache aber auch nicht genau lokalisieren.

Gruß


Bernd


Antwort 7 von Sunnylein

Hi,

sorry, war eine Zeit lang nicht am Platz.

Hmm...
...zuerst müßte man mal genau herausbekommen, wann (an welcher Stelle des Scripts) die Sache schief läuft.

Die Fehlermeldungen in Notes halte ich für eine einzige Katastrophe *hust*, auf jeden Fall helfen sie nur manchmal, um die tatsächliche Ursache zu finden... trotzdem scheint es, als sei eine Deklaration nicht korrekt.

Was sagt denn der Debugger, wenn du schrittweise durchgehst?

Sunnylein

Antwort 8 von bernd wegener

Hallo sunnylein,

jo, das mit dem debugger war ein guter Hinweis, musste das Ding aber erst einmal finden.

Es sieht so aus, als ob der Fehler von wenigstens einer der anderen subs ausgelöst wird: der debugger bleibt dann in der postopen-routine hängen

Sub Postopen(Source As Notesuidocument)
Call cMemoObject.PostOpen(Source)
End Sub


cMemoObject ist hier offensichtlich nicht als Objekt definiert (wird in (Globals) Memo -> Declarations auch nur als Variant deklariert, es wird aber keine Objektreferenz zugewiesen.

1. Da dieser code schon vor dem Einfügen meiner queryopen-Routine existiert hat, warum bekomme ich erst jetzt die Meldung ?

2. Wie umschiffe ich dieses Problem jetzt am besten ?

(ich könnte natürlich den Code in allen anderen Ereignis-Subs löschen, aber das ist sicher nicht der Sinn der Sache)

Gruß


Bernd

Antwort 9 von Sunnylein

Hi,

extrem gute Fragen *fg*.

Sorry, aber ohne selbst davor zu sitzen und alles selbst ausprobieren zu können, bin ich momentan ehrlich gesagt ein wenig ratlos, auch wenn ich selbst häufiger mit Notes programmiere.

Ich kann dir nur sagen, dass ich in meiner Mail-DB im PostOpen Event das gleiche drin stehen habe, das scheint folglich 'normal' zu sein. Daran würde ich auch erstmal nichts ändern. Der 'Fehler' trat, wie du sagtest, ja auch erst beim Einfühen des neuen Scripts im QueryOpen auf.

Sprichst/schreibst du gut Englisch?
Dann wäre deine Frage ein Posting auf einem speziellen LN-Board wert.
Dort hole ich mir oft 'Anregungen' und Antworten zu speziellen Fragen.
Vielleicht hilft dir auch eine Forumssuche dort schon weiter.
Hier einer meiner 'hilfreichsten' Links bei Notes-Fragen:

http://www-10.lotus.com/ldd/46dom.nsf

Die 'zweitbeste' Adresse ist meiner Ansicht nach:

http://spotlight.de/

Auch hier (deutschsprachig) gibt es viel mehr "Notes-Profis" als hier (so jedenfalls mein Eindruck ;-).

Auch wenn ich ad hoc keine Lösung für dich habe, wünsch' ich trotzdem erst mal einen schönen Feierabend.

Tschau
Sunnylein

Antwort 10 von bernd wegener

Hallo sunnylein,

Heureka !

Die Lösung war eigentlich recht simpel: da ja, wie ich erwähnt habe, in (Globals) Memo -> Declarations cMemoObject zwar als "Variant" deklariert wird aber keine Objektreferenz zugewiesen wird, kommt es in allen Prozeduren, in denen das Objekt referenziert wird, außer QueryOpen zu der Meldung.

Ich habe daher ein

set cMemoObject = New UIMemoDocument

in die Initialize-Sub von (Globals) Memo eingefügt.

Danach konnte ich die Deklaration/Definition auch aus meiner queryopen-Routine entfernen.

Wenn ich meine eigene Antwort 8 noch einmal gründlicher gelesen hätte, hätte mir die Lösung eigentlich wie Schuppen aus den Haaren fallen müssen :->>

Aber ich habe den Eindruck, daß Lösungen im EDV-Bereich häufig auf ziemlich verschlungenen Pfaden zum Programmierer kommen *lol*

Zu guter letzt möchte ich mich noch bei Dir für die Hilfe und die viele Zeit, die Du mir geopfert hast, bedanken. Ich habe dadurch eine Menge gelernt.

Dir auch einen schönen Feierabend.

Gruß


Bernd

Antwort 11 von Sunnylein

Hallo Bernd,

danke für die Rückmeldung - auch ich lerne immer wieder gern was dazu.

Gruss, Sunnylein

Ich möchte kostenlos eine Frage an die Mitglieder stellen:


Ähnliche Themen:


Suche in allen vorhandenen Beiträgen: