Wie kann man rauskriegen, ob ein Agent aus einer Maske oder aus einer Ansicht gestartet wurde?

  • Hallo zusammen,


    ich habe da was "geerbt" und muss die Fehler beheben... ?(
    Kurz zum Problem: es gibt eine gemeinsame Aktion, die einen LS Agent startet, der dann eine Document Collection bearbeitet, die aus unprocessed docs besteht.
    Den Knopf kann man in mehreren Ansichten und in mehreren Masken anklicken.
    Was passiert in der Praxis? Ein User bearbeitet ein Dokument im Frontend, der Andere markiert dasgleiche Dokument in der Ansicht und setzt auch ein paar Felder...
    Und dann meckern beide, dass es zu Überschneidungen gekommen ist.


    Kann man mit den LS irgendwie rauskriegen, ob der Agent aus einer Maske oder aus einer Ansicht gestartet wurde?
    Ziel: wenn er aus der Maske gestartet ist, soll das im Frontend geöffnete Dokument bearbeitet werden, wenn aus der Ansicht - nicht.


    Habe leider nichts hier im Forum gefunden.
    Danke für eure Antworten!


    Gruß aus Mainz


    Laura

  • Hallo Andreas,


    Agent, der aus der Ansicht gestartet ist, läuft auf den ausgewählten Dokumenten. Er soll schon was tun, aber nur bei den Docs, die nicht im Frontend geöffnet sind.
    Ist kein Problem, die kann ich ausschließen.


    Das Problem ist, dasgleiche Agent kann auch aus der Maske gestartet werden, dann muss er natürlich dieses eine im Frontend geöffnete Doc bearbeiten.


    Ich könnte natürlich die Agenten trennen (1 für Ansichten, 1 für Masken), möchte aber nicht die ganze Anwendung umschreiben...


    Andere Ideen?..

  • Hi,


    Kannst Du mal den Code des Agenten zeigen?
    Oder besser gesagt, den Code, der zum Aufruf des Agenten verwendet wird. (wenn des denn einen solchen gibt)


    Wobei das aber Dein Problem nicht beseitigen wird.
    Der Agent, der aus der Ansicht heraus gestartet wird, bearbeitet die Dokumente im Backend. Ist jetzt ein Dokument, welches bearbeitet wird im Frontend geoeffnet und wird bearbeitet,
    stoert das den Agenten aus der Ansicht heraus herzlich wenig, es sei ihr haettet das DokumentLocking eingeschaltet.


    Grob gesagt muesset der Agent, wenn aus der Ansicht heraus gestartet wird wissen, ist das Dokument welches ich bearbeiten soll an irgendeinem Rechner von irgendeinem Benutzer
    bereits zum Bearbeiten geoeffnet. Wenn Ja, dann darf ich es eben nicht bearbeiten, sondern muss es ueberbspringen.


    Andreas

  • In der Aktion ist nur die Formel @Command([ToolsRunMacro];"(Agentname)").


    (Agentname): drin ist ein elendlanger Spagetthiscript. Ein Superagent für alle Fälle sozusagen...

    Grob gesagt muesset der Agent, wenn aus der Ansicht heraus gestartet wird wissen, ist das Dokument welches ich bearbeiten soll an irgendeinem Rechner von irgendeinem Benutzer
    bereits zum Bearbeiten geoeffnet. Wenn Ja, dann darf ich es eben nicht bearbeiten, sondern muss es ueberbspringen.

    :o) Das habe ich bereits gelöst, die geöffneten Docs werden übersprungen, gezählt, Medlung an Bearbeiter.


    Aber auch aus der Maske gestartet, überspringt der Agent das geöffnete Dokument und bringt die nette Meldung, dass er das Doc leider nicht bearbeiten durfte...


    Habe gehofft, man kann dem Agenten irgendwie mitteilen: "Achtung! Nur aus der Ansicht gestartet, überspringst du die geöffneten Docs."


    Ich sehe schon, es führt kein Weg daran vorbei, ich muss separate Aktion/Agent für jede Maske schreiben.
    Es sind 8 masken mit je 12 Aktionen...


    Danke dir trotzdem.

  • Die Anwendung ist vom 2003, damals hatten sie R5, seitdem wurde mehrmals an ihr geschraubt, also ist sie "wie gewachsen".


    Docs werden im Queryopen in einen Ordner geschoben.


    Sub Queryopen(Source As Notesuidocument, Mode As Integer, Isnewdoc As Variant, Continue As Variant)
    ' Bei jedem Öffnen eines Dokumentes wird geprüft, ob das Dokument sich im Ordner "InBearbeitung" befindet
    ' Ist dies der Fall wird das Öffnen mit der u.a. Fehlermeldung abgebrochen.
    ' Beim Verlassen des Dokument wird über den QueryClose das Dokument wieder aus dem Ordner entfernt


    Dim ns As New notessession
    Dim ndb As notesdatabase
    Dim nview As notesview
    Set ndb = ns.currentdatabase
    Set nview = ndb.getview("InBearbeitung")
    Dim ndoc As notesdocument
    Dim nviewdoc As notesdocument
    Set ndoc = source.document
    If (source.InPreviewPane) Then Exit Sub
    Set nviewdoc = nview.GetDocumentByKey(ndoc.UNID(0))
    If nviewdoc Is Nothing Then
    Call ndoc.putinFolder("InBearbeitung")
    Else
    Msgbox(" Das Dokument ist gerade in Bearbeitung! " + Chr(13)+Chr(13)+ " (Aber Sie können es im Dokumentvorschau ansehen...)" , 16, "Vorgang in Bearbeitung")
    continue =False
    End If
    End Sub


    Sub Queryclose(Source As Notesuidocument, Continue As Variant)
    ' Erklärung siehe QueryOpen


    Dim ndoc As NotesDocument
    Set ndoc = source.document
    If (source.InPreviewPane) Then Exit Sub
    Call ndoc.removeFromFolder("InBearbeitung")


    End Sub


    Die Lösung funktioniert übrigens sehr zuverlässig.
    Nachts läuft ein Agent, der alle evtl. hängengebliebenen Docs aus dem Ordner rauswirft.


    Habe eine Funktion geschrieben, die im Ordner nachschaut, ob das Doc da drin ist.
    Am Anfang vom Superagent ein If mit dieser Funktion eingefügt. Wenn Doc im Ordner - nicht weiter machen, zählen, Msgbox.

  • Hi,


    Ok.
    Prinzipiell musst Du dem Agenten doch blos mitteilen, ob er aus der Ansicht oder der Maske gestartet wurde.


    Dafuer sollte es doch reichen, die Art des Aufrufes des Agenten zu aendern.
    Einmal mit der UNID des aktuell geoeffneten Dokumentes - wenn er aus dem Dokument gestartet wird, und einmal mit einem Leerstring, wenn er aus der Ansicht heraus gestartet wird.


    siehe hierzu die Designer-HIlfe NotesAgent.Run


    Eventuell findest Du ja hier ein paar Anregungen fuer eine Loesung.



    Andreas

  • Hi,


    Eine kleine Frage/Bemerkung habe ich noch zu Deinem Code, der verhindert, dass ein bereits geoeffnetes Dokument durch den Agenten, wenn aus der Ansicht heraus aufgerufen wird,
    bearbeitet wird.


    Ich hoffe doch mal, dass keine neuen Dokumente manuell erstellt werden. Denn dann muesste Dein Code eigentlich ganz schnell auf die Bretter gehen.
    (Set ndoc = Source.Document duerfte bei einem neuen Dokument noch nichts liefern.)



    Andreas

  • Dim uiws As New NotesUIWorkspace
    Dim uiView As NotesUIView
    Dim uidoc As NotesUIDocument
    Dim jobDoc As NotesDocument

    If uiws.CurrentDocument Is Nothing Then ' view-mode
    Set uiView = uiws.CurrentView
    Set jobDoc = currentDB.GetDocumentByID(uiView.CaretNoteID)
    Else ' single document-mode
    Set uidoc = uiws.CurrentDocument
    Set jobDoc = uidoc.Document
    End If