periodischer Agent auf Server

  • Hallo zusammen,


    ich habe eine Datenbank zusammengebaut, die unter anderem einen peroidischen Agenten enthält. Dieser ändert zum einen Einträge in der Datenbank. Zum anderen soll er jedoch einen Alarm erzeugen und zwar für alle User, die Zugriff auf die Datenbank haben.
    Die Datenbank liegt auf dem Server und es soll keine lokale Replik geben (wegen Replizierfehler). Wird eine lokale Replik erstellt, funktioniert (mitterweile) alles problemlos.
    Problem: Es erscheint mir, dass der Agent am Server einfach nicht weiß, wohin er den Alarm "schicken" soll (von mir aus können die betroffenen User im Code fest eingetragen werden).
    Wie ist das zu programmieren?
    Danke.

  • Was ist denn ein Alarm?? Meinst Du die Alarmfunktion wie im Kalendar oder einfach nur eine mail zu schicken?? Dann muss er aus der ACL alle auslesen, die auf die DB Zugriff haben - evtl. Gruppen aufloesen - und an diese dann die mail schicken.

  • Hallo,
    Danke rfür die schnelle Antwort.
    Ich meinte eine Alarmfkt wie im Kalender.
    Auslesen aus der ACL: das wäre natürlich sehr elegant.


    Hier mein bisheriger, auf lokaler Replik funktionierender Code:


    Sub createReminder( popUpStr As String, subjectStr As String )
    Dim dateTime As NotesDateTime
    Dim dateTimeEnd As NotesDateTime

    Set DateTime = New NotesDateTime("")
    DateTime.SetNow
    DateTime.AdjustMinute (2)

    Set DateTimeEnd = New NotesDateTime("")
    DateTimeEnd.SetNow
    DateTimeEnd.AdjustMinute (3)

    Dim sess As New NotesSession
    Dim userMailDb As New NotesDatabase( "", "" )
    Call userMailDb.OpenMail

    Dim reminderDoc As New NotesDocument( userMailDb )

    Dim DTItem As NotesItem

    With reminderDoc

    .Form = "Appointment"
    .ReplaceItemValue "$Alarm", 1
    .ReplaceItemValue "$AlarmDescription", popUpStr
    .ReplaceItemValue "$AlarmMemoOptions", ""
    .ReplaceItemValue "$AlarmOffset", 0
    .ReplaceItemValue "$AlarmUnit", "M"

    .Subject = subjectStr
    .Alarms = "1"

    .CalendarDateTime = dateTime.lsLocalTime
    .StartDate = dateTime.lsLocaltime
    .StartTime = dateTime.lsLocaltime
    .StartDateTime = dateTime.lsLocaltime

    .EndDate = dateTime.lsLocaltime
    .EndTime = dateTimeEnd.lsLocaltime
    .EndDateTime = dateTime.lsLocaltime
    '4 = Erinnerung
    '0 = Termin
    .AppointmentType = 4
    .tmpEventLabel = "Eri"
    .ComputeWithForm False, False
    .Save True, False

    .PutInFolder( "$Alarms" )

    End With

    End Sub

    • Offizieller Beitrag

    das Problem ist: Du hast einen Backend-Agent, der einen Alarm in FrontEnd auslösen soll.


    Frontend-Elemente sind in periodischen Agents nicht erlaubt, der Agent wird nicht mehr laufen!


    Außerdem hast Du noch das Problem, dass Du alle User finden musst, die Notes offenen haben und den Server physikalisch erreichen können.


    Gruß
    Dirk

    Rein logisches Denken verschafft uns keine Erkenntnis über die wirkliche Welt.
    Alle Erkenntnis der Wirklichkeit beginnt mit der Erfahrung und endet mit ihr.
    Alle Aussagen, zu denen man auf rein logischen Wegen kommt, sind, was die Realität angeht, vollkommen leer.
    Albert Einstein

  • Hi,


    Der peroidische Agent funktioniert auf einer lokalen Replik ohne Probleme. Der Agent selber kreiert nur das Alarm-Dokument. Ausgelöst wird er dann duch den (irgendwann) gestarteten Client.
    Die User müssen ihren Client nicht offen haben, da der Agent das Alarm-Dokument direkt in deren Server-nsf-Datei eintragen soll.


    Der Agent müsste also nur wissen, in welche User-nsf er das Alamr-Dokument eintragen muss.

  • "User in names.nsf suchen und dort das Feld MailFile und ggfls MailServer auslesen."


    Welche Änderungen sind dafür nötig. Bin leider noch nicht so fit, aber ich lerne

  • Dann wuerde ichs chnell lernen..ist nicht unbedingt trivial fuer einen Anfaenger.
    Keine Aenderungen sind noetig..die Felder sollten vorhanden sein in den Userdokuemnten. Musst halt nur in der ACL Deiner DB nachschauen, wer hat Zugriff, mit den einzelnen Namen im Adressbuch das ejweilige Personendockuemnt suchen und die Werte auslesen. Dann haste die mail-db eines Anwenders und kannst dort Dein Alarmdokument erzeugen

  • Hi,
    Ich bin nach wie vor damit beschäftigt, über einen periodischen Agenten ein Alarm-Dokument bei mehreren Useren erzeugen zu lassen.


    Habe es mittlerweile testhalber mal mit einem direkten Eintrag eines Users versucht:


    Dim userMailDb As New NotesDatabase( "SERVER", "user.nsf" )


    Ergebnis: keines. Das Alarm-Dokument wird nicht erzeugt.


    "... im Adressbuch das ejweilige Personendockuemnt suchen und die Werte auslesen. Dann haste die mail-db eines Anwenders und kannst dort Dein Alarmdokument erzeugen".


    Das habe ich mit obiger Zeile erledigt. Und dennoch, es funzt nicht.
    Wenn ich den Agenten im Designer starte über Kontextmenü "Starten", dann wird ein Alarm-Dokument erzeugt.

  • Wie weit laeuft denn der Code?? Was sagt der Debuger dazu? Wird das Objekt "userMailDB" erzeugt oder wird die Datenbank gar nicht gefunden??

  • Welche Serverversion habt ihr denn im Einsatz ?
    Unter 5 ist es nicht möglich auf einen anderen Server per periodischen Agent zuzugreifen.
    Dort habe ich auch die Erfahrung gemacht, daß er oftmals eine Datenbank nicht findet wenn der Serverparameter nicht leer ist, selbst wenn dort der gleiche Server angegeben ist.
    Lass den doch mal leer und probier es dann noch mal

  • Ok,
    jetzt komm ich langsam dahinter.


    Wenn ich den Agenten nicht über das Kontextmenü mittels "Starten" aktiviere, dann wird die Sub für die Termin-Erstellung "createReminder" nicht von "pruefen()" aufgerufen.


    Hier ein Auszug:


    Sub pruefen()
    Dim session As New NotesSession
    Dim db As NotesDatabase
    Dim doc As NotesDocument
    Dim view As NotesView
    Dim art As String

    Set db=session.CurrentDatabase
    Set view = db.GetView ("Nach_Tage")
    Set doc = view.GetFirstDocument
    ...
    if...
    doc.alarm_person = session.UserName
    art = doc.art(0)
    Call doc.Save( False, False )
    Call createReminder (art , art )
    end if
    ...


    Sub createReminder( popUpStr As String, subjectStr As String )
    Dim dateTime As NotesDateTime
    Dim dateTimeEnd As NotesDateTime

    Set DateTime = New NotesDateTime("")
    DateTime.SetNow
    DateTime.AdjustMinute (2)

    Set DateTimeEnd = New NotesDateTime("")
    DateTimeEnd.SetNow
    DateTimeEnd.AdjustMinute (3)

    Dim sess As New NotesSession
    Dim userMailDb As New NotesDatabase( "", "mail\user.nsf" )
    Call userMailDb.OpenMail
    'Messagebox( usermaildb.Title & " on server " & usermaildb.Server )
    Dim reminderDoc As New NotesDocument( userMailDb )

    Dim DTItem As NotesItem

    With reminderDoc

    .Form = "Appointment"
    .ReplaceItemValue "$Alarm", 1
    .ReplaceItemValue "$AlarmDescription", popUpStr
    .ReplaceItemValue "$AlarmMemoOptions", ""
    .ReplaceItemValue "$AlarmOffset", 0
    .ReplaceItemValue "$AlarmUnit", "M"

    .Subject = subjectStr
    .Alarms = "1"

    .CalendarDateTime = dateTime.lsLocalTime
    .StartDate = dateTime.lsLocaltime
    .StartTime = dateTime.lsLocaltime
    .StartDateTime = dateTime.lsLocaltime

    .EndDate = dateTime.lsLocaltime
    .EndTime = dateTimeEnd.lsLocaltime
    .EndDateTime = dateTime.lsLocaltime
    '4 = Erinnerung
    '0 = Termin
    .AppointmentType = 4
    .tmpEventLabel = "Eri"
    .ComputeWithForm False, False
    .Save True, False

    .PutInFolder( "$Alarms" )

    End With

    End Sub


    Wenn ich den vollständigen Pfad der user.nsf angebe, also mail\user.nsf und den Agenten dann mittels "Starten" aktiviere, kommt folgende Fehlermeldung:
    This database object is already open as SERVER!!mail\user.nsf


    taurec: Serverversion 6.5.1.
    Test hatte keine Erfolg

  • Das Problem liegt daran, dass die Sub createReminder auf dem Server keine Aktion ausführt bzw. ausführen kann, weil es wohl im Backend ist.
    Einen Fehler werd ich in diesem Code wohl nicht finden, eher die Tatsache, dass die Sub die User.nsf nicht öffnen kann um dort ein Dokument anzulegen.
    Aufgerufen wird die Sub wohl schon.
    Jetzt gehts langsam dahin. :)

  • Hallo zusammen,
    nachdem ich mich jetzt schon viele Stunden mit dem obig beschriebenen Problem herumgeschlagen habe, stellt sich für mich die grundsätzliche Frage, ob es überhaupt möglich ist mittels eines periodischen Agenten, der auf dem Server läuft, ein Dokument (z.B: Alarm-Dokument) in einer user.nsf zu erzeugen.
    Danke.

    • Offizieller Beitrag

    ja Du kannst Dokumente in einer anderen DB erzeugen. Ob es sich dabei um eine Mail-Db oder eine andere DB handelt ist egal.


    Hast Du in createReminder mal an erster Stelle einen Print ausgeben lassen? erscheint der im LOG?


    Ist der Agent eventuell mit Deiner ID unterzeichnet? Hast Du Zugriff auf die Mail-DBs?


    Gruß
    Dirk

    • Offizieller Beitrag

    Print "Start createReminder" bringt auf dem Server im \log.nsf eine Meldung.


    Gruß
    Dirk

    Rein logisches Denken verschafft uns keine Erkenntnis über die wirkliche Welt.
    Alle Erkenntnis der Wirklichkeit beginnt mit der Erfahrung und endet mit ihr.
    Alle Aussagen, zu denen man auf rein logischen Wegen kommt, sind, was die Realität angeht, vollkommen leer.
    Albert Einstein

  • Zu Deinem Code:

    Code
    Dim sess As New NotesSession
    Dim userMailDb As New NotesDatabase( "", "mail\user.nsf" )
    Call userMailDb.OpenMail


    So kann er eigentlich auch keine Alarmdokumente erzeugen in den usermail-dbs. Nur - wenn er auf dem Server laeuft - in der maildb des Unterzeichners.
    Wenn Du die DB- Objekte von Hand erzeugen willst, dann lass die Zeile call userMailDb.OpenMail bitte weg.
    Und dann als Schleife meinetwegen.
    Nur die ZeileDim userMailDb As New NotesDatabase( "", "mail\user.nsf" ) sollte beim periodischen agent funktionieren.