Verbesserung DocSearchLoad, Mapping Sharedrive Refactoring Zusatzsuchen, Dokumentenhandling & Cleanup Umfangreiches Refactoring der Zusatzsuchen-Logik (Validator/ValidatorSearch): Vereinheitlichung und Typprüfung der DataTables, zentrale Filterung, robustere Tab-Steuerung und thread-sicheres Nachladen. Netzlaufwerk-Mapping und Dokumentenpfad-Handling wurden entfernt bzw. auf neue Handler ausgelagert. Profilsuchen-Handling vereinheitlicht, Parametrierung (Working Mode) klarer strukturiert. Diverse Bugfixes, verbessertes Logging, Cleanup von Ressourcen und Projektdateien, veraltete Komponenten entfernt. Update auf DocumentViewer 2.6.0.0. Die Anwendung ist robuster, wartbarer und für Erweiterungen vorbereitet.
483 lines
29 KiB
VB.net
483 lines
29 KiB
VB.net
Imports WINDREAMLib
|
|
Imports WMOSRCHLib
|
|
|
|
Public Class ClassPMWindream
|
|
|
|
Inherits ClassWindream_allgemein
|
|
Dim clsWM As ClassWindream_allgemein
|
|
'Private email As New ClassNIEmail
|
|
Private allgFunk As New ClassAllgemeineFunktionen
|
|
#Region "+++++ Konstanten +++++"
|
|
Protected Const WMObjectEditModeObject = &H1F
|
|
Protected Const WMObjectStreamOpenModeReadWrite = 2
|
|
Protected Const WMEntityObjectType = 10
|
|
Protected Const WMEntityDocument = 1
|
|
|
|
Const WMObjectVariableValueTypeUndefined = 0
|
|
Const WMObjectVariableValueTypeString = 1
|
|
Const WMObjectVariableValueTypeInteger = 2
|
|
Const WMObjectVariableValueTypeInteger64bit = 11
|
|
Const WMObjectVariableValueTypeFloat = 3
|
|
Const WMObjectVariableValueTypeBoolean = 4
|
|
Const WMObjectVariableValueTypeDate = 5
|
|
Const WMObjectVariableValueTypeFixedPoint = 6
|
|
Const WMObjectVariableValueTypeTimeStamp = 7
|
|
Const WMObjectVariableValueTypeCurrency = 8
|
|
Const WMObjectVariableValueTypeTime = 9
|
|
Const WMObjectVariableValueTypeVariant = 10
|
|
Const WMObjectVariableValueTypeMask = &HFFF
|
|
Const WMObjectVariableValueFlagMask = &HFFFFF000
|
|
Const WMObjectVariableValueTypeVector = &H1000
|
|
Const WMObjectVariableValueTypeFulltext = &H2000
|
|
Const WMObjectVariableValueTypeDefaultValue = &H4000
|
|
|
|
Const WMObjectEditModeIndexEdit = &H3DA
|
|
#End Region
|
|
|
|
#Region "+++++ Variablen +++++"
|
|
'Private oController As New WMOSearchController
|
|
#End Region
|
|
|
|
#Region "+++++ Allgemeine Methoden und Funktionen +++++"
|
|
Sub New()
|
|
MyBase.New()
|
|
End Sub
|
|
Private Function IsNotEmpty(ByVal aValue As Object)
|
|
If aValue IsNot Nothing Then
|
|
Return True
|
|
Else
|
|
Return False
|
|
End If
|
|
End Function
|
|
|
|
Public Function GetValuesfromAuswahlliste(ByVal listname As String)
|
|
Try
|
|
If listname = "" Then
|
|
Return ""
|
|
End If
|
|
Dim oChoiceList = oSession.GetWMObjectByName(WINDREAMLib.WMEntity.WMEntityChoiceList, listname)
|
|
If Err.Number = 0 And TypeName(oChoiceList) <> "Nothing" Then
|
|
Dim Values = oChoiceList
|
|
Values = oChoiceList.GetVariableValue("vItems")
|
|
Dim anz As Integer = 0
|
|
|
|
For Each CLItem In Values
|
|
If oChoiceList.aName IsNot Nothing Then
|
|
anz += 1
|
|
End If
|
|
Next
|
|
Dim strListe(anz - 1)
|
|
Dim zahl As Integer = 0
|
|
For Each CLItem In Values
|
|
If oChoiceList.aName IsNot Nothing Then
|
|
strListe(zahl) = CLItem
|
|
zahl += 1
|
|
End If
|
|
Next
|
|
Return strListe
|
|
Else
|
|
MsgBox("Auswahlliste: " & listname & " nicht gefunden!", MsgBoxStyle.Critical, "Fehler:")
|
|
Return Nothing
|
|
End If
|
|
|
|
Catch ex As Exception
|
|
LOGGER.Error(ex)
|
|
MsgBox(ex.Message, MsgBoxStyle.Critical, $"Error in GetValuesfromAuswahlliste ({listname}):")
|
|
Return Nothing
|
|
End Try
|
|
End Function
|
|
|
|
|
|
Public Function RunIndexing(ByVal oDocument As WMObject, ByVal Indizes() As String, ByVal aValues() As Object)
|
|
Dim vType
|
|
Try
|
|
If Indizes IsNot Nothing And aValues IsNot Nothing Then
|
|
If Not oDocument.aLocked Then
|
|
|
|
' 02.07. Änderung der Lock Methode, um eine Validierung auch zuzulassen, wenn das Recht "Datei ändern"
|
|
' nicht gesetzt ist
|
|
'oDocument.lock()
|
|
|
|
Try
|
|
oDocument.LockFor(WMObjectEditModeIndexEdit)
|
|
Catch ex As Exception
|
|
LOGGER.Error(ex)
|
|
frmValidator.idxerr_message = "Could not lock WMFile - Check Your rights and inform the admin!"
|
|
Return False
|
|
End Try
|
|
|
|
If oDocument.aObjectType.aName <> CURRENT_WMObjecttype Then
|
|
' ihr den entsprechenden Dokumenttyp zuweisen
|
|
oDocument.aObjectType = Me.oSession.GetWMObjectByName(WINDREAMLib.WMEntity.WMEntityObjectType, CURRENT_WMObjecttype)
|
|
' WMObject.aObjectType = Me.selectedProfile.Dokumenttyp
|
|
LOGGER.Debug("Objekttyp '" & oDocument.aObjectType.aName & "' was changed to '" & CURRENT_WMObjecttype & "'.")
|
|
Try
|
|
oDocument.Save()
|
|
Catch ex As Exception
|
|
' wenn es einen Fehler beim speichern gab, dann konnte auch kein Dokumenttyp gesetzt werden -> es kann also auch keine
|
|
' Indexierung stattfinden und die Indexierung muss nicht fortgesetzt werden
|
|
Return False
|
|
End Try
|
|
End If
|
|
|
|
|
|
Dim i As Integer = 0
|
|
Dim indexname As String
|
|
|
|
If aValues.Length = 1 And aValues(0) = "" Then
|
|
LOGGER.Debug("Indexwert ist leer/Nothing - Keine Indexierung")
|
|
Else
|
|
'Jetzt jeden Indexwert durchlaufen
|
|
For Each aName As String In Indizes
|
|
indexname = aName
|
|
' das entsprechende Attribut aus windream auslesen
|
|
Dim oAttribute = Me.oSession.GetWMObjectByName(WINDREAMLib.WMEntity.WMEntityAttribute, Indizes(i))
|
|
' den Variablentyp (String, Integer, ...) auslesen
|
|
vType = oAttribute.getVariableValue("dwAttrType")
|
|
' wenn in aValues an Position i ein Wert steht
|
|
|
|
If IsNotEmpty(aValues(i)) Then
|
|
Dim _int As Boolean = False
|
|
Dim _date As Boolean = False
|
|
Dim _dbl As Boolean = False
|
|
Dim _bool As Boolean = False
|
|
'If indexname = "Tournr" Then
|
|
' MsgBox("Index: " & indexname & vbNewLine & "wert: " & aValues(i), MsgBoxStyle.Information, "Index: " & aName.ToString)
|
|
'End If
|
|
LOGGER.Debug(" ### Indexierung von Index: " & indexname & " ####")
|
|
'MsgBox(oDocument.aName & vbNewLine & aValues(i) & vbNewLine & vType, MsgBoxStyle.Exclamation, "Zeile 87")
|
|
Dim value = aValues(i)
|
|
Dim convertValue
|
|
Dim vektor As Boolean = False
|
|
'Den Typ des Index-Feldes auslesen
|
|
'MsgBox(value.GetType.ToString)
|
|
Select Case vType
|
|
Case WMObjectVariableValueTypeString
|
|
LOGGER.Debug("Typ des windream-Indexes: WMObjectVariableValueTypeString")
|
|
If value = "DeleteWMAttributeValue" Then
|
|
LOGGER.Debug("DeleteWMAttributeValue - simpleAttribute with String.Empty")
|
|
convertValue = CStr(String.Empty)
|
|
Else
|
|
convertValue = CStr(value)
|
|
End If
|
|
|
|
Case WMObjectVariableValueTypeInteger
|
|
LOGGER.Debug("Typ des windream-Indexes: WMObjectVariableValueTypeInteger")
|
|
If IsNumeric(value) = False Then
|
|
If value = String.Empty Then
|
|
LOGGER.Debug("Indexing WMObjectVariableValueTypeInteger with vbEmpty")
|
|
convertValue = vbEmpty
|
|
Else
|
|
frmValidator.idxerr_message = "Unerlaubte Eingabe in Numerisches Feld: " & value
|
|
LOGGER.Debug("Achtung: Value " & value & " kann nicht in Zahl konvertiert werden!")
|
|
oDocument.Save()
|
|
oDocument.unlock()
|
|
Return False
|
|
End If
|
|
Else
|
|
convertValue = CInt(value)
|
|
End If
|
|
|
|
_int = True
|
|
Case WMObjectVariableValueTypeInteger64bit
|
|
LOGGER.Debug("Typ des windream-Indexes: Integer64bit")
|
|
If IsNumeric(value) = False Then
|
|
frmValidator.idxerr_message = "Unerlaubte Eingabe in Numerisches Feld: " & value
|
|
LOGGER.Debug("Achtung: Value " & value & " kann nicht in Zahl konvertiert werden!")
|
|
oDocument.Save()
|
|
oDocument.unlock()
|
|
Return False
|
|
End If
|
|
convertValue = CInt(value)
|
|
_int = True
|
|
Case WMObjectVariableValueTypeFloat
|
|
LOGGER.Debug("Typ des windream-Indexes: WMObjectVariableValueTypeFloat")
|
|
Try
|
|
value = Replace(value, ".", ",")
|
|
convertValue = Convert.ToDouble(value)
|
|
Catch ex As Exception
|
|
LOGGER.Error(ex)
|
|
frmValidator.idxerr_message = "Could't convert value '" & value & "' to double!"
|
|
oDocument.Save()
|
|
oDocument.unlock()
|
|
Return False
|
|
End Try
|
|
|
|
Case WMObjectVariableValueTypeFixedPoint
|
|
LOGGER.Debug("Typ des windream-Indexes: WMObjectVariableValueTypeFixedPoint")
|
|
Try
|
|
convertValue = CDbl(value)
|
|
Catch ex As Exception
|
|
LOGGER.Error(ex)
|
|
frmValidator.idxerr_message = "Could't convert value '" & value & "' to double!"
|
|
oDocument.Save()
|
|
oDocument.unlock()
|
|
Return False
|
|
End Try
|
|
|
|
_dbl = True
|
|
Case WMObjectVariableValueTypeBoolean
|
|
LOGGER.Debug("Typ des windream-Indexes: WMObjectVariableValueTypeBoolean")
|
|
convertValue = CBool(value)
|
|
_bool = True
|
|
Case WMObjectVariableValueTypeDate
|
|
LOGGER.Debug("Typ des windream-Indexes: WMObjectVariableValueTypeDate")
|
|
_date = True
|
|
'Dim _date As Date = value
|
|
convertValue = value
|
|
Case WMObjectVariableValueTypeTimeStamp
|
|
LOGGER.Debug("Typ des windream-Indexes: WMObjectVariableValueTypeTimeStamp")
|
|
convertValue = CInt(value)
|
|
Case WMObjectVariableValueTypeCurrency
|
|
LOGGER.Info(" >> Typ des windream-Indexes: WMObjectVariableValueTypeCurrency")
|
|
'Wegen currency muß ein eigenes Objekt vom typ Variant erzeugt werden
|
|
Dim aValueWrapper As System.Runtime.InteropServices.CurrencyWrapper = New System.Runtime.InteropServices.CurrencyWrapper(CDec(value))
|
|
convertValue = aValueWrapper
|
|
Case WMObjectVariableValueTypeTime
|
|
LOGGER.Debug("Typ des windream-Indexes: WMObjectVariableValueTypeTime", False)
|
|
'If ((value)) Then
|
|
' convertValue = CDate(value)
|
|
'Else
|
|
' convertValue = ""
|
|
'End If
|
|
'Dim _date As Date = value
|
|
convertValue = convertValue '*_date.ToShortTimeString
|
|
Case WMObjectVariableValueTypeFloat
|
|
LOGGER.Debug("Typ des windream-Indexes: WMObjectVariableValueTypeFloat", False)
|
|
convertValue = CStr(value)
|
|
Case WMObjectVariableValueTypeVariant
|
|
LOGGER.Debug("Typ des windream-Indexes: WMObjectVariableValueTypeVariant", False)
|
|
convertValue = CStr(value)
|
|
Case WMObjectVariableValueTypeFulltext
|
|
LOGGER.Debug("Typ des windream-Indexes: WMObjectVariableValueTypeFulltext", False)
|
|
convertValue = CStr(value)
|
|
Case 4100
|
|
LOGGER.Debug("Typ des windream-Indexes: 4100 Vektor Boolean", False)
|
|
vektor = True
|
|
Case 4101
|
|
LOGGER.Debug("Typ des windream-Indexes: 4101 Vektor Date", False)
|
|
vektor = True
|
|
Case 4104
|
|
LOGGER.Debug("Typ des windream-Indexes: 4104 Vektor Currency", False)
|
|
vektor = True
|
|
Case 4097
|
|
LOGGER.Debug("Typ des windream-Indexes: 4097 Vektor alphanumerisch", False)
|
|
vektor = True
|
|
Case 4098
|
|
LOGGER.Debug("Typ des windream-Indexes: 4098 Vektor Numerisch", False)
|
|
vektor = True
|
|
Case 4099
|
|
LOGGER.Debug("Typ des windream-Indexes: 4099 Vektor Kommazahl", False)
|
|
vektor = True
|
|
Case 36865
|
|
LOGGER.Debug("Typ des windream-Indexes: 36865 Vektor alphanumerisch", False)
|
|
vektor = True
|
|
Case Else
|
|
LOGGER.Debug("Typ des windream-Indexes konnte nicht bestimmt werden!", False)
|
|
LOGGER.Debug("Versuch des Auslesens (vType): " & vType)
|
|
'MsgBox(vType & vbNewLine & CStr(value), MsgBoxStyle.Exclamation, "Marlon-Case Else")
|
|
convertValue = ""
|
|
End Select
|
|
If vektor = False Then
|
|
If convertValue.ToString Is Nothing = False Then
|
|
LOGGER.Debug("Konvertierter Wert: '" & convertValue.ToString & "'", False)
|
|
End If
|
|
End If
|
|
'############################################################################################
|
|
'####################### Der eigentliche Indexierungsvorgang ################################
|
|
'############################################################################################
|
|
If vektor = False Then
|
|
If convertValue.ToString Is Nothing = False Then
|
|
Try
|
|
LOGGER.Debug("Jetzt indexieren: oDocument.SetVariableValue(" & aName & ", " & convertValue.ToString & ")", False)
|
|
Catch ex As Exception
|
|
LOGGER.Error(ex)
|
|
LOGGER.Info(" >> Unexpected Error in Logging SetVariableValue for " & aName & ": " & ex.Message, False)
|
|
End Try
|
|
|
|
|
|
|
|
If _int = True Then
|
|
oDocument.SetVariableValue(aName, CInt(convertValue))
|
|
ElseIf _date = True Then
|
|
oDocument.SetVariableValue(aName, CDate(convertValue))
|
|
ElseIf _bool Then
|
|
oDocument.SetVariableValue(aName, CBool(convertValue))
|
|
ElseIf _dbl Then
|
|
oDocument.SetVariableValue(aName, CDbl(convertValue))
|
|
Else
|
|
oDocument.SetVariableValue(aName, convertValue)
|
|
End If
|
|
LOGGER.Debug("Index '" & aName & "' wurde geschrieben", False)
|
|
Else
|
|
LOGGER.Info(" >> Kein Indexwert vorhanden", False)
|
|
End If
|
|
Else
|
|
'VEKTORFELDER, ALSO ÜBERPRÜFEN OB ERGEBNIS-ARRAY GEFÜLLT IST
|
|
LOGGER.Debug("VEKTORFELD: Vorbereiten des Arrays", False)
|
|
If aValues(0).ToString.Contains("DeleteWMAttributeValue") Then
|
|
'Variante um Vektorfeld zu leeren
|
|
Dim myArray()
|
|
ReDim myArray(aValues.Length - 1)
|
|
myArray(0) = String.Empty
|
|
LOGGER.Debug("Now Indexing vektor-attribute with String.Empty ...")
|
|
oDocument.SetVariableValue(aName, myArray)
|
|
Else
|
|
Dim myArray()
|
|
Select Case vType
|
|
Case 4100
|
|
'Vektortyp Boolean
|
|
'Umwandeln in Boolean
|
|
'Die Größe des Arrays festlegen
|
|
ReDim myArray(aValues.Length - 1)
|
|
Dim i1 As Integer = 0
|
|
'Das Array durchlaufen und Werte für den Index in Array schreiben
|
|
For Each obj In aValues
|
|
Select Case obj.ToString.ToLower
|
|
Case "falsch"
|
|
obj = False
|
|
Case "wahr"
|
|
obj = True
|
|
Case "nein"
|
|
obj = False
|
|
Case "ja"
|
|
obj = True
|
|
Case "0"
|
|
obj = False
|
|
Case "1"
|
|
obj = True
|
|
End Select
|
|
myArray(i1) = CBool(obj)
|
|
i1 = i1 + 1
|
|
Next
|
|
Case 4101
|
|
'Vektortyp Date
|
|
'Umwandeln in String
|
|
'Die Größe des Arrays festlegen
|
|
ReDim myArray(aValues.Length - 1)
|
|
Dim i1 As Integer = 0
|
|
'Das Array durchlaufen und Werte für den Index in Array schreiben
|
|
For Each obj In aValues
|
|
myArray(i1) = CDate(obj)
|
|
i1 = i1 + 1
|
|
Next
|
|
Case 4104
|
|
'Vektortyp Currency
|
|
'Die Größe des Arrays festlegen
|
|
ReDim myArray(aValues.Length - 1)
|
|
Dim i1 As Integer = 0
|
|
'Das Array durchlaufen und Werte für den Index in Array schreiben
|
|
For Each obj In aValues
|
|
Dim aValueWrapper As System.Runtime.InteropServices.CurrencyWrapper = New System.Runtime.InteropServices.CurrencyWrapper(CDec(obj))
|
|
myArray(i1) = aValueWrapper
|
|
i1 = i1 + 1
|
|
Next
|
|
Case 4097
|
|
'Vektortyp ALPHANUMERISCH
|
|
'Umwandeln in String
|
|
'Die Größe des Arrays festlegen
|
|
ReDim myArray(aValues.Length - 1)
|
|
Dim i1 As Integer = 0
|
|
'Das Array durchlaufen und Werte für den Index in Array schreiben
|
|
For Each obj In aValues
|
|
myArray(i1) = CStr(obj)
|
|
i1 = i1 + 1
|
|
Next
|
|
|
|
Case 4098
|
|
'Umwandeln in Integer
|
|
'Die Größe des Arrays festlegen
|
|
ReDim myArray(aValues.Length - 1)
|
|
Dim i1 As Integer = 0
|
|
'Das Array durchlaufen und Werte für den Index in Array schreiben
|
|
For Each obj In aValues
|
|
myArray(i1) = CInt(obj)
|
|
i1 = i1 + 1
|
|
Next
|
|
Case 4099
|
|
'Umwandeln in Double
|
|
'Die Größe des Arrays festlegen
|
|
ReDim myArray(aValues.Length - 1)
|
|
Dim i1 As Integer = 0
|
|
'Das Array durchlaufen und Werte für den Index in Array schreiben
|
|
For Each obj In aValues
|
|
Dim Str As String = obj
|
|
myArray(i1) = CDbl(Str.Replace(".", ","))
|
|
i1 = i1 + 1
|
|
Next
|
|
|
|
Case 36865
|
|
'Umwandeln in String
|
|
'Die Größe des Arrays festlegen
|
|
ReDim myArray(aValues.Length - 1)
|
|
Dim i1 As Integer = 0
|
|
'Das Array durchlaufen und Werte für den Index in Array schreiben
|
|
For Each obj In aValues
|
|
myArray(i1) = CStr(obj)
|
|
i1 = i1 + 1
|
|
Next
|
|
Case Else
|
|
'Umwandeln in String
|
|
'Die Größe des Arrays festlegen
|
|
ReDim myArray(aValues.Length - 1)
|
|
Dim i1 As Integer = 0
|
|
'Das Array durchlaufen und Werte für den Index in Array schreiben
|
|
For Each obj In aValues
|
|
myArray(i1) = CStr(obj)
|
|
i1 = i1 + 1
|
|
Next
|
|
End Select
|
|
'Jetzt die Nachindexierung für Vektor-Felder
|
|
LOGGER.Debug("Wert für Index vor Indexierung: [{0}]", myArray)
|
|
|
|
'If vType = 4097 Or vType = 36865 Then
|
|
' If myArray(0) = "DeleteWMAttributeValue" Then
|
|
' 'Variante um Vektorfeld zu leeren
|
|
' LOGGER.Debug("Now Indexing vektor-attribute with vbEmpty ...")
|
|
' oDocument.SetVariableValue(aName, vbEmpty)
|
|
' Else
|
|
' oDocument.SetVariableValue(aName, myArray)
|
|
' End If
|
|
'Else
|
|
oDocument.SetVariableValue(aName, myArray)
|
|
'End If
|
|
End If
|
|
|
|
|
|
LOGGER.Debug("'SetVariableValue' für VEKTOR erfolgreich", False)
|
|
End If
|
|
End If
|
|
i += 1
|
|
|
|
Next
|
|
End If
|
|
|
|
' oDocument.LockRights()
|
|
|
|
'SetRights(WMObject, User)
|
|
oDocument.Save()
|
|
oDocument.unlock()
|
|
LOGGER.Debug(" ### Indexierung erfolgreich beendet (Save und Unlock durchgeführt) ###", False)
|
|
Return True
|
|
Else
|
|
LOGGER.Info(" ### Dokument ist gesperrt, Indexierung nicht möglich! ###", False)
|
|
frmValidator.idxerr_message = "Dokument " & oDocument.aName & " ist gesperrt, Indexierung nicht möglich"
|
|
Return False
|
|
End If
|
|
End If
|
|
Catch ex As Exception
|
|
LOGGER.Error(ex)
|
|
LOGGER.Info("ClassSearchResult.RunIndexing - " & ex.Message, True)
|
|
frmValidator.idxerr_message = "Unvorhergesehener Fehler in Indexing: " & ex.Message & vbNewLine & "vType: " & vType.ToString
|
|
oDocument.Save()
|
|
oDocument.unlock()
|
|
Return False
|
|
End Try
|
|
End Function
|
|
|
|
#End Region
|
|
|
|
|
|
|
|
End Class
|