Lotus Notes / Domino Sonstiges > Help-Desk Applikation !!Help!!

Änderungen und Fixes im nächsten point Release 1.5.1 von !!Help!!

<< < (5/8) > >>

animate:

--- Zitat von: eknori am 29.03.06 - 20:16:54 ---
und wer eine Idee hat, wie man das immer wiederkehrende


--- Code: ---EXITPOINT:
Exit Sub
ERRHANDLE:
xProc = Getthreadinfo(LSI_THREAD_PROC)
xError = xProc  & ": " &Trim$(Str$(Err)) & " on line " & Cstr(Erl) & ": " & Error$
If UseOpenLog Then
Call LogError
Elseif LogScriptErrors Then
Call ThrowException ( xProc, xError  )
End If
Print xError   'In all cases
If ResumeMethodNext Then
Resume Next
Else
Resume EXITPOINT
End If

--- Ende Code ---

ersetzen kann, ohne den Fokus auf die Routine zu verlieren, der möge das bitte hier posten ...


--- Ende Zitat ---

Wirklich nur eine erste Idee und ich kenne die existierende Struktur der Anwendung nicht.
Du machst eine eigene Error-Klasse, der dun im Konstruktor die notwendigen Informationen mitgibst (Getthreadinfo(LSI_THREAD_PROC), Err, Error$, Erl). Die Klasse hat eine Methode "handle()", die die Fehlermeldung zusammenbaut und logt und anhand deren Rückgabewert der Aufrufer entscheidet ob ResumeNext oder Resume Exitpoint.
Du hättest dann zwar auch wiederkehrenden Code, aber der ist erstens kürzer und zweitens kannst du das was bei einem Fehler passieren soll, an einer Stelle ändern und musst nicht alle Methoden anfassen, die ErrorHandling haben (also alle).

eknori (retired):
@Thomas: Das funktioniert wg. Call LogError nicht. Der Call verzweigt in eine Klasse von Julian Robichaux und da müsste ich einiges umbauen, damit das so funktioniert, wie es das jetzt tut.

Hatte auch schon an ein execute ( strCode ) gedacht, aber irgendwie haut das nicht hin.


Jetzt baue ich erst einmal an der EscalationClass weiter, um die Funktionalität wie bei dem alten Code hinbekomme.

Das wird so funktionieren, wie bisher, nur daß der Code leiter zu plegen sein wird.
Eine kleine Änderung wird die Folgende sein.

Bei den Adressaten gibt es bisher die Möglichkeit, sowohl feste Personeneinträge ( Einzelpersonen und Gruppen aus dem Domino Directory ) zu verwenden. Darüber hinaus kann man mit Feldwerten arbeiten. ( <<supporter>>

Einträge beider Typen zu verwenden macht Probleme.

Das wird jetzt aber auch funktionieren.

<<supporter>> | de
Hein Bloed/Firma/cz | cz

verschickt einzelne Benachrichtigungen an die Person im Feld <<supporter> und eine Liste aller eskalierten Tickets an Hein Bloed.

Zusätzlich wird es im EskalationsProfil ein neues Feld geben ( SendAsSummary ).  O0

Ist dieses Feld gesetzt, wird auch an die <<supporter>> eine Liste aller SEINER eskalierten Tickets geschickt.

Wie ich das jetzt genau umsetze, weiss ich noch nicht. Entweder sortiere ich die Collection der escalierten Tickets nach dem / den Feld in den <<>> Tags und loop dann durch die sortierte collection, oder ich baue mir ein Array von Collections und arbeite diese dann ab.  ???

eknori (retired):
Hier noch schnell ein weiteres Update der EscalationEngine


--- Code: ---Class TagArray
Public Tag () As String
End Class

'///////////////////////////////////////////////////////////////////
'///////////////////////////////////////////////////////////////////
Public Class EscalationEngine
'///////////////////////////////////////////////////////////////////
'///////////////////////////////////////////////////////////////////

Private pCol As NotesDocumentCollection

%REM
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
%END REM

Private Function SendNotifications ( epd As NotesDocument ) As Boolean

On Error Goto ERRHANDLE

Dim SendAsSummary As Boolean
Dim strTemplateName As String
Dim strRecipientName As String
Dim strRecipientLanguage As String
Dim col As NotesDocumentCollection
Dim ta As TagArray

SendNotifications = False
If epd.HasItem ( "SendAsSummary" ) Then
If  epd.SendAsSummary(0) = 1 Then
SendAsSummary = True
End If
End If

Set col = Me.TicketCollection ( epd )

strTemplateName = epd.nTemplate(0)
' Hier jetzt ein Loop durch col
Forall r In epd.nFirstEscalationSendTo
strRecipientName = Trim(Strtoken ( Cstr ( r ) , "|" , 1 ))
strRecipientLanguage = Trim(Strtoken ( Cstr ( r ) , "|" , 2 ))


Set ta = New TagArray
%REM
ToDo

 Was haben wir bis jetzt ? ( SendAsSummary lassen wir mal ausser 8 )
 Name des Templates und Sprache des Empfängers.
 Jetzt hole dir das Template in der richtigen Sprache ( prüfen, ob überhaupt vorhanden )
 Fülle das TagArray mit den <<>> Tags des Template und übergebe den Kram mitsamt des Template Body an
 Private Function ModifyMessageText ( TemplateBody As NotesRichTextItem, Tags As TagArray ) As NotesRichTextItem
 
 Du bekommst ein RT mit dem MessageText zurück .

 Prüfe ob @Contains strRecipientName < --> hänge doclink an MessageText und raus damit.
 sonst baue Newsletter aller Tickets aus col und hänge den stuff an MessageText -- raus damit

%END REM


End Forall

EXITPOINT:
SendNotifications = True
Exit Function
ERRHANDLE:

xProc = Getthreadinfo(LSI_THREAD_PROC)
xError = xProc  & ": " &Trim$(Str$(Err)) & " on line " & Cstr(Erl) & ": " & Error$
If UseOpenLog Then
Call LogError
Elseif LogScriptErrors Then
Call ThrowException ( xProc, xError  )
End If
Print xError   'In all cases
If ResumeMethodNext Then
Resume Next
Else
Resume EXITPOINT
End If

End Function

%REM
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
%END REM

Private Function ModifyMessageText ( TemplateBody As NotesRichTextItem, Ticket as NotesDocument, Tags As TagArray ) As NotesRichTextItem

On Error Goto ERRHANDLE


EXITPOINT:
Exit Function
ERRHANDLE:

xProc = Getthreadinfo(LSI_THREAD_PROC)
xError = xProc  & ": " &Trim$(Str$(Err)) & " on line " & Cstr(Erl) & ": " & Error$
If UseOpenLog Then
Call LogError
Elseif LogScriptErrors Then
Call ThrowException ( xProc, xError  )
End If
Print xError   'In all cases
If ResumeMethodNext Then
Resume Next
Else
Resume EXITPOINT
End If

End Function

%REM
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
/* CONSTRUCTOR
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
%END REM
Public Sub New ()

On Error Goto ERRHANDLE

Dim s As New NotesSession
Dim dt As New NotesDateTime(Cstr(Datenumber(2004, 5, 1)))

Set pCol  = s.CurrentDatabase.Search ({@UpperCase(Form) = "NOTIFICATION PROFILE" & nStatus = "1"} , dt, 0 )

EXITPOINT:
Exit Sub
ERRHANDLE:

xProc = Getthreadinfo(LSI_THREAD_PROC)
xError = xProc  & ": " &Trim$(Str$(Err)) & " on line " & Cstr(Erl) & ": " & Error$
If UseOpenLog Then
Call LogError
Elseif LogScriptErrors Then
Call ThrowException ( xProc, xError  )
End If
Print xError   'In all cases
If ResumeMethodNext Then
Resume Next
Else
Resume EXITPOINT
End If

End Sub

%REM
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
%END REM
Private Function TicketCollection ( epd As NotesDocument ) As NotesDocumentCollection

On Error Goto ERRHANDLE

Dim s As New NotesSession
Dim dt As New NotesDateTime(Cstr(Datenumber(2004, 5, 1)))

Set TicketCollection = s.CurrentDatabase.Search ( epd.nFormula( 0 ) , dt, 0 )

EXITPOINT:
Exit Function
ERRHANDLE:
xProc = Getthreadinfo(LSI_THREAD_PROC)
xError = xProc  & ": " &Trim$(Str$(Err)) & " on line " & Cstr(Erl) & ": " & Error$
If UseOpenLog Then
Call LogError
Elseif LogScriptErrors Then
Call ThrowException ( xProc, xError  )
End If
Print xError   'In all cases
If ResumeMethodNext Then
Resume Next
Else
Resume EXITPOINT
End If
End Function


%REM
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
%END REM
Private Function  StampAll ( epd As NotesDocument ) As Boolean

On Error Goto ERRHANDLE

StampAll = False

Dim s As New NotesSession
Dim dt As New NotesDateTime(Cstr(Datenumber(2004, 5, 1)))
Dim varStampValues As Variant
Dim strFieldToStamp As String
Dim strStampFieldWith As String
Dim strAtAdjust As Variant
Dim strColDocFieldFound As String
Dim atNow As New NotesDateTime( Now )
Dim thisdate As New NotesDateTime("")
Call thisdate.setnow
Dim col As NotesDocumentCollection

Set col = Me.TicketCollection ( epd )
varStampValues = epd.nStampAll

If Trim ( varStampValues (0) ) ="" Then
Exit Function ' nothing to do; let's get outa here
Else
strColDocFieldFound =  Left$ ( strStampFieldWith , 2 ) ' <<TAG>>
Forall v In varStampValues
strFieldToStamp = Trim(Strtoken ( Cstr ( v ) , "|" , 1 ))
strStampFieldWith = Trim(Strtoken ( Cstr ( v ) , "|" , 2 ))

If Left$ ( strStampFieldWith , 1 ) = "@" Or strColDocFieldFound = "<<" Then

If Instr ( Ucase ( strStampFieldWith ) , "@ADJUST") Then
strAtAdjust = Split ( strStampFieldWith , ";")
strStampFieldWith = Left ( Ucase ( strStampFieldWith ) , 7 )
End If

Select Case Ucase ( strStampFieldWith )

Case "@NOW"
strStampFieldWith = Cstr(Now)
Case "@DATE(@NOW)"
strStampFieldWith = Cstr(atNow.DateOnly)
Case "@TIME(@NOW)"
strStampFieldWith = Cstr(atNow.TimeOnly)
Case "@ADJUST"
Call thisdate.AdjustYear( Cint(strAtAdjust(1)) )
Call thisdate.AdjustMonth( Cint(strAtAdjust(2)) )
Call thisdate.AdjustDay( Cint(strAtAdjust(3)) )
Call thisdate.AdjustHour( Cint(strAtAdjust(4)) )
Call thisdate.AdjustMinute( Cint(strAtAdjust(5)) )
Call thisdate.AdjustSecond( Cint(Left(strAtAdjust(6),1)) )
strStampFieldWith = Cstr(thisdate.LocalTime)

End Select
End If
Call col.StampAll ( strFieldToStamp, strStampFieldWith )
End Forall
End If

EXITPOINT:
StampAll = True
Exit Function
ERRHANDLE:
xProc = Getthreadinfo(LSI_THREAD_PROC)
xError = xProc  & ": " &Trim$(Str$(Err)) & " on line " & Cstr(Erl) & ": " & Error$
If UseOpenLog Then
Call LogError
Elseif LogScriptErrors Then
Call ThrowException ( xProc, xError  )
End If
Print xError   'In all cases
If ResumeMethodNext Then
Resume Next
Else
Resume EXITPOINT
End If
End Function

%REM
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
/* MAIN METHOD
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
%END REM
Public Sub Run ()

On Error Goto ERRHANDLE

Dim i As Integer
Dim ret As Boolean
Dim epd As NotesDocument

For i = 1 To Me.pCol.count
Set epd =  Me.pCol.GetNthDocument ( i )
If Not Me.StampAll ( epd ) Then Exit Sub ' set field values
If Not Me.SendNotifications ( epd ) Then Exit Sub
Next

EXITPOINT:
Exit Sub
ERRHANDLE:
xProc = Getthreadinfo(LSI_THREAD_PROC)
xError = xProc  & ": " &Trim$(Str$(Err)) & " on line " & Cstr(Erl) & ": " & Error$
If UseOpenLog Then
Call LogError
Elseif LogScriptErrors Then
Call ThrowException ( xProc, xError  )
End If
Print xError   'In all cases
If ResumeMethodNext Then
Resume Next
Else
Resume EXITPOINT
End If
End Sub

End Class

--- Ende Code ---

baces:
Noch eine ein paar Anfragen bzw. Verbesserungsvorschläge

1. Wir haben hier im Haus ca. 100 Anwendungen, die wir Supporten müssen. Das bisherige Ticket-Tool, dass wir jetzt mit HELP ablösen,hatte (neben vielen, vielen Nachteilen) den Vorteil, daß bei der Supporterzuweisung die Anwendung berücksichtigt wurde.

Wenn also bei Excel Supporter A und B eingetragen waren, dann gabe es bei Zuweisung an den 2nd Level Support nur erstmal A und B als Zielsupporter, optional jemand anderes. Als Zusatzinformation beim Zuweisen wurde die aktuelle Anzahl offener Calls angezeigt.

Im Augenblick überlegen wir, die möglichen Supporter in der 2. Ebene der Anwendung zu hinterlegen, aber das geht natürlich nur als reine Informationen, ohne Logikverzweigung auf das zuweisen. Es ist halt für den 1st Level Support einfacher, als sich per Hand durch eine Baumstruktur (Visio)

2. Bei der Anwendungsauswahl, vorallem wenn man alle 3 Ebenen nutzt, wäre eine Tree-Auswahl besser als die jetzt abhängigen Textfelder. Man findet sich eben leichter zurecht. Vielleicht auch als extra Knopf für ein Tree-Fenster, daß dann die Textfelder füllt.

3. Bei der Lösungsdatenbank kann man nur die 1. Ebene der Anwendung kategorisieren, das reicht meistens nicht aus, besser wäre die Nutzungsmöglichkeit aller 3 Ebenen der Anwendung.

4. Bei den Aktionen sollte per default aktuelles Datum und Uhrzeit gefüllt werden, geht dann erheblich schneller.

 :)  :) Ganz klar dies sind Anregungen und Vorschläge und KEINE Forderungen  :)  :)
 
Schönes WOE  O0

Thomas Schulte:

--- Zitat von: baces am 31.03.06 - 14:22:01 ---1. Wir haben hier im Haus ca. 100 Anwendungen, die wir Supporten müssen. Das bisherige Ticket-Tool, dass wir jetzt mit HELP ablösen,hatte (neben vielen, vielen Nachteilen) den Vorteil, daß bei der Supporterzuweisung die Anwendung berücksichtigt wurde.

--- Ende Zitat ---
Hmm das hatten wir als Anforderung schon einmal. Das Problem das sich dann stellt ist wie krieg ich das dynamisch hin und vor allen wo soll es denn eingebaut werden. Immer bei der Zuweisung? Nur bei neuen Dokumenten? Soll der Benutzer immer zweimal klicken müssen? Bis zu einem gewissen Grad kann man das denke ich jetzt schon lösen, wenn man kein Addressbuch als Quelle für die Supporter nutzt, sondern die eingebaute Supporter Funktion "LUPNAMES = custom"und dann die Einträge für die Supporter mit den entsprechenden Schüsseln versieht
Also zum Beispiel
Typ = Supporter
Schlüssel = Administration\Notes\Benutzer anlegen
Schlüsselwörter = Max Mustermann/ORG
Beschreibung = Supporter
wird hier gebruacht = Supporter
und das dann halt für jede Kombination die du brauchst wiederholen.


--- Zitat von: baces am 31.03.06 - 14:22:01 ---2. Bei der Anwendungsauswahl, vorallem wenn man alle 3 Ebenen nutzt, wäre eine Tree-Auswahl besser als die jetzt abhängigen Textfelder. Man findet sich eben leichter zurecht. Vielleicht auch als extra Knopf für ein Tree-Fenster, daß dann die Textfelder füllt.

--- Ende Zitat ---
Was ist an einer Tree View besser? Außerdem sind die hinterlegten Schlüssel nicht statisch aufeinander aufgebaut, sondern können dynamisch voneinander abhängig gemacht werden. Oder auch nicht wenn man will. Damit fallen schon mal die "einfachen" Möglichkeiten so einen Tree aufzubauen weg.


--- Zitat von: baces am 31.03.06 - 14:22:01 ---3. Bei der Lösungsdatenbank kann man nur die 1. Ebene der Anwendung kategorisieren, das reicht meistens nicht aus, besser wäre die Nutzungsmöglichkeit aller 3 Ebenen der Anwendung.

--- Ende Zitat ---
Ehrlich!!! Ihr verwendet die Technotes??? Die sind eigentlich noch überhaupt nicht vernünftig eingebunden in das System. Streng genommen noch gar nicht.


--- Zitat von: baces am 31.03.06 - 14:22:01 ---4. Bei den Aktionen sollte per default aktuelles Datum und Uhrzeit gefüllt werden, geht dann erheblich schneller.

--- Ende Zitat ---
Haben wir Hausintern schon ein paarmal diskutiert. Und hatten es auch schon eingebunden. Das Ergebniss war das sich 90% beschwert haben das man ja jedesmal die Werte wieder löschen muss wenn man da was anderes einträgt oder wenn man nur kurz mal eine Systemaktion durchgeführt hat. Das kam nicht so gut an. Was gehen würde wäre einen Flag beim Öffnen des Dokumentes zu setzen und einen Button um die Zeiten einzutragen. Das überleg ich mir mal.

Navigation

[0] Themen-Index

[#] Nächste Seite

[*] Vorherige Sete

Zur normalen Ansicht wechseln