2015-07-27 15:56:59 +02:00

1594 lines
79 KiB
VB.net

Imports WINDREAMLib
Imports WINDREAMLib.WMCOMEvent
Imports WINDREAMLib.WMEntity
Imports WINDREAMLib.WMObjectEditMode
Imports WINDREAMLib.WMSearchOperator
Imports WINDREAMLib.WMSearchRelation
Imports WMOBRWSLib
Imports WMOSRCHLib
Imports System.IO
Public Class ClassWindream
#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 Shared oBrowser As New WMOBRWSLib.ServerBrowser
Public Shared oDokumentTypen As WINDREAMLib.WMObjects
Private oController As New WMOSearchController
Public Shared _WDObjekttyp As String
Private Shared aktWMObject As WINDREAMLib.WMObject
#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 ClassWindream.Init() Then
' Nachricht ausgeben
MsgBox("Es trat ein Fehler bei der Initialisierung der Klasse windream auf. Bitte prüfen Sie ob der windream-Server aktiv ist und alle Dienste gestartet sind.", MsgBoxStyle.Exclamation, "Fehler bei 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)
oController = New WMOSearchController
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 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("Error 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("Error in GetSearchDocuments()" & vbNewLine & ex.Message, MsgBoxStyle.Critical)
Return Nothing
End Try
End If
Return Nothing
End Function
''' <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)
If LogErrorsOnly = False Then ClassLogger.Add(">> windream-Server: '" & GetCurrentServer() & "'", False)
' Connection-Objekt instanziieren
oConnect = CreateObject("Windream.WMConnect")
'MsgBox("windrem init 'ed")
Catch ex As Exception
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 = "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
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
' 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
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, "Fehler beim Login an windream")
End If
Return False
End Try
End Function
#End Region
#Region "+++++ Funktionen die für den Objekttyp relevate Informationen zurückliefern +++++"
''' <summary>
''' Liefert alle Objekttypen des aktuellen Servers als windream-Objekte.
''' </summary>
''' <returns>Alle Objekttypen als WMObjects-Objekt</returns>
''' <remarks></remarks>
Public Shared Function GetObjecttypesAsObjects() As WMObjects
Try
Return oDokumentTypen
Catch ex As Exception
MsgBox("Fehlernachricht:" & vbNewLine & ex.Message, MsgBoxStyle.Critical, "Fehler beim Auslesen der Objekttypen")
Return Nothing
End Try
End Function
''' <summary>
''' Liefert alle Objekttypen des aktuellen Servers als Array aus Strings.
''' </summary>
''' <returns>Array mit allen Objekttypen als Strings</returns>
''' <remarks></remarks>
Public Function GetObjecttypesAsStrings() As String()
Try
Dim objektTypenStr(Me.oDokumentTypen.Count) As String
For i As Integer = 0 To Me.oDokumentTypen.Count
objektTypenStr(i) = Me.oDokumentTypen.Item(i).aName
Next
Return objektTypenStr
Catch ex As Exception
MsgBox("Fehlernachricht:" & vbNewLine & ex.Message, MsgBoxStyle.Critical, "Fehler beim Auslesen der Objekttypen als String")
Return Nothing
End Try
End Function
Public Function GetTypeOfIndex(ByVal indexname As String) As Integer
Try
Dim oAttribute = Me.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
MsgBox(ex.Message, MsgBoxStyle.Critical, "Fehler beim Auslesen der windream-Indexe")
Return Nothing
End Try
End Function
''' <summary>
''' Liefert einen Objekttyp als WMObject an Hand dessen Name.
''' </summary>
''' <param name="objekttypName">Name des Objekttyps</param>
''' <returns>Objekttyp als WMObject</returns>
''' <remarks></remarks>
Public Function GetObjecttypeByName(ByVal objekttypName As String) As WMObject
Try
' alle Objekttypen auslesen
Dim oObjectTypes As WMObjects = Me.oSession.GetWMObjectTypes(WINDREAMLib.WMEntity.WMEntityDocument)
' alle Objekttypen durchlaufen und nach dem mit dem angegebenen Namen suchen
For Each oObjectType As WMObject In oObjectTypes
If oObjectType.aName = objekttypName Then
Return oObjectType
End If
Next
Return Nothing
Catch ex As Exception
MsgBox("Es konnte ein Objekttyp nicht erstellt werden." & vbNewLine & vbNewLine & "Fehlernachricht:" & vbNewLine & ex.Message, MsgBoxStyle.Exclamation, "Objekttyp konnte nicht erstellt werden")
Return Nothing
End Try
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
MsgBox("Beim Prüfen ob ein Index für einen Objekttypen existiert, ist ein Fehler aufgetreten." & vbNewLine & vbNewLine & "Fehlernachricht:" & vbNewLine & ex.Message, MsgBoxStyle.Critical, "Fehler beim Prüfen auf Existenz eines Index in einem Objekttyp")
End Try
Return False
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
MsgBox("Es konnte nicht erfolgreich geprüft werden, ob das Programm am windream-Server angemeldted ist." & vbNewLine & vbNewLine & "Fehlernachricht:" & vbNewLine & ex.Message, MsgBoxStyle.Critical, "Fehler bei Loggedin-Prüfung")
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
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, "Fehler beim Auslesen des windream-Servers")
End Try
Return ""
End Function
'Public Function GetSharedCurrentServer() As String
' Try
' Return 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, "Fehler beim Auslesen des windream-Servers")
' End Try
' Return ""
'End Function
''' <summary>
''' Liefert das Windream-Laufwerk des windream-Servers, in Form '[Laufwerksbuchstabe]:'. (z.B. 'W:')
''' </summary>
''' <returns>Laufwerksbuchstabe mit Doppelpunkt als String</returns>
''' <remarks></remarks>
'Public Function GetWindreamDriveLetter() As String
' Try
' Dim oControl As AISCONTROLDATACOMLib.AISControlData
' Dim sDrive As String = ""
' oControl = New AISCONTROLDATACOMLib.AISControlData
' sDrive = oControl.GetStringValue(&H10040003)
' Return sDrive & ":"
' Catch ex As Exception
' MsgBox("Fehlernachricht: " & ex.Message, MsgBoxStyle.Critical, "Fehler beim Auslesen des windream-Laufwerks")
' End Try
' Return ""
'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 Function GetValuesfromAuswahlliste(ByVal _auswahlliste As String) As Object
Try
'Dim oAttribute = Me.oSession.GetWMObjectByName(WINDREAMLib.WMEntity.WMEntityAttribute, indexname)
'Dim vType = oAttribute.getVariableValue("vItems")
'Return vType
Dim oChoiceList = oSession.GetWMObjectByName(WMEntityChoiceList, _auswahlliste)
If Err.Number = 0 And TypeName(oChoiceList) <> "Nothing" Then
Dim Values = oChoiceList
Values = oChoiceList.GetVariableValue("vItems")
Dim anz As Integer = 0
For Each CLItem In Values
If oChoiceList.aName IsNot Nothing Then
anz += 1
End If
Next
Dim strListe(anz - 1)
Dim zahl As Integer = 0
For Each CLItem In Values
If oChoiceList.aName IsNot Nothing Then
strListe(zahl) = CLItem
zahl += 1
End If
Next
Return strListe
Else
MsgBox("Auswahlliste: " & _auswahlliste & " nicht gefunden!", MsgBoxStyle.Critical, "Fehler:")
Return Nothing
End If
Catch ex As Exception
MsgBox(ex.Message, MsgBoxStyle.Critical, "Error in GetValuesfromAuswahlliste:")
Return Nothing
End Try
End Function
#End Region
Public Shared Function Stream_File(ByVal filenameQuelle As String, ByVal zielpfad As String)
aktWMObject = Nothing
If My.Computer.FileSystem.DirectoryExists(zielpfad) = False Then
My.Computer.FileSystem.CreateDirectory(zielpfad)
ClassLogger.Add(" - Zielverzeichnis neu erzeugt!", False)
End If
Const STREAM_BinaryObject = "BinaryObject"
If LogErrorsOnly = False Then ClassLogger.Add(" - Stream_File wurde gestartet", False)
Dim endgültigerDateiname As String = ""
' Objekt für Datei und Zielverzeichnis anlegen
Dim Quelldatei_Name As String = Path.GetFileName(filenameQuelle)
If LogErrorsOnly = False Then ClassLogger.Add(" - Quelldatei gelesen", False)
'########
Dim Zielverzeichnis As String = zielpfad
endgültigerDateiname = Zielverzeichnis.Substring(2) & "\" & Quelldatei_Name
If LogErrorsOnly = False Then ClassLogger.Add(" - Zielverzeichnis erzeugt", False)
If My.Computer.FileSystem.DirectoryExists(Zielverzeichnis) Then
If LogErrorsOnly = False Then ClassLogger.Add(" - targetPath exisitiert", False)
' Überprüfen ob der zu Kopieren notwendige Speicherplatz auf Ziellaufwerk vorhanden ist
Dim dvr As New DriveInfo(vWLaufwerk & ":")
Dim freeSpace = dvr.TotalFreeSpace
Dim info As New FileInfo(filenameQuelle)
' Get length of the file.
Dim length As Long = info.Length
If freeSpace < length Then
MsgBox(" Auf dem Zielverzeichnis ist nicht genug Speicherplatz zum Übertragen frei.", MsgBoxStyle.Exclamation, "Nicht genug Speicherplatz")
Return -10
End If
If LogErrorsOnly = False Then ClassLogger.Add(" - Datei kopieren von " & filenameQuelle & " nach " & zielpfad.Substring(2) & "\" & Quelldatei_Name & ".", False)
Dim Connect
Dim Session
Dim WMObject
Dim aFileIO
Dim aWMStream
Dim wmbrwsr
Dim dmsServer As String
If LogErrorsOnly = False Then ClassLogger.Add(" - Connect definieren: CreateObject('Windream.WMConnect')", False)
Connect = CreateObject("Windream.WMConnect")
aFileIO = New WMOTOOLLib.WMFileIO
'If My.Settings.DLL_WMOTOOL = "" Then
' aFileIO = New WMOTOOLLib.WMFileIO
' If LogErrorsOnly = False Then ClassLogger.Add(" - Direkter Verweis auf New WMOTOOLLib.WMFileIO", False)
'Else
' aFileIO = CreateObject(My.Settings.DLL_WMOTOOL) 'WMOTool.WMFileIO oder WMOTOOLLib.WMFileIO
' If LogErrorsOnly = False Then ClassLogger.Add(" - Verwendeter Verweis aus Anwendungsstring: '" & My.Settings.DLL_WMOTOOL & "'", False)
'End If
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
If LogErrorsOnly = False Then ClassLogger.Add(" - Login ok. You are logged in as '" & Connect.UserName & "' on Server '" & dmsServer, False)
'MsgBox("Login ok. You are logged in as '" + Connect.UserName + "' on Server '" + dmsServer + "'")
Else
ClassLogger.Add(" - Login on dms-Server failed", False)
' MsgBox("Login failed. ")
End If
Const WMCOMEventWMSessionNeedIndex = 1
'windream Objekte erstellen ohne Indexierungs-Event
Session.SwitchEvents(WMCOMEventWMSessionNeedIndex, False)
'==================================================================
' check if files exist
'==================================================================
If LogErrorsOnly = False Then ClassLogger.Add(" - ÜBERPRÜFTER DATEINAME => " & endgültigerDateiname, False)
Dim wdFilexists As Boolean
If LogErrorsOnly = False Then ClassLogger.Add(" - Versuch auf die Datei in W: zuzugreifen und zu sperren...", False)
wdFilexists = Session.WMObjectExists(WMEntityDocument, endgültigerDateiname, 0, 0)
If wdFilexists = False Then
If LogErrorsOnly = False Then ClassLogger.Add(" - Datei ist NICHT vorhanden, kann also einfach neu angelegt werden", False)
Err.Clear()
'==================================================================
' create an object
'==================================================================
WMObject = Session.GetNewWMObjectFS(WMEntityDocument, endgültigerDateiname, WMObjectEditModeObject)
If Err.Number > 0 Then
ClassLogger.Add(" FEHLER: WMObject konnte nicht erzeugt werden - Error: '" & Err.Description & "'")
'MsgBox(Err.Description)
End If
' MsgBox("Created file: " + endgültigerDateiname)
Else
' wenn auf die Datei zugeriffen werden konnte ist sie bereits vorhanden -> Datum anhängen
If LogErrorsOnly = False Then ClassLogger.Add(" - Es konnte zugegriffen werden -> DATEI IST BEREITS VORHANDEN", False)
Err.Clear()
'### Automatische Versionierung mit ~ (Tilde) ###
Dim version As Integer = 2
Dim extension As String = Quelldatei_Name.Substring(Quelldatei_Name.LastIndexOf("."))
Dim Stammname As String = zielpfad.Substring(2) & "\" & Quelldatei_Name.Substring(0, Quelldatei_Name.LastIndexOf("."))
Dim neuername As String = zielpfad.Substring(2) & "\" & Quelldatei_Name.Substring(0, Quelldatei_Name.LastIndexOf("."))
Do While File.Exists("W:\" & neuername & extension) = True
If LogErrorsOnly = False Then ClassLogger.Add(" - Datei " & endgültigerDateiname & " ist vorhanden!", False)
neuername = Stammname & "~" & version
endgültigerDateiname = neuername & extension
version = version + 1
Loop
WMObject = Session.GetNewWMObjectFS(WMEntityDocument, endgültigerDateiname, WMObjectEditModeObject)
If Err.Number > 0 Then
ClassLogger.Add(" FEHLER: Neues WMObject (Kopie) konnte nicht erzeugt werden - Error: '" & Err.Description & "'")
'MsgBox(Err.Description)
End If
If LogErrorsOnly = False Then ClassLogger.Add(" - WMObject zugewiesen", False)
End If
If LogErrorsOnly = False Then ClassLogger.Add(" - ENDGÜLTIGER DATEINAME => " & endgültigerDateiname, False)
If WMObject IsNot Nothing Then
' 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
'MsgBox(Err.Number.ToString)
ClassLogger.Add(" FEHLER: fileIO konnte nicht gesetzt werden - Datei wird wieder gelöscht - Error: '" & Err.Description & "'")
ClassLogger.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()
System.IO.File.Delete(vWLaufwerk & ":\" & endgültigerDateiname)
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
ClassLogger.Add(" FEHLER bei OpenStream - Datei wird wieder gelöscht - Error: '" & Err.Description & "'")
WMObject.Unlock()
System.IO.File.Delete(vWLaufwerk & ":\" & endgültigerDateiname)
Return False
'MsgBox(Err.Description)
End If
If LogErrorsOnly = False Then ClassLogger.Add(" - oWMStream erzeugt", False)
' give fileIO helper object the windream stream
aFileIO.aWMStream = aWMStream
If Err.Number > 0 Then
ClassLogger.Add(" FEHLER bei Zuweisen aWMStream zu aFileIO - Datei wird wieder gelöscht - Error: '" & Err.Description & "'")
WMObject.Unlock()
System.IO.File.Delete(vWLaufwerk & ":\" & endgültigerDateiname)
Return False
'MsgBox(Err.Description)
End If
' let fileIO object import the original file into windream
aFileIO.ImportOriginal(True)
If Err.Number > 0 Then
ClassLogger.Add(" FEHLER bei FileIO.ImportOriginal(True) - Datei wird wieder gelöscht - Error: '" & Err.Description & "'")
WMObject.Unlock()
System.IO.File.Delete(vWLaufwerk & ":\" & endgültigerDateiname)
Return False
' MsgBox(Err.Description)
End If
If LogErrorsOnly = False Then ClassLogger.Add(" - Inhalt der Datei konnte übertragen werden", False)
' close the windream file stream
aWMStream.Close()
If Err.Number > 0 Then
ClassLogger.Add(" FEHLER bei aWMStream.Close() - Datei wird wieder gelöscht - Error: '" & Err.Description & "'")
WMObject.Unlock()
System.IO.File.Delete(vWLaufwerk & ":\" & endgültigerDateiname)
Return False
'MsgBox(Err.Description)
End If
' save new windream object
WMObject.save()
If Err.Number > 0 Then
ClassLogger.Add(" FEHLER bei WMObject.save - Datei wird wieder gelöscht - Error: '" & Err.Description & "'")
WMObject.Unlock()
System.IO.File.Delete(vWLaufwerk & ":\" & endgültigerDateiname)
Return Err.Number
'MsgBox(Err.Description)
End If
If LogErrorsOnly = False Then ClassLogger.Add(" - Datei konnte gespeichert werden", False)
' unlock the windream object
WMObject.unlock()
If Err.Number > 0 Then
ClassLogger.Add(" FEHLER bei WMObject.unlock - Datei wird wieder gelöscht - Error: '" & Err.Description & "'")
WMObject.Unlock()
System.IO.File.Delete(vWLaufwerk & ":\" & endgültigerDateiname)
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(vWLaufwerk & ":\" & endgültigerDateiname)
Dim length1 As Long = info2.Length
If LogErrorsOnly = False Then ClassLogger.Add(" - Length der Zieldatei: " & length1.ToString, False)
If length1 > 0 And Err.Number = 0 Then
If endgültigerDateiname.StartsWith("\") Then
If endgültigerDateiname.StartsWith("\\") Then
endgültigerDateiname = endgültigerDateiname.Replace("\\", "\")
Else
endgültigerDateiname = endgültigerDateiname
End If
Else
endgültigerDateiname = "\" & endgültigerDateiname
End If
CURRENT_FILEIN_WD = vWLaufwerk & ":" & endgültigerDateiname
ClassLogger.Add(" - Datei '" & CURRENT_FILEIN_WD & "' wurde erfolgreich importiert!", False)
aktWMObject = WMObject
Return True
Else
System.IO.File.Delete(vWLaufwerk & ":\" & endgültigerDateiname)
ClassLogger.Add(" FEHLER bei Datei-Übertragen - FileLength ist 0, Übertragene Datei wurde gelöscht- Überprüfen Sie Log-File")
Return False
End If
Else
Return False
End If
Else
If LogErrorsOnly = False Then ClassLogger.Add(" - targetPath exisitiert NICHT", False)
Return False
End If
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 DateiIndexieren(ByVal WD_File As String, ByVal _Indexname As String, ByVal _Value As String)
Try
If LogErrorsOnly = False Then ClassLogger.Add(" - DateiIndexieren wurde aufgerufen", False)
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
If LogErrorsOnly = False Then ClassLogger.Add(" ## Indexieren wird gestartet ##", False)
' 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
' ihr den entsprechenden Dokumenttyp zuweisen
WMObject.aObjectType = oSession.GetWMObjectByName(WINDREAMLib.WMEntity.WMEntityObjectType, _WDObjekttyp)
' WMObject.aObjectType = Me.selectedProfile.Dokumenttyp
If LogErrorsOnly = False Then ClassLogger.Add(" - Objekttyp wird gesetzt", False)
Else
If LogErrorsOnly = False Then ClassLogger.Add(" - Objekttyp war bereits gesetzt", False)
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
If LogErrorsOnly = False Then ClassLogger.Add(" - Datei wurde gespeichert / Unlock wurde durchgeführt", False)
' wenn bis hierher alles geklappt hat wurde ein Dokumenttyp übergeben
If LogErrorsOnly = False Then ClassLogger.Add(" - Objekttyp: " & _WDObjekttyp, False)
' wenn keine Werte vorhanden sind, soll wenigstens der Dokumenttyp eingetragen werden
Dim indexe As String = ""
If LogErrorsOnly = False Then ClassLogger.Add(" - Indexname: '" & _Indexname & "'", False)
Dim werte = New ArrayList
If (GetTypeOfIndexAsIntByName(_Indexname) = WMObjectVariableValueTypeVector) Or GetTypeOfIndexAsIntByName(_Indexname) = 4097 Then
If LogErrorsOnly = False Then ClassLogger.Add(" - Es handelt sich um ein Vektor-Feld", False)
'Am 04.08.2014 aktualisiert: um zu verhindern das die vorangegangene Versionierung "Tilde-Werte" schreibt
If LogErrorsOnly = False Then ClassLogger.Add(" - Wert vor Überprüfung: " & _Value, False)
_Value = CheckIndexValue(_Value)
'Ausstieg da Fehler in der Überprüfung
If _Value Is Nothing Then
Return False
End If
If LogErrorsOnly = False Then ClassLogger.Add(" - Value für Indexierung: " & _Value, False)
werte.Add(_Value)
If LogErrorsOnly = False Then ClassLogger.Add(" - Werte zu Array hinzugefügt!", False)
Else
'Am 04.08.2014 aktualisiert: um zu verhindern das die vorangegangene Versionierung "Tilde-Werte" schreibt
If LogErrorsOnly = False Then ClassLogger.Add(" - Value vor Überprüfung: " & _Value, False)
_Value = CheckIndexValue(_Value)
'Ausstieg da Fehler in der Überprüfung
If _Value Is Nothing Then
Return False
End If
If LogErrorsOnly = False Then ClassLogger.Add(" - Value für Indexierung: " & _Value, False)
werte.Add(_Value)
End If
'indexe &= indexname & " = " & werte & vbNewLine
'Der Indexierungsvorgang
' Dim indexErgebnis As ArrayList = Indexiere(filenameZiel, _Indexname, werte)
'Me.singleInfoNode.Insert(0, Me.singleInfoNode(1))
'Me.singleInfoNode.Insert(0, Me.singleInfoNode(0))
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
ClassLogger.Add("Hinweis: Die Datei " & WD_File & " konnte nicht indexiert werden.")
ClassLogger.Add("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
If LogErrorsOnly = False Then ClassLogger.Add(" >> Indexwert ist leer/Nothing - Keine Nachindexierung", False)
End If
' wenn der Datei noch kein Dokumenttyp zugewiesen wurde
If oDocument.aObjectType.aName <> _WDObjekttyp Then
' ihr den entsprechenden Dokumenttyp zuweisen
oDocument.aObjectType = oSession.GetWMObjectByName(WINDREAMLib.WMEntity.WMEntityObjectType, _WDObjekttyp)
' WMObject.aObjectType = Me.selectedProfile.Dokumenttyp
If LogErrorsOnly = False Then ClassLogger.Add(" >> Objekttyp '" & oDocument.aObjectType.aName & "' wurde in '" & _WDObjekttyp & "' geändert.", False)
Else
If LogErrorsOnly = False Then ClassLogger.Add(" >> Objekttyp war bereits gesetzt", False)
End If
Try
oDocument.Save()
Catch ex As Exception
' wenn es einen Fehler beim speichern gab, dann konnte auch kein Dokumenttyp gesetzt werden -> es kann also auch keine
' Indexierung stattfinden und die Indexierung muss nicht fortgesetzt werden
Return False
End Try
'Jetzt jeden Indexwert durchlaufen
For Each aName As String In Indizes
indexname = aName
If LogErrorsOnly = False Then
ClassLogger.Add(" ", False)
ClassLogger.Add(" >> Indexierung von Index '" & indexname & "'", False)
End If
' 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
'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
If LogErrorsOnly = False Then ClassLogger.Add(" >> Typ des windream-Indexes: WMObjectVariableValueTypeString", False)
convertValue = CStr(value)
Case WMObjectVariableValueTypeInteger
If LogErrorsOnly = False Then ClassLogger.Add(" >> Typ des windream-Indexes: WMObjectVariableValueTypeInteger", False)
value = value.ToString.Replace(" ", "")
If IsNumeric(value) = False Then
If LogErrorsOnly = False Then ClassLogger.Add(" >> Achtung: Value '" & value & "' kann nicht in Zahl konvertiert werden!", False)
End If
value = value.ToString.Replace(" ", "")
convertValue = CInt(value)
_int = True
Case WMObjectVariableValueTypeFloat
If LogErrorsOnly = False Then ClassLogger.Add(" >> Typ des windream-Indexes: WMObjectVariableValueTypeFloat", False)
value = value.ToString.Replace(" ", "")
convertValue = CDbl(value)
Case WMObjectVariableValueTypeFixedPoint
If LogErrorsOnly = False Then ClassLogger.Add(" >> Typ des windream-Indexes: WMObjectVariableValueTypeFixedPoint", False)
value = value.ToString.Replace(" ", "")
convertValue = CDbl(value)
_dbl = True
Case WMObjectVariableValueTypeBoolean
If LogErrorsOnly = False Then ClassLogger.Add(" >> Typ des windream-Indexes: WMObjectVariableValueTypeBoolean", False)
convertValue = CBool(value)
_bool = True
Case WMObjectVariableValueTypeDate
If LogErrorsOnly = False Then ClassLogger.Add(" >> Typ des windream-Indexes: WMObjectVariableValueTypeDate", False)
_date = True
'Dim _date As Date = value
convertValue = value
Case WMObjectVariableValueTypeTimeStamp
If LogErrorsOnly = False Then ClassLogger.Add(" >> Typ des windream-Indexes: WMObjectVariableValueTypeTimeStamp", False)
convertValue = CDbl(value)
Case WMObjectVariableValueTypeCurrency
ClassLogger.Add(" - Typ des windream-Indexes: WMObjectVariableValueTypeCurrency", False)
'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
If LogErrorsOnly = False Then ClassLogger.Add(" >> Typ des windream-Indexes: WMObjectVariableValueTypeTime", False)
'If ((value)) Then
' convertValue = CDate(value)
'Else
' convertValue = ""
'End If
'Dim _date As Date = value
convertValue = convertValue '*_date.ToShortTimeString
Case WMObjectVariableValueTypeFloat
If LogErrorsOnly = False Then ClassLogger.Add(" >> Typ des windream-Indexes: WMObjectVariableValueTypeFloat", False)
convertValue = CStr(value)
Case WMObjectVariableValueTypeVariant
If LogErrorsOnly = False Then ClassLogger.Add(" >> Typ des windream-Indexes: WMObjectVariableValueTypeVariant", False)
convertValue = CStr(value)
Case WMObjectVariableValueTypeFulltext
If LogErrorsOnly = False Then ClassLogger.Add(" >> Typ des windream-Indexes: WMObjectVariableValueTypeFulltext", False)
convertValue = CStr(value)
Case 4097
If LogErrorsOnly = False Then ClassLogger.Add(" >> Typ des windream-Indexes: 4097 Vektor alphanumerisch", False)
'Vektor alphanumerisch
vektor = True
Case 4098
If LogErrorsOnly = False Then ClassLogger.Add(" >> Typ des windream-Indexes: 4098 Vektor Numerisch", False)
'Vektor Numerisch
vektor = True
Case 4099
If LogErrorsOnly = False Then ClassLogger.Add(" >> Typ des windream-Indexes: 4099 Vektor Kommazahl", False)
'Vektor Kommazahl
vektor = True
Case 4101
If LogErrorsOnly = False Then ClassLogger.Add(" >> Typ des windream-Indexes: 4101 Vektor Date", False)
'Vektor Kommazahl
vektor = True
Case 4103
If LogErrorsOnly = False Then ClassLogger.Add(" >> Typ des windream-Indexes: 4103 Vektor DateTime", False)
'Vektor DateTime
vektor = True
Case 4107
If LogErrorsOnly = False Then ClassLogger.Add(" >> Typ des windream-Indexes: 4107 Integer 64bit", False)
vektor = True
Case 36865
If LogErrorsOnly = False Then ClassLogger.Add(" >> Typ des windream-Indexes: 36865 Vektor alphanumerisch", False)
'Vektor Kommazahl
vektor = True
Case Else
If LogErrorsOnly = False Then ClassLogger.Add(" >> Typ des windream-Indexes konnte nicht bestimmt werden!", False)
If LogErrorsOnly = False Then ClassLogger.Add(" >> 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
If LogErrorsOnly = False Then ClassLogger.Add(" >> Konvertierter Wert: '" & convertValue.ToString & "'", False)
End If
End If
'############################################################################################
'####################### Der eigentliche Indexierungsvorgang ################################
'############################################################################################
If vektor = False Then
Try
If convertValue.ToString Is Nothing = False Then
If LogErrorsOnly = False Then ClassLogger.Add(" >> Versuch dem Dok einen Index zuzuweisen: oDocument.SetVariableValue(" & aName & ", " & convertValue & ")", False)
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
ClassLogger.Add(" >> Index '" & aName & "' wurde geschrieben", False)
ClassLogger.Add("", False)
End If
Else
ClassLogger.Add(" >> Kein Indexwert vorhanden", False)
End If
Catch ex As Exception
ClassLogger.Add("Unexpected Error in SetVariableValue für Index '" & aName & "': " & ex.Message, True)
oDocument.Save()
oDocument.unlock()
Return False
End Try
Else
End If
Else
If LogErrorsOnly = False Then ClassLogger.Add(" >> Array der Indexwerte ist leer/Nothing - Keine Nachindexierung", False)
End If
i += 1
Next
oDocument.unlock()
If LogErrorsOnly = False Then
ClassLogger.Add(">> ...und Unlock durchgeführt)", False)
ClassLogger.Add("", False)
End If
Return True
Else
ClassLogger.Add(" >> Dokument ist gesperrt, Indexierung erst im nächsten Durchlauf!", False)
'oDocument.unlock()
Return False
End If
End If
Catch ex As Exception
ClassLogger.Add("Unexpected Error in ClassNiWindream.RunIndexing " & ex.Message)
oDocument.Save()
oDocument.unlock()
Return False
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
''' <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)
If LogErrorsOnly = False Then ClassLogger.Add(" - In Indexierungsvorgang für: " & filenameZiel, False)
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
If LogErrorsOnly = False Then ClassLogger.Add("=> Hinweis: Die Datei wurde auf Grund eines Problems in der Initialisierung nicht vollständig indexiert.", False)
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
If LogErrorsOnly = False Then ClassLogger.Add(" Achtung: Datei exisitiert noch nicht: " & My.Computer.Clock.LocalTime, True)
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)
If LogErrorsOnly = False Then
ClassLogger.Add(" - windream-Objekt der Datei erzeugt", False)
ClassLogger.Add(" - Ziel: W:\" & filenameZiel, False)
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 = 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
If LogErrorsOnly = False Then ClassLogger.Add(" - Bei dem Zielindex handelt es sich um einen Einzelindex.", False)
Else
If LogErrorsOnly = False Then ClassLogger.Add(" Bei dem Zielindex handelt es sich um ein Vektorfeld.", False)
' 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
If LogErrorsOnly = False Then ClassLogger.Add(" - Array geleert und erneuert!", False)
End If
Catch ex As Exception
ClassLogger.Add("Hinweis: Beim Initialisieren der Datei auf dem windream-Laufwerk ist ein Fehler aufgetreten.", False)
Return False
End Try
'Try
' den Typ des Zielindexes
If LogErrorsOnly = False Then ClassLogger.Add(" - Typ des Indexes: " & TypDesIndexes.ToString, False)
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", False)
'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
If LogErrorsOnly = False Then ClassLogger.Add("- Es handelt sich um einen Vektorindex", False)
Dim temp_arr As New ArrayList
Select Case (TypDesIndexes - WMObjectVariableValueTypeVector)
'VektorIndex vom Typ String 64'
Case 1
If LogErrorsOnly = False Then ClassLogger.Add("- VektorIndex vom Typ String 1", False)
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))
ClassLogger.Add("- Führende Nullen wurden entfernt", False)
Else
temp_arr.Add(CStr(wert))
End If
If LogErrorsOnly = False Then ClassLogger.Add("- Wert " & CStr(wert) & " konvertiert", False)
Next
Case WMObjectVariableValueTypeUndefined
' convertValue = ""
Case WMObjectVariableValueTypeString
If LogErrorsOnly = False Then ClassLogger.Add("- VektorIndex vom Typ String 2", False)
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))
ClassLogger.Add("- Führende Nullen wurden entfernt", False)
Else
temp_arr.Add(CStr(wert))
End If
If LogErrorsOnly = False Then ClassLogger.Add("- Wert " & CStr(wert) & " konvertiert", False)
Next
Case WMObjectVariableValueTypeInteger
If LogErrorsOnly = False Then ClassLogger.Add("- VektorIndex vom Typ Integer", False)
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
If LogErrorsOnly = False Then ClassLogger.Add("- Einträge in temp_arr also Speichern des Arrays in convertValue", False)
' convertValue = Nothing
' convertValue = temp_arr.ToArray
Else
' convertValue = vbEmpty
End If
If LogErrorsOnly = False Then ClassLogger.Add("- Werte erfolgreich konvertiert", False)
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)
If LogErrorsOnly = False Then
ClassLogger.Add(" - den konvertierten Indexwert dem entsprechenden Index zuweisen", False)
ClassLogger.Add(" - Indexname: " & index.ToString, False)
ClassLogger.Add(" - Indexwert: " & werte.ToString, False)
End If
'End If
' die Indexinformationen des Dokuments speichern
WMObject.Save()
If LogErrorsOnly = False Then ClassLogger.Add(" - die Indexinformationen des Dokuments speichern", False)
' Unlock in einem unbehandelten Try-Block um Fehler abzufangen,
' wenn eine Datei nicht gesperrt ist
Try
' die Sperrung des Dokuments aufheben
WMObject.unlock()
If LogErrorsOnly = False Then ClassLogger.Add(" - die Sperrung des Dokuments aufheben", False)
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
ClassLogger.Add(" Hinweis: Die Datei hat zum Zeitpunkt der Indexierung noch nicht auf dem windream-Laufwerk existiert.", False)
End If
Catch ex As Exception
ClassLogger.Add(" Hinweis: Unbekannter Fehler beim Indexieren der Datei.")
ClassLogger.Add(ex.Message)
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>
Private 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
ClassLogger.Add("Error in CheckIndexValue: " & ex.Message)
Return Nothing
End Try
End Function
End Class