Im Betrieb des Combit Relationship Managers ist es mittels asynchronem Skript möglich einzelnen Nutzern aktuelle Meldungen auszugeben. Das nachfolgende simple Beispiel zeigt wie dies möglich ist.
Für das Beispiel wird eine Datentabelle (Ansicht) „Meldungen” benötigt, die wie folgt aufgebaut ist:
Feldname | Feldtyp |
---|---|
MeldungID | uniqueidentifier |
Text | nvarchar(250) |
Nutzer | nvarchar(250) |
Ungelesen | nchar(1) |
Zudem werden zwei Skripte benötigt. Über den Menüpunkt Konfigurieren > Projekt > Ereignisse müssen diese jeweils einem Ereignis zugeordnet werden:
Im Skript script_start.vbs muss festgelegt werden, dass es sich um ein asynchrones Skript handelt. D.h. das Skript wird parallel vom System in einem gesonderten Thread ausgeführt und blockiert somit nicht das cRM.
Danach werden die benötigten Variablen definiert und die Startwerte gesetzt. Außerdem wird in der nutzerspezifischen Skript-Einstellung festgelegt, dass das CRM läuft. Dies kann nicht mittels „einfacher” Variablen geschehen. Grund hierfür ist dass der Wert beim Beenden des cRMs durch das andere Skript script_ende.vbs geändert werden muss. Dies ist nicht bei einer einfachen Variablen möglich.
Nächster Step ist eine Schleife, die jede Sekunde durchläuft und prüft, ob das cRM noch läuft oder gerade beendet wird. Wird das Skript beendet, so ist dies Skript über eine passende Funktion zu beenden. Außerdem wird der Sekundenzähler um eins erhöht.
Ist eine gewisse Anzahl von Sekunden um – in diesem Beispiel 300 Sekunden (5 Minuten) – so ist die Datentabelle „Meldungen” zu öffnen und nach ungelesenen Meldungen für den aktuellen Nutzer zu suchen. Außerdem muss der Sekundencounter wieder auf Null gesetzt werden damit das 5 Minutenintervall erhalten bleibt.
Der Zeitraum des Intervalls ist hier beispielhaft auf 5 Minuten festgelegt. Der Zeitraum sollte nicht zu kurz gewählt werden, da dieser Skript-Part der ressourcenintensivste ist.
Ist eine oder mehrere Meldungen vorhanden, so werden diese nach und nach ausgegeben. Nach jeder Meldung wird nachgefragt, ob die aktuelle Meldung gelesen wurde. Wird dies mit Ja beantwortet, so wird die Meldung als gelesen markiert und ggf. die nächste Meldung ausgegeben. Wird die Frage verneint, so wird die Ausgabe der Meldungen abgebrochen und diese sowie die verbleibenden Meldung(en) erst in 5 Minuten wieder ausgegeben.
Dieser Part ist nur beispielhaft um einen Einstieg zu geben. In der Praxis muss insbesondere dieser Part den jeweiligen Anforderungen angepasst werden.
Als letztes wird noch die Funktion für das Beenden des Skripts benötigt.
Das Skript muss in der nutzerspezifischen Skript-Einstellung vermerken, dass das CRM beendet wird, und einen Zeitraum warten, der größer als der Zeitraum des Schleifendurchlaufs im Skript script_start.vbs sein sollte.
Nachfolgend sind die beiden Skripte komplett aufgeführt. Es fehlen lediglich die Codeabschnitte für die jeweilige Fehlerbehandlungen.
Option Explicit <!--#pragma asynchronous--> On Error Resume Next ' Fehlerbehandlung ' benötigte Variablen definieren Dim nCounter, sCrmIsRunning, sLoginName Dim oViewConfig, oRecordSet, bFilter, oRecord ' Script-Einstellung setzen, die festlegt, dass das cRM läuft WScript.SetUserProperty "CrmIsRunning", "1" ' Sekundenzähler gleich Null nCounter = 0 ' Loginname des aktuellen Nutzers auslesen sLoginName = crm.CurrentProject.Users.CurrentUser.LoginName Do ' Schleifen-Beginn ' Prüfen, ob das cRM läuft sCrmIsRunning = WScript.GetUserProperty("CrmIsRunning", "1") If (sCrmIsRunning = "0") Then ' cRM läuft nicht mehr Call ScriptBeenden End If ' If - Zeile 22 ' Sekundenzähler um Eins erhöhen nCounter = nCounter + 1 ' Prüfen, ob 5 Minuten um sind If (nCounter = 300) Then ' Sekundenzähler zurücksetzen nCounter = 0 ' Datenbank auf neue Meldung prüfen Set oViewConfig = crm.CurrentProject.ViewConfigs.ItemByName(CStr("Meldungen")) ' Meldungen-Datentabelle aufrufen Set oRecordSet = oViewConfig.CreateRecordSet ' RecordSet-Object erzeugen bFilter = oRecordSet.SetFilter("""Ungelesen"" = '1' AND ""Nutzer"" = '" & sLoginName & "'") If (bFilter = True) Then ' Filter konnte gesetzt werden If (oRecordSet.RecCount > 0) Then ' mindestens eine ungelesene Meldung ist vorhanden oRecordSet.MoveFirst ' Datensatzzeiger auf den ersten Datensatz setzen ' Meldungen ausgeben Do ' Schleifen-Beginn Set oRecord = oRecordSet.CurrentRecord If (MsgBox(CStr("Meldung:" & vbCrlf & oRecord.GetContentsByName(CStr("Text")) & vbCrlf & vbCrlf & "Meldung gelesen?"), vbYesNo + vbQuestion, CStr("Aktuelle Meldung")) = vbYes) Then ' Meldung als gelesen markieren oRecord.SetContentsByName CStr("Ungelesen"), Cstr("0") If (oRecord.Save = False) Then '...Code für die Fehlerbehandlung, wenn die Änderung des Datensatzes nicht gespeichert werden konnte... End If ' If - Zeile 52 Else ' If - Zeile 49 ' Anzeige der Meldungen abbrechen (Schleife verlassen) und wieder 5 Minuten warten Exit Do ' Schleife verlassen, weiter Zeile 64 End If ' If - Zeile 49 Loop Until oRecordSet.MoveNext = False ' Schleifen-Ende - Zeile 46 ' Objekte auf Nothing setzen Set oRecord = Nothing Set oRecordSet = Nothing Set oViewConfig = Nothing End If ' If - Zeile 41 Else ' If - Zeile 39 ' Filter konnte nicht gesetzt werden '...Code für die Fehlerbehandlung, wenn der Filter nicht gesetzt werden konnte... End If ' If - Zeile 39 End If ' If - Zeile 31 ' eine Sekunde warten WScript.Sleep 1000 Loop ' Schleifen-Ende - Zeile 18 Sub ScriptBeenden ' Objekte auf Nothing setzen Set oRecord = Nothing Set oRecordSet = Nothing Set oViewConfig = Nothing ' Script beenden WScript.Quit End Sub ' Sub - Zeile 83 If (Err.Number <> 0) Then '...Code für die allgemeine Fehlerbehandlung... End If On Error Goto 0