Formel aus einer Maske in einen Script-Code verwenden

Manchmal kommt man in die Verlegenheit, dass man eine Formel, die in einer Maske verwendet wird auch in Hintergrund-Agenten verwenden möchte/muss.

In der Regel wird diese Formel, dann zusätzlich in den Agenten eingefügt. Hoffentlich durch ein Profildokument und nicht Hard-Coded.

Aber es gibt auch eine Alternative! Via DXL kann man die Formel auch direkt aus der Maske auslesen, um mit dieser zu Arbeiten!!

Ich habe hierzu eine Funktion erstellt, mit der die Formel aus der angegeben Maske eingelesen werden kann:

Function getFormulaFromForm(db As notesDatabase, FormName As String, fieldname As String) As String

Der erste Paremeter ist hierbei die Datenbank in der die Maske gespeichert ist. (Das ist zwar häufig die aktuelle Datenbank, aber das muss ja nicht immer so sein!)

Der zweite Parameter ist der Maskenname. Hierbei kann auch der Alias angegeben werden.

Wurde die Formel nicht gefunden wird ein leerer String (“”) zurückgegeben!

Die Routine ruft, die Unterfunktion “getForm” auf, um die Maske als NotesDocument zu erhalten!

Anschließend wird über die Unterfunktion “GetDocumentNodeForDocument”, die DOM-Document-Node (Die DXL repräsentation) des NotesDocuments ermittelt.

Anschließend wird das Item gesucht “<field>”!

Und zuguter letzt hier der Element-Inhalt von “<formula>” ausgelesen und dieser anschließend zurückgegeben.

—————————–

Die Routine zum suchen eines Dokuments heißt folgendermaßen:

Function getForm(db As NotesDatabase, formname As String) As NotesDocument

Hierbei ist wiederum der Datenbank-Name anzugeben und der Maskenname!

Die Routine sucht hierbei das Dokument über die NotesNoteCollection über den Feldnamen “$TITLE”!

Der Rückgabewert ist das Dokument oder falls kein Dokument gefunden wurde -> NOTHING

———-

Die Unterfunktion “GetDocumentNodeForDocument” gibt die DXL-Repäsentation als DOM-DocumentNode des übergeben NotesDocuments zurück.

Hierbei wird das NotesDocument zunächst vom DXLExporter exportiert und anschließend durch den DOMParser verarbeitet. Die DocumentNode wird anschließend zurückgegeben.

———-

Beispiel:

Um die Formel aus einem Feld “TestField” in einer Maske “TestForm” in der aktuellen Datenbank auszulesen, wird die Funktion “getFormulaFromForm” folgendermaßen aufgerufen:

formul = getFormulaFromForm(s.currentDatabase,”TestFrom”,”TestField”)

——

Hier nun der Programmcode für das Auslesen der Formel:
Function getFormulaFromForm(db As notesDatabase, FormName As String, fieldname As String) As String
 On Error Goto failure
 Dim s As NotesSession
 Dim doc As NotesDocument
 Dim fieldList As NotesDOMNodeList
 Dim eNode As NotesDOMElementNode
 Dim formulaNode As NotesDOMElementNode
 Dim i As Integer
 
 Set s = db.parent 
 getFormulaFromForm=””
 Set doc = getForm(db,FormName)
 
 If doc Is Nothing Then
  Print “Error: Form wasn’t found!”
  Exit Function
 End If
 
 ‘ Now export the dxl document
 Dim docNode As NotesDOMDocumentNode
 
 Set docNode = GetDocumentNodeForDocument(doc)
 
 ‘ Pocess all field -elements
 Set fieldList = docNode.GetElementsByTagName(“field”)
 For i = 1 To fieldList.NumberOfEntries
  Set eNode = fieldList.GetItem(i)
  If Ucase(eNode.GetAttribute(“name”)) = Ucase(fieldname) Then
   ‘ Fieldname found!
   Set formulaNode = eNode.GetElementsByTagName(“formula”).GetItem(1)
   getFormulaFromForm = formulaNode.FirstChild.NodeValue
   ‘ found… exit all
   Goto finally
  End If
 Next i
failure:
 Print “Following error appeared: “+Error$
 Resume finally
finally:
 Exit Function
End Function

Function getForm(db As NotesDatabase, formname As String) As NotesDocument
 On Error Goto failure
 Set getForm = Nothing
 
 Dim nc As NotesNoteCollection
 Dim noteid As String
 Dim doc As NotesDocument
 
 ‘ Get all forms in defined database
 Set nc = db.CreateNoteCollection(False)
 nc.SelectForms = True
 Call nc.BuildCollection
 
 ‘ went trough all notes
 noteid = nc.GetFirstNoteId
 Do Until noteid = “”
  Set doc = db.GetDocumentByID(noteid)
  
  ‘ Test if document is the searched form // Test all aliases too
  
  If HasMember(doc.~$TITLE,formname) Then
   ‘ return the form at all
   Set getForm = doc
   Goto finally
  End If
  noteid = nc.GetNextNoteId(noteid)
 Loop
 Print “Document with “+FormName+” couldn’t be found!”
 Goto finally
failure:
 Print “Document couldn’t be retrieved. Error: “+Error$
 Resume finally
finally:
 Exit Function
End Function

Function GetDocumentNodeForDocument(doc As NotesDocument) As NotesDOMDocumentNode
 Dim s As New NotesSession
 Dim db As NotesDatabase
 Dim inputstream As NotesStream
 Dim domParser As NotesDOMParser
 Dim dxlexporter As NotesDXLExporter
 
 On Error Goto failure
 Set GetDocumentNodeForDocument = Nothing
 
 ‘ First retrieve database and session
 Set db = doc.ParentDatabase
 Set s = db.Parent
 
 ‘ Create stream
 Set inputStream = s.CreateStream
 
 ‘ export the document
 Set dxlexporter = s.CreateDXLExporter(doc,inputStream)
 Call dxlexporter.process()
 
 ‘ parse document
 Set domParser = s.CreateDOMParser(inputStream)
 Call domParser.Process()
 
 Set GetDocumentNodeForDocument=domParser.Document
 
 
 Goto finally 
failure:
 Print “Following error appeared: “+Error$
 Resume finally
finally:
 Exit Function
End Function

Function hasMember(alist As Variant,item As String) As Integer
 hasMember = False
 Forall element In aList
  If item = element Then
   hasMember = True
   Exit Function
  End If
 End Forall
End Function

—–

Viel Spass beim Herumprobieren!

This entry was posted in Development, DXL, Lotus Domino and tagged , , . Bookmark the permalink.

Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out /  Change )

Google photo

You are commenting using your Google account. Log Out /  Change )

Twitter picture

You are commenting using your Twitter account. Log Out /  Change )

Facebook photo

You are commenting using your Facebook account. Log Out /  Change )

Connecting to %s