Autor Thema: Exiting -> Agent ausführen  (Gelesen 8204 mal)

Offline Hedwig14

  • Aktives Mitglied
  • ***
  • Beiträge: 221
Exiting -> Agent ausführen
« am: 18.10.11 - 16:44:36 »
Hallo!
ich möchte in einer Exiting-Formel (s.u.) einen Agenten (s.u.) starten.

Der Agent soll in diversen Felden nach dem Verlassen des Feldes(Exiting-Formel) eine Berechnung vornehmen.
Die Berechnungsformel will ich aber nur im Agenten hinterlegen.

Hier meine ersten Versuche. Leider werden mir die Felder nicht berechnet angezeigt !


Exiting-Formel

Sub Exiting(Source As Field)
   Dim s As New NotesSession
   Dim ws As New NotesUIWorkspace
   Dim db As NotesDatabase
   Dim doc As NotesDocument
   Dim uidoc As NotesUIDocument
   Dim agent As NotesAgent
   
   
   Set db = s.CurrentDatabase
   Set uidoc=ws.CurrentDocument
   Set doc = uidoc.Document
   
                'Agent mit übergabe der Dokumenten ID starten
   Set agent = db.GetAgent("(AbrechnungBelegeSummenUSt)")
   Call agent.Run(doc.NoteID)
End Sub


Agent

Sub Initialize
   Dim ws As New NotesUIWorkspace
   Dim doc As NotesDocument
   Dim uidoc As NotesUIDocument
   Dim note As NotesDocument
   Dim session As New NotesSession
   Dim agent As NotesAgent
   Dim db As NotesDatabase
   
   Set db=session.CurrentDatabase
   Set agent = session.CurrentAgent
   Set doc=db.GetDocumentByID(agent.ParameterDocID)
   
'Hotelkosten incl. Umsatzsteuer
   'Umsatzsteuer Hotel
   doc.AB_USt_Hotelkosten =    doc.AB_Übernachtungskosten_gesamt(0) * doc.AB_Hotelumsatzsteuer(0)
   
   
   
   
End Sub

Offline ata

  • Freund des Hauses!
  • Gold Platin u.s.w. member:)
  • *****
  • Beiträge: 5.092
  • Geschlecht: Männlich
  • drenaiondrufflos
    • Anton Tauscher Privat
Re: Exiting -> Agent ausführen
« Antwort #1 am: 18.10.11 - 16:48:14 »
... das wird so auch nicht gehen, da das Dokument im Backend geändert wird - und nicht erkennbar gespeichert wird. Das ist nicht der richtige Ansatz. Warum unbedingt ein Agent?

Toni
Grüßle Toni :)

Offline Hedwig14

  • Aktives Mitglied
  • ***
  • Beiträge: 221
Re: Exiting -> Agent ausführen
« Antwort #2 am: 18.10.11 - 16:51:21 »
Hallo Toni !
Soll ich lieber eine Funktion verwenden ?

Offline ata

  • Freund des Hauses!
  • Gold Platin u.s.w. member:)
  • *****
  • Beiträge: 5.092
  • Geschlecht: Männlich
  • drenaiondrufflos
    • Anton Tauscher Privat
Re: Exiting -> Agent ausführen
« Antwort #3 am: 18.10.11 - 17:01:00 »
... auf jeden Fall wäre eine Library am Besten. Ich mache es so, daß ich sogar noch zwischen Frontend und Backend in unterschiedliche Lib's trenne und die beiden Lib's über einen USe verknüpfe

Also zwei Libraries:

lib.[MASKENNAME].frontend
lib.[MASKENNAME].backend

In der lib.[MASKENNAME].frontend wird per use dann lib.[MASKENNAME].backend eingebunden.

Das hat den Vorteil, daß dir keine Frontendobjekte bei Hintergrundagenten im Weg stehen. Ausserdem kannst du diesen Code dann universell überall einsetzen.

Das aktuelle Dokument kannst du nun auch als uidoc (frontend) oder doc (backend) durchreichen. In diesem Fall bist du in der Lage Änderungen im aktuell geöffneten Dokument sehen zu können.

Wieviel Erfahrung hast du mit LS?



Grüßle Toni :)

Offline Hedwig14

  • Aktives Mitglied
  • ***
  • Beiträge: 221
Re: Exiting -> Agent ausführen
« Antwort #4 am: 18.10.11 - 17:13:17 »
Danke für Deinen Tip !
Aber ich glaube das ist def. zu hoch für mich....

Offline ata

  • Freund des Hauses!
  • Gold Platin u.s.w. member:)
  • *****
  • Beiträge: 5.092
  • Geschlecht: Männlich
  • drenaiondrufflos
    • Anton Tauscher Privat
Re: Exiting -> Agent ausführen
« Antwort #5 am: 18.10.11 - 17:19:36 »
... in deinem Beispiel berechnest du den Wert in einem Feld - vermutlich aufgrund einer Eingabe im Exiting-Feld - oder ?
Grüßle Toni :)

Offline Hedwig14

  • Aktives Mitglied
  • ***
  • Beiträge: 221
Re: Exiting -> Agent ausführen
« Antwort #6 am: 18.10.11 - 17:21:53 »
ja genau, das Feld (nur ein Beispiel von vielen) soll nach der Eingabe neu berechnet werden....

Offline ata

  • Freund des Hauses!
  • Gold Platin u.s.w. member:)
  • *****
  • Beiträge: 5.092
  • Geschlecht: Männlich
  • drenaiondrufflos
    • Anton Tauscher Privat
Re: Exiting -> Agent ausführen
« Antwort #7 am: 18.10.11 - 17:23:57 »
... da ist das auch mit Kanonen nach Spatzen geschossen. Ausserdem ist nicht gewährleistet, daß das Feld auch verlassen wird - und somit könnte dein Ergebnisfeld nicht den richtigen Wert haben.

Es gibt einen Trick, den du hier anwenden kannst - ich skizziere ihn dir bis morgen - OK?
Grüßle Toni :)

Offline Hedwig14

  • Aktives Mitglied
  • ***
  • Beiträge: 221
Re: Exiting -> Agent ausführen
« Antwort #8 am: 18.10.11 - 17:27:48 »
gefühlt habe ich mir das auch schon gedacht ! Aber ich finde es klasse, wenn nach Eingabe, das Ergbnis angezeigt wird bzw. eine Änderung angezeigt wird !

Ich finde es toll, dass Du mir eine Alternative aufgibst ! Davon kann ich nur lernen ! Vielen Dank vorab !

Offline ata

  • Freund des Hauses!
  • Gold Platin u.s.w. member:)
  • *****
  • Beiträge: 5.092
  • Geschlecht: Männlich
  • drenaiondrufflos
    • Anton Tauscher Privat
Re: Exiting -> Agent ausführen
« Antwort #9 am: 18.10.11 - 17:33:28 »
... wie sieht denn das Design bei der Eingabe der Feldwerte aus - arbeitest du mit den Notes-Ecken?
Der Trick arbeitet mit einer Combobox - das Feld hat dann einen durchgehenden Rahmen - wenn das nicht stört, dann kannst du das Exiting in diesem Fall verwenden. Es wird dann bereits während der Eingabe neu berechnet. Wenn der Twistie am Ende des Feldes stört, dann kann man den noch mit einem Layer abdecken.
Grüßle Toni :)

Offline koehlerbv

  • Moderator
  • Gold Platin u.s.w. member:)
  • *****
  • Beiträge: 20.460
  • Geschlecht: Männlich
Re: Exiting -> Agent ausführen
« Antwort #10 am: 18.10.11 - 17:44:49 »
Andere Variante: Im Exiting steht nur ein NotesUIWorkspace.CurrentDocument.Refresh.
Das triggert das PostRecalc-Event.
Dort steht dann der Aufruf der eigentlichen Routine in einer ScriptLibrary.

Vorteil: Ein Aufruf für alle in Frage kommenden Felder.

Ausbaufähig ist das auch:
In der verwendeten ScriptLibrary wird eine globale Variable vereinbart. Im Exiting wird diese belegt:
Code
Sub Exiting (Source As Field)
	
	Const g_szCurrentField = <"FELDNAME">

	Dim ws As New NotesUIWorkspace
	
	g_szCurrentField = <"FELDNAME">
	Call ws.CurrentDocument.Refresh
	
End Sub

In der durch das PostRecalc aufgerufenen Routine der ScriptLibrary wird dann via SELECT-Anweisung genau die Neuberechnung durchgeführt wird, die für das Feld    <"FELDNAME"> erforderlich ist.

Was man nicht vergessen darf: Ggf. muss die Maske nach dem PostRecalc neu dargestellt werden. Ein NotesUIWorkspace.ViewRefresh und Konsorten verbietet sich, weil dadurch ja ein verschachteltes Maskenereignis generiert wird, was Notes mit heftigem Protest zur Laufzeit begleitet.
Wie man das am geschicktesten macht, lässt sich nur sagen, wenn man die Maske in tutto kennt.

HTH,
Bernhard

Offline Hedwig14

  • Aktives Mitglied
  • ***
  • Beiträge: 221
Re: Exiting -> Agent ausführen
« Antwort #11 am: 18.10.11 - 17:46:30 »
bislang arbeite ich mit den "Notes - Exken" ! Gegen eine Cambobox spricht aber nichts ....
Das kann ich noch umstellen !

Offline Jens Winkelmann

  • Junior Mitglied
  • **
  • Beiträge: 53
  • Geschlecht: Männlich
  • Jens Winkelmann
    • PAVONE AG
onChange statt Exiting
« Antwort #12 am: 19.10.11 - 00:06:39 »
Statt dem Exiting Event würde ich das onChange Event verwenden.
Dann wird der Code nur ausgeführt, wenn man tatsächlich was geändert hat.


Offline ata

  • Freund des Hauses!
  • Gold Platin u.s.w. member:)
  • *****
  • Beiträge: 5.092
  • Geschlecht: Männlich
  • drenaiondrufflos
    • Anton Tauscher Privat
Re: Exiting -> Agent ausführen
« Antwort #13 am: 19.10.11 - 11:40:12 »
Zitat
Statt dem Exiting Event würde ich das onChange Event verwenden.

... leider nicht stabil über alle Versionen - der Weg von Bernhard ist der Beste - den verwende ich im übrigen auch in dieser Art - es im Postrecalc zu machen, dann hat man es auch beim Speichern im Frontend gematcht...

Toni
Grüßle Toni :)

Glombi

  • Gast
Re: Exiting -> Agent ausführen
« Antwort #14 am: 19.10.11 - 16:38:05 »
Das Exiting Event halte ich nicht unbedingt für geeignet, denn es wird nur ausgeführt, wenn der User den Cursor woanders im Focus des Dokuments hinsetzt. Wenn der User aber bspw. <Esc> klickt oder in der evtl. vorhandenen Aktionsleiste Speichern & Schließen (es soll ja einige geben, die sowas machen), dann wird das Exiting Event nicht ausgeführt.

Das möchte ich zu Bedenken geben.

Andreas

Offline ata

  • Freund des Hauses!
  • Gold Platin u.s.w. member:)
  • *****
  • Beiträge: 5.092
  • Geschlecht: Männlich
  • drenaiondrufflos
    • Anton Tauscher Privat
Re: Exiting -> Agent ausführen
« Antwort #15 am: 20.10.11 - 07:24:32 »
... beim uidoc.save wird auch der PostRecalc durchlaufen - oder nicht? Beim Backend.save wird es bei anderen Masken-Aktionen Probleme geben - man muß über seine Architektur eben Bescheid wissen ;)

Toni
Grüßle Toni :)

Glombi

  • Gast
Re: Exiting -> Agent ausführen
« Antwort #16 am: 20.10.11 - 08:17:42 »
Ok, ich versuch es nochmal: Wenn der Cursor zuletzt in dem Feld, in dem das Exiting Event programmiert wurde, steht und der User dann mit ESC das Dokument schließt und auch ggf. speichert oder eine Aktion in der Aktionsleiste anklickt, dann wird das Exiting Event des Feld nicht ausgeführt. Und dann nützt auch das schöne Script im Exiting Event nichts.

Also: Entweder zwingt man den User irgendwie dazu, den Cursor im Focus des Dokuments woanders hin zu setzen - also entweder in ein anderes Feld oder auf einen Button (keine Aktion) - oder man verlagert das Script in ein anderes Event.

Man könnte bspw. das Speichern und Verlassen des Dokuments nur erlauben, wenn ein bestimmter Button gedrückt wird.

Andreas

Offline ata

  • Freund des Hauses!
  • Gold Platin u.s.w. member:)
  • *****
  • Beiträge: 5.092
  • Geschlecht: Männlich
  • drenaiondrufflos
    • Anton Tauscher Privat
Re: Exiting -> Agent ausführen
« Antwort #17 am: 20.10.11 - 08:42:46 »
... aktuell liegt nach meinem Verständnis im Exiting ein uidoc.Refresh - und der zieht das PostRecalc - ebenso wie beim Speichern ;)
Es tut also nichts zwingendes ausser den Refresh, der auch beim Speichern durchlaufen wird. Kritisch wird es nur, wenn eine Maskenaktion angesteuert wird, ohne daß dort zunächst ein uidoc.Refresh ist - und das meinte ich damit, daß man über seine Architektur eben Bescheid wissen sollte.

Toni  ;)
Grüßle Toni :)

Glombi

  • Gast
Re: Exiting -> Agent ausführen
« Antwort #18 am: 20.10.11 - 09:09:14 »
PostRecalc wird nur beim Aktualisieren des Dokuments ausgeführt und nicht beim Speichern.

Offline ata

  • Freund des Hauses!
  • Gold Platin u.s.w. member:)
  • *****
  • Beiträge: 5.092
  • Geschlecht: Männlich
  • drenaiondrufflos
    • Anton Tauscher Privat
Re: Exiting -> Agent ausführen
« Antwort #19 am: 20.10.11 - 09:29:15 »
... mea culpa - du hast natürlich Recht - der Aufruf zur Prüfung - refresh - muß auch in den save  :-[
Grüßle Toni :)

 

Impressum Atnotes.de  -  Powered by Syslords Solutions  -  Datenschutz