diff --git a/app/ZSG_Import/App.config b/app/ZSG_Import/App.config index 9c05822..3d6db96 100644 --- a/app/ZSG_Import/App.config +++ b/app/ZSG_Import/App.config @@ -1,6 +1,42 @@  + + +
+ + + + + + + + + True + + + ZSG-Geschäftsprozess + + + sdsd + + + vktRecordID + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/ZSG_Import/CURRENT.vb b/app/ZSG_Import/CURRENT.vb new file mode 100644 index 0000000..5902eff --- /dev/null +++ b/app/ZSG_Import/CURRENT.vb @@ -0,0 +1,4 @@ +Module CURRENT + Public LOG_ERRORS_ONLY As Boolean = True + Public CURRENT_FILEIN_WD As String +End Module diff --git a/app/ZSG_Import/My Project/Settings.Designer.vb b/app/ZSG_Import/My Project/Settings.Designer.vb index 82f5043..af85c0a 100644 --- a/app/ZSG_Import/My Project/Settings.Designer.vb +++ b/app/ZSG_Import/My Project/Settings.Designer.vb @@ -1,10 +1,10 @@ '------------------------------------------------------------------------------ ' -' This code was generated by a tool. -' Runtime Version:4.0.30319.34209 +' Dieser Code wurde von einem Tool generiert. +' Laufzeitversion:4.0.30319.34209 ' -' Changes to this file may cause incorrect behavior and will be lost if -' the code is regenerated. +' Änderungen an dieser Datei können falsches Verhalten verursachen und gehen verloren, wenn +' der Code erneut generiert wird. ' '------------------------------------------------------------------------------ @@ -13,46 +13,129 @@ Option Explicit On Namespace My - - _ + + _ Partial Friend NotInheritable Class MySettings Inherits Global.System.Configuration.ApplicationSettingsBase - - Private Shared defaultInstance As MySettings = CType(Global.System.Configuration.ApplicationSettingsBase.Synchronized(New MySettings), MySettings) - -#Region "My.Settings Auto-Save Functionality" + + Private Shared defaultInstance As MySettings = CType(Global.System.Configuration.ApplicationSettingsBase.Synchronized(New MySettings()),MySettings) + +#Region "Funktion zum automatischen Speichern von My.Settings" #If _MyType = "WindowsForms" Then - Private Shared addedHandler As Boolean + Private Shared addedHandler As Boolean - Private Shared addedHandlerLockObject As New Object + Private Shared addedHandlerLockObject As New Object - _ - Private Shared Sub AutoSaveSettings(ByVal sender As Global.System.Object, ByVal e As Global.System.EventArgs) - If My.Application.SaveMySettingsOnExit Then - My.Settings.Save() - End If - End Sub + _ + Private Shared Sub AutoSaveSettings(ByVal sender As Global.System.Object, ByVal e As Global.System.EventArgs) + If My.Application.SaveMySettingsOnExit Then + My.Settings.Save() + End If + End Sub #End If #End Region - + Public Shared ReadOnly Property [Default]() As MySettings Get - + #If _MyType = "WindowsForms" Then - If Not addedHandler Then - SyncLock addedHandlerLockObject - If Not addedHandler Then - AddHandler My.Application.Shutdown, AddressOf AutoSaveSettings - addedHandler = True - End If - End SyncLock - End If + If Not addedHandler Then + SyncLock addedHandlerLockObject + If Not addedHandler Then + AddHandler My.Application.Shutdown, AddressOf AutoSaveSettings + addedHandler = True + End If + End SyncLock + End If #End If Return defaultInstance End Get End Property + + _ + Public ReadOnly Property MyConnectionString() As String + Get + Return CType(Me("MyConnectionString"),String) + End Get + End Property + + _ + Public ReadOnly Property LOG_ERRORS_ONLY() As Boolean + Get + Return CType(Me("LOG_ERRORS_ONLY"),Boolean) + End Get + End Property + + _ + Public ReadOnly Property OBJEKTTYP() As String + Get + Return CType(Me("OBJEKTTYP"),String) + End Get + End Property + + _ + Public ReadOnly Property IDX_Doctype() As String + Get + Return CType(Me("IDX_Doctype"),String) + End Get + End Property + + _ + Public ReadOnly Property IDX_RECORD_ID() As String + Get + Return CType(Me("IDX_RECORD_ID"),String) + End Get + End Property + + _ + Public ReadOnly Property AD_DOMAIN() As String + Get + Return CType(Me("AD_DOMAIN"),String) + End Get + End Property + + _ + Public ReadOnly Property AD_SERVER() As String + Get + Return CType(Me("AD_SERVER"),String) + End Get + End Property + + _ + Public ReadOnly Property AD_USER() As String + Get + Return CType(Me("AD_USER"),String) + End Get + End Property + + _ + Public ReadOnly Property AD_USER_PW() As String + Get + Return CType(Me("AD_USER_PW"),String) + End Get + End Property End Class End Namespace diff --git a/app/ZSG_Import/My Project/Settings.settings b/app/ZSG_Import/My Project/Settings.settings index 85b890b..b7956ad 100644 --- a/app/ZSG_Import/My Project/Settings.settings +++ b/app/ZSG_Import/My Project/Settings.settings @@ -1,7 +1,37 @@  - - - - - - + + + + + <?xml version="1.0" encoding="utf-16"?> +<SerializableConnectionString xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema"> + <ConnectionString>Data Source=172.24.12.41\tests;Initial Catalog=DD_ECM_RENOLIT;User ID=sa;Password=dd</ConnectionString> +</SerializableConnectionString> + Data Source=172.24.12.41\tests;Initial Catalog=DD_ECM_RENOLIT;User ID=sa;Password=dd + + + True + + + ZSG-Geschäftsprozess + + + sdsd + + + vktRecordID + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/ZSG_Import/Service1.Designer.vb b/app/ZSG_Import/MyService.Designer.vb similarity index 97% rename from app/ZSG_Import/Service1.Designer.vb rename to app/ZSG_Import/MyService.Designer.vb index 1ca347f..c8ed9f7 100644 --- a/app/ZSG_Import/Service1.Designer.vb +++ b/app/ZSG_Import/MyService.Designer.vb @@ -1,7 +1,7 @@ Imports System.ServiceProcess _ -Partial Class Service1 +Partial Class MyService Inherits System.ServiceProcess.ServiceBase 'UserService überschreibt den Löschvorgang, um die Komponentenliste zu bereinigen. @@ -28,7 +28,7 @@ Partial Class Service1 ' ' ServicesToRun = New System.ServiceProcess.ServiceBase () {New Service1, New MySecondUserService} ' - ServicesToRun = New System.ServiceProcess.ServiceBase() {New Service1} + ServicesToRun = New System.ServiceProcess.ServiceBase() {New MyService} System.ServiceProcess.ServiceBase.Run(ServicesToRun) End Sub diff --git a/app/ZSG_Import/MyService.vb b/app/ZSG_Import/MyService.vb new file mode 100644 index 0000000..e088ab6 --- /dev/null +++ b/app/ZSG_Import/MyService.vb @@ -0,0 +1,139 @@ +Imports System.ComponentModel +Imports System.IO + +Public Class MyService + 'Variablen + Public Shared threadRunner As BackgroundWorker + Protected Overrides Sub OnStart(ByVal args() As String) + ' Code zum Starten des Dienstes hier einfügen. Diese Methode sollte Vorgänge + ' ausführen, damit der Dienst gestartet werden kann. + ' Code zum Starten des Dienstes hier einfügen. Diese Methode sollte Vorgänge + ' ausführen, damit der Dienst gestartet werden kann. + Try + clsLogger.Init(My.Application.Info.DirectoryPath & "\Log", "") + clsLogger.Add("## ZSGImport Service started - " & Now & " ## ", False) + + If My.Settings.MyConnectionString = String.Empty Then + clsLogger.Add("NO CONNECTIONSTRING CONFIGURED.", True) + Else + If clsDatabase.Init = False Then + clsLogger.Add("ATTENTION: No Connection was established '" & My.Settings.MyConnectionString & "'!", True) + Else + LOG_ERRORS_ONLY = My.Settings.LOG_ERRORS_ONLY + + '### Thread für das nachträgliche Setzen von Rechten generieren + MyService.threadRunner = New BackgroundWorker() + MyService.threadRunner.WorkerReportsProgress = True + MyService.threadRunner.WorkerSupportsCancellation = True + AddHandler threadRunner.DoWork, AddressOf RUN_THREAD + AddHandler threadRunner.RunWorkerCompleted, AddressOf Thread1_Completed + + ' Und den Durchlauf das erste Mal starten + threadRunner.RunWorkerAsync() + End If + End If + clsLogger.WriteLog() + Catch ex As Exception + clsLogger.AddError(ex.Message, "OnStart") + clsLogger.WriteLog() + End Try + End Sub + Public Shared Sub RUN_THREAD(ByVal sender As Object, ByVal e As System.ComponentModel.DoWorkEventArgs) + Try + 'erst einmal die Technischen Plätze bestimmen die noch nciht importiert wurden + Dim DT_TP As DataTable = clsDatabase.Return_Datatable("SELECT DISTINCT [UNIQUE_STR] FROM [EXPORT_COMOS] where dokumentart is not null and imported = 0 and [UNIQUE_STR] LIKE '472%' order by [UNIQUE_STR]") + Try + If Not IsNothing(DT_TP) Then + If DT_TP.Rows.Count > 0 Then + clsLogger.Add(String.Format(">> {0} TPs need to be worked - {1}", DT_TP.Rows.Count.ToString, Now), False) + 'Jeden Technischen Platz einzeln durchlaufen weil für diesen ein Record existiert + For Each TP As DataRow In DT_TP.Rows + Dim _TP As String = TP.Item(0) + clsLogger.AddDetailLog(String.Format(">> Working on technical place: '{0}'", _TP)) + Dim selrecid = String.Format("SELECT [Record-ID] FROM VWTEMP_PMO_FORM3 where UPPER(TPLNR) = UPPER('{0}')", _TP) + Dim _RECORD_ID = clsDatabase.Execute_Scalar(selrecid) + If Not IsNothing(_RECORD_ID) Then + 'Jede Datei einzeln durchlaufen + Dim sel = String.Format("SELECT * FROM [EXPORT_COMOS] WHERE IMPORTED = 0 AND [UNIQUE_STR] = '{0}'", TP.Item("UNIQUE_STR")) + Dim DT_TP_DOCS As DataTable = clsDatabase.Return_Datatable(sel) + If Not IsNothing(DT_TP_DOCS) Then + If DT_TP_DOCS.Rows.Count > 0 Then + For Each _docRow As DataRow In DT_TP_DOCS.Rows + Dim GUID = _docRow.Item("GUID") + Dim filename = _docRow.Item("Link") + If File.Exists(filename) Then + + Else + clsLogger.Add(String.Format(">> File not found: {0}", filename), False) + Update_COMMENT_GUID(GUID, "FILE NOT FOUND") + End If + + Next + End If + End If + Else + clsLogger.Add(String.Format(">> No Record found for TP: {0}", _TP), False) + Update_COMMENT(_TP, "NO RECORD-ID FOUND") + End If + + Next + + + 'DD_Rights.clsLogger.Init(My.Application.Info.DirectoryPath & "\Log", "") + 'If DD_Rights.ClassRights.Init_Service(LOG_ERRORS_ONLY, DT_RIGHTS_2b_WORKED.Rows.Count) Then + ' If DD_Rights.ClassRights.WORK_RIGHT2B_CHANGED(DT_RIGHTS_2b_WORKED) = True Then + ' clsLogger.Add(">> All rights were worked - " & Now, False) + ' End If + 'End If + End If + End If + + Catch ex As Exception + clsLogger.AddError("Uncexpected Error in working rights: " & ex.Message, "DT_RIGHTS_2b_WORKED") + End Try + + clsLogger.WriteLog() + Catch ex As Exception + clsLogger.AddError("Uncexpected Error: " & ex.Message, "RUN_THREAD") + End Try + End Sub + Private Shared Sub Update_COMMENT(UNIQUE_STR As String, comment As String) + Try + Dim upd = String.Format("UPDATE EXPORT_COMOS_472 SET COMMENT = '{0}' where UPPER(UNIQUE_STR) = UPPER('{1}') AND IMPORTED = 0") + clsDatabase.Execute_non_Query(upd) + Catch ex As Exception + clsLogger.AddError("Uncexpected Error in Update_COMMENT: " & ex.Message) + End Try + End Sub + Private Shared Sub Update_COMMENT_GUID(GUID As Integer, comment As String) + Try + Dim upd = String.Format("UPDATE EXPORT_COMOS_472 SET COMMENT = '{0}' where GUID = {1}") + clsDatabase.Execute_non_Query(upd) + Catch ex As Exception + clsLogger.AddError("Uncexpected Error in Update_COMMENT_GUID: " & ex.Message) + End Try + End Sub + Protected Overrides Sub OnStop() + ' Hier Code zum Ausführen erforderlicher Löschvorgänge zum Beenden des Dienstes einfügen. + + clsLogger.Add("## ZSGImport Service was stopped manually - " & Now & " ## ", False) + clsLogger.WriteLog() + End Sub + Private Shared Sub Thread1_Completed(ByVal sender As Object, ByVal e As System.ComponentModel.RunWorkerCompletedEventArgs) 'Handles threadDateiimport.RunWorkerCompleted + ' This event fires when the DoWork event completes + Try + Dim result As String = "" + If e.Cancelled Then + clsLogger.Add("## The thread was cancelled", False) + clsLogger.WriteLog() + ElseIf e.Error IsNot Nothing Then + clsLogger.Add("Fehler bei Durchlauf. Der Vorgang wird abgebrochen.", True, "Thread_Completed") + clsLogger.Add(e.Error.Message, True, "Thread_Completed") + clsLogger.WriteLog() + End If + Catch ex As Exception + clsLogger.AddError(ex.Message, "Thread_Completed") + End Try + End Sub + +End Class diff --git a/app/ZSG_Import/Service1.vb b/app/ZSG_Import/Service1.vb deleted file mode 100644 index 4139d95..0000000 --- a/app/ZSG_Import/Service1.vb +++ /dev/null @@ -1,12 +0,0 @@ -Public Class Service1 - - Protected Overrides Sub OnStart(ByVal args() As String) - ' Code zum Starten des Dienstes hier einfügen. Diese Methode sollte Vorgänge - ' ausführen, damit der Dienst gestartet werden kann. - End Sub - - Protected Overrides Sub OnStop() - ' Hier Code zum Ausführen erforderlicher Löschvorgänge zum Beenden des Dienstes einfügen. - End Sub - -End Class diff --git a/app/ZSG_Import/ZSG_Import.vbproj b/app/ZSG_Import/ZSG_Import.vbproj index 5381169..416aaaf 100644 --- a/app/ZSG_Import/ZSG_Import.vbproj +++ b/app/ZSG_Import/ZSG_Import.vbproj @@ -6,7 +6,7 @@ AnyCPU {4591D818-6F38-4FBB-918D-76259EBBD7C6} WinExe - ZSG_Import.Service1 + ZSG_Import.MyService ZSG_Import ZSG_Import 512 @@ -47,6 +47,18 @@ On + + ..\..\lib\Interop.WINDREAMLib.dll + False + + + ..\..\lib\Interop.WMOBRWSLib.dll + True + + + ..\..\lib\Interop.WMOTOOLLib.dll + True + @@ -68,15 +80,19 @@ + + + + True Application.myapp - + Component - - Service1.vb + + MyService.vb diff --git a/app/ZSG_Import/clsDatabase.vb b/app/ZSG_Import/clsDatabase.vb new file mode 100644 index 0000000..486fe40 --- /dev/null +++ b/app/ZSG_Import/clsDatabase.vb @@ -0,0 +1,78 @@ +Public Class clsDatabase + Private Shared connectionString As String + + Public Shared Function Init() + Try + connectionString = My.Settings.MyConnectionString + Dim SQLconnect As New SqlClient.SqlConnection + SQLconnect.ConnectionString = connectionString + SQLconnect.Open() + SQLconnect.Close() + clsLogger.AddDetailLog("Database DDRightService initialized") + Return True + Catch ex As Exception + clsLogger.Add("Unexpected Error in DatabaseInit: " & ex.Message, True) + Return False + End Try + End Function + + Public Shared Function Return_Datatable(Select_anweisung As String) + Try + Dim SQLconnect As New SqlClient.SqlConnection + Dim SQLcommand As SqlClient.SqlCommand + SQLconnect.ConnectionString = connectionString + SQLconnect.Open() + SQLcommand = SQLconnect.CreateCommand + SQLcommand.CommandText = Select_anweisung + + Dim adapter1 As SqlClient.SqlDataAdapter = New SqlClient.SqlDataAdapter(SQLcommand) + Dim dt As DataTable = New DataTable() + adapter1.Fill(dt) + SQLconnect.Close() + Return dt + Catch ex As Exception + clsLogger.Add("Unexpected Error in Return_Datatable: " & ex.Message, True) + clsLogger.Add("SQL: " & Select_anweisung, False) + Return Nothing + End Try + End Function + Public Shared Function Execute_non_Query(ExecuteCMD As String, Optional Userinput As Boolean = False) + Try + Dim SQLconnect As New SqlClient.SqlConnection + Dim SQLcommand As SqlClient.SqlCommand + SQLconnect.ConnectionString = connectionString + SQLconnect.Open() + SQLcommand = SQLconnect.CreateCommand + 'Update Last Created Record in Foo + SQLcommand.CommandText = ExecuteCMD + SQLcommand.ExecuteNonQuery() + SQLcommand.Dispose() + SQLconnect.Close() + Return True + Catch ex As Exception + clsLogger.Add("Unexpected Error in Execute_non_Query: " & ex.Message, True) + clsLogger.Add("SQL: " & ExecuteCMD, False) + Return False + End Try + End Function + Public Shared Function Execute_Scalar(cmdscalar As String) + Dim result + Try + Dim SQLconnect As New SqlClient.SqlConnection + Dim SQLcommand As SqlClient.SqlCommand + SQLconnect.ConnectionString = connectionString + SQLconnect.Open() + SQLcommand = SQLconnect.CreateCommand + 'Update Last Created Record in Foo + SQLcommand.CommandText = cmdscalar + result = SQLcommand.ExecuteScalar() + SQLcommand.Dispose() + SQLconnect.Close() + Return result + Catch ex As Exception + clsLogger.Add("Unexpected Error Execute_Scalar: " & ex.Message, True) + clsLogger.Add("SQL: " & cmdscalar, False) + Return Nothing + End Try + End Function +End Class diff --git a/app/ZSG_Import/clsLogger.vb b/app/ZSG_Import/clsLogger.vb new file mode 100644 index 0000000..1f985ac --- /dev/null +++ b/app/ZSG_Import/clsLogger.vb @@ -0,0 +1,156 @@ +Imports System.IO + +Public Class clsLogger + Private Shared LogPath As String + Private Shared LogFilename As String + Private Shared logErr_name As String + Private Shared log_string As String + Public Shared Function Init(ByVal speicherort As String, ByVal prefix As String) + Try + 'Den Speicherort festlegen + SetSpeicherort() + Dim logf_name As String = LogPath & "\" & prefix & System.DateTime.Now.ToString("yyyy_MM_dd") & ".txt" + logErr_name = LogPath & "\" & "ErrorLog_" & System.DateTime.Now.ToString("yyyy_MM_dd") & ".txt" + Dim anz As Integer = 1 + Do While File.Exists(logf_name) + Dim info As New FileInfo(logf_name) + Dim length As Long = info.Length + If length > 5000000 Then + logf_name = IO.Path.GetDirectoryName(logf_name) + logf_name = logf_name & "\" & prefix & System.DateTime.Now.ToString("yyyy_MM_dd") & "(" & anz.ToString & ").txt" + anz = anz + 1 + Else + Exit Do + End If + Loop + LogFilename = logf_name + Try + 'Veruch das Log zu öffnen + Dim fs As FileStream = New FileStream(LogFilename, FileMode.OpenOrCreate, FileAccess.Write) + ' --- Stream öffnen + Dim w As StreamWriter = New StreamWriter(fs) + ' --- Anfügen am Ende + w.BaseStream.Seek(0, SeekOrigin.End) + ' --- Zeilen schreiben + ' --- Writer und Stream schließen + w.Close() + fs.Close() + Catch ex As Exception + LogEscalation_Error("The Logfile could not be created - Error: " & ex.Message) + Return False + End Try + 'Alles Ok + Return True + Catch ex As Exception + LogEscalation_Error("Unexpected Error in init Logger - Error: " & ex.Message) + Return False + End Try + + End Function + Private Shared Sub LogEscalation_Error(msg As String) + Try + 'Veruch das Log zu öffnen + Dim fs As FileStream = New FileStream(logErr_name, FileMode.OpenOrCreate, FileAccess.Write) + ' --- Stream öffnen + Dim w As StreamWriter = New StreamWriter(fs) + ' --- Anfügen am Ende + w.BaseStream.Seek(0, SeekOrigin.End) + ' --- Zeilen schreiben + w.WriteLine(msg) + ' --- Writer und Stream schließen + w.Close() + fs.Close() + Catch ex As Exception + + End Try + End Sub + ' legt den Speicherort fest + Public Shared Sub SetSpeicherort() + Dim f As New IO.DirectoryInfo(My.Application.Info.DirectoryPath & "\Log") + If f.Exists = False Then + IO.Directory.CreateDirectory(My.Application.Info.DirectoryPath & "\Log") + End If + LogPath = My.Application.Info.DirectoryPath & "\Log\" + End Sub + Public Shared Sub Add(ByVal text As String, ByVal _error As Boolean, Optional ByVal Funktion As String = "") + Dim msg As String + If log_string <> "" Then + log_string &= vbNewLine + End If + 'Präfixe schreiben + If _error = True And Funktion <> "" Then + msg = ">> Attention Error in Funktion '" & Funktion & "'" & vbNewLine & "error-message: " + ElseIf _error = True Then + msg = ">> Attention Error:" & vbNewLine & "error-message: " + End If + 'Präfix und Meldung zusammenstellen + msg &= text + log_string &= msg + End Sub + Public Shared Sub AddError(ByVal error_string As String, Optional ByVal Funktion As String = "") + Try + 'Zuerst mal die Details schreiben + WriteLog() + 'Nun den eigentlichen Fehler loggen + Dim msg As String + 'Präfixe schreiben + If Funktion <> "" Then + msg = ">> Attention Error in function/Class '" & Funktion & "'" & vbNewLine & "error-message: " + Else + msg = ">> Attention Error:" & vbNewLine & "error-message: " + End If + 'Präfix und Meldung zusammenstellen + msg &= error_string + 'Veruch das Log zu öffnen + Dim fs As FileStream = New FileStream(LogFilename, FileMode.OpenOrCreate, FileAccess.Write) + ' --- Stream öffnen + Dim w As StreamWriter = New StreamWriter(fs) + ' --- Anfügen am Ende + w.BaseStream.Seek(0, SeekOrigin.End) + ' --- Zeilen schreiben + w.WriteLine(msg) + ' --- Writer und Stream schließen + w.Close() + fs.Close() + Catch ex As Exception + LogEscalation_Error("Unexpected Error in AddError - Error: " & ex.Message) + End Try + + End Sub + + Public Shared Sub AddDetailLog(ByVal text As String) + Try + If LOG_ERRORS_ONLY = False Then + If log_string <> "" Then + log_string &= vbNewLine + End If + log_string &= " >> " & text + End If + Catch ex As Exception + LogEscalation_Error("Unexpected Error in AddDetailLog - Error: " & ex.Message) + End Try + End Sub + + Public Shared Sub WriteLog() + Try + If log_string <> "" Then + 'Veruch das Log zu öffnen + Dim fs As FileStream = New FileStream(LogFilename, FileMode.OpenOrCreate, FileAccess.Write) + ' --- Stream öffnen + Dim w As StreamWriter = New StreamWriter(fs) + ' --- Anfügen am Ende + w.BaseStream.Seek(0, SeekOrigin.End) + ' --- Zeilen schreiben + w.WriteLine(log_string) + ' --- Writer und Stream schließen + w.Close() + fs.Close() + SetSpeicherort() + 'Den Meldungsstring wieder leeren + log_string = "" + End If + Catch ex As Exception + LogEscalation_Error("Unexpected Error in WriteLog - Error: " & ex.Message) + End Try + End Sub +End Class diff --git a/app/ZSG_Import/clsWindream.vb b/app/ZSG_Import/clsWindream.vb new file mode 100644 index 0000000..2748b90 --- /dev/null +++ b/app/ZSG_Import/clsWindream.vb @@ -0,0 +1,1690 @@ + +Imports WINDREAMLib +Imports WINDREAMLib.WMCOMEvent +Imports WINDREAMLib.WMEntity +Imports WINDREAMLib.WMObjectEditMode +Imports WINDREAMLib.WMSearchOperator +Imports WINDREAMLib.WMSearchRelation +Imports WMOBRWSLib +Imports System.IO + +Public Class clsWindream + +#Region "+++++ Konstanten +++++" + Const DEBUG = AUS + Const AUS = 0 + Const WINDREAM = 1 + Const VARIABLEN = 2 + Const WMObjectStreamOpenModeReadWrite = 2 + + Const WMObjectVariableValueTypeUndefined = 0 + Const WMObjectVariableValueTypeString = 1 + Const WMObjectVariableValueTypeInteger = 2 + Const WMObjectVariableValueTypeFloat = 3 + Const WMObjectVariableValueTypeBoolean = 4 + Const WMObjectVariableValueTypeDate = 5 + Const WMObjectVariableValueTypeFixedPoint = 6 + Const WMObjectVariableValueTypeTimeStamp = 7 + Const WMObjectVariableValueTypeCurrency = 8 + Const WMObjectVariableValueTypeTime = 9 + Const WMObjectVariableValueTypeVariant = 10 + Const WMObjectVariableValueTypeMask = &HFFF + Const WMObjectVariableValueFlagMask = &HFFFFF000 + Const WMObjectVariableValueTypeVector = &H1000 + Const WMObjectVariableValueTypeFulltext = &H2000 + Const WMObjectVariableValueTypeDefaultValue = &H4000 +#End Region + +#Region "+++++ Variablen +++++" + Public Shared oConnect ' der Typ darf nicht festgelegt werden (warum auch immer... geht sonst nicht) + Public Shared oSession 'As WINDREAMLib.WMSession ' der Typ darf nicht festgelegt werden (warum auch immer... geht sonst nicht) + Public _inited + Public Shared oBrowser As New WMOBRWSLib.ServerBrowser + Public Shared oDokumentTypen As WINDREAMLib.WMObjects + Public Shared _WDObjekttyp As String + Private Shared aktWMObject As WINDREAMLib.WMObject + Public Shared WD_SERVER + Public Shared CURRENT_WMObject As WMObject +#End Region + + +#Region "+++++ Allgemeine Methoden und Funktionen +++++" + + ''' + ''' Konstruktor für die windream-Klasse + ''' + ''' + Sub New() + ' wenn ein Fehler bei der Initialisierung auftrat + If Not clsWindream.Init() Then + ' Nachricht ausgeben + clsLogger.Add("windream could not be init'ed", True) + ' das Programm "abschießen" + 'Process.GetCurrentProcess.Kill() + End If + End Sub + ''' + ''' Initialisiert die statische Klasse (Login, Session starten, usw.) + ''' + ''' Liefert True wenn das Anmelden erfolgreich war, sonst False + ''' + Public Shared Function Init() As Boolean + Try + Try + ' Session-Objekt instanziieren und mit dem im Client ausgewählten Server belegen + oSession = CreateObject("Windream.WMSession", GetCurrentServer) + clsLogger.AddDetailLog(" >> windream-Server: '" & GetCurrentServer() & "'") + ' Connection-Objekt instanziieren + oConnect = CreateObject("Windream.WMConnect") + + Catch ex As Exception + Return False + End Try + + ' wenn windream nicht angemeldet ist + If IsLoggedIn() = False Then + + ' Art der Anmeldung an windream festlegen + ' 0x0L (also 0) = Standard windream Benutzer + ' WM_ODULE_ID_DOCTYPEEDITOR_LIC = ermöglicht Zugriff auf die windream Management Funktionen (Z.B. zur Verwaltung der windream Dokumententypen, Auswahllisten, etc.) + ' WM_MODULE_ID_INDEXSERVICE = ermöglicht der Session die Indexierungs-Events vom windream DMS-Service zu empfangen + oConnect.ModuleID = 0 + + ' setzt die minimal erwartete windream-Version + oConnect.MinReqVersion = "3" + + ' -- Impersonifizierung nur möglich mit registry-eintrag -- + ' oConnect.UserName "\schulung\windream" + ' oConnect.Password "windream" + + ' Verbindung mit Session-Objekt (und dem ausgewählten Server) aufbauen + oConnect.LoginSession(oSession) + If oSession.aLoggedin = False Then + clsLogger.Add("Could not create connection with windream server", True) + + Return False + End If + + 'If My.Settings.vDetailLog Then + ' ClassLogger.Add(" >> windream-Version: '" & oSession.GetSystemInfo("WindreamVersion") & "'", False) + 'End If + + ' AUSGABE VON SYSTEMINFORMATIONEN + ' Gibt die Versionsart (Lizenztyp) also Small-Business-Edition (SBE), Small-Business-Extension (SBX) + ' oder Business-Edition (BE) aus + 'MsgBox("WindreamVersion: " & oSession.GetSystemInfo("WindreamVersion") & vbNewLine & "LicenceKey: " & oSession.GetSystemInfo("LicenceKey") & vbNewLine & _ + ' vbNewLine & "LicenceName: " & oSession.GetSystemInfo("LicenceName")) + + 'Dim WMCtrl As AISCONTROLDATACOMLib.AISControlData + 'WMCtrl = New AISCONTROLDATACOMLib.AISControlData + + '' liefert die Versionsnummer des Clients + + 'MsgBox(WMCtrl.WMWorkstationBuildNo) + 'MsgBox(WMCtrl.W + '' liefert den Servernamen des angemeldeten windreams + 'MsgBox(WMCtrl.WMServerName) + + Try + oSession.SwitchEvents(WMCOMEventWMSessionNeedIndex, False) + ' der Parameter WMEntityDocument definiert, dass nur Dokumenttypen und keine + ' Ordnertypen ausgelesen werden + oDokumentTypen = oSession.GetWMObjectTypes(WINDREAMLib.WMEntity.WMEntityDocument) + Catch ex As Exception + Return False + End Try + + End If + + Return True + + Catch ex As Exception + clsLogger.Add("Unexpected Error in windream init:" & ex.Message, True) + Return False + End Try + + End Function + +#End Region + +#Region "+++++ Funktionen die für den Objekttyp relevate Informationen zurückliefern +++++" + Public Function GetTypeOfIndex(ByVal indexname As String) As Integer + Try + Dim oAttribute = clsWindream.oSession.GetWMObjectByName(WINDREAMLib.WMEntity.WMEntityAttribute, indexname) + Dim vType = oAttribute.getVariableValue("dwAttrType") + Return vType + Catch ex As Exception + Return Nothing + End Try + End Function + ''' + ''' Liefert alle Indexe eines Objekttypen. + ''' + ''' Name des Objekttyps + ''' Array mit allen Objekttyp zugeordneten Indexen als String + ''' + Public Shared Function GetIndicesByObjecttype(ByVal Objecttype_name As String) As String() + Try + Dim oObjectType As WMObject + Dim oIndexAttributes As WMObjectRelation + Dim oIndexAttribute As WMObject + Dim oIndex As WMObject + Dim oRelProperties As WMObjectRelationClass + + ' den Objekttyp laden + oObjectType = oSession.GetWMObjectByName(WMEntityObjectType, Objecttype_name) + + ' Beziehung zu Indizes des Objekttyp auslesen + oIndexAttributes = oObjectType.GetWMObjectRelationByName("TypeAttributes") + + ' Array für Indizes vorbereiten + Dim aIndexNames(oIndexAttributes.Count - 1) As String + + ' alle Indizes durchlaufen + For j As Integer = 0 To oIndexAttributes.Count - 1 + + ' aktuellen Index auslesen + oIndexAttribute = oIndexAttributes.Item(j) + + ' Eigenschaften des Index auslesen + oRelProperties = oIndexAttribute.GetWMObjectRelationByName("Attribute") + + ' Index aus den Eigenschaften auslesen + oIndex = oRelProperties.Item(0) + + ' Indexname speichern + aIndexNames(j) = oIndex.aName + Next + + ' Indexarray zurückgeben + Return aIndexNames + + Catch ex As Exception + clsLogger.Add("Error reading windream-indices: " & ex.Message, True) + Return Nothing + End Try + End Function + +#End Region + + + +#Region "+++++ Allgemeine Funktionen die Informationen zurückliefern +++++" + + ''' + ''' Liefert True wenn die windream-Session angemeldet ist und False für den Fall, dass die Session nicht eingeloggt ist. + ''' + ''' Anmeldestatus als Boolean + ''' + Public Shared Function IsLoggedIn() As Boolean + Try + Return oSession.aLoggedin + Catch ex As Exception + clsLogger.Add("Error while checking session - Errormessage:" & vbNewLine & ex.Message, True) + End Try + + Return False + End Function + + ''' + ''' Liefert den Servernamen an dem windream aktuell angemeldet ist. + ''' + ''' Servername als String + ''' + Public Shared Function GetCurrentServer() As String + Try + WD_SERVER = oBrowser.GetCurrentServer + Return oBrowser.GetCurrentServer 'ClassWindream.oBrowser.GetCurrentServer + Catch ex As Exception + clsLogger.Add("Error while getting windream-Server - Errormessage: " & ex.Message, True) + End Try + + Return "" + End Function +#End Region + Public Shared Function GetWMSessionAsUser(Domain, ServerName, UserName, Password) + Try + Dim SessionAsUser + Dim aConnect, aUserId, aSession + + ' Hilfsobjekte erschaffen, um eine Verbindung zum windream Server herzustellen + ' mit der gewünschten Benutzer-Identität + aConnect = CreateObject("Windream.WMConnect") + 'Bei einer impersonifizierten Session ist zu beachten, dass die ModuleID 9 zu nutzen ist. + 'Wird keine Session-ID angegeben, hat die Session die ID 0 (‚Default‘). + aConnect.ModuleId = 9 + If Err.Number <> 0 Then + Dim msg = "Error in CreateObject (aConnect) - Err.Number: " & Err.Number & vbNewLine & Err.Description + clsLogger.Add(msg, True) + Return Nothing + End If + + aUserId = CreateObject("WMOTool.WMUserIdentity") + If Err.Number <> 0 Then + Dim msg = "Error in CreateObject('WMOTool.WMUserIdentity') - Err.Number: " & Err.Number & vbNewLine & Err.Description + clsLogger.Add(msg, True) + Return Nothing + End If + + aUserId.aDomain = Domain + aUserId.aServerName = ServerName + aUserId.aUserName = UserName + aUserId.aPassword = Password + + aSession = aConnect.Login(aUserId) + + + If Err.Number <> 0 Then + Dim msg = "Error in Connect.Login(aUserId) - Err.Number: " & Err.Number & vbNewLine & Err.Description + clsLogger.Add(msg, True) + Return Nothing + Else + SessionAsUser = aSession + If aSession.aLoggedin = True Then + Return SessionAsUser + End If + + End If + Catch ex As Exception + Dim msg = "Unexpected Error in GetWMSessionAsUser: " & ex.Message + clsLogger.Add(msg, True) + Return Nothing + End Try + + End Function + Public Shared Function Stream_File(ByVal filenameQuelle As String, ByVal filenameZiel As String, Optional ImportAll As Boolean = False) + Try + aktWMObject = Nothing + Dim zielpfad = Path.GetDirectoryName(filenameZiel) + If My.Computer.FileSystem.DirectoryExists(zielpfad) = False Then + My.Computer.FileSystem.CreateDirectory(zielpfad) + clsLogger.Add(">> Zielverzeichnis neu erzeugt!", False) + End If + + Const STREAM_BinaryObject = "BinaryObject" + + clsLogger.AddDetailLog(" >> Stream_File wurde gestartet") + Dim endgültigerDateiname As String = "" + ' Objekt für Datei und Zielverzeichnis anlegen + ' Dim Quelldatei_Name As String = Path.GetFileName(filenameQuelle) + + clsLogger.AddDetailLog(" >> Quelldatei gelesen") + + '######## + endgültigerDateiname = filenameZiel.Substring(2) + If My.Computer.FileSystem.DirectoryExists(zielpfad) Then + clsLogger.AddDetailLog(" >> targetPath exisitiert") + ' Überprüfen ob der zu Kopieren notwendige Speicherplatz auf Ziellaufwerk vorhanden ist + Dim dvr As New DriveInfo("W:") + 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 + clsLogger.Add("Not enough space on filestore", True) + Return -10 + End If + + clsLogger.AddDetailLog(" >> Datei kopieren von " & filenameQuelle & " nach " & endgültigerDateiname & ".") + Dim Connect + Dim Session + Dim WMObject + Dim aFileIO + Dim aWMStream + Dim wmbrwsr + Dim dmsServer As String + clsLogger.AddDetailLog(" >> Connect definieren: CreateObject('Windream.WMConnect')") + Connect = CreateObject("Windream.WMConnect") + aFileIO = New WMOTOOLLib.WMFileIO + 'If My.Settings.DLL_WMOTOOL = "" Then + ' aFileIO = New WMOTOOLLib.WMFileIO + ' clsLogger.AddDetailLog(" >> Direkter Verweis auf New WMOTOOLLib.WMFileIO") + 'Else + ' aFileIO = CreateObject(My.Settings.DLL_WMOTOOL) 'WMOTool.WMFileIO oder WMOTOOLLib.WMFileIO + ' clsLogger.AddDetailLog(" >> Verwendeter Verweis aus Anwendungsstring: '" & My.Settings.DLL_WMOTOOL & "'") + 'End If + + wmbrwsr = CreateObject("WMOBrws.ServerBrowser") + '================================================================== + ' get the current DMS-server to log in + '================================================================== + dmsServer = wmbrwsr.GetCurrentServer + '================================================================== + ' create a session + '================================================================== + 'Prüfen ob sich personifiziert angemeldet werden muss? + + Session = GetWMSessionAsUser(My.Settings.AD_DOMAIN, My.Settings.AD_SERVER, My.Settings.AD_USER, My.Settings.AD_USER_PW) + + '================================================================== + ' login session + '================================================================== + Try + Connect.LoginSession(Session) + Dim LoggedIn = Session.aLoggedin + If LoggedIn Then + clsLogger.AddDetailLog(" >> 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 + clsLogger.Add(">> Login on dms-Server failed", True) + ' MsgBox("Login failed. ") + End If + Catch ex As Exception + clsLogger.Add(">> Persionalized session - User is already logged in!'" & Err.Description & "'", True) + End Try + + Const WMCOMEventWMSessionNeedIndex = 1 + + 'windream Objekte erstellen ohne Indexierungs-Event + Session.SwitchEvents(WMCOMEventWMSessionNeedIndex, False) + '================================================================== + ' check if files exist + '================================================================== + clsLogger.AddDetailLog(" >> ÜBERPRÜFTER DATEINAME => " & endgültigerDateiname) + Dim wdFilexists As Boolean + clsLogger.AddDetailLog(" >> Versuch auf die Datei in W: zuzugreifen und zu sperren...") + wdFilexists = Session.WMObjectExists(WMEntityDocument, endgültigerDateiname, 0, 0) + + If wdFilexists = False Then + clsLogger.AddDetailLog(" >> Datei ist NICHT vorhanden, kann also einfach neu angelegt werden") + Err.Clear() + '================================================================== + ' create an object + '================================================================== + WMObject = Session.GetNewWMObjectFS(WMEntityDocument, endgültigerDateiname, WMObjectEditModeObject) + If Err.Number > 0 Then + clsLogger.Add(" FEHLER: WMObject konnte nicht erzeugt werden - Error: '" & Err.Description & "'", True) + End If + + Else + ' wenn auf die Datei zugeriffen werden konnte ist sie bereits vorhanden -> Datum anhängen + clsLogger.AddDetailLog(" >> Es konnte zugegriffen werden -> DATEI IST BEREITS VORHANDEN") + Err.Clear() + + WMObject = Session.GetNewWMObjectFS(WMEntityDocument, endgültigerDateiname, WMObjectEditModeObject) + If Err.Number > 0 Then + clsLogger.Add(" FEHLER: Neues WMObject (Kopie) konnte nicht erzeugt werden - Error: '" & Err.Description & "'", True) + + End If + clsLogger.AddDetailLog(" >> WMObject zugewiesen") + End If + clsLogger.AddDetailLog(" >> ENDGÜLTIGER DATEINAME => " & endgültigerDateiname) + 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 + + clsLogger.Add(" FEHLER: fileIO konnte nicht gesetzt werden - Datei wird wieder gelöscht - Error: '" & Err.Description & "'", True) + clsLogger.Add(" HINWEIS: Überprüfen Sie den Verweis auf die Bibliotheken 'WMOTool.WMFileIO' UND 'WMOTOOLLib.WMFileIO' und ändern diese in den Anwendungseinstellungen (DLL_WMOTOOL)'", False) + WMObject.unlock() + System.IO.File.Delete("W:\" & endgültigerDateiname) + Return False + + End If + ' open the windream object's file stream for writing + aWMStream = WMObject.OpenStream(STREAM_BinaryObject, WMObjectStreamOpenModeReadWrite) + If Err.Number > 0 Then + clsLogger.Add(" FEHLER bei OpenStream - Datei wird wieder gelöscht - Error: '" & Err.Description & "'", True) + WMObject.unlock() + System.IO.File.Delete("W:\" & endgültigerDateiname) + Return False + + End If + clsLogger.AddDetailLog(" >> oWMStream erzeugt") + ' give fileIO helper object the windream stream + aFileIO.aWMStream = aWMStream + If Err.Number > 0 Then + clsLogger.Add(" FEHLER bei Zuweisen aWMStream zu aFileIO - Datei wird wieder gelöscht - Error: '" & Err.Description & "'", True) + WMObject.unlock() + System.IO.File.Delete("W:\" & endgültigerDateiname) + Return False + + End If + ' let fileIO object import the original file into windream + aFileIO.ImportOriginal(True) + If Err.Number > 0 Then + clsLogger.Add(" FEHLER bei FileIO.ImportOriginal(True) - Datei wird wieder gelöscht - Error: '" & Err.Description & "'", True) + WMObject.unlock() + System.IO.File.Delete("W:\" & endgültigerDateiname) + Return False + + End If + clsLogger.AddDetailLog(" >> Inhalt der Datei konnte übertragen werden") + ' close the windream file stream + aWMStream.Close() + If Err.Number > 0 Then + clsLogger.Add(" FEHLER bei aWMStream.Close() - Datei wird wieder gelöscht - Error: '" & Err.Description & "'", True) + WMObject.unlock() + System.IO.File.Delete("W:\" & endgültigerDateiname) + Return False + + End If + ' save new windream object + WMObject.Save() + If Err.Number > 0 Then + clsLogger.Add(" FEHLER bei WMObject.save - Datei wird wieder gelöscht - Error: '" & Err.Description & "'", True) + WMObject.unlock() + System.IO.File.Delete("W:\" & endgültigerDateiname) + Return Err.Number + + End If + clsLogger.AddDetailLog(" >> Datei konnte gespeichert werden") + ' unlock the windream object + WMObject.unlock() + If Err.Number > 0 Then + clsLogger.Add(" FEHLER bei WMObject.unlock - Datei wird wieder gelöscht - Error: '" & Err.Description & "'", True) + WMObject.unlock() + System.IO.File.Delete("W:\" & endgültigerDateiname) + Return False + + End If + 'DATEI GRÖSSE ERMITTELN - MANCHMAL KOMMT ES VOR DAS DATEIGRÖße 0 ist + Dim info2 As New FileInfo("W:\" & endgültigerDateiname) + Dim length1 As Long = info2.Length + 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 = "W:" & endgültigerDateiname + CURRENT_FILEIN_WD = CURRENT_FILEIN_WD.Replace("\\", "\") + clsLogger.Add(">> File '" & CURRENT_FILEIN_WD & "' was imported.", False) + + + aktWMObject = WMObject + Return True + Else + If length = 0 Then + If ImportAll = False Then + System.IO.File.Delete("W:\" & endgültigerDateiname) + clsLogger.Add(" Error in Stream File - FileLength = 0, File " & CURRENT_FILEIN_WD & " was deleted", True) + Return False + Else + 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 + clsLogger.Add(">> ATTENTION in Stream File - FileLength = 0, File " & CURRENT_FILEIN_WD & " will be imported", False) + CURRENT_FILEIN_WD = "W:" & endgültigerDateiname + CURRENT_FILEIN_WD = CURRENT_FILEIN_WD.Replace("\\", "\") + + '### + clsLogger.Add(">> File '" & CURRENT_FILEIN_WD & "' was imported.", False) + aktWMObject = WMObject + Return True + End If + + Else + clsLogger.Add("Error in Stream File - Error <> 0", True) + Return False + End If + + End If + Else + Return False + End If + Else + clsLogger.AddDetailLog(" >> targetPath exisitiert NICHT") + Return False + End If + Catch ex As Exception + clsLogger.Add("Unexpected Error in Stream File: " & vbNewLine & ex.Message, True) + Return False + End Try + + + End Function + Public Shared Function Delete_WDFile(ByVal WD_File As String) + Try + WD_File = WD_File.Substring(2) + Dim WMObject As WINDREAMLib.WMObject '= CreateObject("WINDREAMLib.WMObject") 'New WINDREAMLib.WMObject + Try + WMObject = oSession.GetWMObjectByPath(WINDREAMLib.WMEntity.WMEntityDocument, WD_File) 'WINDREAMLib.WMEntity.WMEntityDocument + Catch ex As Exception + clsLogger.Add(">> Could not create WMObject for file '" & WD_File & "' - so it is not existing", False) + Return False + End Try + + clsLogger.AddDetailLog(" >> Deleting started - Object created") + WMObject.Delete() + Return True + Catch ex As Exception + clsLogger.Add("Unexpected Error in Delete_WDFile: " & ex.Message, False) + Return False + End Try + End Function + + Public Shared Function WDFile_exists(ByVal WD_File As String) + Try + If Not WD_File.StartsWith("\") Then + WD_File = WD_File.Substring(2) + End If + Dim WMObject As WINDREAMLib.WMObject '= CreateObject("WINDREAMLib.WMObject") 'New WINDREAMLib.WMObject + WMObject = oSession.GetWMObjectByPath(WINDREAMLib.WMEntity.WMEntityDocument, WD_File) 'WINDREAMLib.WMEntity.WMEntityDocument + clsLogger.AddDetailLog(" >> WDFile_exists - Could create an object") + Return True + Catch ex As Exception + clsLogger.AddDetailLog(" >> WDFile_exists- Could not create object for file '" & WD_File & "'") + Return False + End Try + End Function + + + ''' + ''' Übergibt einer in windream gespeicherten Datei Indexwerte + ''' + ''' Name der zu indexierenden Datei + ''' neuer Name der zu indexierenden Datei + ''' Liefert True wenn das Indexieren erfolgreich war, sonst False + ''' + Public Shared Function IndexFile(ByVal WD_File As String, ByVal _Indexname As String, ByVal _Value As String, Optional outside As Boolean = False, Optional _objecttype As String = "") + Try + clsLogger.AddDetailLog(" >> IndexFile ('" & WD_File & "','" & _Indexname & "','" & _Value & "') was called!") + + '' das entsprechende Attribut aus windream auslesen + 'Dim oAttribute = oSession.GetWMObjectByName(WINDREAMLib.WMEntity.WMEntityAttribute, _Indexname) + ''den Variablentyp (String, Integer, ...) auslesen + 'Dim vType = oAttribute.getVariableValue("dwAttrType") + WD_File = WD_File.Substring(2) + Dim WMObject As WINDREAMLib.WMObject '= CreateObject("WINDREAMLib.WMObject") 'New WINDREAMLib.WMObject + + + ' den Dokumenttyp schreiben + clsLogger.AddDetailLog(" >> Indexing will be started") + If outside = True Then + _WDObjekttyp = _objecttype + aktWMObject = Nothing + aktWMObject = oSession.GetWMObjectByPath(WINDREAMLib.WMEntity.WMEntityDocument, WD_File) 'WINDREAMLib.WMEntity.WMEntityDocument + End If + ' ein windream-Objekt der Datei anlegen + WMObject = aktWMObject 'oSession.GetWMObjectByPath(WINDREAMLib.WMEntity.WMEntityDocument, WD_File) + Try + ' die Datei sperren + WMObject.lock() + Catch ex As Exception + ' nichts tun (Datei ist bereits gesperrt) + End Try + + ' wenn der Datei noch kein Dokumenttyp zugewiesen wurde + If WMObject.aObjectType.aName = "Standard" Then + Try + ' ihr den entsprechenden Dokumenttyp zuweisen + WMObject.aObjectType = oSession.GetWMObjectByName(WINDREAMLib.WMEntity.WMEntityObjectType, _WDObjekttyp) + Catch ex As Exception + clsLogger.Add("Unexpected Error Setting the objecttype' " & _WDObjekttyp & "'!", True) + clsLogger.Add("Error-Description: " & ex.Message, False) + WMObject.Save() + WMObject.unlock() + ' Me.TreeNodeInfos.Add(temp) + Return False + End Try + + ' WMObject.aObjectType = Me.selectedProfile.Dokumenttyp + clsLogger.AddDetailLog(" >> Objecttype '" & _WDObjekttyp & "' was set!") + End If + + Try + WMObject.Save() + Catch ex As Exception + ' wenn es einen Fehler beim speichern gab, dann konnte auch kein Dokumenttyp gesetzt werden -> es kann also auch keine + ' Indexierung stattfinden und die Indexierung muss nicht fortgesetzt werden + Return False + End Try + + Try + WMObject.unlock() + Catch ex As Exception + ' wenn das entsperren nicht geklappt hat, dann war die Datei auch nicht gesperrt + End Try + clsLogger.AddDetailLog(" >> File saved / Unlock done") + ' wenn bis hierher alles geklappt hat wurde ein Dokumenttyp übergeben + + clsLogger.AddDetailLog(" >> Objecttype: " & _WDObjekttyp) + + + ' wenn keine Werte vorhanden sind, soll wenigstens der Dokumenttyp eingetragen werden + + Dim indexe As String = "" + + Dim werte = New ArrayList + + 'Den Typ des Index-Feldes auslesen + + + If (GetTypeOfIndexAsIntByName(_Indexname) = WMObjectVariableValueTypeVector) Or GetTypeOfIndexAsIntByName(_Indexname) = 4097 Then + clsLogger.AddDetailLog(" >> type vectorfield") + 'Am 04.08.2014 aktualisiert: um zu verhindern das die vorangegangene Versionierung "Tilde-Werte" schreibt + clsLogger.AddDetailLog(" >> value before checking: " & _Value) + _Value = CheckIndexValue(_Value) + 'Ausstieg da Fehler in der Überprüfung + If _Value Is Nothing Then + Return False + End If + werte.Add(_Value) + clsLogger.AddDetailLog(" >> value for indexing: " & _Value) + Else + 'Am 04.08.2014 aktualisiert: um zu verhindern das die vorangegangene Versionierung "Tilde-Werte" schreibt + clsLogger.AddDetailLog(" >> value before checking: " & _Value) + _Value = CheckIndexValue(_Value) + 'Ausstieg da Fehler in der Überprüfung + If _Value Is Nothing Then + Return False + End If + werte.Add(_Value) + clsLogger.AddDetailLog(" >> value for indexing: " & _Value) + End If + + Dim arrIndex() As String = Nothing + Dim arrValue() As String = Nothing + ReDim Preserve arrIndex(0) + ReDim Preserve arrValue(0) + arrIndex(0) = _Indexname + arrValue(0) = _Value + Return RunIndexing(WMObject, arrIndex, arrValue) + + 'MsgBox(arr(0) & vbNewLine & indexe) + + Catch ex As Exception + clsLogger.Add("Unexpected Error in IndexFile: the file' " & WD_File & "' could not be indexed!", True) + clsLogger.Add("Error-Description: " & ex.Message, False) + ' Me.TreeNodeInfos.Add(temp) + Return False + End Try + End Function + Public Shared Function File_SetBooleanIndex(ByVal _value As Boolean, ByVal _dok As WINDREAMLib.WMObject, ByVal _Indexname As String, Optional SetOType As Boolean = True) + Try + If _Indexname <> "" Then + 'Überprüfen ob Boolean-Value bereits gesetzt wurde? + Dim akt_Status As Boolean = CBool(_dok.GetVariableValue(_Indexname)) + If akt_Status <> _value Then + 'Index muß angepasst werden + clsLogger.AddDetailLog(" >> Index not set to '" & _value.ToString & "'") + Dim arrIndex() As String = Nothing + Dim arrValue() As String = Nothing + 'Nun die Datei indexieren + arrIndex = Nothing + arrValue = Nothing + ReDim Preserve arrIndex(0) + ReDim Preserve arrValue(0) + arrIndex(0) = _Indexname + arrValue(0) = _value.ToString + RunIndexing(_dok, arrIndex, arrValue, SetOType) + Else + 'Validation muß nicht angepasst werden + clsLogger.AddDetailLog(" >> Index already set to '" & _value.ToString & "'") + End If + End If + Catch ex As Exception + clsLogger.Add("Unexpected Error in File_SetBooleanIndex!", True) + clsLogger.Add("Error-Description: " & ex.Message, False) + End Try + + + End Function + Private Shared Function RunIndexing(ByVal oDocument As WMObject, ByVal Indizes() As String, ByVal aValues() As Object, Optional setOType As Boolean = True) + Dim vektInsState As Integer = 1 + Try + If Indizes IsNot Nothing And aValues IsNot Nothing Then + If Not oDocument.aLocked Then + oDocument.lock() + Dim i As Integer = 0 + Dim indexname As String + If aValues.Length = 1 And aValues(0) = "" Then + clsLogger.AddDetailLog(" >> Indexvalue is empty - No indexing") + End If + ' wenn der Datei noch kein Dokumenttyp zugewiesen wurde + If oDocument.aObjectType.aName <> _WDObjekttyp And setOType = True Then + ' ihr den entsprechenden Dokumenttyp zuweisen + oDocument.aObjectType = oSession.GetWMObjectByName(WINDREAMLib.WMEntity.WMEntityObjectType, _WDObjekttyp) + ' WMObject.aObjectType = Me.selectedProfile.Dokumenttyp + clsLogger.AddDetailLog(" >> Objecttype '" & oDocument.aObjectType.aName & "' was changed to '" & _WDObjekttyp) + Else + clsLogger.AddDetailLog(" >> Objecttype was set already.") + End If + If setOType = True Then + Try + oDocument.Save() + Catch ex As Exception + ' wenn es einen Fehler beim speichern gab, dann konnte auch kein Objekttyp gesetzt werden -> es kann also auch keine + ' Indexierung stattfinden und die Indexierung muss nicht fortgesetzt werden + Return False + End Try + End If + + 'Jetzt jeden Indexwert durchlaufen + For Each aName As String In Indizes + indexname = aName + + clsLogger.AddDetailLog(" ") + clsLogger.AddDetailLog(" >> Indexing of index '" & indexname & "'") + + ' das entsprechende Attribut aus windream auslesen + Dim oAttribute = oSession.GetWMObjectByName(WINDREAMLib.WMEntity.WMEntityAttribute, Indizes(i)) + ' den Variablentyp (String, Integer, ...) auslesen + Dim vType = oAttribute.getVariableValue("dwAttrType") + ' wenn in aValues an Position i ein Wert steht + If IsNotEmpty(aValues(i)) Then + Dim _int As Boolean = False + Dim _date As Boolean = False + Dim _dbl As Boolean = False + Dim _bool As Boolean = False + + Dim value = aValues(i) + Dim convertValue + Dim vektor As Boolean = False + 'Den Typ des Index-Feldes auslesen + + Select Case (vType) + 'Case WMObjectVariableValueTypeUndefined + Case WMObjectVariableValueTypeString + clsLogger.AddDetailLog(" >> type of windreamIndex WMObjectVariableValueTypeString") + convertValue = CStr(value) + Case WMObjectVariableValueTypeInteger + clsLogger.AddDetailLog(" >> type of windreamIndex WMObjectVariableValueTypeInteger") + value = value.ToString.Replace(" ", "") + If IsNumeric(value) = False Then + clsLogger.AddDetailLog(" >> Attention: Value '" & value & "' can not be converted to integer!") + End If + value = value.ToString.Replace(" ", "") + convertValue = CInt(value) + _int = True + Case WMObjectVariableValueTypeFloat + clsLogger.AddDetailLog(" >> type of windreamIndex WMObjectVariableValueTypeFloat") + value = value.ToString.Replace(" ", "") + convertValue = CDbl(value) + Case WMObjectVariableValueTypeFixedPoint + clsLogger.AddDetailLog(" >> type of windreamIndex WMObjectVariableValueTypeFixedPoint") + value = value.ToString.Replace(" ", "") + convertValue = CDbl(value) + _dbl = True + Case WMObjectVariableValueTypeBoolean + clsLogger.AddDetailLog(" >> type of windreamIndex WMObjectVariableValueTypeBoolean") + convertValue = CBool(value) + _bool = True + Case WMObjectVariableValueTypeDate + clsLogger.AddDetailLog(" >> type of windreamIndex WMObjectVariableValueTypeDate") + _date = True + 'Dim _date As Date = value + convertValue = value + Case WMObjectVariableValueTypeTimeStamp + clsLogger.AddDetailLog(" >> type of windreamIndex WMObjectVariableValueTypeTimeStamp") + convertValue = CDbl(value) + Case WMObjectVariableValueTypeCurrency + clsLogger.AddDetailLog(" - type of windreamIndex WMObjectVariableValueTypeCurrency") + 'Wegen currency muß ein eigenes Objekt vom typ Variant erzeugt werden + Dim aValueWrapper As System.Runtime.InteropServices.CurrencyWrapper = New System.Runtime.InteropServices.CurrencyWrapper(CDec(value)) + convertValue = aValueWrapper + Case WMObjectVariableValueTypeTime + clsLogger.AddDetailLog(" >> type of windreamIndex WMObjectVariableValueTypeTime") + 'If ((value)) Then + ' convertValue = CDate(value) + 'Else + ' convertValue = "" + 'End If + 'Dim _date As Date = value + convertValue = convertValue '*_date.ToShortTimeString + Case WMObjectVariableValueTypeFloat + clsLogger.AddDetailLog(" >> type of windreamIndex WMObjectVariableValueTypeFloat") + convertValue = CStr(value) + Case WMObjectVariableValueTypeVariant + clsLogger.AddDetailLog(" >> type of windreamIndex WMObjectVariableValueTypeVariant") + convertValue = CStr(value) + Case WMObjectVariableValueTypeFulltext + clsLogger.AddDetailLog(" >> type of windreamIndex WMObjectVariableValueTypeFulltext") + convertValue = CStr(value) + Case 4097 + clsLogger.AddDetailLog(" >> type of windreamIndex 4097 Vektor alphanumerisch") + 'Vektor alphanumerisch + vektor = True + Case 4098 + clsLogger.AddDetailLog(" >> type of windreamIndex 4098 Vektor Numerisch") + 'Vektor Numerisch + vektor = True + Case 4099 + clsLogger.AddDetailLog(" >> type of windreamIndex 4099 Vektor Kommazahl") + 'Vektor Kommazahl + vektor = True + Case 4100 + clsLogger.AddDetailLog(" >> type of windreamIndex 4100 Vektor Boolean") + 'Vektor Kommazahl + vektor = True + Case 4101 + clsLogger.AddDetailLog(" >> type of windreamIndex 4101 Vektor Date") + 'Vektor Kommazahl + vektor = True + Case 4103 + clsLogger.AddDetailLog(" >> type of windreamIndex 4103 Vektor DateTime") + 'Vektor DateTime + vektor = True + Case 4107 + clsLogger.AddDetailLog(" >> type of windreamIndex 4107 Integer 64bit") + vektor = True + Case 36865 + clsLogger.AddDetailLog(" >> type of windreamIndex 36865 Vektor alphanumerisch") + 'Vektor Kommazahl + vektor = True + Case Else + clsLogger.AddDetailLog(" >> Typ des windream-Indexes konnte nicht bestimmt werden!") + clsLogger.AddDetailLog(" >> Versuch des Auslesens (vType): " & vType) + + convertValue = "" + End Select + If vektor = False Then + If convertValue.ToString Is Nothing = False Then + clsLogger.AddDetailLog(" >> Converted valuet: '" & convertValue.ToString & "'") + End If + End If + '############################################################################################ + '####################### Der eigentliche Indexierungsvorgang ################################ + '############################################################################################ + If vektor = False Then + Try + If convertValue.ToString Is Nothing = False Then + clsLogger.AddDetailLog(" >> Now: oDocument.SetVariableValue(" & aName & ", " & convertValue & ")") + If _int = True Then + convertValue = convertValue.ToString.Replace(" ", "") + oDocument.SetVariableValue(aName, CInt(convertValue)) + ElseIf _date = True Then + oDocument.SetVariableValue(aName, CDate(convertValue)) + ElseIf _bool Then + oDocument.SetVariableValue(aName, CBool(convertValue)) + ElseIf _dbl Then + convertValue = convertValue.ToString.Replace(" ", "") + oDocument.SetVariableValue(aName, CDbl(convertValue)) + Else + oDocument.SetVariableValue(aName, convertValue) + End If + 'Die Datei speichern + oDocument.Save() + + clsLogger.AddDetailLog(" >> index '" & aName & "' was written") + clsLogger.AddDetailLog("") + + Else + clsLogger.Add(" >> No indexvalue exists", False) + End If + Catch ex As Exception + clsLogger.Add("Unexpected Error in SetVariableValue für Index '" & aName & "': " & ex.Message, True) + oDocument.Save() + oDocument.unlock() + Return False + End Try + + Else + 'VEKTORFELDER, ALSO ÜBERPRÜFEN OB ERGEBNIS-ARRAY GEFÜLLT IST + clsLogger.AddDetailLog(" >> Vectorfield: Preparing of Array") + Dim myArray() + 'If aValues.Length = 2 And aValues(0) = "" Then + ' clsLogger.AddDetailLog(" >> Indexwert ist leer/Nothing - Keine Nachindexierung") + 'End If + 'For Each row As DataRow In DT.Rows + + 'Next + Dim Anzahl As Integer = aValues.Length + 'Vektorfeld wird mit EINEM Wert gefüllt + If Anzahl = 1 Then + clsLogger.AddDetailLog(" >> Vectorfield will be filled with ONE VALUE") + ReDim myArray(0) + myArray(0) = Convert_VectorType(vType, value) + 'Jetzt überprüfen ob Werte in Vektorfeld angefügt oder überschrieben werden sollen + clsLogger.AddDetailLog(" >> Converted Value: " & myArray(0).ToString) + Dim VektorArray() + VektorArray = Return_VektorArray(oDocument, aName, myArray, vType) + If VektorArray Is Nothing = False Then + ReDim myArray(VektorArray.Length - 1) + Array.Copy(VektorArray, myArray, VektorArray.Length) + 'Jetzt die Nachindexierung für Vektor-Felder + oDocument.SetVariableValue(aName, myArray) ' + If LOG_ERRORS_ONLY = False Then + clsLogger.AddDetailLog(" >> Vectorindex '" & aName & "' was written") + clsLogger.AddDetailLog("") + End If + 'Die Änderungen festsschreiben/speichern + oDocument.Save() + End If + + End If + + + + End If + Else + clsLogger.AddDetailLog(" >> Array of indexvalues is nothing - No indexing") + End If + i += 1 + + Next + oDocument.unlock() + + clsLogger.AddDetailLog(" >> ...and unlock.") + + Return True + Else + clsLogger.Add(" >> document is locked!", False) + 'oDocument.unlock() + Return False + End If + End If + Catch ex As Exception + clsLogger.Add("Unexpected Error in ClassNiWindream.RunIndexing: " & ex.Message, True) + oDocument.Save() + oDocument.unlock() + Return False + End Try + End Function + Private Shared Function Return_VektorArray(ByVal oDocument As WMObject, vktIndexName As String, arr_Indexwerte As Object, vType As Object) + Try + Dim missing As Boolean = False + Dim Anzahl As Integer = 0 + Dim ValueArray() + 'Jeden Wert des Vektorfeldes durchlaufen + Dim wertWD = oDocument.GetVariableValue(vktIndexName) + If wertWD Is Nothing = False Then + 'Nochmals prüfen ob wirklich Array + If wertWD.GetType.ToString.Contains("System.Object") Then + 'Duplikat Prüfung an, also nur anhängen wenn Wert <> + For Each WDValue As Object In wertWD + If WDValue Is Nothing = False Then + 'Erst die ALten Werte schreiben + ReDim Preserve ValueArray(Anzahl) + 'Den Wert im Array speichern + ValueArray(Anzahl) = Convert_VectorType(vType, WDValue) + Anzahl += 1 + End If + Next + 'Jetzt die Neuen Werte auf Duplikate überprüfen + For Each NewValue As Object In arr_Indexwerte + If NewValue Is Nothing = False Then + If ValueArray.Contains(NewValue) = False Then + 'Das Array anpassen + ReDim Preserve ValueArray(Anzahl) + 'Den Wert im Array speichern + ValueArray(Anzahl) = Convert_VectorType(vType, NewValue) + Anzahl += 1 + Else + clsLogger.Add(" >> Value '" & NewValue.ToString & "' already existing in vectorfield", False) + End If + End If + Next + + End If + Else + clsLogger.AddDetailLog(" >> vectorfield is empty....") + 'Den/die Neuen Wert(e) anfügen + For Each NewValue As Object In arr_Indexwerte + If NewValue Is Nothing = False Then + If ValueArray Is Nothing = False Then + If ValueArray.Contains(NewValue) = False Then + 'Das Array anpassen + ReDim Preserve ValueArray(Anzahl) + 'Den Wert im Array speichern + ValueArray(Anzahl) = Convert_VectorType(vType, NewValue) + Anzahl += 1 + Else + clsLogger.Add(" >> Value '" & NewValue.ToString & "' already existing in Array", False) + End If + Else 'Dererste Wert, also hinzufügen + 'Das Array anpassen + ReDim Preserve ValueArray(Anzahl) + 'Den Wert im Array speichern + ValueArray(Anzahl) = Convert_VectorType(vType, NewValue) + Anzahl += 1 + + End If + + + End If + Next + End If + + Return ValueArray + Catch ex As Exception + clsLogger.Add("unexpected error in ClassWindream.Return_VektorArray: " & ex.Message, True) + End Try + + + End Function + Public Shared Function REMOVE_VEKTOR_LINK(ByVal FILEPATH As String, vktIndexName As String, deleteValue As String) + Try + Dim WMObject As WINDREAMLib.WMObject + Dim containsvalue As Boolean = False + Try + ' ein windream-Objekt der Datei erzeugen + WMObject = oSession.GetWMObjectByPath(WINDREAMLib.WMEntity.WMEntityDocument, FILEPATH.Substring(2)) + clsLogger.AddDetailLog(" >> wibdreamObject created") + Catch ex As Exception + clsLogger.Add("Unexpected Error in Initializing windream file: " & ex.Message, False) + Return False + End Try + + Dim ValueArray() + 'Jeden Wert des Vektorfeldes durchlaufen + Dim wertWD = WMObject.GetVariableValue(vktIndexName) + If wertWD Is Nothing = False Then + 'Nochmals prüfen ob wirklich Array + If wertWD.GetType.ToString.Contains("System.Object") Then + ' das entsprechende Attribut aus windream auslesen + Dim oAttribute = oSession.GetWMObjectByName(WINDREAMLib.WMEntity.WMEntityAttribute, vktIndexName) + ' den Variablentyp (String, Integer, ...) auslesen + Dim vType = oAttribute.getVariableValue("dwAttrType") + Dim Anzahl As Integer = 0 + For Each WDValue As Object In wertWD + If WDValue Is Nothing = False Then + If WDValue = deleteValue Then + containsvalue = True + End If + If WDValue <> deleteValue Then + 'Erst die ALten Werte schreiben + ReDim Preserve ValueArray(Anzahl) + 'Den Wert im Array speichern + ValueArray(Anzahl) = Convert_VectorType(vType, WDValue) + Anzahl += 1 + End If + End If + Next + End If + End If + If containsvalue = True Then 'And Not IsNothing(ValueArray) + Try + ' die Datei sperren + WMObject.lock() + Catch ex As Exception + clsLogger.Add("Unexpected Error in locking windream file: " & ex.Message, False) + Return False + End Try + + 'Indexiern des Vektorfeldes + WMObject.SetVariableValue(vktIndexName, ValueArray) + ' die Indexinformationen des Dokuments speichern + WMObject.Save() + clsLogger.Add(" >> The new vectorvalues were saved!", False) + ' Unlock in einem unbehandelten Try-Block um Fehler abzufangen, + ' wenn eine Datei nicht gesperrt ist + Try + ' die Sperrung des Dokuments aufheben + WMObject.unlock() + clsLogger.AddDetailLog(" >> die Sperrung des Dokuments aufheben") + Catch ex As Exception + ' nichts tun (Datei war nicht gesperrt) + End Try + + ' die Indexierungsinformationen für den TreeView-Log zurückgeben + Return True + Else + clsLogger.Add("Could not remove the linked value!", True) + Return False + End If + + Catch ex As Exception + clsLogger.Add("unexpected error in ClassWindream.REMOVE_VEKTOR_LINK: " & ex.Message, True) + Return False + End Try + + + End Function + + Private Shared Function Convert_VectorType(vType As Object, value As String) + Select Case vType + Case 36865 + 'Umwandeln in String + Return CStr(value) + Case 4097 + 'Umwandeln in String + Return CStr(value) + Case 4098 + 'Umwandeln in Integer + value = value.ToString.Replace(" ", "") + Return CInt(value) + Case 4099 + Dim Str As String = value + Str = Str.ToString.Replace(" ", "") + 'Umwandeln in Double + Return CDbl(Str.Replace(".", ",")) + Case 4100 + 'Umwandeln in Boolean + Return CBool(value) + Case 4101 + 'Umwandeln in Date + Return CDate(value) + Case 4107 + Return Convert.ToInt64(value) + Case 4103 + 'Umwandeln in Datum Uhrzeit + Return value + Case Else + 'Umwandeln in String + Return CStr(value) + End Select + End Function + Private Shared Function IsNotEmpty(ByVal aValue As Object) + + If aValue IsNot Nothing Then + Dim itsType As Type = aValue.GetType + If itsType Is GetType(String) Then + + If Not aValue = "" Then + Return True + End If + + Return False + Else + Return True + End If + Else + Return False + End If + + End Function + ''' + ''' Überprüft ob der angegebene Index im Objekttyp existiert + ''' + ''' Name des zu durchsuchenden Objekttyps + ''' Name des zu suchenden Indexes + ''' Liefert True wenn der Index im Objekttyp existiert, sonst False + ''' + Public Shared Function ExistIndexInObjekttyp(ByVal objekttyp As String, ByVal indexname As String) As Boolean + Try + Dim indexnamen() As String = GetIndicesByObjecttype(objekttyp) + + If indexnamen Is Nothing Then Return False + + For Each index As String In indexnamen + If index = indexname Then Return True + Next + + Catch ex As Exception + clsLogger.Add("Error while checking index exists in Objecttype - Errormessage: " & vbNewLine & ex.Message, True) + End Try + Return False + End Function + ''' + ''' Führt das eigendliche Indexieren aus + ''' + ''' Dateiname der zu indexierenden Datei + ''' Name des zu indexierenden Indexfeldes + ''' Der Wert/die Werte die dem Index zugewiesen werden sollen + ''' Liefert True wenn das Indexieren erfolgreich war, sonst False + ''' + Private Shared Function Indexiere(ByVal filenameZiel As String, ByVal index As String, ByVal werte As Object) + clsLogger.AddDetailLog(" >> In Indexierungsvorgang für: " & filenameZiel) + Try + Dim WMObject As WINDREAMLib.WMObject = Nothing '= CreateObject("WINDREAMLib.WMObject") '= New WINDREAMLib.WMObject 'CreateObject("WINDREAMLib.WMObject") + 'MsgBox("Indexiere: " & vbNewLine & filenameZiel) + 'werte Is Nothing Or _ + ' überprüfen ob alle notwendigen Informationen angegeben wurden (sonst abbrechen) + If filenameZiel Is Nothing Or _ + filenameZiel = "" Or _ + index Is Nothing Or _ + index = "" Or _ + Not ExistIndexInObjekttyp(_WDObjekttyp, index) Then + clsLogger.AddDetailLog("=> Hinweis: Die Datei wurde auf Grund eines Problems in der Initialisierung nicht vollständig indexiert.") + Return False + End If + + Dim fileExists As Boolean + + ' prüfen ob die zu indexierende Datei existiert + fileExists = My.Computer.FileSystem.FileExists("W:" & filenameZiel) '_windream.GetWindreamDriveLetter + + Dim an As Integer = 0 + Do While My.Computer.FileSystem.FileExists("W:" & filenameZiel) = False + If an > 500 Then + fileExists = False + Exit Do + Else + clsLogger.AddDetailLog(" Achtung: Datei exisitiert noch nicht: " & My.Computer.Clock.LocalTime) + End If + an = an + 1 + Loop + ' wenn die Datei existiert + If fileExists Then + WMObject = oSession.GetWMObjectByPath(WINDREAMLib.WMEntity.WMEntityDocument, filenameZiel) + + ' eine Variable für den umgewandelten Indexwert anlegen (kein Typ, da noch unklar ist was reingeschrieben wird) + 'Dim convertValue = Nothing + + ' den Typ des Zielindexes auslesen + Dim TypDesIndexes As Integer + + Try + + ' ein windream-Objekt der Datei anlegen + WMObject = oSession.GetWMObjectByPath(WINDREAMLib.WMEntity.WMEntityDocument, filenameZiel) + + clsLogger.AddDetailLog(" - windream-Objekt der Datei erzeugt") + clsLogger.AddDetailLog(" - Ziel: W:\" & filenameZiel) + + + 'Me.singleInfoNode.Add("Ziel: " & ClassDateiimportWindream.GetWindreamDriveLetter & filenameZiel) + + Try + ' die Datei sperren + WMObject.lock() + + 'WMObject.LockFor(WINDREAMLib.WMObjectEditMode.WMObjectEditModeObject) + Catch ex As Exception + + End Try + + ' wenn der Datei noch kein Dokumenttyp zugewiesen wurde + If WMObject.aObjectType.aName = "Standard" Then + ' ihr den entsprechenden Dokumenttyp zuweisen + WMObject.aObjectType = oSession.GetWMObjectByName(WINDREAMLib.WMEntity.WMEntityObjectType, _WDObjekttyp) + ' WMObject.aObjectType = Me.selectedProfile.Dokumenttyp + End If + + + ' wenn keine Werte vorhanden sind, soll wenigstens der Dokumenttyp eingetragen werden + If werte Is Nothing Then + + Try + WMObject.Save() + WMObject.unlock() + Catch ex As Exception + + End Try + + Return Nothing + End If + + ' den Typ des Zielindexes auslesen + TypDesIndexes = GetTypeOfIndexAsIntByName(index) + + ' wenn es sich bei dem Index NICHT um ein Vektorfeld handelt + If TypDesIndexes < WMObjectVariableValueTypeVector Then + clsLogger.AddDetailLog(" >> Bei dem Zielindex handelt es sich um einen Einzelindex.") + Else + clsLogger.AddDetailLog(" Bei dem Zielindex handelt es sich um ein Vektorfeld.") + ' ein Backup der Indexwerte anlegen + Dim temp As Object = werte + ' und die eigendliche Variable zurücksetzen + werte = Nothing + ' dann soll nur der letzte Wert des Arrays übernommen werden, damit nicht versucht wird ein + ' Array in einen Einzelindex zu speichern + werte = temp + clsLogger.AddDetailLog(" >> Array geleert und erneuert!") + End If + Catch ex As Exception + clsLogger.Add("Hinweis: Beim Initialisieren der Datei auf dem windream-Laufwerk ist ein Fehler aufgetreten.", False) + Return False + End Try + + + 'Try + ' den Typ des Zielindexes + clsLogger.AddDetailLog(" >> Typ des Indexes: " & TypDesIndexes.ToString) + Select Case (TypDesIndexes) + Case WMObjectVariableValueTypeUndefined ' zu klären !!!! + 'convertValue = vbEmpty + Case WMObjectVariableValueTypeString + ''Führende Nullen Entfernen + 'If werte.ToString.StartsWith("0") Then + ' Dim wert As String = CStr(CInt(werte.ToString)) + ' convertValue = wert + ' ClassLogger.Add(" - Führende Nullen wurden entfernt") + 'Else + ' Dim wert As String = CStr(CInt(werte.ToString)) + ' convertValue = wert + 'End If + 'If convertValue.ToString.Contains("~1") Then + ' convertValue = convertValue.ToString.Replace("~1", "") + 'End If + 'If convertValue.ToString.Contains("~2") Then + ' convertValue = convertValue.ToString.Replace("~2", "") + 'End If + 'If convertValue.ToString.Contains("~3") Then + ' convertValue = convertValue.ToString.Replace("~3", "") + 'End If + 'If convertValue.ToString.Contains("~4") Then + ' convertValue = convertValue.ToString.Replace("~4", "") + 'End If + + Case WMObjectVariableValueTypeInteger + ' convertValue = CInt(werte) + Case WMObjectVariableValueTypeFloat + werte = werte.ToString.Replace(".", ",") + 'convertValue = CDbl(werte) + + Case WMObjectVariableValueTypeBoolean + Try + ' convertValue = CBool(werte) + Catch ex As Exception + ' Nothing zuweisen damit SetVariableValue nicht ausgeführt wird + 'convertValue = Nothing + End Try + Case WMObjectVariableValueTypeDate + If (IsDate(werte)) Then + ' convertValue = CDate(werte) + Else + ' convertValue = vbEmpty + End If + + Case WMObjectVariableValueTypeFixedPoint + werte = werte.ToString.Replace(".", ",") + ' convertValue = CDbl(werte) + + Case WMObjectVariableValueTypeTimeStamp + Dim timestamp As Integer = GetTimestamp(werte) + If timestamp > 0 Then + ' convertValue = timestamp + Else + ' convertValue = vbEmpty + End If + + Case WMObjectVariableValueTypeCurrency + Dim aValue As System.Runtime.InteropServices.CurrencyWrapper = New System.Runtime.InteropServices.CurrencyWrapper(werte) + ' convertValue = aValue + + Case WMObjectVariableValueTypeTime + If (IsDate(werte)) Then + ' convertValue = CDate(werte) ' ggf. aber nur die Zeit + Else + ' convertValue = vbEmpty + End If + + Case WMObjectVariableValueTypeVariant + ' convertValue = werte + + Case WMObjectVariableValueTypeMask ' zu klären !!!! + ' convertValue = vbEmpty + + Case WMObjectVariableValueFlagMask ' zu klären !!!! + ' convertValue = vbEmpty + + + Case WMObjectVariableValueTypeFulltext + 'convertValue = CStr(werte) + + Case WMObjectVariableValueTypeDefaultValue ' zu klären !!!! + ' convertValue = vbEmpty + + Case Else + ' wenn es sich um einen TypVektorIndex handelt + If TypDesIndexes >= 4096 And TypDesIndexes < 8192 Then + clsLogger.AddDetailLog("- Es handelt sich um einen Vektorindex") + Dim temp_arr As New ArrayList + + Select Case (TypDesIndexes - WMObjectVariableValueTypeVector) + 'VektorIndex vom Typ String 64' + Case 1 + clsLogger.AddDetailLog("- VektorIndex vom Typ String 1") + For Each wert As Object In werte + 'Führende Nullen Entfernen + If werte.ToString.StartsWith("0") Then + Dim werteString As String = CStr(CInt(wert.ToString)) + wert = werteString + temp_arr.Add(CStr(wert)) + clsLogger.AddDetailLog("- Führende Nullen wurden entfernt") + Else + temp_arr.Add(CStr(wert)) + End If + + clsLogger.AddDetailLog("- Wert " & CStr(wert) & " konvertiert") + Next + Case WMObjectVariableValueTypeUndefined + ' convertValue = "" + + Case WMObjectVariableValueTypeString + clsLogger.AddDetailLog("- VektorIndex vom Typ String 2") + For Each wert As Object In werte + 'Führende Nullen Entfernen + If werte.ToString.StartsWith("0") Then + wert = CInt(wert) + temp_arr.Add(CStr(wert)) + clsLogger.AddDetailLog("- Führende Nullen wurden entfernt") + Else + temp_arr.Add(CStr(wert)) + End If + clsLogger.AddDetailLog("- Wert " & CStr(wert) & " konvertiert") + Next + + Case WMObjectVariableValueTypeInteger + clsLogger.AddDetailLog("- VektorIndex vom Typ Integer") + For Each wert As Object In werte + temp_arr.Add(CInt(wert)) + Next + + Case WMObjectVariableValueTypeFloat + For Each wert As Object In werte + wert = wert.ToString.Replace(".", ",") + temp_arr.Add(CDbl(wert)) + Next + + Case WMObjectVariableValueTypeBoolean + For Each wert As Object In werte + Try + temp_arr.Add(CBool(wert)) + Catch ex As Exception + ' Nothing zuweisen damit SetVariableValue nicht ausgeführt wird + temp_arr = Nothing + End Try + Next + + Case WMObjectVariableValueTypeDate + For Each wert As Object In werte + 'wert = + temp_arr.Add(CDate(wert)) + Next + + Case WMObjectVariableValueTypeFixedPoint + For Each wert As Object In werte + temp_arr.Add(CDbl(wert)) + Next + + Case WMObjectVariableValueTypeTimeStamp + For Each wert As Object In werte + temp_arr.Add(CInt(wert)) + Next + + Case WMObjectVariableValueTypeCurrency + For Each wert As Object In werte + Dim aValue As System.Runtime.InteropServices.CurrencyWrapper = New System.Runtime.InteropServices.CurrencyWrapper(werte) + temp_arr.Add(aValue) + Next + + Case WMObjectVariableValueTypeTime + For Each wert As Object In werte + temp_arr.Add(CDate(wert)) + Next + + Case WMObjectVariableValueTypeVariant + ' dann bleiben alle Werte wie sie sind + + End Select + + If temp_arr.Count > 0 Then + clsLogger.AddDetailLog("- Einträge in temp_arr also Speichern des Arrays in convertValue") + ' convertValue = Nothing + ' convertValue = temp_arr.ToArray + Else + ' convertValue = vbEmpty + End If + clsLogger.AddDetailLog("- Werte erfolgreich konvertiert") + Else + ' convertValue = vbEmpty + End If + + End Select + + 'Catch ex As Exception + ' ' einen Hinweis über einen aufgetretenen Fehler an das Array für den TreeView-Log anhängen + ' ClassLogger.Add("Fehler bei Auswerten/Konvertieren des Typs!", ex.Message) + ' ' die Indexierungsinformationen für den TreeView-Log zurückgeben + ' Return False + 'End Try + + + ' Try + ' ***** Anmerkung: das Nachindexieren mit vbEmpty ist möglich (siehe oben) jedoch nicht ***** + ' ***** das Indexieren mit einem Nothing-Wert !!! ***** + ' wenn das Konvertieren soweit gut gelaufen ist (also kein Nothing-Wert zugewiesen wurde) + ' If (convertValue Is Nothing) = False Then + ' den konvertierten Indexwert dem entsprechenden Index zuweisen + WMObject.SetVariableValue(index, werte) + + clsLogger.AddDetailLog(" - den konvertierten Indexwert dem entsprechenden Index zuweisen") + clsLogger.AddDetailLog(" - Indexname: " & index.ToString) + clsLogger.AddDetailLog(" - Indexwert: " & werte.ToString) + + 'End If + + ' die Indexinformationen des Dokuments speichern + WMObject.Save() + clsLogger.AddDetailLog(" >> die Indexinformationen des Dokuments speichern") + ' Unlock in einem unbehandelten Try-Block um Fehler abzufangen, + ' wenn eine Datei nicht gesperrt ist + Try + ' die Sperrung des Dokuments aufheben + WMObject.unlock() + clsLogger.AddDetailLog(" >> die Sperrung des Dokuments aufheben") + Catch ex As Exception + ' nichts tun (Datei war nicht gesperrt) + End Try + + 'Catch ex As Exception + ' ' auch wenn ein Fehler aufgetreten ist muss das Dokument gespeichert werden, um den Dokumenttypen zu speichern + ' WMObject.Save() + + ' ' Unlock in einem unbehandelten Try-Block um Fehler abzufangen, + ' ' wenn eine Datei nicht gelocked ist + ' Try + ' WMObject.unlock() + ' Catch ex2 As Exception + ' ' nichts tun (Datei war nicht gesperrt) + ' End Try + + + ' ' Nachricht für den TreeView-Log + ' indexBeschreibung &= "konnte nicht indexiert werden" + ' ClassLogger.Add(" DATEI konnte nicht indexiert werden", True) + 'End Try + + + ' die Indexierungsinformationen für den TreeView-Log zurückgeben + Return True + Else + ' die Indexierungsinformationen für den TreeView-Log zurückgeben + clsLogger.Add(" Hinweis: Die Datei hat zum Zeitpunkt der Indexierung noch nicht auf dem windream-Laufwerk existiert.", False) + End If + + Catch ex As Exception + clsLogger.Add(" Hinweis: Unbekannter Fehler beim Indexieren der Datei.", True) + clsLogger.Add(ex.Message, False) + Return False + End Try + + Return True + + End Function + + ''' + ''' Diese Funktion überprüft ob eine Variable ein Array ist, oder nicht. + ''' + ''' Variable die überprüft werden soll + ''' Liefert True wenn es sich um ein Array handelt, sonst False + ''' + Private Shared Function IsArray(ByVal arrayOrNot As Object) + + Dim arrayType As String = UCase(arrayOrNot.GetType.ToString) + + ' überprüft an welcher Stelle sich ein '['-Zeichen befindet + Dim position = InStr(arrayType, "[") + + ' existiert ein '['-Zeichen, so handelt es sich um ein Array (GetType wäre System.Object[]) + If Not position = 0 Then + Return True + Else + Return False + End If + End Function + + + ''' + ''' Diese Funktion überprüft ob eine Variable eine ArrayList ist, oder nicht. + ''' + ''' Variable die überprüft werden soll + ''' Liefert True wenn es sich um eine ArrayList handelt, sonst False + ''' + Private Shared Function IsArrayList(ByVal arrayOrNot As Object) + + Dim arrayType As String = UCase(arrayOrNot.GetType.ToString) + + ' überprüft an welcher Stelle sich ein '['-Zeichen befindet + Dim position = InStr(arrayType, "[") + + ' existiert ein '['-Zeichen, so handelt es sich um ein Array (GetType wäre System.Object[]) + If arrayOrNot.GetType.ToString = "System.Collections.ArrayList" Then + Return True + Else + Return False + End If + End Function + ''' + ''' Diese Funktion errechnet aus einem Datum den Unix-Timestamp + ''' + ''' Datum, für das der Timestamp errechnet werden soll + ''' Liefert den Timestamp als Integer + ''' + Private Shared Function GetTimestamp(ByVal FromDateTime As DateTime) As Integer + + If IsDate(FromDateTime) Then + Dim Startdate As DateTime = #1/1/1970# + Dim Spanne As TimeSpan + + ' vom Datum das Datum des "Beginns der Zeitrechnung" abziehen + Spanne = FromDateTime.Subtract(Startdate) + + ' die Zeitspanne in einen Integer umwandeln + Return CType(Math.Abs(Spanne.TotalSeconds()), Integer) + Else + Return 0 + End If + End Function + ''' + ''' Liefert den Typen eines Indexes als Integer. + ''' + ''' Name des zu überprüfenden Indexfeldes + ''' Liefert eine Zahl, die einen Typen beschreibt + ''' + Public Shared Function GetTypeOfIndexAsIntByName(ByVal indexname As String) As Integer + Try + Dim oAttribute = oSession.GetWMObjectByName(WINDREAMLib.WMEntity.WMEntityAttribute, indexname) + Dim vType = oAttribute.getVariableValue("dwAttrType") + Return vType + Catch ex As Exception + Return Nothing + End Try + End Function + Private Shared Function CheckIndexValue(ByVal input) + Try + 'Ersetzt die Versionierungen Tilde(~) und Klammern ((1)) + For i As Integer = 1 To 20 + If input.ToString.EndsWith("~" & i.ToString) Then + input = input.ToString.Replace("~" & i.ToString, "") + ElseIf input.ToString.EndsWith("(" & i.ToString & ")") Then + input = input.ToString.Replace("(" & i.ToString & ")", "") + End If + + Next + + Return input + Catch ex As Exception + clsLogger.Add("Error in CheckIndexValue: " & ex.Message, True) + Return Nothing + End Try + + End Function +End Class diff --git a/lib/Interop.WINDREAMLib.dll b/lib/Interop.WINDREAMLib.dll new file mode 100644 index 0000000..c542fd1 Binary files /dev/null and b/lib/Interop.WINDREAMLib.dll differ diff --git a/lib/Interop.WMOBRWSLib.dll b/lib/Interop.WMOBRWSLib.dll new file mode 100644 index 0000000..cab577b Binary files /dev/null and b/lib/Interop.WMOBRWSLib.dll differ diff --git a/lib/Interop.WMOTOOLLib.dll b/lib/Interop.WMOTOOLLib.dll new file mode 100644 index 0000000..93b66ae Binary files /dev/null and b/lib/Interop.WMOTOOLLib.dll differ