From ed3f4a1cd230a979015cc9d29ff5b9c2febfb232 Mon Sep 17 00:00:00 2001 From: SchreiberM Date: Wed, 31 Aug 2016 13:09:10 +0200 Subject: [PATCH] MS --- app/ZSG_Import/App.config | 36 + app/ZSG_Import/CURRENT.vb | 4 + .../My Project/Settings.Designer.vb | 143 +- app/ZSG_Import/My Project/Settings.settings | 42 +- ...ice1.Designer.vb => MyService.Designer.vb} | 4 +- app/ZSG_Import/MyService.vb | 139 ++ app/ZSG_Import/Service1.vb | 12 - app/ZSG_Import/ZSG_Import.vbproj | 24 +- app/ZSG_Import/clsDatabase.vb | 78 + app/ZSG_Import/clsLogger.vb | 156 ++ app/ZSG_Import/clsWindream.vb | 1690 +++++++++++++++++ lib/Interop.WINDREAMLib.dll | Bin 0 -> 262144 bytes lib/Interop.WMOBRWSLib.dll | Bin 0 -> 5120 bytes lib/Interop.WMOTOOLLib.dll | Bin 0 -> 69632 bytes 14 files changed, 2274 insertions(+), 54 deletions(-) create mode 100644 app/ZSG_Import/CURRENT.vb rename app/ZSG_Import/{Service1.Designer.vb => MyService.Designer.vb} (97%) create mode 100644 app/ZSG_Import/MyService.vb delete mode 100644 app/ZSG_Import/Service1.vb create mode 100644 app/ZSG_Import/clsDatabase.vb create mode 100644 app/ZSG_Import/clsLogger.vb create mode 100644 app/ZSG_Import/clsWindream.vb create mode 100644 lib/Interop.WINDREAMLib.dll create mode 100644 lib/Interop.WMOBRWSLib.dll create mode 100644 lib/Interop.WMOTOOLLib.dll 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 0000000000000000000000000000000000000000..c542fd1f68f33452058cdd3ac65d72bbbbc286f6 GIT binary patch literal 262144 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

N)c(@GradjoxG%3?e51(}){n;N@06lj`tzDEp zE~-oa=t}auNm&*u&HNLAj)cjSbbAH{pH- zwQYoVA2Y-IyFT?shoe#1zYg^WhwU^Qr-V5vdo`H2_Gxy;tqkvE7*iPz=GX(6;|cmN z6VM#@;Vo6D4)uk*!)%1tJmjq~gQhUuVLgY5Ue-oem@#$TgMO_TQE)-&wS9KHE5Y992&W*y8EWQM+78wzx;kFksSp%G}XBLL$< zOni(}j5n3)Toc<`Nj_q?sdRbxWnHGx;Z)5gO{9jb3Haqu@A*q z3U2V(K`YG%ojxLFpT~I7h*{wMPL6k%=uN|;K<5~dXK)6?Zad98#iTP;Z*k@P5nhK@ z%^$T_?AH_(OVv+C` zYk_+S^?EratJ!R$zFm@amjviFIh0g zi{K?mZUH(&>Ji|x=VJPe^?S`5q$QVe%GBM&P~)%UXfnN#gfe>cpFp z193{yObqU;czik8LGC@^{{Xtc+&JhikoE|&JT_{aBomZ1hvbLg<%l`EgM9BG37kpbOaf;TIFrCXDGB_4{EXbl literal 0 HcmV?d00001 diff --git a/lib/Interop.WMOBRWSLib.dll b/lib/Interop.WMOBRWSLib.dll new file mode 100644 index 0000000000000000000000000000000000000000..cab577b6022efb1c6ce7f19640b09eb56988c0b3 GIT binary patch literal 5120 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 J1ioJg{2%HrYs>%u literal 0 HcmV?d00001