TaskFlow/app/TaskFlow/ClassPMWindream.vb
Developer01 f21dbd3423 LookupControl Rückgabe Wert1','Wert2
VektorBoolean Handling und String.empty zum leeren
2025-08-18 18:28:21 +02:00

479 lines
28 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 WMObjectVariableValueTypeUndefined
Case WMObjectVariableValueTypeString
LOGGER.Debug("Typ des windream-Indexes: WMObjectVariableValueTypeString")
convertValue = CStr(value)
Case WMObjectVariableValueTypeInteger
LOGGER.Debug("Typ des windream-Indexes: WMObjectVariableValueTypeInteger")
If IsNumeric(value) = False Then
If value = String.Empty Then
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
'Dim ArrValues()
'ReDim ArrValues(0)
'ArrValues(0) = convertValue
'Dim ArrName()
'ReDim ArrName(0)
'ArrName(0) = "Tournr"
'oDocument.SetValues(ArrName, ArrValues)
'If convertValue = String.Empty Or convertValue = vbEmpty Then
' LOGGER.Debug("Now Indexing simpleAttribute with vbEmpty ...")
' oDocument.SetVariableValue(aName, String.Empty)
'Else
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)
Dim myArray()
'Dim anz As Integer = 0
'For Each obj In aValues
'ReDim Preserve myArray(anz)
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
LOGGER.Debug("Wert für Index vor Indexierung: [{0}]", myArray)
'Jetzt die Nachindexierung für Vektor-Felder
If vType = 4097 Or vType = 36865 Then
If myArray(0) = String.Empty 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
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