Imports WINDREAMLib Imports WINDREAMLib.WMCOMEvent Imports WINDREAMLib.WMEntity Imports WINDREAMLib.WMObjectEditMode Imports WINDREAMLib.WMSearchOperator Imports WINDREAMLib.WMSearchRelation Imports WMOBRWSLib Imports System.IO Public Class clsWindream #Region "+++++ Konstanten +++++" Const DEBUG = AUS Const AUS = 0 Const WINDREAM = 1 Const VARIABLEN = 2 Const WMObjectStreamOpenModeReadWrite = 2 Const WMObjectVariableValueTypeUndefined = 0 Const WMObjectVariableValueTypeString = 1 Const WMObjectVariableValueTypeInteger = 2 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 #End Region #Region "+++++ Variablen +++++" Public Shared oConnect ' der Typ darf nicht festgelegt werden (warum auch immer... geht sonst nicht) Public Shared oSession 'As WINDREAMLib.WMSession ' der Typ darf nicht festgelegt werden (warum auch immer... geht sonst nicht) Public _inited Public Shared oBrowser As New WMOBRWSLib.ServerBrowser Public Shared oDokumentTypen As WINDREAMLib.WMObjects Public Shared _WDObjekttyp As String Public Shared aktWMObject As WINDREAMLib.WMObject Public Shared WD_SERVER Public Shared CURRENT_WMObject As WMObject Public Shared WMFILE_existed As Boolean = False #End Region #Region "+++++ Allgemeine Methoden und Funktionen +++++" ''' ''' Konstruktor für die windream-Klasse ''' ''' Sub New() ' wenn ein Fehler bei der Initialisierung auftrat If Not clsWindream.Init() Then ' Nachricht ausgeben clsLogger.Add("windream could not be init'ed", True) ' das Programm "abschießen" 'Process.GetCurrentProcess.Kill() End If End Sub ''' ''' Initialisiert die statische Klasse (Login, Session starten, usw.) ''' ''' Liefert True wenn das Anmelden erfolgreich war, sonst False ''' Public Shared Function Init() As Boolean Try Try ' Session-Objekt instanziieren und mit dem im Client ausgewählten Server belegen oSession = CreateObject("Windream.WMSession", GetCurrentServer) clsLogger.AddDetailLog("windream-Server: '" & GetCurrentServer() & "'") ' Connection-Objekt instanziieren oConnect = CreateObject("Windream.WMConnect") Catch ex As Exception Return False End Try ' wenn windream nicht angemeldet ist If IsLoggedIn() = False Then ' Art der Anmeldung an windream festlegen ' 0x0L (also 0) = Standard windream Benutzer ' WM_ODULE_ID_DOCTYPEEDITOR_LIC = ermöglicht Zugriff auf die windream Management Funktionen (Z.B. zur Verwaltung der windream Dokumententypen, Auswahllisten, etc.) ' WM_MODULE_ID_INDEXSERVICE = ermöglicht der Session die Indexierungs-Events vom windream DMS-Service zu empfangen oConnect.ModuleID = 0 ' setzt die minimal erwartete windream-Version oConnect.MinReqVersion = "3" ' -- Impersonifizierung nur möglich mit registry-eintrag -- ' oConnect.UserName "\schulung\windream" ' oConnect.Password "windream" ' Verbindung mit Session-Objekt (und dem ausgewählten Server) aufbauen oConnect.LoginSession(oSession) If oSession.aLoggedin = False Then clsLogger.Add("Could not create connection with windream server", True) Return False End If 'If My.Settings.vDetailLog Then ' ClassLogger.Add("windream-Version: '" & oSession.GetSystemInfo("WindreamVersion") & "'", False) 'End If ' AUSGABE VON SYSTEMINFORMATIONEN ' Gibt die Versionsart (Lizenztyp) also Small-Business-Edition (SBE), Small-Business-Extension (SBX) ' oder Business-Edition (BE) aus 'MsgBox("WindreamVersion: " & oSession.GetSystemInfo("WindreamVersion") & vbNewLine & "LicenceKey: " & oSession.GetSystemInfo("LicenceKey") & vbNewLine & _ ' vbNewLine & "LicenceName: " & oSession.GetSystemInfo("LicenceName")) 'Dim WMCtrl As AISCONTROLDATACOMLib.AISControlData 'WMCtrl = New AISCONTROLDATACOMLib.AISControlData '' liefert die Versionsnummer des Clients 'MsgBox(WMCtrl.WMWorkstationBuildNo) 'MsgBox(WMCtrl.W '' liefert den Servernamen des angemeldeten windreams 'MsgBox(WMCtrl.WMServerName) Try oSession.SwitchEvents(WMCOMEventWMSessionNeedIndex, False) ' der Parameter WMEntityDocument definiert, dass nur Dokumenttypen und keine ' Ordnertypen ausgelesen werden oDokumentTypen = oSession.GetWMObjectTypes(WINDREAMLib.WMEntity.WMEntityDocument) Catch ex As Exception Return False End Try End If Return True Catch ex As Exception clsLogger.Add("Unexpected Error in windream init:" & ex.Message, True) Return False End Try End Function #End Region #Region "+++++ Funktionen die für den Objekttyp relevate Informationen zurückliefern +++++" Public Function GetTypeOfIndex(ByVal indexname As String) As Integer Try Dim oAttribute = clsWindream.oSession.GetWMObjectByName(WINDREAMLib.WMEntity.WMEntityAttribute, indexname) Dim vType = oAttribute.getVariableValue("dwAttrType") Return vType Catch ex As Exception Return Nothing End Try End Function ''' ''' Liefert alle Indexe eines Objekttypen. ''' ''' Name des Objekttyps ''' Array mit allen Objekttyp zugeordneten Indexen als String ''' Public Shared Function GetIndicesByObjecttype(ByVal Objecttype_name As String) As String() Try Dim oObjectType As WMObject Dim oIndexAttributes As WMObjectRelation Dim oIndexAttribute As WMObject Dim oIndex As WMObject Dim oRelProperties As WMObjectRelationClass ' den Objekttyp laden oObjectType = oSession.GetWMObjectByName(WMEntityObjectType, Objecttype_name) ' Beziehung zu Indizes des Objekttyp auslesen oIndexAttributes = oObjectType.GetWMObjectRelationByName("TypeAttributes") ' Array für Indizes vorbereiten Dim aIndexNames(oIndexAttributes.Count - 1) As String ' alle Indizes durchlaufen For j As Integer = 0 To oIndexAttributes.Count - 1 ' aktuellen Index auslesen oIndexAttribute = oIndexAttributes.Item(j) ' Eigenschaften des Index auslesen oRelProperties = oIndexAttribute.GetWMObjectRelationByName("Attribute") ' Index aus den Eigenschaften auslesen oIndex = oRelProperties.Item(0) ' Indexname speichern aIndexNames(j) = oIndex.aName Next ' Indexarray zurückgeben Return aIndexNames Catch ex As Exception clsLogger.Add("Error reading windream-indices: " & ex.Message, True) Return Nothing End Try End Function #End Region #Region "+++++ Allgemeine Funktionen die Informationen zurückliefern +++++" ''' ''' Liefert True wenn die windream-Session angemeldet ist und False für den Fall, dass die Session nicht eingeloggt ist. ''' ''' Anmeldestatus als Boolean ''' Public Shared Function IsLoggedIn() As Boolean Try Return oSession.aLoggedin Catch ex As Exception clsLogger.Add("Error while checking session - Errormessage:" & vbNewLine & ex.Message, True) End Try Return False End Function ''' ''' Liefert den Servernamen an dem windream aktuell angemeldet ist. ''' ''' Servername als String ''' Public Shared Function GetCurrentServer() As String Try WD_SERVER = oBrowser.GetCurrentServer Return oBrowser.GetCurrentServer 'ClassWindream.oBrowser.GetCurrentServer Catch ex As Exception clsLogger.Add("Error while getting windream-Server - Errormessage: " & ex.Message, True) End Try Return "" End Function #End Region Public Shared Function GetWMSessionAsUser(Domain, ServerName, UserName, Password) Try Dim SessionAsUser Dim aConnect, aUserId, aSession ' Hilfsobjekte erschaffen, um eine Verbindung zum windream Server herzustellen ' mit der gewünschten Benutzer-Identität aConnect = CreateObject("Windream.WMConnect") 'Bei einer impersonifizierten Session ist zu beachten, dass die ModuleID 9 zu nutzen ist. 'Wird keine Session-ID angegeben, hat die Session die ID 0 (‚Default‘). aConnect.ModuleId = 9 If Err.Number <> 0 Then Dim msg = "Error in CreateObject (aConnect) - Err.Number: " & Err.Number & vbNewLine & Err.Description clsLogger.Add(msg, True) Return Nothing End If aUserId = CreateObject("WMOTool.WMUserIdentity") If Err.Number <> 0 Then Dim msg = "Error in CreateObject('WMOTool.WMUserIdentity') - Err.Number: " & Err.Number & vbNewLine & Err.Description clsLogger.Add(msg, True) Return Nothing End If aUserId.aDomain = Domain aUserId.aServerName = ServerName aUserId.aUserName = UserName aUserId.aPassword = Password aSession = aConnect.Login(aUserId) oSession = Nothing If Err.Number <> 0 Then Dim msg = "Error in Connect.Login(aUserId) - Err.Number: " & Err.Number & vbNewLine & Err.Description clsLogger.Add(msg, True) Return Nothing Else SessionAsUser = aSession If aSession.aLoggedin = True Then oSession = SessionAsUser Return SessionAsUser End If End If Catch ex As Exception Dim msg = "Unexpected Error in GetWMSessionAsUser: " & ex.Message clsLogger.Add(msg, True) Return Nothing End Try End Function ''' ''' Checks if folder exists in windream. ''' ''' path to folder without drive ''' Returns true if exists, fals eif not ''' Public Shared Function WD_PATH_EXISTS(substring_path As String) Try Dim folder_exists = oSession.WMObjectExists(WINDREAMLib.WMEntity.WMEntityFolder, substring_path, 0, 0) Return folder_exists Catch ex As Exception clsLogger.Add(String.Format("Unexpected error in WD_PATH_EXISTS ({0}): {1} ", substring_path, ex.Message), True) Return False End Try End Function Public Shared Function Create_FOLDER_FROM_PATH(ByVal WM_FOLDER As String) Try If WM_FOLDER.Contains(":") Then WM_FOLDER = WM_FOLDER.Substring(2) End If Dim WMObject As WINDREAMLib.WMObject If IsNothing(oSession) Then clsLogger.Add(">> There is no windream session active!", True) Return False End If Try WMObject = oSession.GetNewWMObjectFS(WMEntityFolder, WM_FOLDER, WMObjectEditModeNoEdit) Catch ex As Exception clsLogger.Add(">> Could not create WMObject in Create_FOLDER_FROM_PATH '" & WM_FOLDER & "': " & ex.Message, True) Return False End Try Return True Catch ex As Exception Return False End Try End Function Public Shared Function Stream_File(ByVal filenameQuelle As String, ByVal Ziel As String, WDSession As Object, Optional Importall As Boolean = False) Try clsLogger.AddDetailLog("Starting StreamFile....") clsLogger.AddDetailLog("filenameQuelle: " & filenameQuelle) clsLogger.AddDetailLog("filenameZiel: " & Ziel) WMFILE_existed = False aktWMObject = Nothing Dim zielpfad = Path.GetDirectoryName(Ziel) If zielpfad.StartsWith("W:") Then zielpfad = zielpfad.Substring(2) End If If WD_PATH_EXISTS(zielpfad) = False Then Dim split() As String = zielpfad.Split("\") Dim Path_Combined As String = "" For Each s As String In split Path_Combined &= s & "\" If Path_Combined <> "W:\" Then Dim temppath = Path_Combined Try temppath = Path_Combined.Substring(0, temppath.Length) clsLogger.AddDetailLog("Checking if partpath exists: " & temppath) Select Case WD_PATH_EXISTS(temppath) Case False oSession.GetNewWMObjectFS(2, temppath, 0) 'WMEntityFolder,WMObjectEditModeNoEdit) Case -10 Return False End Select Catch ex As Exception If Not ex.Message.Contains("Filename exists!") Then clsLogger.Add(String.Format(">> Could not create folder-part: {0} - Complete path is: {1}", temppath, zielpfad), True) clsLogger.Add(String.Format(">> ErrorMessage: {0}: ", ex.Message), True) clsLogger.WriteLog() Return False End If End Try End If Next 'If Create_FOLDER_FROM_PATH(zielpfad) = False Then ' Return False 'Else ' clsLogger.Add(">> Zielverzeichnis neu erzeugt!", False) 'End If End If Const STREAM_BinaryObject = "BinaryObject" clsLogger.AddDetailLog("Stream_File wurde gestartet") Dim endgültigerDateiname As String = "" clsLogger.AddDetailLog("Quelldatei gelesen") If Ziel.StartsWith("W:") Then endgültigerDateiname = Ziel.Substring(2) End If If WD_PATH_EXISTS(zielpfad) = True Then clsLogger.AddDetailLog("targetPath exisitiert") clsLogger.AddDetailLog("Datei kopieren von " & filenameQuelle & " nach " & endgültigerDateiname & ".") Dim WMObject Dim aFileIO Dim aWMStream Dim wmbrwsr Dim dmsServer As String aFileIO = New WMOTOOLLib.WMFileIO 'If My.Settings.DLL_WMOTOOL = "" Then ' aFileIO = New WMOTOOLLib.WMFileIO ' clsLogger.AddDetailLog("Direkter Verweis auf New WMOTOOLLib.WMFileIO") 'Else ' aFileIO = CreateObject(My.Settings.DLL_WMOTOOL) 'WMOTool.WMFileIO oder WMOTOOLLib.WMFileIO ' clsLogger.AddDetailLog("Verwendeter Verweis aus Anwendungsstring: '" & My.Settings.DLL_WMOTOOL & "'") 'End If wmbrwsr = CreateObject("WMOBrws.ServerBrowser") '================================================================== ' get the current DMS-server to log in '================================================================== dmsServer = wmbrwsr.GetCurrentServer Const WMCOMEventWMSessionNeedIndex = 1 'windream Objekte erstellen ohne Indexierungs-Event WDSession.SwitchEvents(WMCOMEventWMSessionNeedIndex, False) '================================================================== ' check if files exist '================================================================== clsLogger.AddDetailLog("ÜBERPRÜFTER DATEINAME => " & endgültigerDateiname) Dim wdFilexists As Boolean clsLogger.AddDetailLog("Versuch auf die Datei in windream zuzugreifen und zu sperren...") wdFilexists = WDSession.WMObjectExists(WMEntityDocument, endgültigerDateiname, 0, 0) If wdFilexists = False Then clsLogger.AddDetailLog("Datei ist NICHT vorhanden, kann also einfach neu angelegt werden") Err.Clear() '================================================================== ' create an object '================================================================== clsLogger.AddDetailLog("Creating WMObject '" & endgültigerDateiname & "'") WMObject = WDSession.GetNewWMObjectFS(WMEntityDocument, endgültigerDateiname, WMObjectEditModeObject) clsLogger.AddDetailLog("WMObject was created....") If Err.Number > 0 Then clsLogger.Add(" FEHLER: WMObject konnte nicht erzeugt werden - Error: '" & Err.Description & "'", True) End If Else ' wenn auf die Datei zugeriffen werden konnte ist sie bereits vorhanden -> Datum anhängen clsLogger.Add("==> DATEI IST BEREITS VORHANDEN", False) Err.Clear() WMObject = WDSession.GetWMObjectByPath(WMEntityDocument, endgültigerDateiname) aktWMObject = WMObject WMFILE_existed = True If Err.Number > 0 Then clsLogger.Add(" FEHLER: Neues WMObject (Kopie) konnte nicht erzeugt werden - Error: '" & Err.Description & "'", True) End If clsLogger.AddDetailLog("WMObject(Existing) was created....") Return True End If clsLogger.AddDetailLog("ENDGÜLTIGER DATEINAME => " & endgültigerDateiname) If WMObject IsNot Nothing Then aktWMObject = WMObject ' lock object for file system access (to change the file itself) WMObject.lock() ' set fileIO the local source file aFileIO.bstrOriginalFileName = filenameQuelle If Err.Number > 0 Then clsLogger.Add(" FEHLER: fileIO konnte nicht gesetzt werden - Datei wird wieder gelöscht - Error: '" & Err.Description & "'", True) clsLogger.Add(" HINWEIS: Überprüfen Sie den Verweis auf die Bibliotheken 'WMOTool.WMFileIO' UND 'WMOTOOLLib.WMFileIO' und ändern diese in den Anwendungseinstellungen (DLL_WMOTOOL)'", False) WMObject.unlock() Delete_WDFile(endgültigerDateiname) Return False End If ' open the windream object's file stream for writing aWMStream = WMObject.OpenStream(STREAM_BinaryObject, WMObjectStreamOpenModeReadWrite) If Err.Number > 0 Then clsLogger.Add(" FEHLER bei OpenStream - Datei wird wieder gelöscht - Error: '" & Err.Description & "'", True) WMObject.unlock() Delete_WDFile(endgültigerDateiname) Return False End If clsLogger.AddDetailLog("oWMStream erzeugt") ' give fileIO helper object the windream stream aFileIO.aWMStream = aWMStream If Err.Number > 0 Then clsLogger.Add(" FEHLER bei Zuweisen aWMStream zu aFileIO - Datei wird wieder gelöscht - Error: '" & Err.Description & "'", True) WMObject.unlock() Delete_WDFile(endgültigerDateiname) Return False End If ' let fileIO object import the original file into windream aFileIO.ImportOriginal(True) If Err.Number > 0 Then clsLogger.Add(" FEHLER bei FileIO.ImportOriginal(True) - Datei wird wieder gelöscht - Error: '" & Err.Description & "'", True) WMObject.unlock() Delete_WDFile(endgültigerDateiname) Return False End If clsLogger.AddDetailLog("Inhalt der Datei konnte übertragen werden") ' close the windream file stream aWMStream.Close() If Err.Number > 0 Then clsLogger.Add(" FEHLER bei aWMStream.Close() - Datei wird wieder gelöscht - Error: '" & Err.Description & "'", True) WMObject.unlock() Delete_WDFile(endgültigerDateiname) Return False End If ' save new windream object WMObject.Save() If Err.Number > 0 Then clsLogger.Add(" FEHLER bei WMObject.save - Datei wird wieder gelöscht - Error: '" & Err.Description & "'", True) WMObject.unlock() Delete_WDFile(endgültigerDateiname) Return Err.Number End If clsLogger.AddDetailLog("Datei konnte gespeichert werden") ' unlock the windream object WMObject.unlock() If Err.Number > 0 Then clsLogger.Add(" FEHLER bei WMObject.unlock - Datei wird wieder gelöscht - Error: '" & Err.Description & "'", True) WMObject.unlock() Delete_WDFile(endgültigerDateiname) Return False End If 'DATEI GRÖSSE ERMITTELN - MANCHMAL KOMMT ES VOR DAS DATEIGRÖße 0 ist If endgültigerDateiname.StartsWith("\") Then If endgültigerDateiname.StartsWith("\\") Then endgültigerDateiname = endgültigerDateiname.Replace("\\", "\") End If Else endgültigerDateiname = "\" & endgültigerDateiname End If CURRENT_FILEIN_WD = endgültigerDateiname CURRENT_FILEIN_WD = CURRENT_FILEIN_WD.Replace("\\", "\") clsLogger.AddDetailLog("File '" & CURRENT_FILEIN_WD & "' was imported.") Return True Else clsLogger.Add("WMObjekt is nothing", True) Return False End If Else clsLogger.Add("targetPath exisitiert NICHT", True) Return False End If Catch ex As Exception clsLogger.Add("Unexpected Error in Stream File: " & vbNewLine & ex.Message, True) Return False End Try End Function Public Shared Function Delete_WDFile(ByVal WD_File As String) Try If WD_File.StartsWith("\") = False Then WD_File = WD_File.Substring(2) End If Dim WMObject As WINDREAMLib.WMObject '= CreateObject("WINDREAMLib.WMObject") 'New WINDREAMLib.WMObject Try WMObject = oSession.GetWMObjectByPath(WINDREAMLib.WMEntity.WMEntityDocument, WD_File) 'WINDREAMLib.WMEntity.WMEntityDocument clsWindream.CURRENT_WMObject = WMObject Catch ex As Exception clsLogger.Add(">> Could not create WMObject for file '" & WD_File & "' - so it is not existing", True) Return False End Try WMObject.Delete() Return True Catch ex As Exception clsLogger.Add("Unexpected Error in Delete_WDFile: '" & WD_File & "' " & ex.Message, True) Return False End Try End Function Public Shared Function WDFile_exists(ByVal WD_File As String) Try If Not WD_File.StartsWith("\") Then WD_File = WD_File.Substring(2) End If Dim WMObject As WINDREAMLib.WMObject '= CreateObject("WINDREAMLib.WMObject") 'New WINDREAMLib.WMObject WMObject = oSession.GetWMObjectByPath(WINDREAMLib.WMEntity.WMEntityDocument, WD_File) 'WINDREAMLib.WMEntity.WMEntityDocument clsLogger.AddDetailLog("WDFile_exists - Could create an object") Return True Catch ex As Exception clsLogger.AddDetailLog("WDFile_exists- Could not create object for file '" & WD_File & "'") Return False End Try End Function Public Shared Function Create_aktWDObjekt(ByVal WD_File As String) Try WD_File = WD_File.Substring(2) aktWMObject = Nothing aktWMObject = oSession.GetWMObjectByPath(WINDREAMLib.WMEntity.WMEntityDocument, WD_File) 'WINDREAMLib.WMEntity.WMEntityDocument Return True Catch ex As Exception clsLogger.Add("Unexpected Error in Create_aktWDObjekt: the file' " & WD_File & "' could not be transformed!", True) clsLogger.Add("Error-Description: " & ex.Message, False) ' Me.TreeNodeInfos.Add(temp) Return False End Try End Function ''' ''' Übergibt einer in windream gespeicherten Datei Indexwerte ''' ''' Name der zu indexierenden Datei ''' neuer Name der zu indexierenden Datei ''' Liefert True wenn das Indexieren erfolgreich war, sonst False ''' Public Shared Function IndexFile(ByVal WD_File As String, ByVal _Indexname As String, ByVal _Value As String, Optional outside As Boolean = False, Optional _objecttype As String = "") Try clsLogger.AddDetailLog("IndexFile ('" & WD_File & "','" & _Indexname & "','" & _Value & "') was called!") '' das entsprechende Attribut aus windream auslesen 'Dim oAttribute = oSession.GetWMObjectByName(WINDREAMLib.WMEntity.WMEntityAttribute, _Indexname) ''den Variablentyp (String, Integer, ...) auslesen 'Dim vType = oAttribute.getVariableValue("dwAttrType") WD_File = WD_File.Substring(2) Dim WMObject As WINDREAMLib.WMObject '= CreateObject("WINDREAMLib.WMObject") 'New WINDREAMLib.WMObject ' den Dokumenttyp schreiben clsLogger.AddDetailLog("Indexing will be started") If outside = True Then _WDObjekttyp = _objecttype aktWMObject = Nothing aktWMObject = oSession.GetWMObjectByPath(WINDREAMLib.WMEntity.WMEntityDocument, WD_File) 'WINDREAMLib.WMEntity.WMEntityDocument End If ' ein windream-Objekt der Datei anlegen WMObject = aktWMObject 'oSession.GetWMObjectByPath(WINDREAMLib.WMEntity.WMEntityDocument, WD_File) Try ' die Datei sperren WMObject.lock() Catch ex As Exception ' nichts tun (Datei ist bereits gesperrt) End Try ' wenn der Datei noch kein Dokumenttyp zugewiesen wurde If WMObject.aObjectType.aName = "Standard" Then Try ' ihr den entsprechenden Dokumenttyp zuweisen WMObject.aObjectType = oSession.GetWMObjectByName(WINDREAMLib.WMEntity.WMEntityObjectType, _WDObjekttyp) Catch ex As Exception clsLogger.Add("Unexpected Error Setting the objecttype' " & _WDObjekttyp & "'!", True) clsLogger.Add("Error-Description: " & ex.Message, False) WMObject.Save() WMObject.unlock() ' Me.TreeNodeInfos.Add(temp) Return False End Try ' WMObject.aObjectType = Me.selectedProfile.Dokumenttyp clsLogger.AddDetailLog("Objecttype '" & _WDObjekttyp & "' was set!") End If Try WMObject.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 Try WMObject.unlock() Catch ex As Exception ' wenn das entsperren nicht geklappt hat, dann war die Datei auch nicht gesperrt End Try clsLogger.AddDetailLog("File saved / Unlock done") ' wenn bis hierher alles geklappt hat wurde ein Dokumenttyp übergeben clsLogger.AddDetailLog("Objecttype: " & _WDObjekttyp) ' wenn keine Werte vorhanden sind, soll wenigstens der Dokumenttyp eingetragen werden Dim indexe As String = "" Dim werte = New ArrayList 'Den Typ des Index-Feldes auslesen If (GetTypeOfIndexAsIntByName(_Indexname) = WMObjectVariableValueTypeVector) Or GetTypeOfIndexAsIntByName(_Indexname) = 4097 Then clsLogger.AddDetailLog("type vectorfield") 'Am 04.08.2014 aktualisiert: um zu verhindern das die vorangegangene Versionierung "Tilde-Werte" schreibt clsLogger.AddDetailLog("value before checking: " & _Value) _Value = CheckIndexValue(_Value) 'Ausstieg da Fehler in der Überprüfung If _Value Is Nothing Then Return False End If werte.Add(_Value) clsLogger.AddDetailLog("value for indexing: " & _Value) Else 'Am 04.08.2014 aktualisiert: um zu verhindern das die vorangegangene Versionierung "Tilde-Werte" schreibt clsLogger.AddDetailLog("value before checking: " & _Value) _Value = CheckIndexValue(_Value) 'Ausstieg da Fehler in der Überprüfung If _Value Is Nothing Then Return False End If werte.Add(_Value) clsLogger.AddDetailLog("value for indexing: " & _Value) End If Dim arrIndex() As String = Nothing Dim arrValue() As String = Nothing ReDim Preserve arrIndex(0) ReDim Preserve arrValue(0) arrIndex(0) = _Indexname arrValue(0) = _Value Return RunIndexing(WMObject, arrIndex, arrValue) 'MsgBox(arr(0) & vbNewLine & indexe) Catch ex As Exception clsLogger.Add("Unexpected Error in IndexFile: the file' " & WD_File & "' could not be indexed!", True) clsLogger.Add("Error-Description: " & ex.Message, False) ' Me.TreeNodeInfos.Add(temp) Return False End Try End Function Public Shared Function IndexaktFile(ByVal _Indexname As String, ByVal _Value As String) Try Try ' die Datei sperren aktWMObject.lock() Catch ex As Exception ' nichts tun (Datei ist bereits gesperrt) End Try ' wenn der Datei noch kein Dokumenttyp zugewiesen wurde If aktWMObject.aObjectType.aName = "Standard" Then Try ' ihr den entsprechenden Dokumenttyp zuweisen aktWMObject.aObjectType = oSession.GetWMObjectByName(WINDREAMLib.WMEntity.WMEntityObjectType, _WDObjekttyp) Catch ex As Exception clsLogger.Add("Unexpected Error Setting the objecttype' " & _WDObjekttyp & "'!", True) clsLogger.Add("Error-Description: " & ex.Message, False) aktWMObject.Save() aktWMObject.unlock() ' Me.TreeNodeInfos.Add(temp) Return False End Try ' WMObject.aObjectType = Me.selectedProfile.Dokumenttyp clsLogger.AddDetailLog("Objecttype '" & _WDObjekttyp & "' was set!") End If Try aktWMObject.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 Try aktWMObject.unlock() Catch ex As Exception ' wenn das entsperren nicht geklappt hat, dann war die Datei auch nicht gesperrt End Try clsLogger.AddDetailLog("File saved / Unlock done") ' wenn bis hierher alles geklappt hat wurde ein Dokumenttyp übergeben clsLogger.AddDetailLog("Objecttype: " & _WDObjekttyp) ' wenn keine Werte vorhanden sind, soll wenigstens der Dokumenttyp eingetragen werden Dim indexe As String = "" Dim werte = New ArrayList 'Den Typ des Index-Feldes auslesen If (GetTypeOfIndexAsIntByName(_Indexname) = WMObjectVariableValueTypeVector) Or GetTypeOfIndexAsIntByName(_Indexname) = 4097 Then clsLogger.AddDetailLog("type vectorfield") 'Am 04.08.2014 aktualisiert: um zu verhindern das die vorangegangene Versionierung "Tilde-Werte" schreibt clsLogger.AddDetailLog("value before checking: " & _Value) _Value = CheckIndexValue(_Value) 'Ausstieg da Fehler in der Überprüfung If _Value Is Nothing Then Return False End If werte.Add(_Value) clsLogger.AddDetailLog("value for indexing: " & _Value) Else 'Am 04.08.2014 aktualisiert: um zu verhindern das die vorangegangene Versionierung "Tilde-Werte" schreibt clsLogger.AddDetailLog("value before checking: " & _Value) _Value = CheckIndexValue(_Value) 'Ausstieg da Fehler in der Überprüfung If _Value Is Nothing Then Return False End If werte.Add(_Value) clsLogger.AddDetailLog("value for indexing: " & _Value) End If Dim arrIndex() As String = Nothing Dim arrValue() As String = Nothing ReDim Preserve arrIndex(0) ReDim Preserve arrValue(0) arrIndex(0) = _Indexname arrValue(0) = _Value Return RunIndexing(aktWMObject, arrIndex, arrValue) 'MsgBox(arr(0) & vbNewLine & indexe) Catch ex As Exception clsLogger.Add("Unexpected Error in IndexFile: the file' " & aktWMObject.aName & "' could not be indexed!", True) clsLogger.Add("Error-Description: " & ex.Message, False) ' Me.TreeNodeInfos.Add(temp) Return False End Try End Function Public Shared Function File_SetBooleanIndex(ByVal _value As Boolean, ByVal _dok As WINDREAMLib.WMObject, ByVal _Indexname As String, Optional SetOType As Boolean = True) Try If _Indexname <> "" Then 'Überprüfen ob Boolean-Value bereits gesetzt wurde? Dim akt_Status As Boolean = CBool(_dok.GetVariableValue(_Indexname)) If akt_Status <> _value Then 'Index muß angepasst werden clsLogger.AddDetailLog("Index not set to '" & _value.ToString & "'") Dim arrIndex() As String = Nothing Dim arrValue() As String = Nothing 'Nun die Datei indexieren arrIndex = Nothing arrValue = Nothing ReDim Preserve arrIndex(0) ReDim Preserve arrValue(0) arrIndex(0) = _Indexname arrValue(0) = _value.ToString RunIndexing(_dok, arrIndex, arrValue, SetOType) Else 'Validation muß nicht angepasst werden clsLogger.AddDetailLog("Index already set to '" & _value.ToString & "'") End If End If Catch ex As Exception clsLogger.Add("Unexpected Error in File_SetBooleanIndex!", True) clsLogger.Add("Error-Description: " & ex.Message, False) End Try End Function Private Shared Function RunIndexing(ByVal oDocument As WMObject, ByVal Indizes() As String, ByVal aValues() As Object, Optional setOType As Boolean = True) Dim vektInsState As Integer = 1 Try If Indizes IsNot Nothing And aValues IsNot Nothing Then If Not oDocument.aLocked Then oDocument.lock() Dim i As Integer = 0 Dim indexname As String If aValues.Length = 1 And aValues(0) = "" Then clsLogger.AddDetailLog("Indexvalue is empty - No indexing") End If ' wenn der Datei noch kein Dokumenttyp zugewiesen wurde If oDocument.aObjectType.aName <> _WDObjekttyp And setOType = True Then ' ihr den entsprechenden Dokumenttyp zuweisen oDocument.aObjectType = oSession.GetWMObjectByName(WINDREAMLib.WMEntity.WMEntityObjectType, _WDObjekttyp) ' WMObject.aObjectType = Me.selectedProfile.Dokumenttyp clsLogger.AddDetailLog("Objecttype '" & oDocument.aObjectType.aName & "' was changed to '" & _WDObjekttyp) Else clsLogger.AddDetailLog("Objecttype was set already.") End If If setOType = True Then Try oDocument.Save() Catch ex As Exception ' wenn es einen Fehler beim speichern gab, dann konnte auch kein Objekttyp gesetzt werden -> es kann also auch keine ' Indexierung stattfinden und die Indexierung muss nicht fortgesetzt werden Return False End Try End If 'Jetzt jeden Indexwert durchlaufen For Each aName As String In Indizes indexname = aName clsLogger.AddDetailLog(" ") clsLogger.AddDetailLog("Indexing of index '" & indexname & "'") ' das entsprechende Attribut aus windream auslesen Dim oAttribute = oSession.GetWMObjectByName(WINDREAMLib.WMEntity.WMEntityAttribute, Indizes(i)) ' den Variablentyp (String, Integer, ...) auslesen Dim 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 Dim value = aValues(i) Dim convertValue Dim vektor As Boolean = False 'Den Typ des Index-Feldes auslesen Select Case (vType) 'Case WMObjectVariableValueTypeUndefined Case WMObjectVariableValueTypeString clsLogger.AddDetailLog("type of windreamIndex WMObjectVariableValueTypeString") convertValue = CStr(value) Case WMObjectVariableValueTypeInteger clsLogger.AddDetailLog("type of windreamIndex WMObjectVariableValueTypeInteger") value = value.ToString.Replace(" ", "") If IsNumeric(value) = False Then clsLogger.AddDetailLog("Attention: Value '" & value & "' can not be converted to integer!") End If value = value.ToString.Replace(" ", "") convertValue = CInt(value) _int = True Case WMObjectVariableValueTypeFloat clsLogger.AddDetailLog("type of windreamIndex WMObjectVariableValueTypeFloat") value = value.ToString.Replace(" ", "") convertValue = CDbl(value) Case WMObjectVariableValueTypeFixedPoint clsLogger.AddDetailLog("type of windreamIndex WMObjectVariableValueTypeFixedPoint") value = value.ToString.Replace(" ", "") convertValue = CDbl(value) _dbl = True Case WMObjectVariableValueTypeBoolean clsLogger.AddDetailLog("type of windreamIndex WMObjectVariableValueTypeBoolean") convertValue = CBool(value) _bool = True Case WMObjectVariableValueTypeDate clsLogger.AddDetailLog("type of windreamIndex WMObjectVariableValueTypeDate") _date = True 'Dim _date As Date = value convertValue = value Case WMObjectVariableValueTypeTimeStamp clsLogger.AddDetailLog("type of windreamIndex WMObjectVariableValueTypeTimeStamp") convertValue = CDbl(value) Case WMObjectVariableValueTypeCurrency clsLogger.AddDetailLog(" - type of windreamIndex 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 clsLogger.AddDetailLog("type of windreamIndex WMObjectVariableValueTypeTime") 'If ((value)) Then ' convertValue = CDate(value) 'Else ' convertValue = "" 'End If 'Dim _date As Date = value convertValue = convertValue '*_date.ToShortTimeString Case WMObjectVariableValueTypeFloat clsLogger.AddDetailLog("type of windreamIndex WMObjectVariableValueTypeFloat") convertValue = CStr(value) Case WMObjectVariableValueTypeVariant clsLogger.AddDetailLog("type of windreamIndex WMObjectVariableValueTypeVariant") convertValue = CStr(value) Case WMObjectVariableValueTypeFulltext clsLogger.AddDetailLog("type of windreamIndex WMObjectVariableValueTypeFulltext") convertValue = CStr(value) Case 4097 clsLogger.AddDetailLog("type of windreamIndex 4097 Vektor alphanumerisch") 'Vektor alphanumerisch vektor = True Case 4098 clsLogger.AddDetailLog("type of windreamIndex 4098 Vektor Numerisch") 'Vektor Numerisch vektor = True Case 4099 clsLogger.AddDetailLog("type of windreamIndex 4099 Vektor Kommazahl") 'Vektor Kommazahl vektor = True Case 4100 clsLogger.AddDetailLog("type of windreamIndex 4100 Vektor Boolean") 'Vektor Kommazahl vektor = True Case 4101 clsLogger.AddDetailLog("type of windreamIndex 4101 Vektor Date") 'Vektor Kommazahl vektor = True Case 4103 clsLogger.AddDetailLog("type of windreamIndex 4103 Vektor DateTime") 'Vektor DateTime vektor = True Case 4107 clsLogger.AddDetailLog("type of windreamIndex 4107 Integer 64bit") vektor = True Case 36865 clsLogger.AddDetailLog("type of windreamIndex 36865 Vektor alphanumerisch") 'Vektor Kommazahl vektor = True Case Else clsLogger.AddDetailLog("Typ des windream-Indexes konnte nicht bestimmt werden!") clsLogger.AddDetailLog("Versuch des Auslesens (vType): " & vType) convertValue = "" End Select If vektor = False Then If convertValue.ToString Is Nothing = False Then clsLogger.AddDetailLog("Converted valuet: '" & convertValue.ToString & "'") End If End If '############################################################################################ '####################### Der eigentliche Indexierungsvorgang ################################ '############################################################################################ If vektor = False Then Try If convertValue.ToString Is Nothing = False Then clsLogger.AddDetailLog("Now: oDocument.SetVariableValue(" & aName & ", " & convertValue & ")") If _int = True Then convertValue = convertValue.ToString.Replace(" ", "") 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 convertValue = convertValue.ToString.Replace(" ", "") oDocument.SetVariableValue(aName, CDbl(convertValue)) Else oDocument.SetVariableValue(aName, convertValue) End If 'Die Datei speichern oDocument.Save() clsLogger.AddDetailLog("index '" & aName & "' was written") clsLogger.AddDetailLog("") Else clsLogger.Add("No indexvalue exists", False) End If Catch ex As Exception clsLogger.Add("Unexpected Error in SetVariableValue für Index '" & aName & "': " & ex.Message, True) oDocument.Save() oDocument.unlock() Return False End Try Else 'VEKTORFELDER, ALSO ÜBERPRÜFEN OB ERGEBNIS-ARRAY GEFÜLLT IST clsLogger.AddDetailLog("Vectorfield: Preparing of Array") Dim myArray() 'If aValues.Length = 2 And aValues(0) = "" Then ' clsLogger.AddDetailLog("Indexwert ist leer/Nothing - Keine Nachindexierung") 'End If 'For Each row As DataRow In DT.Rows 'Next Dim Anzahl As Integer = aValues.Length 'Vektorfeld wird mit EINEM Wert gefüllt If Anzahl = 1 Then clsLogger.AddDetailLog("Vectorfield will be filled with ONE VALUE") ReDim myArray(0) myArray(0) = Convert_VectorType(vType, value) 'Jetzt überprüfen ob Werte in Vektorfeld angefügt oder überschrieben werden sollen clsLogger.AddDetailLog("Converted Value: " & myArray(0).ToString) Dim VektorArray() VektorArray = Return_VektorArray(oDocument, aName, myArray, vType) If VektorArray Is Nothing = False Then ReDim myArray(VektorArray.Length - 1) Array.Copy(VektorArray, myArray, VektorArray.Length) 'Jetzt die Nachindexierung für Vektor-Felder oDocument.SetVariableValue(aName, myArray) ' If LOG_ERRORS_ONLY = False Then clsLogger.AddDetailLog("Vectorindex '" & aName & "' was written") clsLogger.AddDetailLog("") End If 'Die Änderungen festsschreiben/speichern oDocument.Save() End If End If End If Else clsLogger.AddDetailLog("Array of indexvalues is nothing - No indexing") End If i += 1 Next oDocument.unlock() clsLogger.AddDetailLog("...and unlock.") Return True Else clsLogger.Add("document is locked!", False) 'oDocument.unlock() Return False End If End If Catch ex As Exception clsLogger.Add("Unexpected Error in ClassNiWindream.RunIndexing: " & ex.Message, True) oDocument.Save() oDocument.unlock() Return False End Try End Function Private Shared Function Return_VektorArray(ByVal oDocument As WMObject, vktIndexName As String, arr_Indexwerte As Object, vType As Object) Try Dim missing As Boolean = False Dim Anzahl As Integer = 0 Dim ValueArray() 'Jeden Wert des Vektorfeldes durchlaufen Dim wertWD = oDocument.GetVariableValue(vktIndexName) If wertWD Is Nothing = False Then 'Nochmals prüfen ob wirklich Array If wertWD.GetType.ToString.Contains("System.Object") Then 'Duplikat Prüfung an, also nur anhängen wenn Wert <> For Each WDValue As Object In wertWD If WDValue Is Nothing = False Then 'Erst die ALten Werte schreiben ReDim Preserve ValueArray(Anzahl) 'Den Wert im Array speichern ValueArray(Anzahl) = Convert_VectorType(vType, WDValue) Anzahl += 1 End If Next 'Jetzt die Neuen Werte auf Duplikate überprüfen For Each NewValue As Object In arr_Indexwerte If NewValue Is Nothing = False Then If ValueArray.Contains(NewValue) = False Then 'Das Array anpassen ReDim Preserve ValueArray(Anzahl) 'Den Wert im Array speichern ValueArray(Anzahl) = Convert_VectorType(vType, NewValue) Anzahl += 1 Else clsLogger.Add("Value '" & NewValue.ToString & "' already existing in vectorfield", False) End If End If Next End If Else clsLogger.AddDetailLog("vectorfield is empty....") 'Den/die Neuen Wert(e) anfügen For Each NewValue As Object In arr_Indexwerte If NewValue Is Nothing = False Then If ValueArray Is Nothing = False Then If ValueArray.Contains(NewValue) = False Then 'Das Array anpassen ReDim Preserve ValueArray(Anzahl) 'Den Wert im Array speichern ValueArray(Anzahl) = Convert_VectorType(vType, NewValue) Anzahl += 1 Else clsLogger.Add("Value '" & NewValue.ToString & "' already existing in Array", False) End If Else 'Dererste Wert, also hinzufügen 'Das Array anpassen ReDim Preserve ValueArray(Anzahl) 'Den Wert im Array speichern ValueArray(Anzahl) = Convert_VectorType(vType, NewValue) Anzahl += 1 End If End If Next End If Return ValueArray Catch ex As Exception clsLogger.Add("unexpected error in ClassWindream.Return_VektorArray: " & ex.Message, True) End Try End Function Public Shared Function REMOVE_VEKTOR_LINK(ByVal FILEPATH As String, vktIndexName As String, deleteValue As String) Try Dim WMObject As WINDREAMLib.WMObject Dim containsvalue As Boolean = False Try ' ein windream-Objekt der Datei erzeugen WMObject = oSession.GetWMObjectByPath(WINDREAMLib.WMEntity.WMEntityDocument, FILEPATH.Substring(2)) clsLogger.AddDetailLog("wibdreamObject created") Catch ex As Exception clsLogger.Add("Unexpected Error in Initializing windream file: " & ex.Message, False) Return False End Try Dim ValueArray() 'Jeden Wert des Vektorfeldes durchlaufen Dim wertWD = WMObject.GetVariableValue(vktIndexName) If wertWD Is Nothing = False Then 'Nochmals prüfen ob wirklich Array If wertWD.GetType.ToString.Contains("System.Object") Then ' das entsprechende Attribut aus windream auslesen Dim oAttribute = oSession.GetWMObjectByName(WINDREAMLib.WMEntity.WMEntityAttribute, vktIndexName) ' den Variablentyp (String, Integer, ...) auslesen Dim vType = oAttribute.getVariableValue("dwAttrType") Dim Anzahl As Integer = 0 For Each WDValue As Object In wertWD If WDValue Is Nothing = False Then If WDValue = deleteValue Then containsvalue = True End If If WDValue <> deleteValue Then 'Erst die ALten Werte schreiben ReDim Preserve ValueArray(Anzahl) 'Den Wert im Array speichern ValueArray(Anzahl) = Convert_VectorType(vType, WDValue) Anzahl += 1 End If End If Next End If End If If containsvalue = True Then 'And Not IsNothing(ValueArray) Try ' die Datei sperren WMObject.lock() Catch ex As Exception clsLogger.Add("Unexpected Error in locking windream file: " & ex.Message, False) Return False End Try 'Indexiern des Vektorfeldes WMObject.SetVariableValue(vktIndexName, ValueArray) ' die Indexinformationen des Dokuments speichern WMObject.Save() clsLogger.Add("The new vectorvalues were saved!", False) ' Unlock in einem unbehandelten Try-Block um Fehler abzufangen, ' wenn eine Datei nicht gesperrt ist Try ' die Sperrung des Dokuments aufheben WMObject.unlock() clsLogger.AddDetailLog("die Sperrung des Dokuments aufheben") Catch ex As Exception ' nichts tun (Datei war nicht gesperrt) End Try ' die Indexierungsinformationen für den TreeView-Log zurückgeben Return True Else clsLogger.Add("Could not remove the linked value!", True) Return False End If Catch ex As Exception clsLogger.Add("unexpected error in ClassWindream.REMOVE_VEKTOR_LINK: " & ex.Message, True) Return False End Try End Function Private Shared Function Convert_VectorType(vType As Object, value As String) Select Case vType Case 36865 'Umwandeln in String Return CStr(value) Case 4097 'Umwandeln in String Return CStr(value) Case 4098 'Umwandeln in Integer value = value.ToString.Replace(" ", "") Return CInt(value) Case 4099 Dim Str As String = value Str = Str.ToString.Replace(" ", "") 'Umwandeln in Double Return CDbl(Str.Replace(".", ",")) Case 4100 'Umwandeln in Boolean Return CBool(value) Case 4101 'Umwandeln in Date Return CDate(value) Case 4107 Return Convert.ToInt64(value) Case 4103 'Umwandeln in Datum Uhrzeit Return value Case Else 'Umwandeln in String Return CStr(value) End Select End Function Private Shared Function IsNotEmpty(ByVal aValue As Object) If aValue IsNot Nothing Then Dim itsType As Type = aValue.GetType If itsType Is GetType(String) Then If Not aValue = "" Then Return True End If Return False Else Return True End If Else Return False End If End Function ''' ''' Überprüft ob der angegebene Index im Objekttyp existiert ''' ''' Name des zu durchsuchenden Objekttyps ''' Name des zu suchenden Indexes ''' Liefert True wenn der Index im Objekttyp existiert, sonst False ''' Public Shared Function ExistIndexInObjekttyp(ByVal objekttyp As String, ByVal indexname As String) As Boolean Try Dim indexnamen() As String = GetIndicesByObjecttype(objekttyp) If indexnamen Is Nothing Then Return False For Each index As String In indexnamen If index = indexname Then Return True Next Catch ex As Exception clsLogger.Add("Error while checking index exists in Objecttype - Errormessage: " & vbNewLine & ex.Message, True) End Try Return False End Function ''' ''' Führt das eigendliche Indexieren aus ''' ''' Dateiname der zu indexierenden Datei ''' Name des zu indexierenden Indexfeldes ''' Der Wert/die Werte die dem Index zugewiesen werden sollen ''' Liefert True wenn das Indexieren erfolgreich war, sonst False ''' Private Shared Function Indexiere(ByVal filenameZiel As String, ByVal index As String, ByVal werte As Object) clsLogger.AddDetailLog("In Indexierungsvorgang für: " & filenameZiel) Try Dim WMObject As WINDREAMLib.WMObject = Nothing '= CreateObject("WINDREAMLib.WMObject") '= New WINDREAMLib.WMObject 'CreateObject("WINDREAMLib.WMObject") 'MsgBox("Indexiere: " & vbNewLine & filenameZiel) 'werte Is Nothing Or _ ' überprüfen ob alle notwendigen Informationen angegeben wurden (sonst abbrechen) If filenameZiel Is Nothing Or filenameZiel = "" Or index Is Nothing Or index = "" Or Not ExistIndexInObjekttyp(_WDObjekttyp, index) Then clsLogger.AddDetailLog("=> Hinweis: Die Datei wurde auf Grund eines Problems in der Initialisierung nicht vollständig indexiert.") Return False End If Dim fileExists As Boolean ' prüfen ob die zu indexierende Datei existiert fileExists = My.Computer.FileSystem.FileExists("W:" & filenameZiel) '_windream.GetWindreamDriveLetter Dim an As Integer = 0 Do While My.Computer.FileSystem.FileExists("W:" & filenameZiel) = False If an > 500 Then fileExists = False Exit Do Else clsLogger.AddDetailLog(" Achtung: Datei exisitiert noch nicht: " & My.Computer.Clock.LocalTime) End If an = an + 1 Loop ' wenn die Datei existiert If fileExists Then WMObject = oSession.GetWMObjectByPath(WINDREAMLib.WMEntity.WMEntityDocument, filenameZiel) ' eine Variable für den umgewandelten Indexwert anlegen (kein Typ, da noch unklar ist was reingeschrieben wird) 'Dim convertValue = Nothing ' den Typ des Zielindexes auslesen Dim TypDesIndexes As Integer Try ' ein windream-Objekt der Datei anlegen WMObject = oSession.GetWMObjectByPath(WINDREAMLib.WMEntity.WMEntityDocument, filenameZiel) clsLogger.AddDetailLog(" - windream-Objekt der Datei erzeugt") clsLogger.AddDetailLog(" - Ziel: W:\" & filenameZiel) 'Me.singleInfoNode.Add("Ziel: " & ClassDateiimportWindream.GetWindreamDriveLetter & filenameZiel) Try ' die Datei sperren WMObject.lock() 'WMObject.LockFor(WINDREAMLib.WMObjectEditMode.WMObjectEditModeObject) Catch ex As Exception End Try ' wenn der Datei noch kein Dokumenttyp zugewiesen wurde If WMObject.aObjectType.aName = "Standard" Then ' ihr den entsprechenden Dokumenttyp zuweisen WMObject.aObjectType = oSession.GetWMObjectByName(WINDREAMLib.WMEntity.WMEntityObjectType, _WDObjekttyp) ' WMObject.aObjectType = Me.selectedProfile.Dokumenttyp End If ' wenn keine Werte vorhanden sind, soll wenigstens der Dokumenttyp eingetragen werden If werte Is Nothing Then Try WMObject.Save() WMObject.unlock() Catch ex As Exception End Try Return Nothing End If ' den Typ des Zielindexes auslesen TypDesIndexes = GetTypeOfIndexAsIntByName(index) ' wenn es sich bei dem Index NICHT um ein Vektorfeld handelt If TypDesIndexes < WMObjectVariableValueTypeVector Then clsLogger.AddDetailLog("Bei dem Zielindex handelt es sich um einen Einzelindex.") Else clsLogger.AddDetailLog(" Bei dem Zielindex handelt es sich um ein Vektorfeld.") ' ein Backup der Indexwerte anlegen Dim temp As Object = werte ' und die eigendliche Variable zurücksetzen werte = Nothing ' dann soll nur der letzte Wert des Arrays übernommen werden, damit nicht versucht wird ein ' Array in einen Einzelindex zu speichern werte = temp clsLogger.AddDetailLog("Array geleert und erneuert!") End If Catch ex As Exception clsLogger.Add("Hinweis: Beim Initialisieren der Datei auf dem windream-Laufwerk ist ein Fehler aufgetreten.", False) Return False End Try 'Try ' den Typ des Zielindexes clsLogger.AddDetailLog("Typ des Indexes: " & TypDesIndexes.ToString) Select Case (TypDesIndexes) Case WMObjectVariableValueTypeUndefined ' zu klären !!!! 'convertValue = vbEmpty Case WMObjectVariableValueTypeString ''Führende Nullen Entfernen 'If werte.ToString.StartsWith("0") Then ' Dim wert As String = CStr(CInt(werte.ToString)) ' convertValue = wert ' ClassLogger.Add(" - Führende Nullen wurden entfernt") 'Else ' Dim wert As String = CStr(CInt(werte.ToString)) ' convertValue = wert 'End If 'If convertValue.ToString.Contains("~1") Then ' convertValue = convertValue.ToString.Replace("~1", "") 'End If 'If convertValue.ToString.Contains("~2") Then ' convertValue = convertValue.ToString.Replace("~2", "") 'End If 'If convertValue.ToString.Contains("~3") Then ' convertValue = convertValue.ToString.Replace("~3", "") 'End If 'If convertValue.ToString.Contains("~4") Then ' convertValue = convertValue.ToString.Replace("~4", "") 'End If Case WMObjectVariableValueTypeInteger ' convertValue = CInt(werte) Case WMObjectVariableValueTypeFloat werte = werte.ToString.Replace(".", ",") 'convertValue = CDbl(werte) Case WMObjectVariableValueTypeBoolean Try ' convertValue = CBool(werte) Catch ex As Exception ' Nothing zuweisen damit SetVariableValue nicht ausgeführt wird 'convertValue = Nothing End Try Case WMObjectVariableValueTypeDate If (IsDate(werte)) Then ' convertValue = CDate(werte) Else ' convertValue = vbEmpty End If Case WMObjectVariableValueTypeFixedPoint werte = werte.ToString.Replace(".", ",") ' convertValue = CDbl(werte) Case WMObjectVariableValueTypeTimeStamp Dim timestamp As Integer = GetTimestamp(werte) If timestamp > 0 Then ' convertValue = timestamp Else ' convertValue = vbEmpty End If Case WMObjectVariableValueTypeCurrency Dim aValue As System.Runtime.InteropServices.CurrencyWrapper = New System.Runtime.InteropServices.CurrencyWrapper(werte) ' convertValue = aValue Case WMObjectVariableValueTypeTime If (IsDate(werte)) Then ' convertValue = CDate(werte) ' ggf. aber nur die Zeit Else ' convertValue = vbEmpty End If Case WMObjectVariableValueTypeVariant ' convertValue = werte Case WMObjectVariableValueTypeMask ' zu klären !!!! ' convertValue = vbEmpty Case WMObjectVariableValueFlagMask ' zu klären !!!! ' convertValue = vbEmpty Case WMObjectVariableValueTypeFulltext 'convertValue = CStr(werte) Case WMObjectVariableValueTypeDefaultValue ' zu klären !!!! ' convertValue = vbEmpty Case Else ' wenn es sich um einen TypVektorIndex handelt If TypDesIndexes >= 4096 And TypDesIndexes < 8192 Then clsLogger.AddDetailLog("- Es handelt sich um einen Vektorindex") Dim temp_arr As New ArrayList Select Case (TypDesIndexes - WMObjectVariableValueTypeVector) 'VektorIndex vom Typ String 64' Case 1 clsLogger.AddDetailLog("- VektorIndex vom Typ String 1") For Each wert As Object In werte 'Führende Nullen Entfernen If werte.ToString.StartsWith("0") Then Dim werteString As String = CStr(CInt(wert.ToString)) wert = werteString temp_arr.Add(CStr(wert)) clsLogger.AddDetailLog("- Führende Nullen wurden entfernt") Else temp_arr.Add(CStr(wert)) End If clsLogger.AddDetailLog("- Wert " & CStr(wert) & " konvertiert") Next Case WMObjectVariableValueTypeUndefined ' convertValue = "" Case WMObjectVariableValueTypeString clsLogger.AddDetailLog("- VektorIndex vom Typ String 2") For Each wert As Object In werte 'Führende Nullen Entfernen If werte.ToString.StartsWith("0") Then wert = CInt(wert) temp_arr.Add(CStr(wert)) clsLogger.AddDetailLog("- Führende Nullen wurden entfernt") Else temp_arr.Add(CStr(wert)) End If clsLogger.AddDetailLog("- Wert " & CStr(wert) & " konvertiert") Next Case WMObjectVariableValueTypeInteger clsLogger.AddDetailLog("- VektorIndex vom Typ Integer") For Each wert As Object In werte temp_arr.Add(CInt(wert)) Next Case WMObjectVariableValueTypeFloat For Each wert As Object In werte wert = wert.ToString.Replace(".", ",") temp_arr.Add(CDbl(wert)) Next Case WMObjectVariableValueTypeBoolean For Each wert As Object In werte Try temp_arr.Add(CBool(wert)) Catch ex As Exception ' Nothing zuweisen damit SetVariableValue nicht ausgeführt wird temp_arr = Nothing End Try Next Case WMObjectVariableValueTypeDate For Each wert As Object In werte 'wert = temp_arr.Add(CDate(wert)) Next Case WMObjectVariableValueTypeFixedPoint For Each wert As Object In werte temp_arr.Add(CDbl(wert)) Next Case WMObjectVariableValueTypeTimeStamp For Each wert As Object In werte temp_arr.Add(CInt(wert)) Next Case WMObjectVariableValueTypeCurrency For Each wert As Object In werte Dim aValue As System.Runtime.InteropServices.CurrencyWrapper = New System.Runtime.InteropServices.CurrencyWrapper(werte) temp_arr.Add(aValue) Next Case WMObjectVariableValueTypeTime For Each wert As Object In werte temp_arr.Add(CDate(wert)) Next Case WMObjectVariableValueTypeVariant ' dann bleiben alle Werte wie sie sind End Select If temp_arr.Count > 0 Then clsLogger.AddDetailLog("- Einträge in temp_arr also Speichern des Arrays in convertValue") ' convertValue = Nothing ' convertValue = temp_arr.ToArray Else ' convertValue = vbEmpty End If clsLogger.AddDetailLog("- Werte erfolgreich konvertiert") Else ' convertValue = vbEmpty End If End Select 'Catch ex As Exception ' ' einen Hinweis über einen aufgetretenen Fehler an das Array für den TreeView-Log anhängen ' ClassLogger.Add("Fehler bei Auswerten/Konvertieren des Typs!", ex.Message) ' ' die Indexierungsinformationen für den TreeView-Log zurückgeben ' Return False 'End Try ' Try ' ***** Anmerkung: das Nachindexieren mit vbEmpty ist möglich (siehe oben) jedoch nicht ***** ' ***** das Indexieren mit einem Nothing-Wert !!! ***** ' wenn das Konvertieren soweit gut gelaufen ist (also kein Nothing-Wert zugewiesen wurde) ' If (convertValue Is Nothing) = False Then ' den konvertierten Indexwert dem entsprechenden Index zuweisen WMObject.SetVariableValue(index, werte) clsLogger.AddDetailLog(" - den konvertierten Indexwert dem entsprechenden Index zuweisen") clsLogger.AddDetailLog(" - Indexname: " & index.ToString) clsLogger.AddDetailLog(" - Indexwert: " & werte.ToString) 'End If ' die Indexinformationen des Dokuments speichern WMObject.Save() clsLogger.AddDetailLog("die Indexinformationen des Dokuments speichern") ' Unlock in einem unbehandelten Try-Block um Fehler abzufangen, ' wenn eine Datei nicht gesperrt ist Try ' die Sperrung des Dokuments aufheben WMObject.unlock() clsLogger.AddDetailLog("die Sperrung des Dokuments aufheben") Catch ex As Exception ' nichts tun (Datei war nicht gesperrt) End Try 'Catch ex As Exception ' ' auch wenn ein Fehler aufgetreten ist muss das Dokument gespeichert werden, um den Dokumenttypen zu speichern ' WMObject.Save() ' ' Unlock in einem unbehandelten Try-Block um Fehler abzufangen, ' ' wenn eine Datei nicht gelocked ist ' Try ' WMObject.unlock() ' Catch ex2 As Exception ' ' nichts tun (Datei war nicht gesperrt) ' End Try ' ' Nachricht für den TreeView-Log ' indexBeschreibung &= "konnte nicht indexiert werden" ' ClassLogger.Add(" DATEI konnte nicht indexiert werden", True) 'End Try ' die Indexierungsinformationen für den TreeView-Log zurückgeben Return True Else ' die Indexierungsinformationen für den TreeView-Log zurückgeben clsLogger.Add(" Hinweis: Die Datei hat zum Zeitpunkt der Indexierung noch nicht auf dem windream-Laufwerk existiert.", False) End If Catch ex As Exception clsLogger.Add(" Hinweis: Unbekannter Fehler beim Indexieren der Datei.", True) clsLogger.Add(ex.Message, False) Return False End Try Return True End Function ''' ''' Diese Funktion überprüft ob eine Variable ein Array ist, oder nicht. ''' ''' Variable die überprüft werden soll ''' Liefert True wenn es sich um ein Array handelt, sonst False ''' Private Shared Function IsArray(ByVal arrayOrNot As Object) Dim arrayType As String = UCase(arrayOrNot.GetType.ToString) ' überprüft an welcher Stelle sich ein '['-Zeichen befindet Dim position = InStr(arrayType, "[") ' existiert ein '['-Zeichen, so handelt es sich um ein Array (GetType wäre System.Object[]) If Not position = 0 Then Return True Else Return False End If End Function ''' ''' Diese Funktion überprüft ob eine Variable eine ArrayList ist, oder nicht. ''' ''' Variable die überprüft werden soll ''' Liefert True wenn es sich um eine ArrayList handelt, sonst False ''' Private Shared Function IsArrayList(ByVal arrayOrNot As Object) Dim arrayType As String = UCase(arrayOrNot.GetType.ToString) ' überprüft an welcher Stelle sich ein '['-Zeichen befindet Dim position = InStr(arrayType, "[") ' existiert ein '['-Zeichen, so handelt es sich um ein Array (GetType wäre System.Object[]) If arrayOrNot.GetType.ToString = "System.Collections.ArrayList" Then Return True Else Return False End If End Function ''' ''' Diese Funktion errechnet aus einem Datum den Unix-Timestamp ''' ''' Datum, für das der Timestamp errechnet werden soll ''' Liefert den Timestamp als Integer ''' Private Shared Function GetTimestamp(ByVal FromDateTime As DateTime) As Integer If IsDate(FromDateTime) Then Dim Startdate As DateTime = #1/1/1970# Dim Spanne As TimeSpan ' vom Datum das Datum des "Beginns der Zeitrechnung" abziehen Spanne = FromDateTime.Subtract(Startdate) ' die Zeitspanne in einen Integer umwandeln Return CType(Math.Abs(Spanne.TotalSeconds()), Integer) Else Return 0 End If End Function ''' ''' Liefert den Typen eines Indexes als Integer. ''' ''' Name des zu überprüfenden Indexfeldes ''' Liefert eine Zahl, die einen Typen beschreibt ''' Public Shared Function GetTypeOfIndexAsIntByName(ByVal indexname As String) As Integer Try Dim oAttribute = oSession.GetWMObjectByName(WINDREAMLib.WMEntity.WMEntityAttribute, indexname) Dim vType = oAttribute.getVariableValue("dwAttrType") Return vType Catch ex As Exception Return Nothing End Try End Function Private Shared Function CheckIndexValue(ByVal input) Try 'Ersetzt die Versionierungen Tilde(~) und Klammern ((1)) For i As Integer = 1 To 20 If input.ToString.EndsWith("~" & i.ToString) Then input = input.ToString.Replace("~" & i.ToString, "") ElseIf input.ToString.EndsWith("(" & i.ToString & ")") Then input = input.ToString.Replace("(" & i.ToString & ")", "") End If Next Return input Catch ex As Exception clsLogger.Add("Error in CheckIndexValue: " & ex.Message, True) Return Nothing End Try End Function End Class