Imports WINDREAMLib
Imports WINDREAMLib.WMCOMEvent
Imports WINDREAMLib.WMEntity
Imports WINDREAMLib.WMObjectEditMode
Imports WINDREAMLib.WMSearchOperator
Imports WINDREAMLib.WMSearchRelation
Imports WMOBRWSLib
Imports WMOSRCHLib
Imports System.IO
Imports System.Text.RegularExpressions
Public Class ClassWindream
#Region "+++++ Konstanten +++++"
Const DEBUG = AUS
Const AUS = 0
Const WINDREAM = 1
Const VARIABLEN = 2
Const WMObjectStreamOpenModeReadWrite = 2
Const STREAM_BinaryObject = "BinaryObject"
Public Const WMObjectVariableValueTypeUndefined = 0
Public Const WMObjectVariableValueTypeString = 1
Public Const WMObjectVariableValueTypeInteger = 2
Public Const WMObjectVariableValueTypeFloat = 3
Public Const WMObjectVariableValueTypeBoolean = 4
Public Const WMObjectVariableValueTypeDate = 5
Public Const WMObjectVariableValueTypeFixedPoint = 6
Public Const WMObjectVariableValueTypeTimeStamp = 7
Public Const WMObjectVariableValueTypeCurrency = 8
Public Const WMObjectVariableValueTypeTime = 9
Public Const WMObjectVariableValueTypeVariant = 10
Public Const WMObjectVariableValueTypeMask = &HFFF
Public Const WMObjectVariableValueFlagMask = &HFFFFF000
Public Const WMObjectVariableValueTypeVector = &H1000
Public Const WMObjectVariableValueTypeFulltext = &H2000
Public Const WMObjectVariableValueTypeDefaultValue = &H4000
#End Region
#Region "+++++ Variablen +++++"
Public Shared oConnect ' der Typ darf nicht festgelegt werden (warum auch immer... geht sonst nicht)
Public Shared _session 'As WINDREAMLib.WMSession ' der Typ darf nicht festgelegt werden (warum auch immer... geht sonst nicht)
Public Shared oBrowser As New WMOBRWSLib.ServerBrowser
Public Shared _DocumentTypes As WINDREAMLib.WMObjects
Private _SearchController As New WMOSearchController
Public Shared _WDObjekttyp As String
Private Shared _currentWMObject As WINDREAMLib.WMObject
#End Region
#Region "+++++ Allgemeine Methoden und Funktionen +++++"
'''
''' Konstruktor für die windream-Klasse
'''
'''
Sub New()
' wenn ein Unexpected error in der Initialisierung auftrat
If Not ClassWindream.Init() Then
' Nachricht ausgeben
MsgBox("Es trat ein Unexpected error in der Initialisierung der Klasse windream auf. Bitte prüfen Sie ob der windream-Server aktiv ist und alle Dienste gestartet sind.", MsgBoxStyle.Exclamation, "Unexpected error in Initialisierung")
' das Programm "abschießen"
Process.GetCurrentProcess.Kill()
End If
End Sub
Public Function GetSearchDocuments(ByVal wdfLocation As String)
If System.IO.File.Exists(wdfLocation) Then
Try
Dim ProfileName = wdfLocation.Substring(wdfLocation.LastIndexOf("\") + 1)
Dim ProfilePath = wdfLocation.Substring(0, wdfLocation.Length - ProfileName.Length)
_SearchController = New WMOSearchController
Me._SearchController.CheckSearchProfile(wdfLocation.ToLower)
Dim suchTyp = Me._SearchController.SearchProfileTargetProgID
Dim ExSettings As Object
Dim oSearch As Object
ExSettings = Me._SearchController.SearchProfileExSettings
If ExSettings = 0 Then ExSettings = 7
Dim srchQuick As WMOSRCHLib.WMQuickSearch = CreateObject("WMOSrch.WMQuickSearch")
Dim srchIndex As WMOSRCHLib.WMIndexSearch = CreateObject("WMOSrch.WMIndexSearch")
Dim srchObjectType As WMOSRCHLib.WMObjectTypeSearch = CreateObject("WMOSrch.WMObjectTypeSearch")
'' Der öffentliche Member CheckSearchProfile für den Typ IWMQuickSearch7 wurde nicht gefunden. [Microsoft.VisualBasic] => GetSearchDocuments()
Select Case suchTyp.ToString.ToUpper
Case "WMOSRCH.WMQUICKSEARCH"
srchQuick.WMSession = CreateObject("Windream.WMSession", Me.GetCurrentServer)
Me.oConnect.LoginSession(srchQuick.WMSession)
srchQuick.ClearSearch()
srchQuick.SearchProfilePath = ProfilePath
srchQuick.LoadSearchProfile(ProfileName)
oSearch = srchQuick.GetSearch()
Case "WMOSRCH.WMINDEXSEARCH"
srchIndex.WMSession = CreateObject("Windream.WMSession", Me.GetCurrentServer)
Me.oConnect.LoginSession(srchIndex.WMSession)
srchIndex.ClearSearch()
srchIndex.SearchProfilePath = ProfilePath
srchIndex.LoadSearchProfile(ProfileName)
oSearch = srchIndex.GetSearch()
Case "WMOSRCH.WMOBJECTTYPESEARCH"
srchObjectType.WMSession = CreateObject("Windream.WMSession", Me.GetCurrentServer)
Me.oConnect.LoginSession(srchObjectType.WMSession)
srchObjectType.ClearSearch()
srchObjectType.SearchProfilePath = ProfilePath
srchObjectType.LoadSearchProfile(ProfileName)
oSearch = srchObjectType.GetSearch()
Case Else
MsgBox("KEIN GÜLTIGER WINDREAM-SUCHTYP")
Return Nothing
End Select
Dim WMObjects As Object
WMObjects = oSearch.Execute
Return oSearch.execute
Catch ex As Exception
' bei einem Fehler einen Eintrag in der Logdatei machen
MsgBox("Fehler in GetSearchDocuments: " & vbNewLine & ex.Message, MsgBoxStyle.Critical)
Return Nothing
End Try
End If
Return Nothing
End Function
Public Function GetSearchDocuments_Objekttype(ByVal wdfLocation As String)
If System.IO.File.Exists(wdfLocation) Then
Try
Dim ProfileName = wdfLocation.Substring(wdfLocation.LastIndexOf("\") + 1)
Dim ProfilePath = wdfLocation.Substring(0, wdfLocation.Length - ProfileName.Length)
' Me.oController.CheckSearchProfile(wdfLocation.ToLower)
' Dim suchTyp = Me.oController.SearchProfileTargetProgID
'Dim ExSettings As Object
Dim oSearch As Object
'ExSettings = Me.oController.SearchProfileExSettings
'If ExSettings = 0 Then ExSettings = 7
Dim srchObjectType As WMOSRCHLib.WMObjectTypeSearch = CreateObject("WMOSrch.WMObjectTypeSearch")
'' Der öffentliche Member CheckSearchProfile für den Typ IWMQuickSearch7 wurde nicht gefunden. [Microsoft.VisualBasic] => GetSearchDocuments()
srchObjectType.WMSession = CreateObject("Windream.WMSession", Me.GetCurrentServer)
Me.oConnect.LoginSession(srchObjectType.WMSession)
srchObjectType.ClearSearch()
srchObjectType.SearchProfilePath = ProfilePath
srchObjectType.LoadSearchProfile(ProfileName)
oSearch = srchObjectType.GetSearch()
Dim WMObjects As Object
WMObjects = oSearch.Execute
Return oSearch.execute
Catch ex As Exception
' bei einem Fehler einen Eintrag in der Logdatei machen
MsgBox("Fehler in GetSearchDocuments()" & vbNewLine & ex.Message, MsgBoxStyle.Critical)
Return Nothing
End Try
End If
Return Nothing
End Function
'''
''' 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
_session = CreateObject("Windream.WMSession", GetCurrentServer)
LOGGER.Info(" ...windream-Server: '" & GetCurrentServer() & "'")
' Connection-Objekt instanziieren
oConnect = CreateObject("Windream.WMConnect")
'MsgBox("windrem init 'ed")
Catch ex As Exception
LOGGER.Info("Windream konnte nicht initiiert werden: " & ex.Message)
LOGGER.Error(ex.Message)
Return False
End Try
' wenn windream nicht angemeldet ist
If Not IsLoggedIn() 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 = "4"
' -- 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(_session)
If _session.aLoggedin = False Then
MsgBox("Es konnte keine Verbindung mit dem windream-Server hergestellt werden", MsgBoxStyle.Exclamation, "Verbindung konnte nicht hergestellt werden")
Return False
End If
'If My.Settings.vDetailLog Then
' LOGGER.Info(" >> windream-Version: '" & oSession.GetSystemInfo("WindreamVersion") & "'")
'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
_session.SwitchEvents(WMCOMEventWMSessionNeedIndex, False)
' der Parameter WMEntityDocument definiert, dass nur Dokumenttypen und keine
' Ordnertypen ausgelesen werden
_DocumentTypes = _session.GetWMObjectTypes(WINDREAMLib.WMEntity.WMEntityDocument)
Catch ex As Exception
Return False
End Try
End If
Return True
Catch ex As Exception
If Err.Number = -2147220985 Then
MsgBox("Die installierte windream-Version ist nicht ausreichend für den Betrieb der Tool Collection für windream." & vbNewLine &
"Bitte kontaktieren Sie Digital Data." & vbNewLine & vbNewLine & "Fehlernachricht:" & vbNewLine & Err.Description, MsgBoxStyle.Exclamation, "Unzureichende windream-Version")
Else
MsgBox("Fehlernachricht:" & vbNewLine & ex.Message, MsgBoxStyle.Critical, "Unexpected error inm Login an windream")
End If
Return False
End Try
End Function
#End Region
#Region "+++++ Funktionen die für den Objekttyp relevate Informationen zurückliefern +++++"
'''
''' Liefert alle Objekttypen des aktuellen Servers als windream-Objekte.
'''
''' Alle Objekttypen als WMObjects-Objekt
'''
Public Shared Function GetObjecttypesAsObjects() As WMObjects
Try
Return _DocumentTypes
Catch ex As Exception
MsgBox("Fehlernachricht:" & vbNewLine & ex.Message, MsgBoxStyle.Critical, "Unexpected error inm Auslesen der Objekttypen")
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 = _session.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)
'Dim o = oRelProperties.Item(2)
' Indexname speichern
aIndexNames(j) = oIndex.aName
Next
'Indexarray sortiert zurückgeben
Array.Sort(aIndexNames)
' Indexarray zurückgeben
Return aIndexNames
Catch ex As Exception
MsgBox(ex.Message, MsgBoxStyle.Critical, "Unexpected error inm Auslesen der windream-Indexe")
Return Nothing
End Try
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
Return indexnamen.Contains(indexname)
Catch ex As Exception
MsgBox("Beim Prüfen ob ein Index für einen Objekttypen existiert, ist ein Fehler aufgetreten." & vbNewLine & vbNewLine & "Fehlernachricht:" & vbNewLine & ex.Message, MsgBoxStyle.Critical, "Unexpected error inm Prüfen auf Existenz eines Index in einem Objekttyp")
End Try
Return False
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 _session.aLoggedin
Catch ex As Exception
MsgBox("Es konnte nicht erfolgreich geprüft werden, ob das Programm am windream-Server angemeldted ist." & vbNewLine & vbNewLine & "Fehlernachricht:" & vbNewLine & ex.Message, MsgBoxStyle.Critical, "Unexpected error in Loggedin-Prüfung")
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
Return oBrowser.GetCurrentServer 'ClassWindream.oBrowser.GetCurrentServer
Catch ex As Exception
MsgBox("Der aktuell gewählte windream-Server konnte nicht ausgelesen werden." & vbNewLine & vbNewLine & "Fehlernachricht:" & vbNewLine & ex.Message, MsgBoxStyle.Critical, "Unexpected error inm Auslesen des windream-Servers")
End Try
Return ""
End Function
#End Region
Public Shared Function Stream_File(ByVal SourceFilePath As String, ByVal NewFileName As String)
_currentWMObject = Nothing
Dim oWindreamFilename As String = NewFileName
Dim oFileName As String = NewFileName
Dim oWDriveRegex As New Regex("^\w{1}:")
If oWDriveRegex.IsMatch(NewFileName) Then
oFileName = oWDriveRegex.Replace(NewFileName, vWLaufwerk)
oWindreamFilename = oWDriveRegex.Replace(NewFileName, String.Empty)
Else
oWindreamFilename = NewFileName.Replace(vWLaufwerk, String.Empty)
End If
'If NewFileName.StartsWith("W:") Then
' oFileName = NewFileName.Replace("W:", vWLaufwerk)
' oWindreamFilename = NewFileName.Replace("W:", String.Empty)
'Else
' oWindreamFilename = NewFileName.Replace(vWLaufwerk, String.Empty)
'End If
Dim oSourceFilename As String = Path.GetFileName(SourceFilePath)
Dim oDestination As String = Path.GetDirectoryName(oFileName)
If My.Computer.FileSystem.DirectoryExists(oDestination) = False Then
My.Computer.FileSystem.CreateDirectory(oDestination)
LOGGER.Info(" - Zielverzeichnis neu erzeugt!")
End If
LOGGER.Info(" ...Stream_File wurde gestartet")
' Objekt für Datei und Zielverzeichnis anlegen
LOGGER.Info(" ...Quelldatei gelesen")
If My.Computer.FileSystem.DirectoryExists(oDestination) Then
LOGGER.Info(" ...targetPath existiert")
' Überprüfen ob der zu Kopieren notwendige Speicherplatz auf Ziellaufwerk vorhanden ist
Dim oFileInfo As New FileInfo(SourceFilePath)
Dim oFileLength As Long = oFileInfo.Length
LOGGER.Info(" ...Datei kopieren von '" & SourceFilePath & "' nach '" & NewFileName & "'.")
Dim Connect
Dim Session
Dim WMObject
Dim aFileIO
Dim aWMStream
Dim wmbrwsr
Dim dmsServer As String
LOGGER.Info(" ...Connect definieren: CreateObject('Windream.WMConnect')")
Connect = CreateObject("Windream.WMConnect")
aFileIO = New WMOTOOLLib.WMFileIO
wmbrwsr = CreateObject("WMOBrws.ServerBrowser")
'==================================================================
' get the current DMS-server to log in
'==================================================================
dmsServer = wmbrwsr.GetCurrentServer
'==================================================================
' create a session
'==================================================================
Session = CreateObject("Windream.WMSession", dmsServer)
'==================================================================
' login session
'==================================================================
Connect.LoginSession(Session)
Dim LoggedIn = Session.aLoggedin
If LoggedIn Then
LOGGER.Info(" ...Login ok. You are logged in as '" & Connect.UserName & "' on Server '" & dmsServer)
'MsgBox("Login ok. You are logged in as '" + Connect.UserName + "' on Server '" + dmsServer + "'")
Else
LOGGER.Info(" >> Login on dms-Server failed")
' MsgBox("Login failed. ")
End If
_session = Session
Const WMCOMEventWMSessionNeedIndex = 1
'windream Objekte erstellen ohne Indexierungs-Event
Session.SwitchEvents(WMCOMEventWMSessionNeedIndex, False)
'==================================================================
' check if files exist
'==================================================================
LOGGER.Info(" ...ÜBERPRÜFTER DATEINAME => " & oWindreamFilename)
Dim wdFilexists As Boolean
LOGGER.Info(" ...Versuch auf die Datei in W: zuzugreifen und zu sperren...")
wdFilexists = Session.WMObjectExists(WMEntityDocument, oWindreamFilename, 0, 0)
Err.Clear()
If wdFilexists = False Then
LOGGER.Info(" ...Datei ist NICHT vorhanden, kann also einfach neu angelegt werden")
'==================================================================
' create an object
'==================================================================
WMObject = Session.GetNewWMObjectFS(WMEntityDocument, oWindreamFilename, WMObjectEditModeObject) 'WMEntityDocument, windreamFilename, WMObjectEditModeObject
If Err.Number > 0 Then
LOGGER.Info(" FEHLER: WMObject konnte nicht erzeugt werden - Error: '" & Err.Description & "'")
'MsgBox(Err.Description)
End If
' MsgBox("Created file: " + windreamFilename)
Else
' wenn auf die Datei zugeriffen werden konnte ist sie bereits vorhanden -> Datum anhängen
LOGGER.Info(" ...Es konnte zugegriffen werden -> DATEI IST BEREITS VORHANDEN")
Select Case CURRENT_DOKART_DUPLICATE_HANDLING
Case "New version"
LOGGER.Info("Creating new version of file [{0}]", NewFileName)
oWindreamFilename = ClassFilehandle.Versionierung_Datei(NewFileName).ToString.Substring(2)
CURRENT_NEWFILENAME = oWindreamFilename
Case "Question"
Dim oMessage = $"Eine Datei mit identischem Namen {vbNewLine}'{NewFileName}'{vbNewLine}existiert bereits!{vbNewLine}Wollen Sie die bestehende Datei ersetzen?"
If USER_LANGUAGE <> "de-DE" Then
oMessage = $"There is already a file with the name {NewFileName}!{vbNewLine}Would You like to replace the file?"
End If
Dim oResult = MessageBox.Show(oMessage, "File exists", MessageBoxButtons.YesNo, MessageBoxIcon.Question)
If oResult = DialogResult.No Then
oWindreamFilename = ClassFilehandle.Versionierung_Datei(NewFileName).ToString.Substring(2)
Else
If Delete_WDFile(oWindreamFilename) = False Then
Return False
End If
End If
Case Else
If Delete_WDFile(oWindreamFilename) = False Then
Return False
End If
End Select
WMObject = Session.GetNewWMObjectFS(1, oWindreamFilename, 31) 'WMEntityDocument, windreamFilename, WMObjectEditModeObject
If Err.Number > 0 Then
LOGGER.Info(" FEHLER: Neues WMObject (Kopie) konnte nicht erzeugt werden - Error: '" & Err.Description & "'")
'MsgBox(Err.Description)
End If
LOGGER.Info(" ...WMObject zugewiesen")
End If
LOGGER.Info(" ...ENDGÜLTIGER DATEINAME => " & oWindreamFilename)
If WMObject IsNot Nothing Then
'NewFileName = vWLaufwerk & ":" & oWindreamFilename
' lock object for file system access (to change the file itself)
WMObject.lock()
' set fileIO the local source file
aFileIO.bstrOriginalFileName = SourceFilePath
If Err.Number > 0 Then
LOGGER.Info(" FEHLER: fileIO konnte nicht gesetzt werden - Datei wird wieder gelöscht - Error: '" & Err.Description & "'")
LOGGER.Info(" HINWEIS: Überprüfen Sie den Verweis auf die Bibliotheken 'WMOTool.WMFileIO' UND 'WMOTOOLLib.WMFileIO' und ändern diese in den Anwendungseinstellungen (DLL_WMOTOOL)'")
WMObject.Unlock()
Delete_WDFile(oWindreamFilename)
Return False
' MsgBox(Err.Description)
End If
' open the windream object's file stream for writing
aWMStream = WMObject.OpenStream(STREAM_BinaryObject, WMObjectStreamOpenModeReadWrite)
If Err.Number > 0 Then
LOGGER.Info(" Unexpected error in OpenStream - Datei wird wieder gelöscht - Error: '" & Err.Description & "'")
WMObject.Unlock()
Delete_WDFile(oWindreamFilename)
Return False
'MsgBox(Err.Description)
End If
LOGGER.Info(" ...oWMStream erzeugt")
' give fileIO helper object the windream stream
aFileIO.aWMStream = aWMStream
If Err.Number > 0 Then
LOGGER.Info(" Unexpected error in Zuweisen aWMStream zu aFileIO - Datei wird wieder gelöscht - Error: '" & Err.Description & "'")
WMObject.Unlock()
Delete_WDFile(oWindreamFilename)
Return False
'MsgBox(Err.Description)
End If
' let fileIO object import the original file into windream
aFileIO.ImportOriginal(True)
If Err.Number > 0 Then
LOGGER.Info(" Unexpected error in FileIO.ImportOriginal(True) - Datei wird wieder gelöscht - Error: '" & Err.Description & "'")
WMObject.Unlock()
Delete_WDFile(oWindreamFilename)
Return False
' MsgBox(Err.Description)
End If
LOGGER.Info(" ...Inhalt der Datei konnte übertragen werden")
' close the windream file stream
aWMStream.Close()
If Err.Number > 0 Then
LOGGER.Info(" Unexpected error in aWMStream.Close() - Datei wird wieder gelöscht - Error: '" & Err.Description & "'")
WMObject.Unlock()
Delete_WDFile(oWindreamFilename)
Return False
'MsgBox(Err.Description)
End If
' save new windream object
WMObject.save()
If Err.Number > 0 Then
LOGGER.Info(" Unexpected error in WMObject.save - Datei wird wieder gelöscht - Error: '" & Err.Description & "'")
WMObject.Unlock()
Delete_WDFile(oWindreamFilename)
Return False
'MsgBox(Err.Description)
End If
LOGGER.Info(" ...Datei konnte gespeichert werden")
' unlock the windream object
WMObject.unlock()
If Err.Number > 0 Then
LOGGER.Info(" Unexpected error in WMObject.unlock - Datei wird wieder gelöscht - Error: '" & Err.Description & "'")
WMObject.Unlock()
Delete_WDFile(oWindreamFilename)
Return False
'MsgBox(Err.Description)
End If
'DATEI GRÖSSE ERMITTELN - MANCHMAL KOMMT ES VOR DAS DATEIGRÖße 0 ist
Dim info2 As New FileInfo(oFileName)
Dim length1 As Long = info2.Length
LOGGER.Info(" ...Length der Zieldatei: " & length1.ToString)
If oFileLength > 0 And Err.Number = 0 Then
'Dim p As String
'If oWindreamFilename.StartsWith("\") Then
' If oWindreamFilename.StartsWith("\\") Then
' p = oWindreamFilename.Replace("\\", "\")
' Else
' p = oWindreamFilename
' End If
'Else
' p = "\" & oWindreamFilename
'End If
'CURRENT_NEWFILENAME = vWLaufwerk & ":" & p
CURRENT_NEWFILENAME = oFileName
LOGGER.Info(" >> Datei '" & CURRENT_NEWFILENAME & "' wurde erfolgreich importiert!")
_currentWMObject = WMObject
Return True
Else
Delete_WDFile(oWindreamFilename)
LOGGER.Info("Error Number: [{0}]", Err.Number)
LOGGER.Info(" Unexpected error in Datei-Übertragen - FileLength ist 0, Übertragene Datei wurde gelöscht")
Return False
End If
Else
LOGGER.Info(" Could not create a WMObject for file:'" & oWindreamFilename)
If Not Err() Is Nothing Then
If Not Err.Description Is Nothing Then
LOGGER.Info(Err.Description)
End If
End If
Return False
End If
Else
LOGGER.Info("...targetPath existiert NICHT")
Return False
End If
End Function
Public Shared Function Delete_WDFile(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
Try
WMObject = _session.GetWMObjectByPath(WINDREAMLib.WMEntity.WMEntityDocument, WD_File) 'WINDREAMLib.WMEntity.WMEntityDocument
Catch ex As Exception
LOGGER.Info(">> Could not create WMObject for file '" & WD_File & "' - so it is not existing")
LOGGER.Error(ex.Message)
Return False
End Try
LOGGER.Info(" >> Deleting started - Object created")
WMObject.Delete()
Return True
Catch ex As Exception
MsgBox("Unexpected Error in Delete_WDFile: " & vbNewLine & ex.Message, MsgBoxStyle.Critical)
LOGGER.Info("Unexpected Error in Delete_WDFile: " & ex.Message)
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 DateiIndexieren(ByVal WD_File As String, ByVal _Indexname As String, ByVal _Value As String)
Try
LOGGER.Info(" ...DateiIndexieren wurde aufgerufen")
WD_File = WD_File.Substring(2)
Dim WMObject As WINDREAMLib.WMObject '= CreateObject("WINDREAMLib.WMObject") 'New WINDREAMLib.WMObject
'MsgBox("DateiIndexieren:" & vbNewLine & ClassDateiimportWindream.GetWindreamDriveLetter & filenameZiel & vbNewLine & Me.selectedProfile.DokumenttypString)
' den Dokumenttyp schreiben
LOGGER.Info(" ## Indexieren wird gestartet ##")
' ein windream-Objekt der Datei anlegen
WMObject = _currentWMObject 'oSession.GetWMObjectByPath(WINDREAMLib.WMEntity.WMEntityDocument, WD_File)
Try
LOGGER.Info(" ...Datei wird gesperrt")
' die Datei sperren
WMObject.lock()
Catch ex As Exception
LOGGER.Info(" ...Datei ist bereits gesperrt")
' nichts tun (Datei ist bereits gesperrt)
End Try
If IsNothing(WMObject) Then
LOGGER.Info(" ...Windream Object ist nothing, Indexierung wird abgebrochen")
Return False
End If
If IsNothing(WMObject.aObjectType) Then
LOGGER.Info(" ...Kein Objekttyp gesetzt, Indexierung wird abgebrochen")
Return False
End If
LOGGER.Info($" ...Objekttyp wird gesetzt: " & _WDObjekttyp)
' wenn der Datei noch kein Dokumenttyp zugewiesen wurde
If WMObject.aObjectType.aName = "Standard" Then
' ihr den entsprechenden Dokumenttyp zuweisen
WMObject.aObjectType = _session.GetWMObjectByName(WINDREAMLib.WMEntity.WMEntityObjectType, _WDObjekttyp)
' WMObject.aObjectType = Me.selectedProfile.Dokumenttyp
LOGGER.Info(" ...Objekttyp wurde gesetzt")
Else
LOGGER.Info(" ...Objekttyp war bereits gesetzt")
End If
Try
WMObject.Save()
Catch ex As Exception
' wenn es einen Unexpected error inm 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
LOGGER.Info(" ...Datei wurde gespeichert / Unlock wurde durchgeführt")
' wenn bis hierher alles geklappt hat wurde ein Dokumenttyp übergeben
LOGGER.Info(" ...Objekttyp: " & _WDObjekttyp)
' wenn keine Werte vorhanden sind, soll wenigstens der Dokumenttyp eingetragen werden
Dim indexe As String = ""
LOGGER.Info(" ...Indexname: '" & _Indexname & "'")
Dim werte = New ArrayList
If (GetTypeOfIndexAsIntByName(_Indexname) = WMObjectVariableValueTypeVector) Or GetTypeOfIndexAsIntByName(_Indexname) = 4097 Then
LOGGER.Info(" ...Es handelt sich um ein Vektor-Feld")
'Am 04.08.2014 aktualisiert: um zu verhindern das die vorangegangene Versionierung "Tilde-Werte" schreibt
LOGGER.Info(" ...Wert vor Überprüfung: " & _Value)
_Value = CheckIndexValue(_Value)
'Ausstieg da Fehler in der Überprüfung
If _Value Is Nothing Then
Return False
End If
LOGGER.Info(" ...Value für Indexierung: " & _Value)
werte.Add(_Value)
LOGGER.Info(" ...Werte zu Array hinzugefügt!")
Else
'Am 04.08.2014 aktualisiert: um zu verhindern das die vorangegangene Versionierung "Tilde-Werte" schreibt
LOGGER.Info(" ...Value vor Überprüfung: " & _Value)
_Value = CheckIndexValue(_Value)
'Ausstieg da Fehler in der Überprüfung
If _Value Is Nothing Then
Return False
End If
LOGGER.Info(" ...Value für Indexierung: " & _Value)
werte.Add(_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)
Catch ex As Exception
LOGGER.Info("Hinweis: Die Datei " & WD_File & " konnte nicht indexiert werden.")
LOGGER.Error(ex.Message)
LOGGER.Info("Fehler: " & ex.Message)
' Me.TreeNodeInfos.Add(temp)
Return False
End Try
End Function
Private Shared Function RunIndexing(ByVal oDocument As WMObject, ByVal Indizes() As String, ByVal aValues() As Object)
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
LOGGER.Info(" ...Indexwert ist leer/Nothing - Keine Nachindexierung")
End If
' wenn der Datei noch kein Dokumenttyp zugewiesen wurde
If oDocument.aObjectType.aName <> _WDObjekttyp Then
' ihr den entsprechenden Dokumenttyp zuweisen
oDocument.aObjectType = _session.GetWMObjectByName(WINDREAMLib.WMEntity.WMEntityObjectType, _WDObjekttyp)
' WMObject.aObjectType = Me.selectedProfile.Dokumenttyp
LOGGER.Info(" ...Objekttyp '" & oDocument.aObjectType.aName & "' wurde in '" & _WDObjekttyp & "' geändert.")
Else
LOGGER.Info(" ...Objekttyp war bereits gesetzt")
End If
Try
oDocument.Save()
Catch ex As Exception
' wenn es einen Unexpected error inm 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
'Jetzt jeden Indexwert durchlaufen
For Each aName As String In Indizes
indexname = aName
If LogErrorsOnly = False Then
LOGGER.Info(" ")
LOGGER.Info(" >> Indexierung von Index '" & indexname & "'")
End If
' das entsprechende Attribut aus windream auslesen
Dim oAttribute = _session.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
'If indexname = "Tournr" Then
' MsgBox("Index: " & indexname & vbNewLine & "wert: " & aValues(i), MsgBoxStyle.Information, "Index: " & aName.ToString)
'End If
'MsgBox(oDocument.aName & vbNewLine & aValues(i) & vbNewLine & vType, MsgBoxStyle.Exclamation, "Zeile 87")
Dim value = aValues(i)
Dim convertValue
Dim vektor As Boolean = False
'Den Typ des Index-Feldes auslesen
'MsgBox(value.GetType.ToString)
Select Case (vType)
'Case WMObjectVariableValueTypeUndefined
Case WMObjectVariableValueTypeString
LOGGER.Info(" ...Typ des windream-Indexes: WMObjectVariableValueTypeString")
convertValue = CStr(value)
Case WMObjectVariableValueTypeInteger
LOGGER.Info(" ...Typ des windream-Indexes: WMObjectVariableValueTypeInteger")
value = value.ToString.Replace(" ", "")
If IsNumeric(value) = False Then
LOGGER.Info(" ...Achtung: Value '" & value & "' kann nicht in Zahl konvertiert werden!")
End If
value = value.ToString.Replace(" ", "")
convertValue = CInt(value)
_int = True
Case WMObjectVariableValueTypeFloat
LOGGER.Info(" ...Typ des windream-Indexes: WMObjectVariableValueTypeFloat")
value = value.ToString.Replace(" ", "")
convertValue = CDbl(value)
Case WMObjectVariableValueTypeFixedPoint
LOGGER.Info(" ...Typ des windream-Indexes: WMObjectVariableValueTypeFixedPoint")
value = value.ToString.Replace(" ", "")
convertValue = CDbl(value)
_dbl = True
Case WMObjectVariableValueTypeBoolean
LOGGER.Info(" ...Typ des windream-Indexes: WMObjectVariableValueTypeBoolean")
convertValue = CBool(value)
_bool = True
Case WMObjectVariableValueTypeDate
LOGGER.Info(" ...Typ des windream-Indexes: WMObjectVariableValueTypeDate")
_date = True
'Dim _date As Date = value
convertValue = value
Case WMObjectVariableValueTypeTimeStamp
LOGGER.Info(" ...Typ des windream-Indexes: WMObjectVariableValueTypeTimeStamp")
convertValue = value
Case WMObjectVariableValueTypeCurrency
LOGGER.Info(" - Typ des windream-Indexes: WMObjectVariableValueTypeCurrency")
'Wegen currency muß ein eigenes Objekt vom typ Variant erzeugt werden
Dim aValueWrapper As System.Runtime.InteropServices.CurrencyWrapper = New System.Runtime.InteropServices.CurrencyWrapper(CDec(value))
convertValue = aValueWrapper
Case WMObjectVariableValueTypeTime
LOGGER.Info(" ...Typ des windream-Indexes: WMObjectVariableValueTypeTime")
'If ((value)) Then
' convertValue = CDate(value)
'Else
' convertValue = ""
'End If
'Dim _date As Date = value
convertValue = convertValue '*_date.ToShortTimeString
Case WMObjectVariableValueTypeFloat
LOGGER.Info(" ...Typ des windream-Indexes: WMObjectVariableValueTypeFloat")
convertValue = CStr(value)
Case WMObjectVariableValueTypeVariant
LOGGER.Info(" ...Typ des windream-Indexes: WMObjectVariableValueTypeVariant")
convertValue = CStr(value)
Case WMObjectVariableValueTypeFulltext
LOGGER.Info(" ...Typ des windream-Indexes: WMObjectVariableValueTypeFulltext")
convertValue = CStr(value)
Case 4097
vektor = True
LOGGER.Info(" ...Typ des windream-Indexes: 4097 Vektor alphanumerisch")
'Vektor alphanumerisch
convertValue = CStr(value)
Case 4098
vektor = True
LOGGER.Info(" ...Typ des windream-Indexes: 4098 Vektor Numerisch")
'Vektor Numerisch
convertValue = CStr(value)
Case 4099
vektor = True
LOGGER.Info(" ...Typ des windream-Indexes: 4099 Vektor Kommazahl")
'Vektor Kommazahl
convertValue = CStr(value)
Case 4100
vektor = True
LOGGER.Info(" ...Typ des windream-Indexes: 4100 Vektor Boolean")
'Vektor Kommazahl
convertValue = ToBoolean(value)
Case 4101
vektor = True
LOGGER.Info(" ...Typ des windream-Indexes: 4101 Vektor Date")
'Vektor Kommazahl
convertValue = CStr(value)
Case 4103
vektor = True
LOGGER.Info(" ...Typ des windream-Indexes: 4103 Vektor DateTime")
'Vektor DateTime
convertValue = CStr(value)
Case 4107
vektor = True
LOGGER.Info(" ...Typ des windream-Indexes: 4107 Integer 64bit")
convertValue = CStr(value)
Case 36865
vektor = True
LOGGER.Info(" ...Typ des windream-Indexes: 36865 Vektor alphanumerisch")
'Vektor Kommazahl
convertValue = CStr(value)
Case Else
LOGGER.Info(" ...Typ des windream-Indexes konnte nicht bestimmt werden!")
LOGGER.Info(" ...Versuch des Auslesens (vType): " & vType)
'MsgBox(vType & vbNewLine & CStr(value), MsgBoxStyle.Exclamation, "Marlon-Case Else")
convertValue = ""
End Select
If vektor = False Then
If convertValue.ToString Is Nothing = False Then
LOGGER.Info(" ...Konvertierter Wert: '" & convertValue.ToString & "'")
End If
End If
'############################################################################################
'####################### Der eigentliche Indexierungsvorgang ################################
'############################################################################################
If vektor = False Then
If convertValue.ToString Is Nothing = False Then
LOGGER.Info(" ...Versuch dem Dok einen Index zuzuweisen: 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()
If LogErrorsOnly = False Then
LOGGER.Info(" ...Index '" & aName & "' wurde geschrieben")
LOGGER.Info("")
End If
Else
LOGGER.Info(" >> Kein Indexwert vorhanden")
End If
Else
'VEKTORFELDER, ALSO ÜBERPRÜFEN OB ERGEBNIS-ARRAY GEFÜLLT IST
LOGGER.Info(" >> VEKTORFELD: Vorbereiten des Arrays")
Dim myArray()
'For Each row As DataRow In DT.Rows
'MsgBox(aName & vbNewLine & row.Item("Indexname") & vbNewLine & CStr(row.Item("Wert")))
'Next
Dim Anzahl As Integer = aValues.Length
'Vektorfeld wird mit EINEM Wert gefüllt
If Anzahl = 1 Then
LOGGER.Info(" >> Vektorfeld wird mit EINEM Wert gefüllt ")
ReDim myArray(0)
Select Case vType
Case 36865
'Umwandeln in String
myArray(0) = CStr(value)
Case 4097
'Umwandeln in String
myArray(0) = CStr(value)
Case 4098
'Umwandeln in Integer
value = value.ToString.Replace(" ", "")
myArray(0) = CInt(value)
Case 4099
Dim Str As String = value
Str = Str.ToString.Replace(" ", "")
'Umwandeln in Double
myArray(0) = CDbl(Str.Replace(".", ","))
Case 4100
' Umwandeln in Boolean
myArray(0) = ToBoolean(value)
Case 4101
'Umwandeln in Date
myArray(0) = CDate(value)
Case 4107
myArray(0) = Convert.ToInt64(value)
Case 4103
'Umwandeln in Datum Uhrzeit
myArray(0) = value
Case Else
'Umwandeln in String
myArray(0) = CStr(value)
End Select
'Jetzt überprüfen ob Werte in Vektorfeld angefügt oder überschrieben werden sollen
LOGGER.Info(" >> Konvertierter Wert: " & myArray(0).ToString)
Dim VektorArray()
'Immer anfügen
LOGGER.Info(" >> Check Existing Vektorvalues")
Dim indicies As New List(Of Object)
For Each element In myArray
If TypeOf element Is String Then
Dim splitted = element.ToString.Split(ClassConstants.VECTORSEPARATOR)
For Each s In splitted
indicies.Add(s)
Next
Else
indicies.Add(element)
End If
Next
myArray = indicies.ToArray()
VektorArray = Return_VektorArray(oDocument, aName, myArray)
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)
'myArray)
LOGGER.Info(" >> 'SetVariableValue' für VEKTOR mit einem Wert erfolgreich")
'Die Änderungen festsschreiben/speichern
oDocument.Save()
End If
Else
LOGGER.Info(" >> Vektorfeld wird mit MEHREREN Werten gefüllt ")
' das ausgewählte Profil in _selectedProfile laden
'Die Größe des Arrays festlegen
ReDim myArray(Anzahl - 1)
Dim i1 As Integer = 0
'Die Datatable durchlaufen und Werte für den Index in Array schreiben
For Each obj In myArray
myArray(i1) = CStr(obj)
LOGGER.Info(" >> Wert (" & i1 & ") aus Datatable: '" & myArray(i1).ToString & "'")
i1 = i1 + 1
Next
LOGGER.Info(" >> Array wurde erfolgreich erzeugt")
Dim VektorArray()
VektorArray = Return_VektorArray(oDocument, aName, myArray)
If VektorArray Is Nothing = False Then
'Das Array wieder anpassen
ReDim myArray(VektorArray.Length - 1)
'Array.Copy(VektorArray, myArray, VektorArray.Length)
i1 = 0
For Each _value As Object In VektorArray
Select Case vType
Case 36865
myArray(i1) = CStr(_value)
Case 4097
myArray(i1) = CStr(_value)
Case 4098
Dim v As String = _value.ToString.Replace(" ", "")
myArray(i1) = CInt(v)
Case 4099
'Vektroryp Double
Dim Str As String = _value
Str = Str.ToString.Replace(" ", "")
myArray(i1) = CDbl(Str.Replace(".", ","))
Case 4101
'Vektortyp DATE
Dim dat As String = _value
myArray(i1) = CDate(dat.Replace(".", ","))
Case 4107
myArray(i1) = Convert.ToInt64(_value)
Case Else
'Vektortyp ALPHANUMERISCH
'Die Größe des Arrays festlegen
myArray(i1) = CStr(myArray(0))
End Select
LOGGER.Info(" >> Konvertierter Wert (" & i1 & ") : '" & myArray(i1).ToString & "'")
i1 += 1
Next
'Jetzt die Nachindexierung für Vektor-Felder
Try
oDocument.SetVariableValue(aName, myArray)
Catch ex As Exception
LOGGER.Info("RunIndexing -Unexpected error in indexing Vectorfield: " & ex.Message)
LOGGER.Error(ex.Message)
oDocument.Save()
oDocument.unlock()
Return False
End Try
LOGGER.Info(" >> 'SetVariableValue' für VEKTOR erfolgreich")
' oDocument.LockRights()
'Die Änderungen festsschreiben/speichern
oDocument.Save()
LOGGER.Info(">> Indexierung erfolgreich beendet (Save ...")
Else
LOGGER.Info(" - Achtung: VektorArray Is NOTHING")
oDocument.Save()
Return True
End If
End If
End If
End If
i += 1
Next
oDocument.unlock()
If LogErrorsOnly = False Then
LOGGER.Info(">> ...und Unlock durchgeführt)")
LOGGER.Info("")
End If
Return True
Else
LOGGER.Info(" >> Dokument ist gesperrt, Indexierung erst im nächsten Durchlauf!")
'oDocument.unlock()
Return False
End If
End If
Catch ex As Exception
LOGGER.Info("ClassNiWindream.RunIndexing: " & ex.Message)
LOGGER.Error(ex.Message)
oDocument.Save()
oDocument.unlock()
Return False
End Try
End Function
Private Shared Function Return_VektorArray(ByVal oDocument As WMObject, vktIndexName As String, NIIndexe 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
'Keine Duplikatprüfung also einfach neues Array füllen
LOGGER.Info(" >> Duplikatprüfung soll durchgeführt werden.")
'Duplikat Prüfung an, also nur anhängen wenn Wert <>
For Each WDValue As Object In wertWD
If WDValue Is Nothing = False Then
'Erst einmal die ALten Werte schreiben
ReDim Preserve ValueArray(Anzahl)
'Den Wert im Array speichern
ValueArray(Anzahl) = WDValue.ToString
Anzahl += 1
End If
Next
'Jetzt die Neuen Werte auf Duplikate überprüfen
For Each NewValue As Object In NIIndexe
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) = NewValue.ToString
Anzahl += 1
Else
LOGGER.Info(" >> Value '" & NewValue.ToString & "' bereits in Vektorfeld enthalten")
End If
End If
Next
End If
Else
LOGGER.Info(" >> Vektorfeld ist noch leer....")
'Den/die Neuen Wert(e) anfügen
For Each NewValue As Object In NIIndexe
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) = NewValue '.ToString
Anzahl += 1
Else
LOGGER.Info(" >> Value '" & NewValue.ToString & "' bereits in Array enthalten")
End If
Else 'Dererste Wert, also hinzufügen
'Das Array anpassen
ReDim Preserve ValueArray(Anzahl)
'Den Wert im Array speichern
ValueArray(Anzahl) = NewValue '.ToString
Anzahl += 1
End If
End If
Next
End If
Return ValueArray
Catch ex As Exception
LOGGER.Info("Unexpected Error in ClassWindream.Return_VektorArray: " & ex.Message)
LOGGER.Error(ex.Message)
End Try
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
'''
''' Führt das eigendliche Indexieren aus
'''
'''
''' 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
'''
Public Shared Function Indexiere(ByVal filenameZiel As String, ByVal index As String, ByVal werte As Object) As Boolean
LOGGER.Info(" - 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
LOGGER.Info("=> 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(vWLaufwerk & ":" & filenameZiel) '_windream.GetWindreamDriveLetter
Dim an As Integer = 0
Do While My.Computer.FileSystem.FileExists(vWLaufwerk & ":" & filenameZiel) = False
If an > 500 Then
fileExists = False
Exit Do
Else
LOGGER.Info(" Achtung: Datei exisitiert noch nicht: " & My.Computer.Clock.LocalTime)
End If
an = an + 1
Loop
' wenn die Datei existiert
If fileExists Then
WMObject = _session.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 = _session.GetWMObjectByPath(WINDREAMLib.WMEntity.WMEntityDocument, filenameZiel)
If LogErrorsOnly = False Then
LOGGER.Info(" - windream-Objekt der Datei erzeugt")
LOGGER.Info(" - Ziel: W:\" & filenameZiel)
End If
'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 = _session.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
LOGGER.Info(" - Bei dem Zielindex handelt es sich um einen Einzelindex.")
Else
LOGGER.Info(" 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
LOGGER.Info(" - Array geleert und erneuert!")
End If
Catch ex As Exception
LOGGER.Info("Hinweis: Beim Initialisieren der Datei auf dem windream-Laufwerk ist ein Fehler aufgetreten.")
LOGGER.Error(ex.Message)
Return False
End Try
'Try
' den Typ des Zielindexes
LOGGER.Info(" - 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
' LOGGER.Info(" - 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
LOGGER.Info("- Es handelt sich um einen Vektorindex")
'Dim temp_arr As New ArrayList
Dim arrayIndex = 0
Dim temp_arr As Object
Dim arrayLength As Integer = 0
For Each element In werte
arrayLength = arrayLength + 1
Next
ReDim temp_arr(arrayLength - 1)
Select Case (TypDesIndexes - WMObjectVariableValueTypeVector)
'VektorIndex vom Typ String 64'
Case 1
LOGGER.Info("- 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(arrayIndex) = CStr(wert)
LOGGER.Info("- Führende Nullen wurden entfernt")
Else
temp_arr(arrayIndex) = CStr(wert)
End If
arrayIndex = arrayIndex + 1
LOGGER.Info("- Wert " & CStr(wert) & " konvertiert")
Next
Case WMObjectVariableValueTypeUndefined
' convertValue = ""
Case WMObjectVariableValueTypeString
LOGGER.Info("- 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(arrayIndex) = CStr(wert)
LOGGER.Info("- Führende Nullen wurden entfernt")
Else
temp_arr(arrayIndex) = CStr(wert)
End If
arrayIndex = arrayIndex + 1
LOGGER.Info("- Wert " & CStr(wert) & " konvertiert")
Next
Case WMObjectVariableValueTypeInteger
LOGGER.Info("- VektorIndex vom Typ Integer")
For Each wert As Object In werte
temp_arr(arrayIndex) = CInt(wert)
arrayIndex = arrayIndex + 1
Next
Case WMObjectVariableValueTypeFloat
For Each wert As Object In werte
wert = wert.ToString.Replace(".", ",")
temp_arr(arrayIndex) = CDbl(wert)
arrayIndex = arrayIndex + 1
Next
Case WMObjectVariableValueTypeBoolean
For Each wert As Object In werte
Try
temp_arr(arrayIndex) = CBool(wert)
Catch ex As Exception
' Nothing zuweisen damit SetVariableValue nicht ausgeführt wird
temp_arr = Nothing
End Try
arrayIndex = arrayIndex + 1
Next
Case WMObjectVariableValueTypeDate
For Each wert As Object In werte
'wert =
temp_arr(arrayIndex) = CDate(wert)
arrayIndex = arrayIndex + 1
Next
Case WMObjectVariableValueTypeFixedPoint
For Each wert As Object In werte
temp_arr(arrayIndex) = CDbl(wert)
arrayIndex = arrayIndex + 1
Next
Case WMObjectVariableValueTypeTimeStamp
For Each wert As Object In werte
temp_arr(arrayIndex) = CInt(wert)
arrayIndex = arrayIndex + 1
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(arrayIndex) = aValue
arrayIndex = arrayIndex + 1
Next
Case WMObjectVariableValueTypeTime
For Each wert As Object In werte
temp_arr(arrayIndex) = CDate(wert)
arrayIndex = arrayIndex + 1
Next
Case WMObjectVariableValueTypeVariant
' dann bleiben alle Werte wie sie sind
End Select
werte = temp_arr
LOGGER.Info("- 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
' LOGGER.Info("Unexpected error in 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)
If LogErrorsOnly = False Then
LOGGER.Info(" - den konvertierten Indexwert dem entsprechenden Index zuweisen")
LOGGER.Info(" - Indexname: " & index.ToString)
LOGGER.Info(" - Indexwert: " & werte.ToString)
End If
'End If
' die Indexinformationen des Dokuments speichern
WMObject.Save()
LOGGER.Info(" - 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()
LOGGER.Info(" - 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
' die Indexierungsinformationen für den TreeView-Log zurückgeben
LOGGER.Info(" Hinweis: Die Datei hat zum Zeitpunkt der Indexierung noch nicht auf dem windream-Laufwerk existiert.")
End If
Catch ex As Exception
LOGGER.Info(" Hinweis: Unbekannter Unexpected error inm Indexieren der Datei.")
LOGGER.Error(ex.Message)
LOGGER.Info(ex.Message)
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 = _session.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
LOGGER.Info("Fehler in CheckIndexValue: " & ex.Message)
LOGGER.Error(ex.Message)
Return Nothing
End Try
End Function
Private Shared Function ToBoolean(input As String) As Boolean
If String.IsNullOrEmpty(input) Then Return False
Return (input.Trim().ToLower() = "true") OrElse (input.Trim() = "1")
End Function
End Class