Das Notes Forum
Domino 9 und frühere Versionen => ND6: Entwicklung => Thema gestartet von: dengao am 07.02.07 - 13:26:02
-
Hallo zusammen,
ich habe eine Datenbank erstellt wo eine Geräteausgabe vermerkt wird. In der Ausgabemaske soll nach Eingabe der Kundennummer geprüft werden ob der Kunde nicht schon ein Gerät bekommen hat. Wenn ja soll eine Meldung am Bildschirm erscheinen.
Leider kann ich die Prüfung nicht direkt in der Eingabemaske machen sondern über einen Agent, da die Mitarbeiter nicht alle Dokumente sehen können (Leserfeld).
Mit diesem LS rufe ich den Agent auf:
Sub Exiting(Source As Field)
Dim s As New NotesSession
Dim db As NotesDatabase
Dim doc As NotesDocument
Dim doc2 As NotesDocument
Dim agent As NotesAgent
Dim ws As New NotesUIWorkspace
Set db = s.CurrentDatabase
Set doc2=ws.CurrentDocument.Document
'Dokument erstellen um Kundennummer zu übergeben
Set doc = New NotesDocument(db)
doc.Kundennummer = doc2.GetItemValue("Kundennummer")
Call doc.Save(True, False)
'Agent mit übergabe der Dokumenten ID starten
Set agent = db.GetAgent("Kdpruf")
Call agent.Run(doc.NoteID)
End Sub
Der Agent sieht so aus:
Sub Initialize
Dim ws As New NotesUIWorkspace
Dim doc As NotesDocument
Dim note As NotesDocument
Dim kunde As Variant
Dim gefkunde As Variant
Dim session As New NotesSession
Dim collection As NotesDocumentCollection
Dim sSelection As String
Dim dtCutOff As New NotesDateTime("")
Dim zaehler As Long
Dim mtext As String
Dim filiale As Variant
Dim erstellt As Variant
Dim kdname As Variant
Dim umtext As String
Dim agent As NotesAgent
Dim db As NotesDatabase
Set db=session.CurrentDatabase
Set agent = session.CurrentAgent
zaehler=0
Set doc=db.GetDocumentByID(agent.ParameterDocID)
kunde= doc.Kundennummer(0)
Call doc.Remove(True)
'Alle Dokumente des Kunden mit dem Formular Ausgabe suchen
sSelection = |Form = "Ausgabe"|
'Führe Suche aus
Set collection = session.CurrentDatabase.Search(sSelection, _
dtCutOff, 0)
Set note = collection.GetFirstDocument
While Not note Is Nothing
gefkunde=note.GetItemValue("Kundennummer")
If gefkunde(0) = kunde(0) Then
zaehler=zaehler+1
erstellt=note.Created
filiale=note.GetItemValue("Filiale")
kdname=note.GetItemValue("KdName")
mtext= mtext & filiale(0) & " " & erstellt & " "& kdname(0) & Chr(10)
End If
Set note = collection.GetNextDocument(note)
Wend
umtext= Chr(10) & Chr(10) & "Filiale Ausgabe am Kunde" & Chr(10) & "-----------------------------------------------------------------------------"& Chr(10)
'Wieviele Leser hat der Kunde bereits?
If zaehler> 0 Then
Messagebox "Der Kunde hat bereits " & zaehler & " Geräte bekommen"& Chr(10) & umtext & mtext & Chr(10) & "Bitte prüfen Sie ob der Kunde noch ein Gerät benötigt.", _
48, "Wichtiger Hinweis"
End If
End Sub
Kann mir ggf. jemand einen Tipp geben was ich falsch mache?
Danke
-
What´s the problem?
Errorhandling wäre gut und Du hast keinerlei überprügung ob der Agent gelaufen ist oder nicht, Du rufst Ihn einfach nur auf.
Agenten lassen keine Interaktion mit dem Benutzer zu. Schau mal in der Hilfe nach agent.run.
P.S. Agenten laufen mit Benutzerrechten.
-
Agenten lassen keine Interaktion mit dem Benutzer zu. Schau mal in der Hilfe nach agent.run.
Kann ich dann kein "Messagebox" aufrufen? Wenn ich den Agent umbiege und über "Aktionen" aufrufe hat der mir die Messagebox gezeigt.
P.S. Agenten laufen mit Benutzerrechten.
Dann hilft mir mein Ansatz nicht weiter. Gibt es denn mit "collection" eine Möglichkeit alle Dokumente (auch die die nicht gelesen werden dürfen) zu bekommen?
-
Mach doch einen Knopf in der Maske. Dahinter steckt sinngemäss der Code des o.a. Agenten und dann wertest du das Ergebnis aus.
Ohne den Knopf gedrückt zu haben lässt sich z.Bsp. das Doc nicht speichern, o.ä.
-
Die Idee ist gut, aber Löst das Problem wegen der fehlenden Leseberechtigung nicht...
-
P.S. Agenten laufen mit Benutzerrechten.
Das stimmt so nicht. Wenn man per Script einen Agenten aufruft und in diesem Agenten ein RunOnBehalf setzt, läuft der Agent auch mit der dort eingetragenen Berechtigung.
An den Agenten kann man eine NoteID übergeben. Das entsprechenden Dokument kann der Agent dann auslesen und ggf. verändern.
Man müßte dann bei erfolgreichem Lauf des Agents das Dokument im UI refreshen oder besser neu öffnen und könnte so eine Statusmeldung ausgeben, z.B. in einem berechneten Feld.
-
Dann hilft mir mein Ansatz nicht weiter. Gibt es denn mit "collection" eine Möglichkeit alle Dokumente (auch die die nicht gelesen werden dürfen) zu bekommen?
Nicht wirklich. So lange du Aktionen ausführst die den Benutzerrechten unterliegen, kommst du an Dokumente, die mit Leserfeldern geschützt sind, nicht ran.
Nur mal so eine Idee. Verwalte doch im eigentlichen Dokument die Anzahl der Ausgaben. Ohne die DB genau zu kennen ist das aber nur ein Schuss ins Blaue.
Axel
-
P.S. Agenten laufen mit Benutzerrechten.
Das stimmt so nicht. Wenn man per Script einen Agenten aufruft und in diesem Agenten ein RunOnBehalf setzt, läuft der Agent auch mit der dort eingetragenen Berechtigung.
An den Agenten kann man eine NoteID übergeben. Das entsprechenden Dokument kann der Agent dann auslesen und ggf. verändern.
Man müßte dann bei erfolgreichem Lauf des Agents das Dokument im UI refreshen oder besser neu öffnen und könnte so eine Statusmeldung ausgeben, z.B. in einem berechneten Feld.
Das ist soweit auch richtig, aber das löst meines Erachtens nicht das Problem mit der fehlenden Interaktivität mit dem Benutzer.
Axel
-
Stimmt Ingo, Asche über mein Haupt.
Ich sehe gerade was...
Warum muß das im Exciting vom Feld stattfinden???
Was passiert, wenn ich mich niemals in dieses Feld reintraue?
-
@Axel: Doch - interaktiv ausgewertet wird doch nach dem agent.RunOnServer das per NoteID bezeichnete Dokument mit dem Ergebnis des Agentlaufs.
Ich wage allerdings zu bezweifeln, dass die Architektur der Gesamtlösung dem angestrebten Ziel gerecht wird: Der Benutzer muss sehen, was er nicht sehen darf ...
Bernhard
-
@Axel: Doch - interaktiv ausgewertet wird doch nach dem agent.RunOnServer das per NoteID bezeichnete Dokument mit dem Ergebnis des Agentlaufs.
Die Interaktivität meinte ich nicht, sondern die Benutzerschnittstelle (Messagebox) und auch die NotesUI- Klassen. Damit dürfte es doch bei Agent.Run und .RunOnServer vorbei sein.
Ich wage allerdings zu bezweifeln, dass die Architektur der Gesamtlösung dem angestrebten Ziel gerecht wird: Der Benutzer muss sehen, was er nicht sehen darf ...
Da bin ich deiner Meinung.
Axel
-
Jo, bei Agent.Run und .RunOnServer ist es mit jeglichem UI-Zeugs vorbei. Daher ja auch das NotesDokument zum Datenaustausch Ui -> Agent -> UI.
Bernhard
-
Jetzt brauch ich mal leichte Schläge auf den Hinterkopf... ;D
Im Exciting ist die letzte Zeile call agent.run...
Das ganze UI.Zeugs steht im Agent
Oder hab ich jetzt Tomaten auf den Augen... Hilfeeeeee...
-
Und wo ist jetzt Dein Problem?
-
Die Interaktivität meinte ich nicht, sondern die Benutzerschnittstelle (Messagebox) und auch die NotesUI- Klassen. Damit dürfte es doch bei Agent.Run und .RunOnServer vorbei sein.
Ich habe nicht von der Verwendung von UI-Methoden gesprochen.
Ich bin davon ausgegangen, daß die Aktion aus einem Dokument heraus ausgelöst wird. In dem Moment muß zur Not das Dokument gespeichert und das dann vorhandene Backgrounddokument per NoteID an den Agenten übergeben werden.
Der Agent kann dann seine Ergebnisse in das Backgrounddokument eintragen und nach Beendigung wird das UI-Dokument geschlossen und über das Backgroundokument neu geöffnet.
Dann muß man sich nur noch Gedanken machen, wie man damit umgeht, wenn der User das evtl. neu erstellte Dokument gar nicht speichern will/darf/kann.
-
Daher ja auch das NotesDokument zum Datenaustausch Ui -> Agent -> UI.
Den Satz versteh ich jetzt nicht. Nach dem Aufruf des Agenten im UI passiert doch nichts mehr.
Grübel...
Sorry wenn ich da gerade was nervig bin. Liegt wohl am schlechten Allgemeinzustand meinerseits..
-
Nach dem Aufruf des Agents im UI passiert JETZT nichts mehr. Dass das ganze Verfahren geändert werden muss, sollte doch aus der bisherigen Diskussion hervorgegangen sein ;)
Bernhard
-
::)
Bernhard verzeih mir. Das ist natürlich Richtig, dieser Aspekt ist irgendwie nicht mehr bis zu mir durchgedrungen... :P
-
Macht doch nichts - wir haben es ja geklärt :)
Hoffentlich steigt jetzt auch der Fragesteller noch durch ;D
Bernhard