Das Notes Forum

Lotus Notes / Domino Sonstiges => Projekt Bereich => Help-Desk Applikation !!Help!! => Thema gestartet von: Thomas Schulte am 23.02.06 - 12:25:40

Titel: Änderungen und Fixes im nächsten point Release 1.5.1 von !!Help!!
Beitrag von: Thomas Schulte am 23.02.06 - 12:25:40
Also eine Änderung die wir haben und die für einige interessant sein dürfte ist die Angleichung des Handlings von Feldern bei versendeten Mails.
In der neuen Version kann man dann auch im Subject mit <<b:Feldname>> und <<p:Feldname>> arbeiten. Das löst die alte Variante mit ~~&Feldname~~ ab.
Zusätzlich gibt es für die Subjects noch einen weitern Bezeichner <<x:Feldname>> mit diesem Bezeichner bleiben die spitzen Klammern um das Feld herum erhalten. Das braucht der Dispatcher.

Was das Releasedatum angeht. Ich würde mal sagen fühestens Ende März, eher um Ostern herum.
Wir könnten das auch von den Downloads bei Openntf abhängig machen. Das neue Release gibt es erst dann wenn das aktuelle Release mehr Downloads hat als das letzte.  >:D
Titel: Re: Änderungen und Fixes im nächsten point Release 1.5.1 von !!Help!!
Beitrag von: Thomas Schulte am 23.02.06 - 17:32:29
Ach ja und was noch neu ist.

Es wird eine Möglichkeit geben "Notizen" an Tickets oder Aufgaben zu hängen. Diese notizen erhalten logischerweise einen eigenen "Informationszyklus", um dem im Parent eingetragenen Supporter mitteilen zu können ob neue oder geänderte Notizen zu seinem Ticket oder seiner Aufgabe vorliegen.
Titel: Re: Änderungen und Fixes im nächsten point Release 1.5.1 von !!Help!!
Beitrag von: eknori am 23.02.06 - 20:56:29
Bezogen auf http://atnotes.de/index.php?topic=29039.0 gibt es im Projekt auch noch einen Dialog, der dringend überarbeitet werden muss; das Zeugs ist wirklich nicht mer state-of-the-art
Titel: Re: Änderungen und Fixes im nächsten point Release 1.5.1 von !!Help!!
Beitrag von: Thomas Schulte am 24.02.06 - 08:24:06
???? Welchen ????
Titel: Re: Änderungen und Fixes im nächsten point Release 1.5.1 von !!Help!!
Beitrag von: Thomas Schulte am 27.02.06 - 15:41:46
Another new thing:

Es gibt in der neuen Version einen Test Modus. Damit kann man mit einer Kopie der echten Datenbank und mit der Eintragung von zwei Parametern (ApplicationTestmode und ApplicationTestSupervisor) jeglichen Output der vom System erstellt wird direkt an eine bestimmte Person oder Gruppe ausgeben.

OK. Ganz so einfach ist das nicht. Man muss die Kopie der Datenbank auch noch mit einer eigenständigen Mail in Adresse versehen und die entsprechenden Parameter (SendMailOnBehalfOf) in der Test Datenbank ändern, aber wenigstens kann man das.
Titel: Re: Änderungen und Fixes im nächsten point Release 1.5.1 von !!Help!!
Beitrag von: eknori am 04.03.06 - 18:48:56
Ich werde dem nächsten Release einige Klassen mitgeben, die es ermöglichen, detailierte Informationen über einen Rechner zu ermitteln. Die Klassen sind abgeleitet von http://www.microsoft.com/technet/scriptcenter/scripts/default.mspx
Das sollte eigentlich auch bei ( fast ) allen Anwendern funktionieren. Ich gehe nicht davon aus, daß ein !!HELP!! User ernsthaft noch Win95 oder Win98 einsetzt. Bei NT4.0 Maschinen kann es Probleme geben. Unter Windows 2000 und XP funktionieren alle Klassen.
Mit dem Code ist es sogar möglich remote die Config eines Rechners auszulesen; dazu muss nur die IP bekannt sein. In heterogenen Netzwerken ( Windows mit Novell ) funktioniert das Ganze nicht. Da suche ich aber noch nach einer Lösung.
Titel: Re: Änderungen und Fixes im nächsten point Release 1.5.1 von !!Help!!
Beitrag von: baces am 07.03.06 - 17:08:33
Dann äußere ich gleich nochmal einen Wunsch bzw. Vorschlag, auch wenn das schon mal "abgeblockt" wurde:

Bitte ein neues Feld einbauen, mit einer fortlaufenden Ticketnummer, die einfach immer bei einem neuen Ticket/Aufgabe umd 1 hochzählt. Startnummern sind in der Konfig hinterlegt.

Ich mach das derzeit einfach manuell und hinterlege dieses Info in ProblemFirstLine. Es hat sich einfach gezeigt, dass eine OP-Nummer immer leichter zu kommunizieren ist, wie die Ticket-ID. Niemand weiß, wenn ich über Ticket DVSR-DJGFD3 rede, aber jeder versteht mich, wenn ich sage, "hast Du OP 592 schon bearbeitet?".... - Vorallem mit unseren externen Supportern, die keinen direkten HELP Zugang haben und über Aufgaben- bzw. Ticketmails kommunizieren.  O0
Titel: Re: Änderungen und Fixes im nächsten point Release 1.5.1 von !!Help!!
Beitrag von: eknori am 07.03.06 - 17:19:42
... fortlaufende Nummern  8) ;D
Titel: Re: Änderungen und Fixes im nächsten point Release 1.5.1 von !!Help!!
Beitrag von: Thomas Schulte am 07.03.06 - 18:01:44
Ulrich wollen wir???

Wir haben uns ja mal geschworen das wir das nie machen .....

Oder nur gegen eine hinreichende Spende ....

Um den Seelenschmerz zu lindern ...
Titel: Re: Änderungen und Fixes im nächsten point Release 1.5.1 von !!Help!!
Beitrag von: Thomas Schulte am 07.03.06 - 18:04:54
wenn ich über Ticket DVSR-DJGFD3 rede, aber jeder versteht mich, wenn ich sage, "hast Du OP 592 schon bearbeitet?".... - Vorallem mit unseren externen Supportern, die keinen direkten HELP Zugang haben und über Aufgaben- bzw. Ticketmails kommunizieren. O0
Also bei uns funktioniert das ....

Aber ich versteh dich da schon, irgendwie, ein wenig, vielleicht .....

Nur für das Wiederfinden im Dispatcher werden wir das nie nutzen. Deswegen MUSS die "kryptische" Nummer immer im Betreff stehen bleiben und ob dann eine Fortlaufend Nummer richtig viel Sinn macht??

Haben täte ich das ja schon.
Titel: Re: Änderungen und Fixes im nächsten point Release 1.5.1 von !!Help!!
Beitrag von: eknori am 07.03.06 - 19:18:08
lso, eine Basisfunktionalität wird die fortlaufende Nummer nicht werden. Ich verstehe, daß eine kürze Nummer die Kommunikation erleichtert ... Ich halte es für möglich, eine zusätzliche Funktion einzubauen, die eine solche *würg, schmerz* f.o.r.t.l.a.u.f.e.n.d.e Nummer zusätzlich zu der hübschen, kryptischen Nummer erzeugt.
Titel: Re: Änderungen und Fixes im nächsten point Release 1.5.1 von !!Help!!
Beitrag von: baces am 07.03.06 - 21:27:26

Also bei uns funktioniert das ....

Aber ich versteh dich da schon, irgendwie, ein wenig, vielleicht .....

Nur für das Wiederfinden im Dispatcher werden wir das nie nutzen. Deswegen MUSS die "kryptische" Nummer immer im Betreff stehen bleiben und ob dann eine Fortlaufend Nummer richtig viel Sinn macht??


Na klar, die krytische hat natürlich ihre Berechtigung und soll auch nicht ersetzt werden. Ich denke wirklich als Extra-Feld. Damit kann diese sorry, erheblich einfachere, Nummer in den Mails verwendet werden, zusätzlich zur Ticket-Id. Wie gesagt, im Augenblick packe ich die Ticket-Id ganz hinten an den Betreff und packe diese *..würg..* - einfache Nummer händisch vorne ran. Ein Feld für Tickets und ein Feld für Aufgaben, Startnummer und Ein/Ausschalter in der Config - als Vorschlag.

Bei unserer ERP-Einführung / Mitentwicklung, sind die Tickets halt sehr lange offen (Projekt läuft schon 3 Jahre und kein Ende abzusehen  :-X - aber es ist kein SAP, das können auch andere...), somit werden diese Tickets nicht mal in 3 Tagen abgeschlossen, sondern werden immer wieder aufgegriffen und werden länger und länger.

Und über Linderung des Seelenschmerz mache ich mir schon Gedanken...  :D
Titel: Re: Änderungen und Fixes im nächsten point Release 1.5.1 von !!Help!!
Beitrag von: Thomas Schulte am 09.03.06 - 09:44:41
Okay also basierend auf diesem (http://atnotes.de/index.php?topic=29211.0) Post hab ich gestern eine mögliche Lösung für dieses Problem eingebaut:

TicketNewTicketStartWithStatus, Neues Konfigurationsdokument eingeführt. Steuert wie der
Status bei Manuell erstellten neuen Dokumenten gesetzt werden soll. BugReport Feld Status angepasst.

DispatcherNewTicketStartStatus, Neues Konfigurationsdokument eingeführt, Steuert mit welchem Status der Dispatcher ein neues Ticket anlegt. Sourcecode in lib.appl.function (createnewdocument) geändert

TicketReassignSetStatusTo, neues Konfigurationsdokument eingeführt, Steuert welcher Status beim Reassign eines Tickets gesetzt werden soll. Dieser Eintrag kann entweder leer oder 0 oder 1 sein. Bei leer wird der eingestellte Status nicht verändert. bei 0 wird er immer auf null zurückgesetzt und das Ticket wird wieder "neu", bei 1 bleibt das ticket im Bearbeitungs Modus (aktiv) oder wird in den Bearbeitungs Modus versetzt.

TicketAcceptSetCurrentUserAsSpporter, Neues Konfigurationsdokument eingeführt, steuert ob der aktuelle Benutzer als Supporter eingetragen wird wenn er ein Ticket akzeptiert.

Damit kann dann bei Tickets so vorgegangen werden wie bei Aufgaben. Der Benutzer der ein Ticket akzeptiert wird automatisch als Verantwortlicher Supporter eingetragen.

Einen Wermutstropfen habe ich da aber noch. Jedes neue Accept löst noch eine Email an die User aus von denen der Call kommt. Das könnte aber auch noch gelöst werden, wenn man sich darauf einigt, das beim Accept über ein Konfigurationsdokument gesteuert wird das der Eintrag für fldMailIfAccepted auf "NO" gesetzt wird, wenn der ....

Ähh ja, das hab ich jetzt auch gelöst. Dafür gibt es jetzt auch ein Steuerungsdokument damit kann man dann definieren, ob das Ticektinterne Steuerungsfeld für die Mailbenachrichtigung bei dieser Aktion auf "NO" gesetzt wird, was dann weitere Nachrichten unterbindet, bis jemand das Manuell wieder auf "YES" setzt.
Titel: Re: Änderungen und Fixes im nächsten point Release 1.5.1 von !!Help!!
Beitrag von: Lauff am 13.03.06 - 09:33:55
Hört sich gut an. Danke.
Titel: Re: Änderungen und Fixes im nächsten point Release 1.5.1 von !!Help!!
Beitrag von: eknori am 22.03.06 - 18:18:52
Ich hatte ja angekündigt, dass ich mich mit der Implementierung von erweiterten Systeminformationen in das neue Release beschäftige.
Da wird es auch ein paar neue Sachen geben.
Allerdings wird es hier zunehmend schwieriger, die Sachen in LS abzubilden.

Die WMI Sachen sind nicht in allen Punkten umzusetzen. Zudem wird der Kram mit jeder neuen Abfrage langsamer und langsamer.
Bei manchen Dingen fehlen mir auch Möglichkeiten in LS, die andere Programmiersprachen haben - z.B. Inline-Assembler. Damit wären z.B. INT13 Abfragen zur Festplattenkonfiguration wesentlich einfacher und genauer, als über WMI oder die Windows API.

Ich habe daher angefangen, eine Abfrage der ( Remote ) Computerkonfiguration in C# zu schreiben.

Herauskommen wird am Ende eine DLL, die von LS aus angesprochen werden kann. Einen ersten Eindruck könnt ihr euch schon einmal durch den angehängten Screenshot verschaffen.

Per Default liest der bisherige Code den lokalen Rechner aus; es ist aber auch möglich, sich über ein Connect auf einen Remote Computer aufzuschalten und dessen Config auszulesen.

In einem Windows Netztwerk funktioniert das bereits sehr gut; Probleme bereitet mir aber Novell. Sobald der Novell Client installiert ist, ist Essig mit Remote. Aber das bekomme ich auch noch hin.

Die Abkehr von LS in diesem Bereich hat auch noch einen weiteren Vorteil; z.B. könnte man die Datenbank von ZenWorks anzapfen und die Ergebnisse in LN zur Verfügung stellen.

Momentan steckt das Alles noch in einem sehr frühen Alpha Stadium.

Titel: Re: Änderungen und Fixes im nächsten point Release 1.5.1 von !!Help!!
Beitrag von: regedit am 23.03.06 - 08:43:51
Ich hatte ja angekündigt, dass ich mich mit der Implementierung von erweiterten Systeminformationen in das neue Release beschäftige.
Ist es dann auch möglich bei Terminal-Server-Betrieb die Systeminformationen des lokalen Clients auszulesen?
Momentan werden die Daten des Terminal-Servers angezeigt, an den man angemeldet ist
Titel: Re: Änderungen und Fixes im nächsten point Release 1.5.1 von !!Help!!
Beitrag von: eknori am 23.03.06 - 08:54:40
wenn die IP Adresse oder der Hostname des PC bekannt ist, dann geht das schon. Das Tool ist auch nicht dafür gedacht, den bisherigen Code zu ersetzen, sondern es soll vielmehr im Supportfall einen remote Zugriff auf den PC des Users emöglichen.
Titel: Re: Änderungen und Fixes im nächsten point Release 1.5.1 von !!Help!!
Beitrag von: eknori am 28.03.06 - 20:16:09
- Escalation Management

ich baue gerade den Code nach OO um.

hier mal ein erster Eindruck

Code
'///////////////////////////////////////////////////////////////////
Private Class Stamp
'-------------------------------------------------------------------
%REM
represents a single stamp in the multi-value field "nStampAll"
%END REM
	Public strStampField As String
	Public strStampValue As String
End Class
'-------------------------------------------------------------------

'///////////////////////////////////////////////////////////////////
Private Class Recipient
'-------------------------------------------------------------------
%REM
represents a single receipient in the multi-value field "nFirstEscalationSendTo"
%END REM
	Public strRecipientName As String
	Public strRecipientLanguage As String
End Class
'-------------------------------------------------------------------

'///////////////////////////////////////////////////////////////////
Private Class Profile 
'-------------------------------------------------------------------
%REM
represents a single document from a collection of all active escalation-profiles
%END REM
	Public boolProfileStatus As Boolean
	Public strProfileDescription As String
	Public strProfileTemplate As String
	Public strProfileFormula As String
	Public colProfileSingleFieldStamp () As Stamp
	Public colProfileSingleRecipient () As Recipient
End Class
'-------------------------------------------------------------------

'///////////////////////////////////////////////////////////////////
Private Class ProfileCollection
'-------------------------------------------------------------------	
%REM
	represents a collection of all active escalation-profiles
%END REM
	Public intpColCount As Integer
	'Public colProfileCollectionSingleProfile () As Profile
End Class
'-------------------------------------------------------------------

'///////////////////////////////////////////////////////////////////
'///////////////////////////////////////////////////////////////////
Public Class HelpEscalationProfileCollection
'///////////////////////////////////////////////////////////////////	
'///////////////////////////////////////////////////////////////////	
	
	Private pCol As ProfileCollection
	
	Public Sub New ()
		'------------- ON ERROR STUFF -------------------
		On Error Goto ERRHANDLE 
		
		'------------- DIM STUFF-----------------------------
		Dim s As New NotesSession
		Dim col As NotesDocumentCollection
		Dim dt As New NotesDateTime(Cstr(Datenumber(2004, 5, 1)))
		Dim T_Col As New ProfileCollection
		
		'------------- SET  STUFF-----------------------------
		Set col = s.CurrentDatabase.Search ({@UpperCase(Form) = "NOTIFICATION PROFILE" & nStatus = "1"} , dt, 0 )
		
		T_Col.intpColCount = col.Count 
		
		Set pCol = T_Col 
		
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
	
	Public Property Get Count () As Integer
		count = Me.pCol.intpColCount
	End Property
	
End Class

Die Klasse "HelpEscalationProfileCollection" wird dann haben


Properties


Count as integer

Methoden

GetNthEscalationProfile ( i as integer ) as eProfile
GetNthRecipient ( profile as eProfile, i as Integer )

irgendwie so etwas in dieser Art.



Titel: Re: Änderungen und Fixes im nächsten point Release 1.5.1 von !!Help!!
Beitrag von: eknori am 29.03.06 - 20:16:54
Ich habe heute noch ein wenig gebastelt und den Code weiter eingedampft. Den meisten Platz nimmt das Error Handling ein.

Im Agenten wird sich letztendlich nur noch ein 2-Zeiler finden

Code
	Dim engine As New EscalationEngine
	Call engine.Run

Neben den Constructor gibt es nur noch eine Methode "Run"; der Rest wird in der Klasse "EscalationEngine" abgefackelt.

Ich weiss, ist noch nicht vollständig, soll auch nur einen ersten Eindruck vermitteln.  ;)

Code
'///////////////////////////////////////////////////////////////////
'///////////////////////////////////////////////////////////////////
Public Class EscalationEngine
'///////////////////////////////////////////////////////////////////	
'///////////////////////////////////////////////////////////////////	
	
	Private pCol As NotesDocumentCollection
	
%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 ( idx As Integer ) 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 (Me.pCol.GetNthDocument ( idx ).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 Recipients ( idx As Integer ) As Variant
		
		On Error Goto ERRHANDLE 
		Recipients = Me.pCol.GetNthDocument ( idx ).nFirstEscalationSendTo
		
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 SetField ( idx As Integer ) As Variant
		
		On Error Goto ERRHANDLE 
		SetField = Me.pCol.GetNthDocument ( idx ) .nStampAll
		
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 Sub StampAll ( idx As Integer )
		
		On Error Goto ERRHANDLE 
		
		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 ( idx )
		varStampValues = Me.SetField ( idx )
		
		If Trim ( varStampValues (0) ) ="" Then 
			Exit Sub ' 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
			End Forall
		End If
		
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
	Public Sub Run
		' put stuff here
		Me.StampAll ( 1 )
	End Sub
	
End Class

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

Ich finde es übrigens klasse, daß der ScriptParser ein Konstrukt wie

Zitat
Set TicketCollection = s.CurrentDatabase.Search (Me.pCol.GetNthDocument ( idx ).nFormula(0) , dt, 0 )

umsetzen kann.   O0

ein

Code
If IsEmpty ( varStampValues)  Then
Exit Sub ' nothing to do; let's get outa here

funktioniert nicht. Oder bin ich da auf dem falschen Dampfer ? Ich dachte, IsEmptry prüft, ob ein Variant leer ist ...
Titel: Re: Änderungen und Fixes im nächsten point Release 1.5.1 von !!Help!!
Beitrag von: Thomas Schulte am 30.03.06 - 12:17:00
Und noch was für das nächste Release.

Datenübernahme aus einer frei definierbaren System Datenbank (NotesDB) in ein Ticket wird möglich sein. So das man ein bei einem Ticket betroffenes System auch nachträglich mit den vorhandenen Daten in den Systembereich des Helpdesk einbinden kann.

Titel: Re: Änderungen und Fixes im nächsten point Release 1.5.1 von !!Help!!
Beitrag von: animate am 30.03.06 - 15:39:46

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).
Titel: Re: Änderungen und Fixes im nächsten point Release 1.5.1 von !!Help!!
Beitrag von: eknori am 30.03.06 - 18:51:09
@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.  ???
Titel: Re: Änderungen und Fixes im nächsten point Release 1.5.1 von !!Help!!
Beitrag von: eknori am 30.03.06 - 20:21:41
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
Titel: Re: Änderungen und Fixes im nächsten point Release 1.5.1 von !!Help!!
Beitrag von: baces am 31.03.06 - 14:22:01
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
Titel: Re: Änderungen und Fixes im nächsten point Release 1.5.1 von !!Help!!
Beitrag von: Thomas Schulte am 31.03.06 - 15:11:54
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.
Titel: Re: Änderungen und Fixes im nächsten point Release 1.5.1 von !!Help!!
Beitrag von: eknori am 01.04.06 - 20:00:10
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
Titel: Re: Änderungen und Fixes im nächsten point Release 1.5.1 von !!Help!!
Beitrag von: Lauff am 03.04.06 - 08:39:31
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  ;)
Titel: Re: Änderungen und Fixes im nächsten point Release 1.5.1 von !!Help!!
Beitrag von: dudeis am 03.04.06 - 15:08:33
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 !
Titel: Re: Änderungen und Fixes im nächsten point Release 1.5.1 von !!Help!!
Beitrag von: Thomas Schulte am 03.04.06 - 15:27:51
@dudeis ?????

Kannst du das bitte etwas genauer beschreiben. Spoofmessage und der Austausch der entsprechenden Daten läuft eigentlich ohne Probleme.
Titel: Re: Änderungen und Fixes im nächsten point Release 1.5.1 von !!Help!!
Beitrag von: dudeis am 03.04.06 - 15:58:31
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




Titel: Re: Änderungen und Fixes im nächsten point Release 1.5.1 von !!Help!!
Beitrag von: Thomas Schulte am 03.04.06 - 16:17:08
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.
Titel: Re: Änderungen und Fixes im nächsten point Release 1.5.1 von !!Help!!
Beitrag von: dudeis am 03.04.06 - 16:21:34
Hallo Thomas,

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

Gruß,
Andreas
Titel: Re: Änderungen und Fixes im nächsten point Release 1.5.1 von !!Help!!
Beitrag von: Thomas Schulte am 03.04.06 - 18:09:04
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.
Titel: Re: Änderungen und Fixes im nächsten point Release 1.5.1 von !!Help!!
Beitrag von: eknori am 03.04.06 - 20:02:54
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.
Titel: Re: Änderungen und Fixes im nächsten point Release 1.5.1 von !!Help!!
Beitrag von: dudeis am 04.04.06 - 09:50:41
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
Titel: Re: Änderungen und Fixes im nächsten point Release 1.5.1 von !!Help!!
Beitrag von: Thomas Schulte am 04.04.06 - 10:17:57
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.
Titel: Re: Änderungen und Fixes im nächsten point Release 1.5.1 von !!Help!!
Beitrag von: dudeis am 04.04.06 - 10:33:03
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
Titel: Re: Änderungen und Fixes im nächsten point Release 1.5.1 von !!Help!!
Beitrag von: Thomas Schulte am 04.04.06 - 11:11:38
Aber Refresh mit Parameter(true) sonst kann es Probleme mit dem RTItem geben.