Autor Thema: Änderungen und Fixes im nächsten point Release 1.5.1 von !!Help!!  (Gelesen 15153 mal)

Offline animate

  • Freund des Hauses!
  • Gold Platin u.s.w. member:)
  • *****
  • Beiträge: 1.540
  • Uh, I'm just gonna go find a cash machine.
    • LA2

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

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


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).
Thomas

Fortunately, I'm adhering to a pretty strict, uh, drug, uh, regimen to keep my mind, you know, uh, limber.

Offline eknori

  • @Notes Preisträger
  • Moderator
  • Gold Platin u.s.w. member:)
  • *****
  • Beiträge: 11.730
  • Geschlecht: Männlich
@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.  ???
Egal wie tief man die Messlatte für den menschlichen Verstand auch ansetzt: jeden Tag kommt jemand und marschiert erhobenen Hauptes drunter her!

Offline eknori

  • @Notes Preisträger
  • Moderator
  • Gold Platin u.s.w. member:)
  • *****
  • Beiträge: 11.730
  • Geschlecht: Männlich
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
Egal wie tief man die Messlatte für den menschlichen Verstand auch ansetzt: jeden Tag kommt jemand und marschiert erhobenen Hauptes drunter her!

Offline baces

  • Aktives Mitglied
  • ***
  • Beiträge: 148
  • Geschlecht: Männlich
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
BaCeS

Offline Thomas Schulte

  • @Notes Preisträger
  • Moderator
  • Gold Platin u.s.w. member:)
  • *****
  • Beiträge: 4.388
  • Geschlecht: Männlich
  • Ich glaub mich tritt ein Pferd
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.
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.

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.
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.

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.
Ehrlich!!! Ihr verwendet die Technotes??? Die sind eigentlich noch überhaupt nicht vernünftig eingebunden in das System. Streng genommen noch gar nicht.

4. Bei den Aktionen sollte per default aktuelles Datum und Uhrzeit gefüllt werden, geht dann erheblich schneller.
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.
Thomas Schulte

Collaborative Project Portfolio and Project Management Software

"Aber wo wir jetzt einmal soweit gekommen sind, möchte ich noch nicht aufgeben. Versteh mich recht, aufgeben liegt mir irgendwie nicht."

J.R.R.Tolkien Herr der Ringe, Der Schicksalsberg

OpenNTF Project: !!HELP!! !!SYSTEM!!  !!DRIVER!!

Skype: thomasschulte-kulmbach

Offline eknori

  • @Notes Preisträger
  • Moderator
  • Gold Platin u.s.w. member:)
  • *****
  • Beiträge: 11.730
  • Geschlecht: Männlich
Hier noch einmal für die Chronisten der Code der EscalationEngine.
Mehr habe ich an meinem 7. Hochzeitstag nicht geschafft  ;D ... Sachzwänge ...

Wer Lust hat, kann das ja mal testen ... ( dass ist nix für noobs ! )



Code
Const TAG_PIPE = "|"
'///////////////////////////////////////////////////////////////////
'///////////////////////////////////////////////////////////////////
Public Class EscalationEngine
'///////////////////////////////////////////////////////////////////
'///////////////////////////////////////////////////////////////////
Private pCol As NotesDocumentCollection
%REM
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
 Returns a collection of active notification profiles
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
%END REM
Public Sub New ()
Set pCol  = Me.GetSearchResult ( {@UpperCase(Form) = "NOTIFICATION PROFILE" & nStatus = "1"} )
End Sub
%REM
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
 Returns a collection of Tickets matching the search formula from the escalation profile
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
%END REM
Private Function TicketCollection ( epd As NotesDocument ) As NotesDocumentCollection
Set TicketCollection = Me.GetSearchResult ( epd.nFormula ( 0 ) )
End Function
%REM
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
 Return a collection of documents matching a search formula
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
%END REM
Private Function GetSearchResult ( SearchFormula As String ) As NotesDocumentCollection
Dim s As New NotesSession
Dim dt As New NotesDateTime ( Cstr(Datenumber ( 2004, 5, 1 ) ) )
Set GetSearchResult = s.CurrentDatabase.Search ( SearchFormula , dt, 0 )
End Function
%REM
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
 Sends notifications to a single recipient or to group of recipients; The message can be send in different languages
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
%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 i As Integer
Dim col As NotesDocumentCollection
Dim Template As NotesDocument
Dim Ticket As NotesDocument
Dim rtiTemplateBody As NotesRichTextItem
Dim rtMessage As NotesRichTextItem
SendNotifications = False
If epd.HasItem ( "SendAsSummary" ) Then ' to avoid errors with epd where field is not available
If  epd.SendAsSummary(0) = 1 Then
SendAsSummary = True
End If
End If
Set col = Me.TicketCollection ( epd )
If SendAsSummary Then ' available in 1.5.1
%REM
'Add Code
%END REM
Else
For i = 1 To col.Count ' Loop thru ticket collection
Set Ticket = col.GetNthDocument ( i )
' For each ticket get the list of recipients
Forall r In epd.nFirstEscalationSendTo
' get a single recipient; can be <<TAG>>, single Name or a group.
strRecipientName = Trim ( Strtoken ( Cstr ( r ) , TAG_PIPE , 1 ) )
If Left ( strRecipientName, 1 )  = "<"  Then
' r contains format  "<<tag>> | language"
Dim item As NotesItem
Set item = Ticket.GetFirstItem ( Trim ( Mid ( strRecipientName, 3, Len ( strRecipientName ) - 4 ) ) )
strRecipientName = Item.Text
End If
strRecipientLanguage = Trim (Strtoken ( Cstr ( r ) , TAG_PIPE , 2 ) )
' get the language specific template
Set Template = Me.GetTemplate ( Ucase ( epd.nTemplate ( 0 ) ), Ucase ( strRecipientLanguage ) )
' build the message; replaces all <<TAGS>> with values from ticket
Set rtMessage = Me.BuildMessage ( Template , Ticket )
' finally send the message
End Forall
Next
End If
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
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
 Get the template accoording to the field nTemplate in the notification profile
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
%END REM
Private Function GetTemplate ( strTemplateName As String, strLanguage As String ) As NotesDocument
On Error Goto ERRHANDLE
Dim col As NotesDocumentCollection
If strLanguage = "" Or strTemplateName= "" Then
Set GetTemplate = Nothing
Goto EXITPOINT
Else
Set col  =_
Me.GetSearchResult (_
{@UpperCase(Form) = "CONFIGMAILTEMPLATE"} &_
{ & @UpperCase(cfgKey) = "} & strTemplateName &{"}  &_
{ & @UpperCase(cfgLanguage) = "} & strLanguage &{"} )
If col.Count > 0 Then
Set GetTemplate = col.GetFirstDocument
End If
End If
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 BuildMessage ( Template As NotesDocument , Ticket As NotesDocument ) As NotesRichTextItem
On Error Goto ERRHANDLE
Dim rtnav As NotesRichTextNavigator
Dim rtrange As NotesRichTextRange
Dim strTemp As String
' replace all <<tags>> with values from ticket
' append doclink to RTItem
' want to send info 'bout child docs, too ??
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 ) , TAG_PIPE , 1 ))
strStampFieldWith = Trim(Strtoken ( Cstr ( v ) , TAG_PIPE , 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 epd As NotesDocument
For i = 1 To Me.pCol.count
Set epd =  Me.pCol.GetNthDocument ( i )
If Not Me.SendNotifications ( epd ) Then Exit Sub
If Not Me.StampAll ( 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
Egal wie tief man die Messlatte für den menschlichen Verstand auch ansetzt: jeden Tag kommt jemand und marschiert erhobenen Hauptes drunter her!

Offline Lauff

  • Aktives Mitglied
  • ***
  • Beiträge: 144
  • Geschlecht: Männlich
Zitat
Ehrlich!!! Ihr verwendet die Technotes??? Die sind eigentlich noch überhaupt nicht vernünftig eingebunden in das System. Streng genommen noch gar nicht.

Schade eigendlich. Aber version 2.0 kommt ja auch irgendwann  ;)
Gruß
Sebastian

Offline dudeis

  • Frischling
  • *
  • Beiträge: 9
  • Egal wie, aber weiter so. Wir schaffen das !
Bei uns passierte folgendes:
wenn mit "SpoofMessage" eine Antwortmail generiert wurde, dann wurde die Änderung im Body nicht mitgesendet. D.h. egal was man eingetragen hat, es wurde immer der Original Lösungstext geschickt.

In der Notes Hilfe zur Methode NotesUIWorkspace.Dialogbox steht :
Field sharing is not supported for rich text fields.

Also habe ich in der Maske "ShowMail" beim Feld "Body" den Typ von "Rich Text" auf "Text" geändert. => siehe da es geht !

Kennt Ihr vielleicht alternative Lösungen ? Ansonsten sollte man das wohl für weitere Releases berücksichtigen !
Andreas Schulteiß
tof/Weinheim

6 Server R6.5.4 CF2 auf Win2003, 1 Server R6.5.1 auf Linux und 40xR5.0.10 auf HP-UX
ca. 1k Clients von R4.5.7 bis R 6.5.4

Offline Thomas Schulte

  • @Notes Preisträger
  • Moderator
  • Gold Platin u.s.w. member:)
  • *****
  • Beiträge: 4.388
  • Geschlecht: Männlich
  • Ich glaub mich tritt ein Pferd
@dudeis ?????

Kannst du das bitte etwas genauer beschreiben. Spoofmessage und der Austausch der entsprechenden Daten läuft eigentlich ohne Probleme.
Thomas Schulte

Collaborative Project Portfolio and Project Management Software

"Aber wo wir jetzt einmal soweit gekommen sind, möchte ich noch nicht aufgeben. Versteh mich recht, aufgeben liegt mir irgendwie nicht."

J.R.R.Tolkien Herr der Ringe, Der Schicksalsberg

OpenNTF Project: !!HELP!! !!SYSTEM!!  !!DRIVER!!

Skype: thomasschulte-kulmbach

Offline dudeis

  • Frischling
  • *
  • Beiträge: 9
  • Egal wie, aber weiter so. Wir schaffen das !
Hallo Thomas,

wenn ich z.B. eine Anfrage erledigt habe, dann wird eine Antwort an den User mit dem Lösungstext erzeugt.
Wenn ich in dem Dialog für die Mailantwort den Text ändere oder lösche, dann werden die Änderungen nicht an den User gemailt, sondern es kommt der unveränderte Text an.

Ich beziehe mich auf die Function Spoofmessage in der Library "lib.appl.function" von Version 1.5.0.
Ich hoffe, dass ich hier die richtigen Codestellen rausgepickt habe :

Es wird ein Richtextitem erzeugt:
(Zeile 158)
Set rtitem = showmaildoc.CreateRichTextItem( "Body" )

das Item wird z.B. mit dem Lösungstext gefüllt (Inhalt des Parameters "message"):
(Zeile 175)
Call rtitem.AppendText( message )

Später wird der Dialog mit der Maske "ShowMail" angezeigt:
(Zeile 184)
Dim wksp As New notesuiworkspace
ok = wksp.dialogbox("ShowMail",True,True,True,True,False,False,"",showmaildoc)

zum Debuggen habe ich anschließend folgende Zeile eingefügt:
Set me_item = showMailDoc.GetFirstItem("Body")
Messagebox me_item.text

Hier wird (bei mir !?)  der unveränderte Lösungstext angezeigt, welcher dann auch per Mail verschickt wird.

Wird aber in der Maske "ShowMail" beim Feld "Body" anstelle des Typs "RichText" als Typ "Text" verwendet, dann funktioniert es !

Reicht Dir das als Info ?
Ich gehe mal davon aus, dass ich bei uns nichts fehlkonfiguriert habe.

Viele Grüße,
Andreas




Andreas Schulteiß
tof/Weinheim

6 Server R6.5.4 CF2 auf Win2003, 1 Server R6.5.1 auf Linux und 40xR5.0.10 auf HP-UX
ca. 1k Clients von R4.5.7 bis R 6.5.4

Offline Thomas Schulte

  • @Notes Preisträger
  • Moderator
  • Gold Platin u.s.w. member:)
  • *****
  • Beiträge: 4.388
  • Geschlecht: Männlich
  • Ich glaub mich tritt ein Pferd
Welche Client Version setzt du ein. Es gibt ein Problem mit den Mail Bodys das aber an einer ganz anderen Stelle liegt. Versionsabhängig scheppert es nämlich beim direkten Setzen in den Edit modus mehr oder weniger. Dafür gibt es in der nächsten Version eine Lösung.
Thomas Schulte

Collaborative Project Portfolio and Project Management Software

"Aber wo wir jetzt einmal soweit gekommen sind, möchte ich noch nicht aufgeben. Versteh mich recht, aufgeben liegt mir irgendwie nicht."

J.R.R.Tolkien Herr der Ringe, Der Schicksalsberg

OpenNTF Project: !!HELP!! !!SYSTEM!!  !!DRIVER!!

Skype: thomasschulte-kulmbach

Offline dudeis

  • Frischling
  • *
  • Beiträge: 9
  • Egal wie, aber weiter so. Wir schaffen das !
Hallo Thomas,

wir verwenden vorwiegend den Version 6.5.1 Client.
(An einigen Stellen auch den 6.5.4 er Client)

Gruß,
Andreas
Andreas Schulteiß
tof/Weinheim

6 Server R6.5.4 CF2 auf Win2003, 1 Server R6.5.1 auf Linux und 40xR5.0.10 auf HP-UX
ca. 1k Clients von R4.5.7 bis R 6.5.4

Offline Thomas Schulte

  • @Notes Preisträger
  • Moderator
  • Gold Platin u.s.w. member:)
  • *****
  • Beiträge: 4.388
  • Geschlecht: Männlich
  • Ich glaub mich tritt ein Pferd
Ah ja gefunden und gefixt. Wenn man jetzt Änderungen im RTFeld durchführt werden die auch mit übergeben. (In der nächsten Version). Das ist ein klassisches Ällerbätsch von Notes. Änderungen von RTFeldern in Dialogboxen werden eigentlich nicht an den aufrufenden Code übergeben. Es sei denn man zaubert ein wenig. Gut jetzt haben wir dank der Hilfe eines guten Freundes gezaubert. Und jetzt funktioniert das auch.
« Letzte Änderung: 03.04.06 - 19:07:08 von Thomas Schulte »
Thomas Schulte

Collaborative Project Portfolio and Project Management Software

"Aber wo wir jetzt einmal soweit gekommen sind, möchte ich noch nicht aufgeben. Versteh mich recht, aufgeben liegt mir irgendwie nicht."

J.R.R.Tolkien Herr der Ringe, Der Schicksalsberg

OpenNTF Project: !!HELP!! !!SYSTEM!!  !!DRIVER!!

Skype: thomasschulte-kulmbach

Offline eknori

  • @Notes Preisträger
  • Moderator
  • Gold Platin u.s.w. member:)
  • *****
  • Beiträge: 11.730
  • Geschlecht: Männlich
Die wohl verrückteste Funktion in der neuen EscalationEngine wird wohl diese hier sein:

Code
%REM
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
 Send a notification summary
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
%END REM
Private Function BuildAndSendMessageAsSummary ( Template As NotesDocument,_
tCol As NotesDocumentCollection, rcpt As String , group As Boolean) As Boolean
Dim UniqueRcpt As Variant
Dim sCol As NotesDocumentCollection
On Error Goto ERRHANDLE
BuildAndSendMessageAsSummary = False
If ( Not group) Then
'regular stuff here
If Left ( rcpt, 1 )  = "<"  Then
' ERROR : A summary can only be send to a single recipient or a group from DD
' Throw exception and stop executing
Goto EXITPOINT
Else
' rcpt does not contain a << tag;
' append a list of doclinks to the template and send it to the rcpt
'
End If
Else
' weird stuff here
If ( Not Left ( rcpt, 1 )  = "<" )  Then
' absolutely weird, does not belong here but can be handeld
Else
' remove <<tag>> from rcpt
' ... code to remove <<tags>> here ...
UniqueRcpt = Me.UniqueItems ( tcol , rcpt )
Forall r In UniqueRcpt
sCol =  Me.SubCollection ( tCol , icstr ( r ) )
' now send the collection to the UniqueRcpt
End Forall
End If
End If
BuildAndSendMessageAsSummary = True
EXITPOINT:
Exit Function
ERRHANDLE:
Dim e As New Exception
xProc = Getthreadinfo(LSI_THREAD_PROC)
xError = xProc  & ": " &Trim$(Str$(Err)) & " on line " & Cstr(Erl) & ": " & Error$
If e.es.UseOpenLog Then
Call LogError
Elseif e.es.LogScriptErrors Then
Call ThrowException ( xProc, xError  )
End If
Print xError   'In all cases
If e.es.ResumeMethodNext Then
Resume Next
Else
Resume EXITPOINT
End If
End Function

Zwei neue Felder kommen in der Maske hinzu

- SendAsSummary
- GroupTickets

Ohne eines dieser Felder anzuhaken, werden einzelne Benachrichtigungen an die in der Konfiguration benannten Personen oder Gruppen gesendet; es macht hier keinen Unterschied mehr, ob man die user-defined-formulas oder die default settings verwendet.

SendAsSummary:

wird dieser Eintrag bewirkt, daß eine Liste aller doclinks in tCol an einen Empfänger verschickt wird; dabei macht es keinen Sinn, <<tags>> zu verwenden.

SendAsSummary AND GroupTickets

sucht sich anhand des der function übergebenen rcpt zunächst einmal alle unique rcpt aus der collection, bildet eine subCollection anhand des uniqueRcpt und verschickt dann eine Liste der doclinks der subCollection.

Das macht er in einem Loop durch die Einträge in Me.UniqueItems.

Ziel dabei ist es dann, die eigentliche VersendeRoutine in allen Fällen auf ein

Code
function Send ( tCol as NotesDocumentCollection, rcpt as String, TemplateBody as NotesRichTextItem ) as boolean

zu reduzieren.
Egal wie tief man die Messlatte für den menschlichen Verstand auch ansetzt: jeden Tag kommt jemand und marschiert erhobenen Hauptes drunter her!

Offline dudeis

  • Frischling
  • *
  • Beiträge: 9
  • Egal wie, aber weiter so. Wir schaffen das !
Ah ja gefunden und gefixt. Wenn man jetzt Änderungen im RTFeld durchführt werden die auch mit übergeben. (In der nächsten Version). Das ist ein klassisches Ällerbätsch von Notes. Änderungen von RTFeldern in Dialogboxen werden eigentlich nicht an den aufrufenden Code übergeben. Es sei denn man zaubert ein wenig. Gut jetzt haben wir dank der Hilfe eines guten Freundes gezaubert. Und jetzt funktioniert das auch.

Hallo Thomas,

Danke für Deine Reaktion.

Was hast Du jetzt eigentlich geändert ?
Ich habe nämlich festgestellt, wenn ich einfach nur den Body auf normalen Text umstelle, dann funktionieren die Änderungen am Text aber dummerweise wird der Link nicht mehr verschickt.
Das Einbinden von Links ist ja eine typische Richtext Funktion - braucht man dann noch ein weiteres Richtext Feld nur für den Link ?
Alternativ kann man in Abhängigkeit von der Konfiguration (mit/ohne Link) den Link auch nach dem Dialog ranhängen (im Script ist das Feld immer noch Richtext).

Oh je ich hasse diese Richtext Themen, die logischsten Sachen funktionieren nicht. Aber das ist Notes, so wird es einem nicht langweilig  ;)

Viele Grüße,
Andreas
Andreas Schulteiß
tof/Weinheim

6 Server R6.5.4 CF2 auf Win2003, 1 Server R6.5.1 auf Linux und 40xR5.0.10 auf HP-UX
ca. 1k Clients von R4.5.7 bis R 6.5.4

Offline Thomas Schulte

  • @Notes Preisträger
  • Moderator
  • Gold Platin u.s.w. member:)
  • *****
  • Beiträge: 4.388
  • Geschlecht: Männlich
  • Ich glaub mich tritt ein Pferd
nein ich hab das so umgebaut das er direkt das RTFeld auf Show Mail und der Dialogbox verwenden kann.
nur so ganz grob:
Show Mail, im QueryClose uIdocRefresh und das Document saven und dann geht das nämlich ohne Umstellung auf Text.
Thomas Schulte

Collaborative Project Portfolio and Project Management Software

"Aber wo wir jetzt einmal soweit gekommen sind, möchte ich noch nicht aufgeben. Versteh mich recht, aufgeben liegt mir irgendwie nicht."

J.R.R.Tolkien Herr der Ringe, Der Schicksalsberg

OpenNTF Project: !!HELP!! !!SYSTEM!!  !!DRIVER!!

Skype: thomasschulte-kulmbach

Offline dudeis

  • Frischling
  • *
  • Beiträge: 9
  • Egal wie, aber weiter so. Wir schaffen das !
Hallo Thomas,

das ist echt cool - Einfach und wirkungsvoll  ;D
Das hab´ich bei mir auch eingebaut, und es funktioniert (Im QueryClose von ShowMail - call Source.refresh und call Source.Save).

Eigentlich muss man es nicht kapieren, solange es funktioniert, das ist eben Notes.

Gruß,
Andreas
Andreas Schulteiß
tof/Weinheim

6 Server R6.5.4 CF2 auf Win2003, 1 Server R6.5.1 auf Linux und 40xR5.0.10 auf HP-UX
ca. 1k Clients von R4.5.7 bis R 6.5.4

Offline Thomas Schulte

  • @Notes Preisträger
  • Moderator
  • Gold Platin u.s.w. member:)
  • *****
  • Beiträge: 4.388
  • Geschlecht: Männlich
  • Ich glaub mich tritt ein Pferd
Aber Refresh mit Parameter(true) sonst kann es Probleme mit dem RTItem geben.
Thomas Schulte

Collaborative Project Portfolio and Project Management Software

"Aber wo wir jetzt einmal soweit gekommen sind, möchte ich noch nicht aufgeben. Versteh mich recht, aufgeben liegt mir irgendwie nicht."

J.R.R.Tolkien Herr der Ringe, Der Schicksalsberg

OpenNTF Project: !!HELP!! !!SYSTEM!!  !!DRIVER!!

Skype: thomasschulte-kulmbach

 

Impressum Atnotes.de  -  Powered by Syslords Solutions  -  Datenschutz