Das Notes Forum
Lotus Notes / Domino Sonstiges => Projekt Bereich => Help-Desk Applikation !!Help!! => Thema gestartet von: froggy am 22.03.06 - 15:01:54
-
Hallo zusammen,
bin zwar erst frisch dabei, aber der erste Eindruck der HELP Datenbank: :) super Arbeit!!!. Wenn es nur eine bessere Doku dazu gäbe.
Nun aber zu dem Fehler, den ich glaube, gefunden zu haben:
Man kann in den Mail Signaturen ja Feldwerte aus dem Ticket über Tags wie <<supporter>> einfügen lassen. Auch vom parent (<<p.supporter>>) und von base Dokument (<<b:supporter>>) soll das funktionieren. Hier aber der Fehler, wenn das aktuelle Dokument kein parent-Dokument besitzt:
An der Stellle, an der er das Tag bzgl. "b" oder "p" untersucht, wird der Wert in strT nicht richtig gesetzt, falls es kein parent Dokument gibt. Ich denke, der rote Abschnitt sollte immer gesetzt werden, egal ob ein parent Dokument vorhanden ist:
Forall t In arrRetFieldNames
strT = Cstr ( t )
strReplT = Cstr( t )
arrRetGetFieldFrom = Arrayunique ( Split ( StrT, TAG_FIELDDELIMITER ), 5 )
If arrRetGetFieldFrom(0) = "b"Then
If Not basedoc Is Nothing Then
Set fieldreaddoc = Basedoc
strT = Cstr ( ArrRetGetFieldFrom(1) )
Else
Set fieldreaddoc = LinkTo
End If
Elseif arrRetGetFieldFrom(0) = "p" Then
If Not parentdoc Is Nothing Then
Set fieldreaddoc = Parentdoc
strT = Cstr ( ArrRetGetFieldFrom(1) )
Else
Set fieldreaddoc = LinkTo
End If
Else
Set fieldreaddoc = LinkTo
End If
Denn so versucht er, das Feld "b:supporter" oder "p:supporter" im aktuellen Dokument zu finden!
Also sollte der Code wohl so lauten:
Forall t In arrRetFieldNames
strT = Cstr ( t )
strReplT = Cstr( t )
arrRetGetFieldFrom = Arrayunique ( Split ( StrT, TAG_FIELDDELIMITER ), 5 )
If arrRetGetFieldFrom(0) = "b"Then
strT = Cstr ( ArrRetGetFieldFrom(1) )
If Not basedoc Is Nothing Then
Set fieldreaddoc = Basedoc
strT = Cstr ( ArrRetGetFieldFrom(1) )
Else
Set fieldreaddoc = LinkTo
End If
Elseif arrRetGetFieldFrom(0) = "p" Then
strT = Cstr ( ArrRetGetFieldFrom(1) )
If Not parentdoc Is Nothing Then
Set fieldreaddoc = Parentdoc
strT = Cstr ( ArrRetGetFieldFrom(1) )
Else
Set fieldreaddoc = LinkTo
End If
Else
Set fieldreaddoc = LinkTo
End If
Übrigens verwende ich Version 1.5.
CU Marc
-
Ähh nein, das habe ich ganz bewusst so gemacht.
Wenn er auf Linkto, also auf das Basisdokument zurückfällt, dann soll er ganz bewusst genau das zum suchen hernehmen was in dem Gesamtbegriff drinsteht. Und nichts anderes. Da ist kein Fallback Verhalten drin.
Deswegen wird ja in der zweiten Zeile StrT schon gesetzt und anschließend nur noch überschrieben wenn tatsächlich ein Base oder Parentdocument gefunden wurde.
-
Hallo Thomas,
danke für die prompte Antwort!
Dann ist mir wohl die ganze Dokumenten-Struktur noch nicht so klar.
Wie stehen denn die Dokumente zueinander in Beziehung bzw. was ist ein parent Dokument von wem?
CU Marc
-
OK öassen wir mal die Konfigurationsdokumente weg, dann gibt es in der Version 1.5 drei Dokument Typen:
Tickets (BugReport)
Aufgaben (BugTodo)
Mails (BugMail)
In der Version 1.5.1 kommen da noch Notizen (BugNotice) dazu.
Die Basis bildet immer ein Ticket.
Zu diesen Ticket kann man jetzt Aufgaben oder Mails oder ->1.5.1<- Notizen erfassen.
Zu Aufgaben kann man weitere Aufgaben, oder Mails oder Notizen erfassen.
du hättest also folgende mögliche Struktur:
Ticket
-> Aufgabe 1
--> Aufgabe 1.1
---> Mail zu Aufgabe 1.1
---> Notiz zu Aufgabe 1.1
--> Mail zu Aufgabe 1
-> Aufgabe 2
-> Aufgabe 3
--> Mail zu Aufgabe 3
Und so weiter.
Jetzt besser verständlich???
-
Super! Das ist eine gute Info. Jetzt muss ich mir nur noch überlegen, wie man die MailSignaturen am besten organisiert.
Schade das es dazu nicht eine "fertig" konfigurierte Beispiel-Schabolone gibt. Aber das ist ein anderes Thema.
Anderes Thema: habt ihr euch schon mal überlegt, anstatt nur Felder aus den Dokumenten über Tags einzufügen, auch z.B. berechnete Werte zu ermöglichen?
Also z.B. <<[@Name([CN];user)]>> und das ganze dann mit retVar = Evaluate(strT, fieldreaddoc) auswerten und das Tag ersetzen.
CU Marc
-
Das Prblem ist das man wenn man so was anfängt eine irre Logik dahinter legen muss. Deswegen hat das glaube ich auch noch kein Professioneller Anbieter so wirklich gemacht. Aber als Idee ist das nicht schlecht. Man muss dann halt den Präfix noch etwas erweitern so in dem Sinn, hier kommt eine Formel.
-
Schade das es dazu nicht eine "fertig" konfigurierte Beispiel-Schabolone gibt.
Finde ich gut, daß du uns anbietest, so etwas zu erstellen ... ;D
-
<<[@Name([CN];user)]>>
So etwas verwende ich ja bereits in der EscalationsRoutine ( @Adjust , @Now ). OK, das kann man auch unter der Bedingung eines festen Wortschatzes in das RT Search und Replace einbauen.
An einem kompletten Formet2LS Parser versucht sich ja schon Axel Janssen seit geraumer Zeit ...
evtl. ist das auch über Config Docs regelbar, wenn man sich auf Sachen beschränkt, die mit evaluate in LS abbildbar sind.
-
Zitat
<<[@Name([CN];user)]>>
Vorschlag: Setze dich mit uns in Vrebindung und steige als Entwickler ins Team ein ...
Offensichtlich kommst du mit dem produzierten Script Code klar...
-
An einem kompletten Formet2LS Parser versucht sich ja schon Axel Janssen seit geraumer Zeit ...
Für was braucht man einen Formel2LS Parser? ??? Man kann das doch einfach mit Evaluate(<formel>, <doc>) abbilden. Habe mich natürlich auch schon dran versucht und hier mein Ergebniss:
Ich habe das ganze TAG Handling in eine eigene Funktion verschoben und in SpoofMessage nur den Aufruf eingefügt. Ein erster Test meinerseits hat funktioniert. Allerdings muss man sich natürlich die Fehlerbehandlung noch anschauen (insbesondere wenn ungültige Formeln in den MailSignaturen definiert werden). Aber im Prinzip erzeugt Evaluate dann einen Fehler, den man ja abfangen kann (s.u.).
Das ganze könnte man natürlich noch weiter verallgemeinern, so dass er auch die Subject Tags behandelt. Da muss ich aber erstmal suchen, wo die ersetzt werden.
Function ProcessRTTags(rtitem As NotesRichTextItem, linkto As NotesDocument, basedoc As NotesDocument, parentdoc As NotesDocument) As Integer
%REM
###################################################################################
Goal: Replace defined tags in richtext item rtitem with corresponding items/values from referenced docs
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Arguments: Description:
rtitem NotesRichTextItem RichTextItem to search for tags and replace them with appropriate values
linkto NotesDocument actual document
basedoc NotesDocument base document of actual document
parentdoc NotesDocument parent document of actual document
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Return:
TRUE or FALSE.
TRUE if the function runs without an error
FALSE if the function has an error
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Example:
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
VERSION / WHEN / WHO / CHANGES
1.0/22.03.2006/Marc Aigner/--
'###################################################################################
%END REM
On Error Goto ERRHANDLE
Const TAG_FORMULA_PREFIX = "["
Const TAG_FORMULA_SUFFIX = "]"
Dim rtnav As NotesRichTextNavigator
Dim rtrange As NotesRichTextRange
Dim fieldreaddoc As NotesDocument
Dim strT As String
Dim strReplT As String
Dim strTemp As String
Dim getString As String
Dim arrRetFieldNames As Variant
Dim arrRetGetFieldFrom As Variant
Dim ret As Integer
Dim retvar As Variant
ProcessRTTags = True
If Not linkto Is Nothing Then
Set rtnav = rtItem.CreateNavigator
Set rtrange = rtItem.CreateRange
strTemp = ""
If rtnav.FindFirstString ( TAG_PREFIX, _
RT_FIND_CASEINSENSITIVE) Then
Do
Call rtrange.SetBegin ( rtnav )
strTemp = strTemp + TAG_DELIMITER + Mid ( rtrange.textRun, 3, Instr( rtrange.textRun,TAG_SUFFIX ) -3 )
Loop While rtnav.FindNextString ( TAG_PREFIX, RT_FIND_CASEINSENSITIVE )
End If
arrRetFieldNames = Arrayunique ( Split ( strTemp, TAG_DELIMITER ), 5 )
Set rtrange = rtItem.CreateRange
Forall t In arrRetFieldNames
strT = Cstr ( t )
strReplT = Cstr( t )
arrRetGetFieldFrom = Arrayunique ( Split ( StrT, TAG_FIELDDELIMITER ), 5 )
Select Case arrRetGetFieldFrom(0)
Case "b"
If Not basedoc Is Nothing Then
strT = Cstr ( ArrRetGetFieldFrom(1) )
Set fieldreaddoc = Basedoc
End If
Case "p"
If Not parentdoc Is Nothing Then
strT = Cstr ( ArrRetGetFieldFrom(1) )
Set fieldreaddoc = Parentdoc
End If
End Select
'if no source doc referenced then use actual document
If fieldreaddoc Is Nothing Then Set fieldreaddoc = LinkTo
If ( Not strT = "" ) Then
'Check if we have a formula or a item name
If Left(Trim(strT), 1) = TAG_FORMULA_PREFIX Then
'we have a formula string => process with source document
strT = Strleftback(Strright(strT, TAG_FORMULA_PREFIX), TAG_FORMULA_SUFFIX)
ResumeMethodNext = True
Err = 0
retVar = Evaluate(strT, fieldreaddoc)
If Err <> 0 Then
Error 32000, "Could not evaluate tag with formula in mail signatures."
getstring = ""
Else
getstring = retvar(0)
End If
ResumeMethodNext = False
Else
'we have a item name => use item text as value
If ItemTextExists ( fieldReadDoc, strT ) Then
getstring = fieldReadDoc.GetFirstItem( strT ).text
End If
End If
'replace tag with evaulated value from item text or formula
If Trim(getstring) <> "" Then
ret = rtrange.FindAndReplace _
( TAG_PREFIX & strReplT & TAG_SUFFIX,_ ' find
getstring, _ ' replaceWith
RT_REPL_ALL + RT_FIND_CASEINSENSITIVE)
Call rtItem.Update ' Must update before looping
End If
End If
End Forall
End If
EXITPOINT:
Exit Function
ERRHANDLE:
ProcessRTTags = False
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
-
OK, darf ich das als Angebot auffassen, diese Funktion in das nächste Release einzubauen ??
-
;) ja klar, dass ist für mich kein Problem. Allerdings habe ich es noch nicht ausführlich getestet.
Leider werde ich aber nicht soviel Zeit haben, als Entwickler mitzuhelfen. Dazu fehlt mir leider die Zeit. Wenn's aber möglich ist, dann helfe ich natürlich gerne.
-
wenn du dich auf diese Funktion beschränkst und uns eine releasefähige Version liefern kannst, ist das null problemo. Mitarbeit am Projekt ist keine Verpflichtung, aber immer gerne gesehen ...
Übrigens: Herzlich willkommen im Forum; und ein toller Einstieg deinerseits :D
-
Dann aber noch eine Frage:
MailShowToUserBeforeSending = YES
Warum wird hier nicht die endgültige Mail angezeigt? Wäre doch für den User schöner, hier nochmal alles ändern zu können? Hat es da vielleicht Probleme mit dem RichText Feld in Zusammenhang mit Find & Replace gegeben?
Ansonsten könnte ich mir folgendes vorstellen:
a) Mail zusammenbauen
b) Mail anzeigen, falls konfiguriert und isfrontend
b') wenn User Dialog abbricht, keine Mail versenden
c) Mail verschicken
Denke, dass es so funktionieren sollte. Was meint ihr?
-
Nein Es ist bewusst so gewollt, das die Signatur erst dann an die Mail angehängt wird, wenn sie verschickt wird. Von daher sieht der Benutzer nicht die komplette Mail. Genauso werden die Felder erst beim versenden ersetzt.
-
Das Problem beim Formel Handling ist, das man dann nur Formeln zulassen darf, die keine Variablen aus dem zugrundeliegenden Dokument verwenden. Dann funktioniert dein Code. In dem Moment wo man das aber möchte und der ruf danach erschallt dann zwangsläufig, gibt es Arbeit. Dann musst du nämlich wieder eine interne Syntax und einen entsprechenden Parser zusammenbauen.
-
Ich hab das mal mit ein zwei minimalen Veränderungen in die 1.5.1 übertragen. Was die Formeln angeht muss das noch getestet werden, was da alles geht.
-
Das Problem beim Formel Handling ist, das man dann nur Formeln zulassen darf, die keine Variablen aus dem zugrundeliegenden Dokument verwenden. Dann funktioniert dein Code. In dem Moment wo man das aber möchte und der ruf danach erschallt dann zwangsläufig, gibt es Arbeit. Dann musst du nämlich wieder eine interne Syntax und einen entsprechenden Parser zusammenbauen.
Sorry, dass ich mich erst jetzt wieder melde. Kann dass hier leider nur nebenbei machen :(
Aber deine Aussage verstehe ich nicht! Wenn man Evaluate(<Formel>, doc) verwendet, dann kann man in der Formel durchaus auf Feldinhalte im referenzierten "doc" Bezug nehmen. Als Rückgabe-Wert bekommt man immer ein Array.
Das habe ich schon in sehr vielen Anwendungen verwendet und damit gab es noch nie Probleme.
CU Marc
-
Stimmt ich hab Blödsinn geredet. Aber eingebaut haben wir das schon (siehe alle Fixes)
DANKE.