ZsgImport/app/ZSG_Import/clsWindream.vb
Digital Data - Marlon Schreiber e09488a06b MS
2017-11-08 15:02:30 +01:00

1803 lines
85 KiB
VB.net
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

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 +++++"
''' <summary>
''' Konstruktor für die windream-Klasse
''' </summary>
''' <remarks></remarks>
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
''' <summary>
''' Initialisiert die statische Klasse (Login, Session starten, usw.)
''' </summary>
''' <returns>Liefert True wenn das Anmelden erfolgreich war, sonst False</returns>
''' <remarks></remarks>
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
''' <summary>
''' Liefert alle Indexe eines Objekttypen.
''' </summary>
''' <param name="name">Name des Objekttyps</param>
''' <returns>Array mit allen Objekttyp zugeordneten Indexen als String</returns>
''' <remarks></remarks>
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 +++++"
''' <summary>
''' Liefert True wenn die windream-Session angemeldet ist und False für den Fall, dass die Session nicht eingeloggt ist.
''' </summary>
''' <returns>Anmeldestatus als Boolean</returns>
''' <remarks></remarks>
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
''' <summary>
''' Liefert den Servernamen an dem windream aktuell angemeldet ist.
''' </summary>
''' <returns>Servername als String</returns>
''' <remarks></remarks>
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
''' <summary>
''' Checks if folder exists in windream.
''' </summary>
''' <param name="substring_path">path to folder without drive</param>
''' <returns>Returns true if exists, fals eif not</returns>
''' <remarks></remarks>
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
''' <summary>
''' Übergibt einer in windream gespeicherten Datei Indexwerte
''' </summary>
''' <param name="filenameQuelle">Name der zu indexierenden Datei</param>
''' <param name="filenameZiel">neuer Name der zu indexierenden Datei</param>
''' <returns>Liefert True wenn das Indexieren erfolgreich war, sonst False</returns>
''' <remarks></remarks>
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
''' <summary>
''' Überprüft ob der angegebene Index im Objekttyp existiert
''' </summary>
''' <param name="objekttyp">Name des zu durchsuchenden Objekttyps</param>
''' <param name="indexname">Name des zu suchenden Indexes</param>
''' <returns>Liefert True wenn der Index im Objekttyp existiert, sonst False</returns>
''' <remarks></remarks>
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
''' <summary>
''' Führt das eigendliche Indexieren aus
''' </summary>
''' <param name="filenameZiel">Dateiname der zu indexierenden Datei</param>
''' <param name="index">Name des zu indexierenden Indexfeldes</param>
''' <param name="werte">Der Wert/die Werte die dem Index zugewiesen werden sollen</param>
''' <returns>Liefert True wenn das Indexieren erfolgreich war, sonst False</returns>
''' <remarks></remarks>
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
''' <summary>
''' Diese Funktion überprüft ob eine Variable ein Array ist, oder nicht.
''' </summary>
''' <param name="arrayOrNot">Variable die überprüft werden soll</param>
''' <returns>Liefert True wenn es sich um ein Array handelt, sonst False</returns>
''' <remarks></remarks>
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
''' <summary>
''' Diese Funktion überprüft ob eine Variable eine ArrayList ist, oder nicht.
''' </summary>
''' <param name="arrayOrNot">Variable die überprüft werden soll</param>
''' <returns>Liefert True wenn es sich um eine ArrayList handelt, sonst False</returns>
''' <remarks></remarks>
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
''' <summary>
''' Diese Funktion errechnet aus einem Datum den Unix-Timestamp
''' </summary>
''' <param name="FromDateTime">Datum, für das der Timestamp errechnet werden soll</param>
''' <returns>Liefert den Timestamp als Integer</returns>
''' <remarks></remarks>
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
''' <summary>
''' Liefert den Typen eines Indexes als Integer.
''' </summary>
''' <param name="indexname">Name des zu überprüfenden Indexfeldes</param>
''' <returns>Liefert eine Zahl, die einen Typen beschreibt</returns>
''' <remarks></remarks>
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