Autor Thema: Änderungen und Fixes im nächsten point Release 1.5.1 von !!Help!!  (Gelesen 14106 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.718
  • 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.718
  • 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.718
  • 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.718
  • 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