Das Notes Forum

Domino 9 und frühere Versionen => ND7: Entwicklung => Thema gestartet von: dormi am 29.04.09 - 13:17:03

Titel: Serverseitiger Agent bei Feldänderung aufrufen
Beitrag von: dormi am 29.04.09 - 13:17:03
Hallo,

ich möchte gerne einen Agenten auf dem Server ausführen, wenn ein bestimmtes Feld in einem Formular geändert wird.

Kann mir jemand sagen, wie das geht?

Danke
Jürgen
Titel: Re: Serverseitiger Agent bei Feldänderung aufrufen
Beitrag von: ascabg am 29.04.09 - 13:22:59

Eventuell hilft dieses hier.

aus der Designer-Hilfe - Klasse NotesAgent

Code
status = notesAgent.RunOnServer( [ noteID$ ] )


Andreas
Titel: Re: Serverseitiger Agent bei Feldänderung aufrufen
Beitrag von: dormi am 29.04.09 - 13:51:05
Hallo,

ich hab das mal nach dem Hilfe Beispiel so gelöst:

Code
Sub Exiting(Source As Field)
	
	Dim s As New NotesSession
	Dim db As NotesDatabase
	Dim agent As NotesAgent
	Set db = s.CurrentDatabase
	Set agent = db.GetAgent("Kunden_Agent_ODBC_OF")
	If agent.RunOnServer = 0 Then
		Messagebox "Agent ran",, "Success"
	Else
		Messagebox "Agent did not run",, "Failure"
	End If	
	
	
End Sub

Das klappt auch.

Was ist denn mit unseren ADM, die nur eine lokale Replik auf Ihren Notebooks haben? Die haben dort keine Verbindung zu der ODBC Datenbank.

Kann ich es irgendwie erreichen, dass der Client eine Zeiger auf den geänderten Datensatz setzt und der Server nach der nächsten Replikation die Aktualsierungen durchführt?
Titel: Re: Serverseitiger Agent bei Feldänderung aufrufen
Beitrag von: Thomas Schulte am 29.04.09 - 13:58:40
Ja das kannst du ....

Erst mal musst du deinen Exiting Teil so ändern, das der Agent nur dann läuft wenn er nicht lokal arbeitet und anstelle des Agents dann ein "Flagitem" im Dokument setzt. Und dann brauchst du einen periodischen Agent, der grundsätzlich alles was das Flagitem hat durchnudelt und da die Daten aus der ODBC Datenbank holt. Logischerweise muss der anschließend das Flag Item löschen.
Titel: Re: Serverseitiger Agent bei Feldänderung aufrufen
Beitrag von: dormi am 29.04.09 - 14:17:58
OK, falls mir jetzt jemand eine Lösung posten würde, könnte ich das, ansonsten muss ich den Agenten halt serverseitig auf jedes geänderte Dokument loslassen, was leider relativ lange dauert und viel Last für die Repliken bedeutet :-(
Titel: Re: Serverseitiger Agent bei Feldänderung aufrufen
Beitrag von: Thomas Schulte am 29.04.09 - 14:26:18
Was möchtest du jetzt?

1. Das dir jemand eine mögliche Lösung deines Problemes skizziert?

2. Oder das es dir jemand löst?

Das erste hast du schon bekommen. Für das zweite habe ich mal ein Beschreibung wann ein Problem für mich "interessant wird" hier (http://atnotes.de/index.php/topic,39651.0.html) geposted. Ersetze in diesem Beitrag einfach den Begriff !!HELP!! durch "dein Problem" und lese ihn aufmerksam durch.

OK?
Titel: Re: Serverseitiger Agent bei Feldänderung aufrufen
Beitrag von: dormi am 29.04.09 - 14:39:56
Nein, ist schon klar. - auch ohne, dass ich Dein Posting gelesen habe.

Die Lösung ist nur zu komplex für mich.

Endweder gib es dafür sowas wie eine Musterlösung oder eine der sehr guten Anleitungen hier im Forum oder ich krieg das nicht hin.

Dafür muss ich erstmal in die LS Schule gehen ;-)

Danke für den Lösungsansatz. Fortsetzung meinerseits erfordert aber leider etwas Fortbildung ....

Gruß
Jürgen
Titel: Re: Serverseitiger Agent bei Feldänderung aufrufen
Beitrag von: Thomas Schulte am 29.04.09 - 15:38:38
Also dann Fortbildung ....

Schau dir in der Online Hilfe des Designers die Db Class Properties an und da speziell die Server Property.

Wenn du rausgefunden hast, wie du rausbekommst ob die Datenbank lokal oder auf dem Server liegt, dann weist du auch wie du die If Abfrage gestalten musst mit der du entscheiden kannst, ob du entweder den Agent startest, oder einen Wert in ein von dir beliebig zu benennendes (und es muss nicht in der Form vorhanden sein) Feld in deinem Dokument schreibst. Felder heisen in Notes Items und es gibt grundsätzlich zwei Wege ein Item in einem Notes Dokument zu erstellen. Die verkürzte Syntax mit  ..... Doc.DeinFeldname = "Flag" oder ...= 1 oder mit .... set item = doc.replaceitemvalue(....) Näheres dazu ebenfalls in der Hilfe in der document class.

Dein Agent, den du dann eben nicht auf alle geänderten Dokumente loslässt, sondern auf bestimmte Dokumente in einer Ansicht, die nur die Dokumente enthält, die  ....  >> Select Form = "DeineForm" & DeinFeldname = "Flagwert" << ... gesetzt haben. Ansonsten läuft das eins zu eins identisch mit dem Agent den du ja schon zu haben scheinst.

Du kannst für diesen Zweck deinen ODBC Connect Agent der ja auch etwas komplizierter ist kopieren und anpassen.

Wie du schon bemerkt hast ist die Aktivierung des Agents für alle geänderten Dokumente nicht wirklich korrekt und kann zu leichten Verdauungsschwierigkeiten bei deiner Anwendung führen.

Deswegen würde ich mir an deiner Stelle jemand aus dem Forum schnappen und mir von ihm live helfen lassen. Dabei lernst du mehr als mit zig Kursen.
TeamViewer ist dafür ganz gut geeignet (allerdings hab ich mit dem Teil in letzter Zeit immer wieder Timeouts gehabt). Oder eine gemeinsame Sametime Session mit Desktop Sharing.