3203 lines
182 KiB
VB.net
3203 lines
182 KiB
VB.net
Imports System.ComponentModel
|
|
Imports System.IO
|
|
Imports System.Text.RegularExpressions
|
|
Imports DigitalData.Modules.Logging
|
|
Imports WINDREAMLib
|
|
|
|
|
|
|
|
Public Class frmNIHauptseite
|
|
Private Shared _Logger As DigitalData.Modules.Logging.Logger
|
|
Private Shared _MyLogger As LogConfig
|
|
'####Variablen für Nachindexierung
|
|
Private _windreamNI As ClassNIWindream
|
|
Private _clsWorkfile As clsNI_WorkFile
|
|
'Private _clsMoRe As ClassMO_RE
|
|
'Private _windreamNI As ClassNIWindream = Me.ParentClass.Windream
|
|
Private bwProfil As New BackgroundWorker
|
|
Private bwDatei As New BackgroundWorker
|
|
Private bwsearch As New BackgroundWorker
|
|
|
|
Private email As New ClassNIEmail
|
|
Private database As ClassNIDatenbankzugriff
|
|
Private xml As New ClassxmlZugriff
|
|
|
|
Private _windreamRechte As ClassWD_Rechte
|
|
Private _sqlite As ClassSQLITE
|
|
Private _fulltext As clsNIFulltext
|
|
|
|
Private manuallyRun As Boolean = False
|
|
Private manually_cancel As Boolean = True
|
|
'#### Variablen für das Profil
|
|
Private myNIDatatable As DataTable
|
|
Private myNIArrayIndexe() As String = Nothing ' zum Speichern der Indexe
|
|
Private myNIArrayValues() As String = Nothing ' zum Speichern der Werte
|
|
Public _MRDokumentart, _MRKundenKennzeichen, _MRDeskrIndex As String
|
|
Public Shared _MRKONVERT_FEHLER As Integer = 0
|
|
|
|
Private windreamSucheErgebnisse As WMObjects
|
|
'_MRKONVERT_FEHLER 1 = Konvertierungsfehler-Falsch ausgelesener/eingetragener Wert
|
|
'Private _Grundeinstellung As ClassMoReKonfiguration
|
|
'##### Generelle Variablen
|
|
Public debug As Boolean = True
|
|
Private Shared _Instance As frmNIHauptseite = Nothing
|
|
Private _validModules()
|
|
Private licenseManager As ClassLicenseManager = Nothing
|
|
Public Shared _windream As ClassWindream_allgemein
|
|
Private Const ConstWMEntityDocument = 1 ''WINDREAMLib.WMEntity.WMEntityDocument
|
|
Public Shared Function Instance() As frmNIHauptseite
|
|
If _Instance Is Nothing OrElse _Instance.IsDisposed = True Then
|
|
_Instance = New frmNIHauptseite
|
|
End If
|
|
_Instance.BringToFront()
|
|
Return _Instance
|
|
End Function
|
|
|
|
Sub New()
|
|
|
|
' Dieser Aufruf ist für den Windows Form-Designer erforderlich.
|
|
InitializeComponent()
|
|
|
|
_MyLogger = New LogConfig(LogConfig.PathType.CustomPath, Path.Combine(My.Application.Info.DirectoryPath, "Log"))
|
|
_Logger = _MyLogger.GetLogger()
|
|
_windream = New ClassWindream_allgemein(_MyLogger)
|
|
' 3a. Windream instanziieren
|
|
_windreamNI = New ClassNIWindream(_MyLogger)
|
|
database = New ClassNIDatenbankzugriff(_MyLogger)
|
|
' 3b. Windream initialisieren (Connection, Session, ... aufbauen)
|
|
If _windreamNI.Init() = False Then
|
|
email.Send_EMail("Die Windream-Klasse konnte nicht initialisiert werden. Windream-Client unvollständig gestartert.")
|
|
End If
|
|
'ClassMoveRenameLogger.Init("", "MoveRename_", True)
|
|
|
|
|
|
|
|
AddHandler bwProfil.DoWork, AddressOf bwProfil_DoWork
|
|
AddHandler bwProfil.RunWorkerCompleted, AddressOf bwProfil_RunWorkerCompleted
|
|
AddHandler bwProfil.ProgressChanged, AddressOf bwProfil_ProgressChanged
|
|
|
|
AddHandler bwsearch.DoWork, AddressOf bwsearch_Documents
|
|
AddHandler bwsearch.RunWorkerCompleted, AddressOf bwsearch_RunWorkerCompleted
|
|
|
|
bwsearch.WorkerSupportsCancellation = True
|
|
|
|
bwProfil.WorkerReportsProgress = True
|
|
bwProfil.WorkerSupportsCancellation = True
|
|
|
|
AddHandler bwDatei.DoWork, AddressOf bwDatei_DoWork
|
|
AddHandler bwDatei.RunWorkerCompleted, AddressOf bwDatei_RunWorkerCompleted
|
|
AddHandler bwDatei.ProgressChanged, AddressOf bwDatei_ProgressChanged
|
|
|
|
bwDatei.WorkerReportsProgress = True
|
|
bwDatei.WorkerSupportsCancellation = True
|
|
End Sub
|
|
|
|
Private Sub frmNIHauptseite_FormClosing(sender As Object, e As FormClosingEventArgs) Handles Me.FormClosing
|
|
My.Settings.Save()
|
|
NI_OPENED = False
|
|
'If e.CloseReason = CloseReason.UserClosing Then
|
|
' _Logger.Info("Nachindexierung Hauptformular wird durch User geschlossen.")
|
|
'Else
|
|
' _Logger.Info("Nachindexierung Hauptformular wird automatisch geschlossen.")
|
|
'End If
|
|
End Sub
|
|
|
|
Private Sub frmNIHauptseite_Shown(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Shown
|
|
NI_OPENED = True
|
|
If My.Settings.vLogErrorsonly = False Then
|
|
_MyLogger.Debug = True
|
|
Else
|
|
_MyLogger.Debug = False
|
|
End If
|
|
|
|
If My.Settings.NI_RUNNING = True Then
|
|
|
|
_Logger.Info("Nachindexierungslauf wird wieder gestartet - My.Settings.NI_RUNNING = True")
|
|
Start_NachindexierungThreads()
|
|
Else
|
|
_Logger.Info("Nachindexierung Hauptformular wurde geladen - Nachindexierungslauf wird NICHT gestartet.")
|
|
End If
|
|
End Sub
|
|
Private Sub frmNIHauptseite_Load(sender As Object, e As System.EventArgs) Handles Me.Load
|
|
Try
|
|
'LoadAllModules()
|
|
TBTC_MOVE_RENAMETableAdapter.Connection.ConnectionString = My.Settings.DDECMConString
|
|
Catch ex As Exception
|
|
MsgBox(ex.Message, MsgBoxStyle.Critical, "Fehler bei frmNIHauptseite_Load")
|
|
_Logger.Warn("Fehler bei frmNIHauptseite_Load: " & ex.Message)
|
|
End Try
|
|
End Sub
|
|
'Private Function return_conn(ByVal dbart As String)
|
|
' Select Case dbart
|
|
' Case "MS-SQL"
|
|
' Dim csb As New SqlClient.SqlConnectionStringBuilder
|
|
' csb.DataSource = Me._Grundeinstellung.DataSource
|
|
' csb.InitialCatalog = Me._Grundeinstellung.InitialCatalog
|
|
' csb.IntegratedSecurity = False
|
|
' csb.UserID = Me._Grundeinstellung.UserId
|
|
' csb.Password = Me._Grundeinstellung.Password
|
|
|
|
' Dim connection As New SqlClient.SqlConnection(csb.ConnectionString)
|
|
|
|
' Return csb.ConnectionString
|
|
' Case "Postgre"
|
|
' Dim conn As String
|
|
' My.Settings.Save()
|
|
' conn = "Data Source=" & Me._Grundeinstellung.DataSource & ";Persist Security Info=True;User ID=" & Me._Grundeinstellung.UserId & ";Password=" & Me._Grundeinstellung.Password '& ";Unicode=True"
|
|
' Dim connection As New Oracle.DataAccess.Client.OracleConnection(conn)
|
|
' Return conn
|
|
' Case Else
|
|
' MsgBox("Test zur Zeit nicht möglich", MsgBoxStyle.Information, "Achtung:")
|
|
' Return Nothing
|
|
' End Select
|
|
'End Function
|
|
'Public Sub LoadAllModules()
|
|
' Me._validModules = Nothing
|
|
|
|
' If Not My.Settings.licensekey = "" Then
|
|
' 'Me.licenseManager = New ClassLicenseManager = Nothing
|
|
' Me.licenseManager = New ClassLicenseManager("#DigitalData9731258!#", My.Settings.licensekey)
|
|
|
|
' Me.licenseManager.licenseString = Me.licenseManager.DecodeLicenseKey(My.Settings.licensekey)
|
|
' Me.licenseManager.licenseStringArray = Me.licenseManager.SplitLicenseString(Me.licenseManager.licenseString)
|
|
' Me.licenseManager.LoadLicenses()
|
|
|
|
' Dim i As Integer = 0
|
|
|
|
' If Me.licenseManager.Licenses.Licenses IsNot Nothing Then
|
|
' For Each license As ClassLicense In Me.licenseManager.Licenses.Licenses()
|
|
' Dim expires As String = license.Expires.Date
|
|
' If IsExpired(license.Expires.Date) = False Then
|
|
' ' MsgBox(license.Modulename & vbNewLine & expires)
|
|
|
|
' Select Case license.Modulename.ToUpper
|
|
' Case "MOVEANDRENAME"
|
|
' LICENSE_MoveRename = True
|
|
' _Logger.Info("LICENSE MoveandRename aktiv")
|
|
' End Select
|
|
' i += 1
|
|
' Else
|
|
' Select Case license.Modulename
|
|
' Case "MOVEANDRENAME"
|
|
' LICENSE_MoveRename = False
|
|
' End Select
|
|
' i += 1
|
|
' End If
|
|
' 'Date.TryParse(expires, license.Expires)
|
|
|
|
' Next
|
|
' End If
|
|
' End If
|
|
'End Sub
|
|
Private Function IsExpired(ByVal _Date As Date)
|
|
If Date.Today > _Date Then
|
|
Return True
|
|
Else
|
|
Return False
|
|
End If
|
|
End Function
|
|
Private dokument As WMObject
|
|
|
|
'Private Sub btnStartStop_Click(ByVal sender As System.Object, ByVal e As System.EventArgs)
|
|
' If Me._running = False Then
|
|
' If Not Me.bwProfil.IsBusy And Not Me.bwDatei.IsBusy Then
|
|
' Me._running = True
|
|
' Me.btnStartStop.Text = "Nachindexierung stoppen"
|
|
' Me.numIntervall.Enabled = False
|
|
' Me.pnlInfos.Visible = True
|
|
|
|
' Me.timRun.Interval = Me.numIntervall.Value * 60 * 1000
|
|
' Me.timRun.Start()
|
|
|
|
' If Me.debug Then
|
|
' ClassLoggerNI.Init("", My.Settings.vLogNI & "_", True)
|
|
' ClassLoggerNI.Add(" ")
|
|
' ClassLoggerNI.Add(" ")
|
|
' ClassLoggerNI.Add(" ")
|
|
' ClassLoggerNI.Add("======================================================================")
|
|
' ClassLoggerNI.Add(" Nachindexierungsvorgang gestartet ")
|
|
' ClassLoggerNI.Add("______________________________________________________________________")
|
|
' ClassLoggerNI.Add(" ")
|
|
' ClassLoggerNI.Add(" Datum: " & Now.Date & " " & Now.Date.ToShortTimeString)
|
|
' ClassLoggerNI.Add(" Intervall: " & Me.numIntervall.Value)
|
|
' ClassLoggerNI.Add("======================================================================")
|
|
' End If
|
|
|
|
' ' den Indexierungsvorgang direkt (zum ersten Mal) durchführen
|
|
' Me.Suche_ausfuehren()
|
|
' Else
|
|
' MsgBox("Die Prozesse laufen noch")
|
|
' End If
|
|
|
|
' Else
|
|
' Me._running = False
|
|
' Me.btnStartStop.Text = "Nachindexierung starten"
|
|
' Me.numIntervall.Enabled = True
|
|
' Me.pnlInfos.Visible = False
|
|
|
|
' If Me.bwProfil.IsBusy Then
|
|
' Me.bwProfil.CancelAsync()
|
|
' End If
|
|
|
|
' 'If Me.bwDatei.IsBusy Then
|
|
' ' Me.bwDatei.CancelAsync()
|
|
' 'End If
|
|
|
|
' Me.timRun.Stop()
|
|
' End If
|
|
'End Sub
|
|
Private Sub startDateiDurchlauf()
|
|
bwDatei.RunWorkerAsync()
|
|
End Sub
|
|
Private Sub bwDatei_DoWork(ByVal sender As Object, ByVal e As System.ComponentModel.DoWorkEventArgs)
|
|
If bwDatei.CancellationPending Then
|
|
_Logger.Info("bwDatei.CancellationPending - e.Cancel")
|
|
e.Cancel = True
|
|
ElseIf manually_cancel = True Then
|
|
_Logger.Info("bwDatei.manually_cancel - e.Cancel")
|
|
e.Cancel = True
|
|
Else
|
|
IndexiereVerarbeiteDokument(Me.aktivesDokument)
|
|
End If
|
|
|
|
End Sub
|
|
|
|
Private Sub bwDatei_RunWorkerCompleted(ByVal sender As Object, ByVal e As System.ComponentModel.RunWorkerCompletedEventArgs)
|
|
If e.Cancelled Then
|
|
' MsgBox("Die Nachindexierung wurde abgebrochen.", MsgBoxStyle.Information, "Vorgang abgebrochen (Datei)")
|
|
Else
|
|
If Me.bwDatei.IsBusy Then
|
|
_Logger.Warn("Achtung: bwDatei-RunWorkerCompleted aber bwDatei.Busy - CancelAsync")
|
|
Me.bwDatei.CancelAsync()
|
|
End If
|
|
' MsgBox("Fertig")
|
|
End If
|
|
End Sub
|
|
|
|
Private Sub bwDatei_ProgressChanged(ByVal sender As Object, ByVal e As System.ComponentModel.ProgressChangedEventArgs)
|
|
End Sub
|
|
Private Sub startProfileDurchlauf()
|
|
bwProfil.RunWorkerAsync()
|
|
End Sub
|
|
Private Sub bwsearch_Documents(ByVal sender As Object, ByVal e As System.ComponentModel.DoWorkEventArgs)
|
|
Try
|
|
windreamSucheErgebnisse = Me._windreamNI.GetSearchDocuments(Me.aktivesProfil.WindreamSuche)
|
|
|
|
Catch ex As Exception
|
|
_Logger.Error(ex)
|
|
|
|
End Try
|
|
End Sub
|
|
Private Sub bwsearch_RunWorkerCompleted(ByVal sender As Object, ByVal e As System.ComponentModel.RunWorkerCompletedEventArgs)
|
|
|
|
If e.Cancelled Then
|
|
_Logger.Warn("Achtung: Ausführung der Suche wurde abgebrochen(" & Now & ")")
|
|
ElseIf e.Error IsNot Nothing Then
|
|
' MsgBox("Fehler")
|
|
Else
|
|
' MsgBox("Fertig")
|
|
|
|
Dim minutes = CLng(System.DateTime.Now.Subtract(CURRENT_START_DATETIME).Minutes)
|
|
If minutes >= 1 Then
|
|
_Logger.Warn("Suchdauer >= 1 Minute aber letzendlich ausgeführt (" & Now & ")")
|
|
End If
|
|
|
|
End If
|
|
|
|
End Sub
|
|
Private Sub bwProfil_DoWork(ByVal sender As Object, ByVal e As System.ComponentModel.DoWorkEventArgs)
|
|
Try
|
|
'If bwProfil.CancellationPending Then
|
|
' e.Cancel = True
|
|
'End If
|
|
Dim _Fehler As Boolean = False
|
|
For Each profil As ClassNIProfil In ClassNIProfile.Profile
|
|
_Fehler = False
|
|
' aktuelles Profil der Klasse mitteilen
|
|
Me.aktivesProfil = profil
|
|
_clsWorkfile = New clsNI_WorkFile(_MyLogger)
|
|
_clsWorkfile.aktivesProfil = profil
|
|
'_clsMoRe = New ClassMO_RE(_MyLogger)
|
|
' Profilname aktualisieren (in lblProfilname)
|
|
bwProfil.ReportProgress(-3)
|
|
|
|
' Ausgabe an Logdatei über nächstes Profil
|
|
_Logger.Info("########################################################")
|
|
_Logger.Info("Starte Durchlauf für Profil: " & profil.Profilname & " - " & Now)
|
|
|
|
' Überprüfen ob Profil aktiv oder inaktiv
|
|
If CBool(Me.aktivesProfil.Aktiv) = False Then
|
|
_Logger.Info("Profil: " & profil.Profilname & " ist inaktiv geschaltet")
|
|
|
|
Else
|
|
' den Durchlaufszeitpunkt speichern
|
|
aktivesProfil.LastRun = Now
|
|
'AUSKOMMENTIERT um Fehler beim Speichern der Dateien zu verhindern!! 17.08.2015
|
|
'aktivesProfil.Save(False)
|
|
|
|
If clsHelper.file_exists(Me.aktivesProfil.WindreamSuche, "NI") = False AndAlso Me.aktivesProfil.WindreamSuche.ToLower.Contains("select") = False Then
|
|
_Logger.Warn("Windream Suche für Profil: " & profil.Profilname & " konnte nicht ausgeführt werden! Die Datei " & Me.aktivesProfil.WindreamSuche & " existiert nicht!")
|
|
' wenn die gesuchte File eine Suche ist: per MAil informierne und Indexierung abbrechen
|
|
If My.Settings.vNIMailsenden = True Then
|
|
email.Send_EMail("Fehler bei Nachindexierung: <br> >> Profil: " & Me.aktivesProfil.Profilname & "<br> >> die windream-Suche : " & Me.aktivesProfil.WindreamSuche & " konnte nicht gefunden werden!" &
|
|
"<br> >> Mögliche Fehlerursache: Das W-Laufwerk ist nicht verfügbar!")
|
|
End If
|
|
Abbruch_NI("Windream-Suche konnte nicht gefunden werden!", True, False)
|
|
clsHelper.Add_Application_log("Nachindexierung wurde abgebrochen, da eine Windream-Suche (" & Me.aktivesProfil.WindreamSuche & ") nicht gefunden werden konnte")
|
|
|
|
Else
|
|
' wenn im aktuellen Suchergebnis Verknüpfungen vorhanden sind
|
|
If Me.aktivesProfil.Verknüpfungen IsNot Nothing Then
|
|
' windream-Suche für Profil starten
|
|
bwsearch.RunWorkerAsync()
|
|
Dim d1 As Date = Now
|
|
CURRENT_START_DATETIME = Now
|
|
Dim oldminute As Integer = 0
|
|
Do While bwsearch.IsBusy
|
|
Dim minutes = CLng(System.DateTime.Now.Subtract(d1).Minutes)
|
|
If minutes >= 1 And minutes <> oldminute Then
|
|
oldminute = minutes
|
|
_Logger.Warn("bwsearch IsBusy " & Now & " - MinutesSinceRunWD-Search: " & minutes.ToString)
|
|
If minutes >= 2 Then
|
|
Select Case minutes
|
|
Case 3
|
|
_Logger.Warn($"Die Ausführung der Suche [{Me.aktivesProfil.WindreamSuche}] dauerte zu lange - MinutesSinceRunWD-Search: " & minutes.ToString)
|
|
_Logger.Warn("Die Nachindexierung wird abgebrochen und läuft wieder im Intervall an!")
|
|
'ClassNIEmail.Send_Urgent("Achtung - die Ausführung der Suche: " & Me.aktivesProfil.WindreamSuche & " dauerte viel zu lange! <p> Prüfen Sie schnellst möglich die Client-Konfiguration")
|
|
Abbruch_NI("Abbruch nach Timeout Suche", False, True)
|
|
CURRENT_STATE = "Abbruch Timeout"
|
|
Exit Sub
|
|
End Select
|
|
End If
|
|
End If
|
|
Loop
|
|
If bwProfil.CancellationPending Or bwsearch.CancellationPending Then
|
|
_Logger.Warn(" CancellationPending2 - Abbruch durchgeführt - Nun Exit Sub")
|
|
Exit Sub
|
|
End If
|
|
|
|
|
|
If _Fehler = False Then
|
|
If Not IsNothing(windreamSucheErgebnisse) Or WMSearchIsSQL = True Then
|
|
|
|
|
|
|
|
If (Not IsNothing(windreamSucheErgebnisse) AndAlso windreamSucheErgebnisse.Count > 0) Or WMSearchIsSQL = True Then
|
|
If (Not IsNothing(windreamSucheErgebnisse) AndAlso windreamSucheErgebnisse.Count > 0) Then
|
|
_Logger.Debug($"windreamSucheErgebnisse.Count: [{windreamSucheErgebnisse.Count}]")
|
|
ElseIf WMSearchIsSQL = True Then
|
|
_Logger.Debug($"windreamSucheErgebnisse will be collected with SQL!")
|
|
End If
|
|
|
|
'Wenn Nachbearbeitung AD aktiv ist dann, Klassen initialisieren
|
|
If aktivesProfil.NachbearbeitungAD = True Then
|
|
_Logger.Debug($"aktivesProfil.NachbearbeitungAD = True")
|
|
'Erst DB
|
|
_sqlite = New ClassSQLITE(_MyLogger)
|
|
_windreamRechte = New ClassWD_Rechte(_MyLogger, _sqlite)
|
|
If _sqlite.DBInit(False) = True Then
|
|
_Logger.Debug($"ClassSQLITE initialized...")
|
|
'Dann Rechte-Klasse
|
|
If _windreamRechte.Init() = False Then
|
|
_Logger.Warn("## Die AD-Rechteklasse konnte nicht initialisert werden - Profil Abbruch")
|
|
_Fehler = True
|
|
Else
|
|
_Logger.Debug($"The AD-RightClass has been initialized...")
|
|
End If
|
|
Else
|
|
_Logger.Warn("## Die SQLite-DB konnte nicht initialisert werden - Profil Abbruch")
|
|
_Fehler = True
|
|
End If
|
|
Else
|
|
_Logger.Debug("NachbearbeitungAD inaktiv")
|
|
End If
|
|
|
|
If _Fehler = False Then
|
|
'profil()
|
|
' nun Profilabhängige Parameter laden
|
|
If aktivesProfil.IndexValidation <> "" Then
|
|
_Logger.Debug("Dokumente sollen für Validierung markiert werden - Index: " & aktivesProfil.IndexValidation)
|
|
_clsWorkfile._SetFileValidation = True
|
|
Else
|
|
_clsWorkfile._SetFileValidation = False
|
|
End If
|
|
_Logger.Debug($"clsWorkfile._filevalidation Checked...")
|
|
If My.Settings.ERROR_INDEX <> "" Then
|
|
_Logger.Debug("Error-msg shall be logged in index: " & My.Settings.ERROR_INDEX)
|
|
|
|
End If
|
|
_Logger.Debug($"clsWorkfile._fileerror Checked...")
|
|
_Logger.Debug("Ni-Art: " & aktivesProfil.Ni_Art.ToLower)
|
|
' neue Anzahl von Dateien an ProgressBar2
|
|
If WMSearchIsSQL = False Then
|
|
bwProfil.ReportProgress(windreamSucheErgebnisse.Count)
|
|
End If
|
|
|
|
Dim oWorkCount As Integer = 1
|
|
If WMSearchIsSQL = False Then
|
|
For Each dok As WMObject In windreamSucheErgebnisse
|
|
Dim StopwatchTimer As New ClassStopwatch("Stopwatch FileRun")
|
|
_Logger.Info($"Working on Doc: [{dok.aName}] # ({oWorkCount} of {windreamSucheErgebnisse.Count})")
|
|
' aktuelles Dokument der Klasse mitteilen
|
|
Me.aktivesDokument = dok
|
|
|
|
'####### Go für das Dokument ##########
|
|
' Thread für diese Datei starten
|
|
Me.startDateiDurchlauf()
|
|
'######################################
|
|
' solange der Datei-Thread noch nicht abgeschlossen wurde
|
|
|
|
While Me.bwDatei.IsBusy
|
|
|
|
End While
|
|
' nächste Datei an ProgressBar2
|
|
bwProfil.ReportProgress(-1)
|
|
oWorkCount += 1
|
|
' Vorgang abbrechen
|
|
If bwProfil.CancellationPending Then
|
|
_Logger.Info($"bwProfil.CancellationPending...Exit bwProfil_DoWork")
|
|
StopwatchTimer.Done()
|
|
Exit Sub
|
|
ElseIf manually_cancel = True Then
|
|
_Logger.Info($"manually_cancel...Exit bwProfil_DoWork")
|
|
StopwatchTimer.Done()
|
|
Exit Sub
|
|
End If
|
|
|
|
Dim swMessage = StopwatchTimer.Done()
|
|
If swMessage <> "" Then
|
|
_Logger.Info(swMessage)
|
|
End If
|
|
Next
|
|
Else
|
|
Try
|
|
Dim oDTResults As DataTable
|
|
oDTResults = database.Return_Datatable(aktivesProfil.WindreamSuche)
|
|
|
|
If Not IsNothing(oDTResults) Then
|
|
If oDTResults.Rows.Count > 0 Then
|
|
bwProfil.ReportProgress(oDTResults.Rows.Count)
|
|
_Logger.Debug($">> Working on [{oDTResults.Rows.Count}] documents via SQL...")
|
|
If Not IsNothing(_windreamNI) Then
|
|
Dim i As Integer = 0
|
|
For Each oROW As DataRow In oDTResults.Rows
|
|
Dim oFilenameWM = oROW.Item(1).ToString
|
|
oFilenameWM = oFilenameWM.Replace("W:", "")
|
|
oFilenameWM = oFilenameWM.Replace("\\windream\objects", "")
|
|
_Logger.Debug($">> Trying to create WMObject by path [{oFilenameWM}] ...")
|
|
'Dim _dok As WMObject
|
|
'_dok = Nothing
|
|
Try
|
|
aktivesDokument = _windreamNI.oWMSession.GetWMObjectByPath(ConstWMEntityDocument, oFilenameWM)
|
|
Catch ex As Exception
|
|
_Logger.Warn($"ATTENTION: error while creating a windream-object via objectpath - ERROR [{ex.InnerException.Message}]")
|
|
_Logger.Warn($"Filename [{oFilenameWM}]")
|
|
_Logger.Error(ex)
|
|
bwProfil.ReportProgress(-4)
|
|
Exit Sub
|
|
End Try
|
|
|
|
If Not IsNothing(aktivesDokument) Then
|
|
_Logger.Debug($"..Got a windream-document-object for {aktivesDokument.aName}...")
|
|
i += 1
|
|
'####### Go für das Dokument ##########
|
|
' Thread für diese Datei starten
|
|
Me.startDateiDurchlauf()
|
|
'######################################
|
|
' solange der Datei-Thread noch nicht abgeschlossen wurde
|
|
|
|
While Me.bwDatei.IsBusy
|
|
|
|
End While
|
|
' nächste Datei an ProgressBar2
|
|
bwProfil.ReportProgress(-1)
|
|
oWorkCount += 1
|
|
' Vorgang abbrechen
|
|
If bwProfil.CancellationPending Then
|
|
_Logger.Info($"bwProfil.CancellationPending...Exit bwProfil_DoWork")
|
|
Exit Sub
|
|
ElseIf manually_cancel = True Then
|
|
_Logger.Info($"manually_cancel...Exit bwProfil_DoWork")
|
|
|
|
Exit Sub
|
|
End If
|
|
Else
|
|
_Logger.Error("Could not create a WMDocument via path!")
|
|
End If
|
|
Next
|
|
Else
|
|
_Logger.Error("ATTENTION: _windreamNI not intitialized properly...")
|
|
_Logger.Warn("ATTENTION: _windreamNI not intitialized properly...")
|
|
End If
|
|
End If
|
|
Else
|
|
_Logger.Warn($"ATTENTION: The datatable for WMResults is nothing")
|
|
End If
|
|
Catch ex As Exception
|
|
_Logger.Warn($"UNEXPECTED ERROR IN GetSearchDocuments via SQL: {ex.Message}")
|
|
_Logger.Warn($"Dokument: {aktivesDokument.aName}")
|
|
_Logger.Error(ex)
|
|
Dim oLIneNumber = GetLineNumber(ex)
|
|
If oLIneNumber > 0 Then
|
|
_Logger.Warn($"#### oLIneNumber: {oLIneNumber} ####")
|
|
End If
|
|
End Try
|
|
|
|
End If
|
|
|
|
|
|
Else
|
|
_Logger.Debug("Fehler = True - Check Log")
|
|
_Logger.Warn("Fehler = True - Check Log")
|
|
bwProfil.ReportProgress(-4)
|
|
End If
|
|
|
|
Else
|
|
_Logger.Debug("Keine windream-Dokumente für Profil: " & profil.Profilname & " gefunden!")
|
|
' keine Dateien zum Indexieren
|
|
bwProfil.ReportProgress(-4)
|
|
End If
|
|
Else
|
|
_Logger.Warn($"windreamSucheErgebnisse Is Nothing!! - Please check Search of {profil.Profilname}")
|
|
End If
|
|
Else
|
|
_Logger.Warn("_Fehler = True - Check the config of Nachindexierung")
|
|
bwProfil.ReportProgress(-4)
|
|
End If
|
|
|
|
Else
|
|
'Keine Verknüpfungen
|
|
_Logger.Warn("Es liegen keine Verknüpfungen für dieses Profil vor!")
|
|
End If
|
|
End If
|
|
|
|
End If
|
|
_Logger.Info("####################################################End Profile DoWork####")
|
|
' nächstes Profil an ProgressBar1
|
|
bwProfil.ReportProgress(-2)
|
|
Next
|
|
Catch ex As Exception
|
|
_Logger.Error(ex)
|
|
|
|
End Try
|
|
|
|
End Sub
|
|
Public Function GetLineNumber(ByVal ex As Exception)
|
|
Dim lineNumber As Int32 = 0
|
|
Const lineSearch As String = ":line "
|
|
Dim index = ex.StackTrace.LastIndexOf(lineSearch)
|
|
If index <> -1 Then
|
|
Dim lineNumberText = ex.StackTrace.Substring(index + lineSearch.Length)
|
|
If Int32.TryParse(lineNumberText, lineNumber) Then
|
|
End If
|
|
End If
|
|
Return lineNumber
|
|
End Function
|
|
Private Sub bwProfil_RunWorkerCompleted(ByVal sender As Object, ByVal e As System.ComponentModel.RunWorkerCompletedEventArgs)
|
|
|
|
If e.Cancelled Then
|
|
MsgBox("Die Nachindexierung wurde abgebrochen.", MsgBoxStyle.Information, "Vorgang abgebrochen")
|
|
ElseIf e.Error IsNot Nothing Then
|
|
' MsgBox("Fehler")
|
|
Else
|
|
_Logger.Debug("bwProfil_RunWorkerCompleted")
|
|
_Logger.Info("")
|
|
|
|
End If
|
|
Dim actdatetime = Now
|
|
Dim newrun_dt As DateTime = actdatetime.AddMinutes(Me.numIntervall.Value)
|
|
Me.lblStatus.Text = $"(Status: WARTEN auf den nächsten Durchlauf: {newrun_dt.ToString})"
|
|
tslblStatus.Text = $"Status: WARTEN auf den nächsten Durchlauf: {newrun_dt.ToString}"
|
|
Me.tslblStatus.Visible = True
|
|
|
|
End Sub
|
|
|
|
Private Sub bwProfil_ProgressChanged(ByVal sender As Object, ByVal e As System.ComponentModel.ProgressChangedEventArgs)
|
|
|
|
If e.ProgressPercentage = -4 Then
|
|
Me.ProgressBar2.Minimum = 0
|
|
Me.ProgressBar2.Maximum = 2
|
|
Me.ProgressBar2.Value = Me.ProgressBar2.Maximum
|
|
Me.lblDatei.Text = "- keine Dateien für dieses Profil -"
|
|
ElseIf e.ProgressPercentage = -3 Then
|
|
Me.lblProfilname.Text = Me.aktivesProfil.Profilname
|
|
Me.lblDatei.Text = ""
|
|
ElseIf e.ProgressPercentage = -2 Then
|
|
Me.ProgressBar1.Value += 1
|
|
ElseIf e.ProgressPercentage = -1 Then
|
|
Me.lblDatei.Text = Me.aktivesDokument.aName
|
|
Me.ProgressBar2.Value += 1
|
|
Else
|
|
Me.ProgressBar2.Minimum = 0
|
|
Me.ProgressBar2.Maximum = e.ProgressPercentage
|
|
Me.ProgressBar2.Value = 0
|
|
End If
|
|
|
|
End Sub
|
|
Public aktivesProfil As ClassNIProfil
|
|
Private Shared aktivesDokument As WMObject
|
|
|
|
Public Sub Profile_Durchlaufen()
|
|
Try
|
|
lblNotWorking.Visible = False
|
|
pnlInfos.Visible = True
|
|
|
|
If My.Settings.Sleep_Begin > 0 And My.Settings.Sleep_End > 0 Then
|
|
If Now.Hour >= CInt(My.Settings.Sleep_Begin) And Now.Hour <= CInt(My.Settings.Sleep_End) Then
|
|
_Logger.Info(String.Format(">> ToolCollection is in SleepMode - {0}-{1}-{2}", Now.Hour.ToString, My.Settings.Sleep_Begin.ToString, My.Settings.Sleep_End.ToString))
|
|
Dim actdatetime = Now
|
|
Dim newrun_dt As DateTime = actdatetime.AddMinutes(Me.numIntervall.Value)
|
|
lblNotWorking.Text = $"In SleepMode - Next Check: {newrun_dt.ToString}"
|
|
lblNotWorking.Visible = True
|
|
pnlInfos.Visible = False
|
|
Exit Sub
|
|
End If
|
|
End If
|
|
Dim IsWorking_Hour = False
|
|
If My.Settings.NI_WORKING_HOURS <> "" Then
|
|
Dim hourarray As String() = My.Settings.NI_WORKING_HOURS.Split(";")
|
|
For Each _hour As String In hourarray
|
|
If Now.Hour = _hour Then
|
|
IsWorking_Hour = True
|
|
End If
|
|
Next
|
|
If IsWorking_Hour = False Then
|
|
Dim actdatetime = Now
|
|
Dim newrun_dt As DateTime = actdatetime.AddMinutes(Me.numIntervall.Value)
|
|
|
|
lblNotWorking.Text = $"No working-slot - working hours are: {My.Settings.NI_WORKING_HOURS} Next Check: {newrun_dt.ToString}"
|
|
lblNotWorking.Visible = True
|
|
pnlInfos.Visible = False
|
|
_Logger.Info(String.Format(">> ToolCollection is not in WorkingMode - NowHour: {0} - Working hours are: {1}", Now.Hour.ToString, My.Settings.NI_WORKING_HOURS))
|
|
Exit Sub
|
|
End If
|
|
Else
|
|
IsWorking_Hour = True
|
|
End If
|
|
If _windreamNI.Init() = False Then
|
|
email.Send_EMail("Die Windream-Klasse konnte nicht initialisiert werden. Windream-Client unvollständig gestartert.")
|
|
clsHelper.Add_Application_log("Die Windream-Klasse konnte nicht initialisiert werden. Windream-Client unvollständig gestartert?")
|
|
|
|
Exit Sub
|
|
End If
|
|
'nur weiter machen wenn kein BackgroundWorker mehr läuft
|
|
If Not Me.bwProfil.IsBusy And Not Me.bwDatei.IsBusy And Not Me.bwsearch.IsBusy Then
|
|
_Logger.Info("Nachindexierungsvorgang gestartet ")
|
|
Me.lblStatus.Text = "(Status: Nachindexieren läuft)"
|
|
Me.tslblStatus.Text = "Status: Nachindexieren läuft"
|
|
Me.tslblStatus.Visible = True
|
|
'If debug = False Then
|
|
' ClassLoggerNI.Init("", My.Settings.vLogNI & "_", True)
|
|
'End If
|
|
' Profile laden
|
|
ClassNIProfile.Init()
|
|
|
|
Dim profil_id As Integer = 1
|
|
|
|
If ClassNIProfile.Profile IsNot Nothing Then
|
|
_Logger.Debug("Anzahl der Profile: " & ClassNIProfile.Count)
|
|
If debug Then
|
|
Dim resultProfilnamen As String = ""
|
|
For Each profil As ClassNIProfil In ClassNIProfile.Profile
|
|
_Logger.Debug($"Start Profile-Run for ProfilName [{ profil.Profilname}] ")
|
|
resultProfilnamen &= "- " & profil.Profilname & vbNewLine
|
|
Next
|
|
|
|
End If
|
|
|
|
Me.ProgressBar1.Minimum = 0
|
|
Me.ProgressBar1.Maximum = ClassNIProfile.Count
|
|
Me.ProgressBar1.Value = 0
|
|
|
|
Me.Refresh()
|
|
Me.startProfileDurchlauf()
|
|
Else
|
|
_Logger.Warn("Attention: ClassNIProfile.Profile IsNothing")
|
|
End If
|
|
Else
|
|
_Logger.Info("ATTENTION: Threads are still running...")
|
|
'If Me.bwProfil.IsBusy Then
|
|
' _Logger.Warn("ACHTUNG: der Thread Profil arbeitet noch unerwartet - es wird nun der Thread abgebrochen")
|
|
' Me.bwProfil.CancelAsync()
|
|
|
|
' If bwDatei.IsBusy Then
|
|
' _Logger.Warn("ACHTUNG: Thread Datei wird ebenso abgebrochen")
|
|
' Me.bwDatei.CancelAsync()
|
|
' End If
|
|
|
|
'End If
|
|
'If Me.bwsearch.IsBusy Then
|
|
' _Logger.Warn("ACHTUNG: der Thread Search arbeitet noch unerwartet - es wird nun der Thread abgebrochen")
|
|
' Me.bwsearch.CancelAsync()
|
|
'End If
|
|
'If Me.bwDatei.IsBusy Then
|
|
' _Logger.Warn("der Thread Datei arbeitet noch unerwartet")
|
|
' Try
|
|
' _Logger.Warn("Thread Datei wird abgebrochen....")
|
|
' Me.bwDatei.CancelAsync()
|
|
' manuallyRun = False
|
|
' Catch ex As Exception
|
|
' _Logger.Warn("Fehler beim Abbrechen des Threads (Profile_Durchlaufen) bwDatei: " & ex.Message)
|
|
' End Try
|
|
'End If
|
|
'_Logger.Warn("Es wird versucht die Nachindexierung neu zu starten - 10sec Break")
|
|
'System.Threading.Thread.Sleep(10000)
|
|
'Start_NachindexierungThreads()
|
|
End If
|
|
Catch ex As Exception
|
|
' bei einem Fehler einen Eintrag in der Logdatei machen
|
|
_Logger.Error(ex)
|
|
|
|
End Try
|
|
manuallyRun = False
|
|
End Sub
|
|
|
|
Private Sub timRun_Tick(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles timRun.Tick
|
|
Me.Profile_Durchlaufen()
|
|
End Sub
|
|
'Public Shared Sub _Logger.Info(ByVal _error As String, Optional _mitPraefix As Boolean = False, Optional _inJedemFallLoggen As Boolean = False)
|
|
' If My.Settings.vLogErrorsonly = False Or _inJedemFallLoggen = True Then
|
|
' Select Case _mitPraefix
|
|
' Case False
|
|
' _Logger.Warn(" >> " & _error)
|
|
' Case True
|
|
' _Logger.Warn(_error, True)
|
|
' End Select
|
|
' End If
|
|
'End Sub
|
|
Private Function Check_Desk_Index()
|
|
'Als erste überprüfen ob überhaupt ein Dekriptiver Index ausgelesen werden kann
|
|
Dim DESKINDEX_VALUE As Object = Nothing
|
|
Dim errormsg As String
|
|
Try
|
|
If aktivesProfil.Desk_windreamIndex <> String.Empty Then
|
|
'den Wert des deskriptiven Indexes für das aktuelle Dokument auslesen
|
|
DESKINDEX_VALUE = aktivesDokument.GetVariableValue(aktivesProfil.Desk_windreamIndex)
|
|
Else
|
|
_Logger.Warn($"Check_Desk_Index: Es wurde kein deskriptiver Index für das Profil [{aktivesProfil.OriginalProfilname}] hinterlegt!")
|
|
Return True
|
|
End If
|
|
Catch ex As Exception
|
|
errormsg = " FEHLER bei Check_Desk_Index (GetVariableValue für Index '" & aktivesProfil.Desk_windreamIndex & "'): " & ex.Message
|
|
_Logger.Warn(errormsg)
|
|
If My.Settings.vNIMailsenden = True Then
|
|
email.Send_EMail("Beim Indexieren der Datei " & dokument.aName.ToString & " ist ein Fehler aufgetreten Check_Desk_Index (GetVariableValue): " & ex.Message)
|
|
End If
|
|
' wenn ein Fehler aufgetreten ist, muss das Flag gesetzt werden
|
|
Return True
|
|
|
|
End Try
|
|
If DESKINDEX_VALUE Is String.Empty Then
|
|
errormsg &= vbNewLine & " ACHTUNG - Für DESKINDEX konnte kein Wert gelesen werden - Indexierungsvorgang wird abgebrochen"
|
|
' wenn die Abfrage in windream kein Ergebnis gab, muss das Fehlerflag gesetzt werden
|
|
Return True
|
|
_Logger.Warn(errormsg)
|
|
Else
|
|
Return False
|
|
End If
|
|
End Function
|
|
' Indexiert die windream-Suchergebnisse
|
|
Public Sub IndexiereVerarbeiteDokument(ByVal dokument As WMObject)
|
|
Dim oResultNachindexierung = Nothing
|
|
|
|
Try
|
|
If bwDatei.CancellationPending Then
|
|
_Logger.Info("bwDatei.CancellationPending - IndexiereVerarbeiteDokument - Exit Sub")
|
|
Exit Sub
|
|
End If
|
|
Dim moved_Folder As String = ""
|
|
Dim swWorkDocument_All As New ClassStopwatch("WorkDocument_All")
|
|
Dim swRegIndex As New ClassStopwatch("RegularIndexing")
|
|
' _Logger.Info($"IndexiereVerarbeiteDokument [{Me.aktivesDokument.aName}]...")
|
|
' dient zum Überprüfen auf Fehler
|
|
Dim oUnexpectedError As Boolean = False
|
|
Dim unvollstaendig As Boolean = False
|
|
_MRKONVERT_FEHLER = 0
|
|
Dim result As String = ""
|
|
Dim fehlermsg As String = ""
|
|
Dim IndexwertAusWindream As Object = Nothing
|
|
Dim eindeutigerWertausWindream As String
|
|
Dim _pathxmlfile As String
|
|
'Liefert nur den PFad des aktiven Dokumens
|
|
Dim ordnerpfad As String = IO.Path.GetDirectoryName(My.Settings.vWLaufwerk & ":" & dokument.aPath)
|
|
_Logger.Debug("OrdnerPfad der Datei: " & ordnerpfad)
|
|
Try
|
|
CURRENT_DOCID = CInt(dokument.GetVariableValue("Dokument-ID"))
|
|
Catch ex As Exception
|
|
CURRENT_DOCID = 0
|
|
End Try
|
|
|
|
'Schalter um zu überprüfen ob es im Durchlauf ein SQL-Ergebnis gab
|
|
Dim _ergebnisSQL As Boolean = False
|
|
'Die Tabelle mit den select werten leeren
|
|
MyDataset.TBVEKTOR_ARRAY.Clear()
|
|
'Als erste überprüfen ob überhaupt ein Deskriptiver Index ausgelesen werden kann
|
|
Select Case Me.aktivesProfil.Ni_Art.ToLower
|
|
Case "fulltext"
|
|
Dim fulltext
|
|
Try
|
|
_fulltext = New clsNIFulltext(_MyLogger)
|
|
_Logger.Debug(">> _fulltext initialized.")
|
|
fulltext = dokument.GetVariableValue(aktivesProfil.Desk_windreamIndex)
|
|
If Len(fulltext) > 0 Then
|
|
_Logger.Info($"{aktivesProfil.Desk_windreamIndex} is empty...")
|
|
Else
|
|
_Logger.Info($"## No fulltext from [{aktivesProfil.Desk_windreamIndex}] extracted!")
|
|
fulltext = dokument.GetVariableValue("Manueller Volltext")
|
|
End If
|
|
If Len(fulltext) > 0 Then
|
|
Volltext_indexer(dokument, fulltext)
|
|
Else
|
|
_Logger.Info($"## Even no fulltext from Manueller Volltext extracted!")
|
|
End If
|
|
Catch ex As Exception
|
|
_Logger.Error(ex)
|
|
oUnexpectedError = True
|
|
unvollstaendig = True
|
|
File_SetBooleanIndex(True, aktivesDokument, aktivesProfil.IndexValidation)
|
|
|
|
End Try
|
|
|
|
|
|
Case "db"
|
|
oUnexpectedError = Check_Desk_Index()
|
|
'If aktivesProfil.checkIndexsql = "" Then
|
|
' _Logger.Debug("# HINWEIS: Eine sql-Überprüfung des Indexwertes ist nicht hinterlegt! Dies kann zu falsch-positiven Werten führen!#")
|
|
'End If
|
|
If aktivesProfil.checkIndexsql <> String.Empty And oUnexpectedError = False Then
|
|
_Logger.Debug("Überprüfung des deskriptiven Indexwertes gegen die DB")
|
|
Dim oResultCheck As Integer
|
|
'##################
|
|
'Zuerst überprüfen ob der Deskriptive Idnex einen gültigen Wert zurückliefert
|
|
Try
|
|
Dim odescIndexValue As String
|
|
Dim oAttribute = _windreamNI.oWMSession.GetWMObjectByName(WINDREAMLib.WMEntity.WMEntityAttribute, aktivesProfil.Desk_windreamIndex)
|
|
Try
|
|
Dim vType = oAttribute.getVariableValue("dwAttrType")
|
|
|
|
If vType >= 4097 Or vType = 8 Then
|
|
oResultCheck = 1
|
|
_Logger.Warn($"Could not check descriptiveIndex as Index is a Vectorfield!")
|
|
|
|
Else
|
|
' den Wert des deskriptiven Indexes für das aktuelle Dokument auslesen
|
|
odescIndexValue = dokument.GetVariableValue(aktivesProfil.Desk_windreamIndex)
|
|
oResultCheck = Check_DeskIndexValue(odescIndexValue, aktivesProfil.checkIndexsql, dokument)
|
|
End If
|
|
|
|
Catch ex As Exception
|
|
|
|
_Logger.Warn($" Error getting {dokument.aName} # Der deskriptive Indexwert '{odescIndexValue}' of Index [{aktivesProfil.Desk_windreamIndex}] verweist auf KEINEN Eintrag in der Datenbank!")
|
|
|
|
End Try
|
|
|
|
|
|
'Überprüfen welcher WErt zurücgekommen ist
|
|
Select Case oResultCheck
|
|
Case 0
|
|
'Kein Ergebnis für den Deskriptiven Index also Kennzeichnen des Dokumentes über den Index der das Dokument für die Validierung kennzeichnet
|
|
_Logger.Warn($"{dokument.aName} # Der deskriptive Indexwert '{odescIndexValue}' of Index [{aktivesProfil.Desk_windreamIndex}] verweist auf KEINEN Eintrag in der Datenbank!")
|
|
fehlermsg &= " >> Der deskriptive Indexwert " & odescIndexValue & " verweist auf KEINEN Eintrag in der Datenbank!"
|
|
'Fehler = True
|
|
unvollstaendig = True
|
|
File_SetBooleanIndex(True, aktivesDokument, aktivesProfil.IndexValidation)
|
|
SetErrorMeldung("Value '" & odescIndexValue & "' not found in Database", aktivesDokument, My.Settings.ERROR_INDEX)
|
|
Case 1
|
|
_Logger.Debug($"{dokument.aName} # Der deskriptive Indexwert '{odescIndexValue}' verweist genau auf EINEN Eintrag in der Datenbank - Alles OK")
|
|
unvollstaendig = False
|
|
Case 2
|
|
'Mehr als ein Ergebnis für den Deskriptiven Index also Kennzeichnen des Dokumentes über den Index der das Dokument für die Validierung kennzeichnet
|
|
_Logger.Warn($"{dokument.aName} # Der deskriptive Indexwert '{odescIndexValue}' of Index [{aktivesProfil.Desk_windreamIndex}] verweist auf MEHR ALS EINEN Eintrag in der Datenbank oder es trat ein genereller Fehler auf!")
|
|
fehlermsg &= " >> Der deskriptive Indexwert " & odescIndexValue & " verweist auf MEHR ALS EINEN Eintrag in der Datenbank oder es trat ein genereller Fehler auf!"
|
|
oUnexpectedError = True
|
|
unvollstaendig = True
|
|
File_SetBooleanIndex(True, aktivesDokument, aktivesProfil.IndexValidation)
|
|
SetErrorMeldung("More then 1 row found in Database", aktivesDokument, My.Settings.ERROR_INDEX)
|
|
End Select
|
|
|
|
Catch ex As Exception
|
|
' wenn ein Fehler aufgetreten ist, muss das Flag gesetzt werden
|
|
_Logger.Error(ex)
|
|
|
|
oUnexpectedError = True
|
|
SetErrorMeldung("Error while Checking DeskriptiveIndex", aktivesDokument, My.Settings.ERROR_INDEX)
|
|
End Try
|
|
End If
|
|
Case "xml" '#### Indexierung über xml-Dokument
|
|
_pathxmlfile = ordnerpfad & "\" & System.IO.Path.GetFileNameWithoutExtension(dokument.aPath) & "."
|
|
If aktivesProfil.xmlEnd = "xml (ZugFerd)" Then
|
|
_pathxmlfile &= "xml"
|
|
Else
|
|
_pathxmlfile &= aktivesProfil.xmlEnd
|
|
End If
|
|
|
|
If clsHelper.file_exists(_pathxmlfile, "NI") = False Then
|
|
_pathxmlfile = ordnerpfad & "\" & System.IO.Path.GetFileNameWithoutExtension(dokument.aPath) & "." & "xfres"
|
|
If clsHelper.file_exists(_pathxmlfile, "NI") = False Then
|
|
_Logger.Warn("ACHTUNG 1: Nachindexdatei '" & _pathxmlfile & "' existiert nicht!")
|
|
' Markierung des Dokumentes
|
|
SetErrorMeldung("Nachindexdatei NOT EXISTING", aktivesDokument, My.Settings.ERROR_INDEX)
|
|
File_SetBooleanIndex(True, aktivesDokument, aktivesProfil.IndexValidation)
|
|
fehlermsg &= " >> ACHTUNG 1: Nachindexdatei '" & _pathxmlfile & "' existiert nicht!"
|
|
oUnexpectedError = True
|
|
End If
|
|
End If
|
|
Case "activedirectory"
|
|
|
|
End Select
|
|
myNIDatatable = Nothing
|
|
myNIArrayIndexe = Nothing ' zum Speichern der Indexe
|
|
myNIArrayValues = Nothing ' zum Speichern der Werte
|
|
Dim oDt As New DataTable
|
|
oDt.Columns.Add("IndexName")
|
|
oDt.Columns.Add("Value")
|
|
myNIDatatable = oDt
|
|
|
|
|
|
|
|
Dim verknüpfungZähler As Integer = 0
|
|
|
|
Dim selectArray()
|
|
|
|
|
|
If IsNothing(Me.aktivesProfil.Verknüpfungen.Links) = False And oUnexpectedError = False And unvollstaendig = False And Me.aktivesProfil.Ni_Art.ToLower <> "fulltext" Then
|
|
' alle Verknüpfungen/Links des aktuellen Suchergebnisses durchlaufen
|
|
Dim ocounter As Integer = 0
|
|
For Each INDEX_SQL_BEFEHL As ClassNIVerknüpfung In Me.aktivesProfil.Verknüpfungen.Links
|
|
ocounter += 1
|
|
_Logger.Debug($"### For each Verknüpfung [{ocounter}]...###")
|
|
'Regulären Ausdruck zum Auslesen der windream-Indexe definieren
|
|
Dim preg As String = "\[%{1}[a-zA-Z0-9\!\$\&\/\(\)\=\?\,\.\-\;\:_öÖüÜäÄ\#\'\+\*\~\{\}\@\€\<\>\ ]+]{1}"
|
|
' SQL-String für aktuelle Verknüpfung laden
|
|
Dim oSqlCommand As String = INDEX_SQL_BEFEHL.SelectAnweisung
|
|
If Len(oSqlCommand) > 0 Then
|
|
'Ersetzen des Dateinamens - für CURSOR NachindexierungPr
|
|
If oSqlCommand.Contains("[DATEINAME]") Then
|
|
oSqlCommand = oSqlCommand.Replace("[DATEINAME]", dokument.aName)
|
|
End If
|
|
If oSqlCommand.Contains("[FULLNAME]") Then
|
|
oSqlCommand = oSqlCommand.Replace("[FULLNAME]", My.Settings.MRWD_Laufwerk & ":" & dokument.aPath)
|
|
End If
|
|
|
|
If oSqlCommand.Contains("[DOCFilename]") Then
|
|
oSqlCommand = oSqlCommand.Replace("[DOCFilename]", dokument.aName)
|
|
End If
|
|
If oSqlCommand.Contains("[DOCFilenameoE]") Then
|
|
Dim Filename As String = aktivesDokument.aName.ToString.Substring(0, aktivesDokument.aName.LastIndexOf("."))
|
|
oSqlCommand = oSqlCommand.Replace("[DOCFilenameoE]", Path.GetFileNameWithoutExtension(Filename))
|
|
End If
|
|
|
|
If oSqlCommand.Contains("[DOCPath]") Then
|
|
oSqlCommand = oSqlCommand.Replace("[DOCPath]", Path.GetDirectoryName(My.Settings.vWLaufwerk & ":" & dokument.aPath))
|
|
End If
|
|
If oSqlCommand.Contains("[%DATENow]") Then
|
|
oSqlCommand = oSqlCommand.Replace("[%DATENow]", Now.ToShortDateString)
|
|
End If
|
|
If oSqlCommand.Contains("[DOCFULLPATH]") Then
|
|
oSqlCommand = oSqlCommand.Replace("[DOCFULLPATH]", My.Settings.MRWD_Laufwerk & ":" & dokument.aPath)
|
|
End If
|
|
_Logger.Debug($"oSqlCommand after Replace 1([{oSqlCommand}])")
|
|
' einen Regulären Ausdruck laden
|
|
Dim regulärerAusdruck As System.Text.RegularExpressions.Regex = New System.Text.RegularExpressions.Regex(preg)
|
|
' die Vorkommen im SQL-String auslesen
|
|
Dim elemente As System.Text.RegularExpressions.MatchCollection = regulärerAusdruck.Matches(oSqlCommand)
|
|
|
|
' alle Vorkommen der windream-Indexe im SQL-String durchlaufen
|
|
For Each element As System.Text.RegularExpressions.Match In elemente
|
|
' wenn es sich nicht um die Spalten- oder Viewangabe handelt (es sollen ja nur die Indexe ausgelesen werden)
|
|
If Not element.Value.ToUpper = "[%SPALTE]" And Not element.Value.ToUpper = "[%VIEW]" Then
|
|
|
|
' die Zeichen [% und ] entfernen (liefert den wirklichen windream-Index)
|
|
Dim idxName_ohneSonderzeichen As String = element.Value.Substring(2, element.Value.Length - 3)
|
|
_Logger.Debug("### Working on Index(" & idxName_ohneSonderzeichen & ")...###")
|
|
Try
|
|
' den Wert des deskriptiven Indexes für das aktuelle Dokument auslesen
|
|
IndexwertAusWindream = dokument.GetVariableValue(idxName_ohneSonderzeichen)
|
|
If element.ToString = aktivesProfil.Desk_windreamIndex Then
|
|
eindeutigerWertausWindream = IndexwertAusWindream
|
|
End If
|
|
Catch ex As Exception
|
|
_Logger.Error(ex)
|
|
|
|
' wenn ein Fehler aufgetreten ist, muss das Flag gesetzt werden
|
|
result &= vbNewLine & " - Schwerwiegender Fehler bei Auslesen des einschränkenden Wertes aus Index':" & idxName_ohneSonderzeichen & "'"
|
|
oUnexpectedError = True
|
|
fehlermsg &= vbNewLine & "Schwerwiegender Fehler bei Auslesen des einschränkenden Wertes aus Index':" & idxName_ohneSonderzeichen & "' - Fehler: " & ex.Message
|
|
If My.Settings.vNIMailsenden = True Then
|
|
email.Send_EMail("Beim Indexieren der Datei " & dokument.aName.ToString & " ist ein Fehler aufgetreten (GetVariableValue bei Auslesen des einschränkenden Wertes): " & ex.Message)
|
|
End If
|
|
End Try
|
|
|
|
' wenn beim Auslesen des Wertes für den aktuellen windream-Index kein Fehler auftrat
|
|
' und die Abfrage ein Ergebnis zurück gab
|
|
If IndexwertAusWindream Is Nothing And Not oUnexpectedError Then
|
|
' IndexwertAusWindream ist Nothing (idxName_ohneSonderzeichen)
|
|
_Logger.Warn("ACHTUNG: der einschränkende Wert aus Windream für Index '" & idxName_ohneSonderzeichen & "' is NOTHING")
|
|
_Logger.Warn("SQL-String bisher: " & oSqlCommand)
|
|
' wenn die Abfrage in windream kein Ergebnis gab, muss das error_in_Indexierungflag gesetzt werden
|
|
oUnexpectedError = True
|
|
Else
|
|
' den Platzhalter im SQL-String durch den Wert ersetzen
|
|
oSqlCommand = oSqlCommand.Replace(element.Value, IndexwertAusWindream.ToString)
|
|
|
|
End If
|
|
|
|
Else ' wenn es sich um den Platzhalter für die Spalte bzw. den View handelt
|
|
' wenn es sich um den Platzhalter für die Spalte handelt
|
|
If element.Value.ToUpper = "[%SPALTE]" Then
|
|
' den Platzhalter für die auszulesende Spalte durch den Spaltennamen ersetzen
|
|
oSqlCommand = oSqlCommand.Replace(element.Value, INDEX_SQL_BEFEHL.Spalte)
|
|
|
|
ElseIf element.Value.ToUpper = "[%VIEW]" Then
|
|
' den Platzhalter für den auszulesenden View durch den Viewnamen ersetzen
|
|
oSqlCommand = oSqlCommand.Replace(element.Value, INDEX_SQL_BEFEHL.From)
|
|
End If
|
|
|
|
End If
|
|
|
|
Next ' zum nächsten Wert in der SQL-Anweisung gehen
|
|
result &= vbNewLine & " " & oSqlCommand
|
|
_Logger.Debug($"oSqlCommand after Replace 2([{oSqlCommand}])")
|
|
Else
|
|
_Logger.Debug("### oSqlCommand is empty!! ###")
|
|
End If
|
|
|
|
' wenn kein error_in_Indexierung aufgetreten ist
|
|
If oUnexpectedError = False Then
|
|
oResultNachindexierung = Nothing ' Der Nachindexierungswert: entweder aus Datenbankabrage oder aus xml-File
|
|
'Indexierung gegen ein Indexfeld
|
|
If INDEX_SQL_BEFEHL.Spalte.StartsWith("%") And INDEX_SQL_BEFEHL.Spalte.EndsWith("%") Then
|
|
'Ein manueller Wert in der Verknüpfung
|
|
_Logger.Debug("Indexierung mit einem manuellem Wert")
|
|
Dim _wert As String = INDEX_SQL_BEFEHL.Spalte.Replace("%", "")
|
|
oResultNachindexierung = _wert
|
|
_Logger.Debug("Manueller Wert: '" & oResultNachindexierung & "'")
|
|
Else
|
|
Dim Arr() As Object
|
|
''###########
|
|
Dim Anzahl_NI_Werte As Integer = 0
|
|
If IndexwertAusWindream Is Nothing = False Then
|
|
'Es wird gegen ein Vektorfeld nachindexiert
|
|
If IndexwertAusWindream.GetType.ToString.Contains("System.Object") Then
|
|
_Logger.Debug("...INDEXIERUNG GEGEN EIN VEKTORFELD")
|
|
'Zuweisen der Indexwerte des Vektorfeldes zu Array
|
|
Arr = IndexwertAusWindream
|
|
For Each str As Object In Arr
|
|
If str Is Nothing = False Then
|
|
Anzahl_NI_Werte += 1
|
|
End If
|
|
Next
|
|
ReDim Preserve selectArray(Anzahl_NI_Werte - 1)
|
|
_Logger.Debug("Anzahl Elemente: " & Anzahl_NI_Werte)
|
|
'MsgBox("Aha ein Vektorindex" & vbNewLine & "Anzahl Elemente: " & Anzahl_NI_Werte)
|
|
|
|
Dim selectstring = oSqlCommand
|
|
Dim i As Integer = 0
|
|
For Each obj As Object In Arr
|
|
'Im Select den Objektverweis mit Werta aus Vektorfeld ersetzen
|
|
oSqlCommand = selectstring
|
|
' MsgBox(obj.ToString)
|
|
oSqlCommand = oSqlCommand.Replace("System.Object[]", obj.ToString)
|
|
'Select-Befehl an Array übergeben
|
|
selectArray(i) = oSqlCommand
|
|
'_Logger.Info("SELECT-BEFEHL: " & selectArray(i))
|
|
i += 1
|
|
Next
|
|
Else
|
|
_Logger.Debug("...Indexierung gegen einen Einfachindex")
|
|
If Len(oSqlCommand) > 0 Then
|
|
ReDim Preserve selectArray(0)
|
|
'MsgBox("Nur ein Einfachindex :(" & vbNewLine & IndexwertAusWindream.ToString)
|
|
selectArray(0) = oSqlCommand
|
|
End If
|
|
|
|
End If
|
|
Else
|
|
ReDim Preserve selectArray(0)
|
|
'MsgBox("Nur ein Einfachindex :(" & vbNewLine & IndexwertAusWindream.ToString)
|
|
selectArray(0) = oSqlCommand
|
|
_Logger.Warn("IndexwertAusWindream Is Nothing: Select so far: '" & oSqlCommand & "'")
|
|
End If
|
|
|
|
|
|
'Nur wenn KEIN INDEXWERT also KEIN MANUELLER WERT
|
|
If oResultNachindexierung Is Nothing And selectArray.Length > 0 Then
|
|
'Indexwert über DB oder Datei
|
|
Select Case aktivesProfil.Ni_Art.ToLower
|
|
Case "db"
|
|
_Logger.Debug("SQL-Abfrage/n durchlaufen...")
|
|
Dim i As Integer
|
|
Dim Quelle_is_vektor = False
|
|
If selectArray.Length > 1 Then
|
|
Quelle_is_vektor = True
|
|
End If
|
|
|
|
For i = 0 To selectArray.Length - 1
|
|
'MessageBox.Show("Select: " & vbNewLine & selectArray(i))
|
|
' die SQL-Abfrage durchführen (liefert den Wert der in den windream-Index geschrieben werden soll)
|
|
If Me.aktivesProfil.DbArt = "Oracle" Then
|
|
oResultNachindexierung = database.GetValueFromOracleDb(aktivesProfil.Profilname, selectArray(i), Me.aktivesProfil.DataSource, aktivesProfil.InitialCatalog, aktivesProfil.UserId, aktivesProfil.Password, MyDataset, INDEX_SQL_BEFEHL.Index, Quelle_is_vektor)
|
|
ElseIf Me.aktivesProfil.DbArt = "MS-SQL" Then
|
|
_Logger.Debug($"Executing MSSQL ...")
|
|
oResultNachindexierung = database.GetValueFromMssqlDb(dokument.aName, aktivesProfil.Profilname, selectArray(i), Me.aktivesProfil.DataSource, aktivesProfil.UserId, aktivesProfil.Password, MyDataset, aktivesProfil.InitialCatalog, INDEX_SQL_BEFEHL.Index, Quelle_is_vektor)
|
|
ElseIf Me.aktivesProfil.DbArt = "ODBC" Then
|
|
oResultNachindexierung = database.GetValueFromOdbcDb(aktivesProfil.Profilname, selectArray(i), Me.aktivesProfil.DataSource, aktivesProfil.UserId, aktivesProfil.Password, INDEX_SQL_BEFEHL.Index)
|
|
' MsgBox(oResultNachindexierung)
|
|
ElseIf Me.aktivesProfil.DbArt = "OLE (Access)" Then
|
|
oResultNachindexierung = database.GetValueFromOleDb(aktivesProfil.Profilname, selectArray(i), Me.aktivesProfil.DataSource, aktivesProfil.UserId, aktivesProfil.Password, INDEX_SQL_BEFEHL.Index)
|
|
ElseIf Me.aktivesProfil.DbArt = "Firebird" Then
|
|
oResultNachindexierung = database.GetValueFromFirebird(aktivesProfil.Profilname, selectArray(i), INDEX_SQL_BEFEHL.Index, MyDataset)
|
|
End If
|
|
Next
|
|
Case "xml"
|
|
'#### Indexierung über xml-Dokument
|
|
Dim dok As String = System.IO.Path.GetFileNameWithoutExtension(dokument.aPath)
|
|
'Indexierung über luratech-Ergebnis Files
|
|
If aktivesProfil.xmlEnd = "xffres" Then
|
|
_Logger.Debug("Indexierung über XML-Dokument Abby/Luratech")
|
|
'Dateipfad für xffres/xml-Datei zusammenbauen
|
|
If File.Exists(_pathxmlfile) Then
|
|
'Übergabe der Dateiparameter und des xml-Knotens
|
|
oResultNachindexierung = Trim(xml.GetValueFromLuratechxml(System.IO.Path.GetFileNameWithoutExtension(dokument.aPath) & "." & aktivesProfil.xmlEnd, _pathxmlfile, INDEX_SQL_BEFEHL.Spalte, aktivesProfil.Profilname))
|
|
'wert aus Luratech darf nicht leer sein
|
|
If oResultNachindexierung Is Nothing Then
|
|
File_SetBooleanIndex(True, aktivesDokument, aktivesProfil.IndexValidation)
|
|
SetErrorMeldung("Wert aus Formrec. ist nothing", aktivesDokument, My.Settings.ERROR_INDEX)
|
|
End If
|
|
Else
|
|
_Logger.Warn("ACHTUNG 2: Nachindexdatei: " & _pathxmlfile & " existiert nicht!")
|
|
oUnexpectedError = True
|
|
fehlermsg &= vbNewLine & " >> ACHTUNG 2: Datei: " & _pathxmlfile & " existiert nicht!"
|
|
End If
|
|
ElseIf aktivesProfil.xmlEnd = "xml (ZugFerd)" Then
|
|
_Logger.Debug("Indexierung über XML-Dokument ZugFerd")
|
|
'Dateipfad für xffres/xml-Datei zusammenbauen
|
|
If File.Exists(_pathxmlfile) Then
|
|
'Übergabe der Dateiparameter und des xml-Knotens
|
|
oResultNachindexierung = Trim(xml.GetValueFromZugFerdxml(System.IO.Path.GetFileNameWithoutExtension(_pathxmlfile), _pathxmlfile, INDEX_SQL_BEFEHL.Spalte, aktivesProfil.Profilname))
|
|
'wert aus Luratech darf nicht leer sein
|
|
If oResultNachindexierung Is Nothing Then
|
|
File_SetBooleanIndex(True, aktivesDokument, aktivesProfil.IndexValidation)
|
|
SetErrorMeldung("Wert aus Formrec. ist nothing", aktivesDokument, My.Settings.ERROR_INDEX)
|
|
End If
|
|
Else
|
|
_Logger.Warn("ACHTUNG 2: Nachindexdatei: " & _pathxmlfile & " existiert nicht!")
|
|
oUnexpectedError = True
|
|
fehlermsg &= vbNewLine & " >> ACHTUNG 2: Datei: " & _pathxmlfile & " existiert nicht!"
|
|
End If
|
|
End If
|
|
'wenn kein error_in_Indexierung und wert geliefert und Index ist deskriptiver Index
|
|
If Not oUnexpectedError And aktivesProfil.Desk_windreamIndex = INDEX_SQL_BEFEHL.Index And aktivesProfil.checkIndexsql <> "" Then
|
|
If (oResultNachindexierung = "") Or (oResultNachindexierung Is Nothing) Then
|
|
_Logger.Warn("ACHTUNG: der XML-Wert (Formrecognition) ist leer! Dies kann zu Fehlern führen!")
|
|
'Markierung Validation
|
|
File_SetBooleanIndex(True, aktivesDokument, aktivesProfil.IndexValidation)
|
|
'errormeldung setzen
|
|
SetErrorMeldung("Wert aus Formrec. ist leer", aktivesDokument, My.Settings.ERROR_INDEX)
|
|
|
|
fehlermsg &= vbNewLine & " >> der Wert in der Indexdatei ist leer"
|
|
oResultNachindexierung = Nothing
|
|
unvollstaendig = True
|
|
oUnexpectedError = True
|
|
Else
|
|
Dim _dokxml As WINDREAMLib.WMObject
|
|
_dokxml = Nothing
|
|
'Dim _path2xmlfile As String = ordnerpfad & "\" & System.IO.Path.GetFileNameWithoutExtension(dokument.aPath) & "." & aktivesProfil.xmlEnd
|
|
_dokxml = _windreamNI.oWMSession.GetWMObjectByPath(ConstWMEntityDocument, _pathxmlfile.Substring(2))
|
|
'Überprüfen ob deskriptiver Wert eindeutig?
|
|
_Logger.Debug("Überprüfung ob deskriptiver Wert eindeutig?")
|
|
Dim Check As Integer = Check_DeskIndexValue(oResultNachindexierung, aktivesProfil.checkIndexsql, dokument)
|
|
Select Case Check
|
|
Case 0
|
|
'Kein Ergebnis für den Deskriptiven Index also Kennzeichnen des Dokumentes über den Index der das Dokument für die Validierung kennzeichnet
|
|
_Logger.Warn("Der deskriptive Indexwert '" & oResultNachindexierung & "' verweist auf keinen Eintrag in der Datenbank!")
|
|
SetErrorMeldung("Value '" & oResultNachindexierung & "' not found in Database", aktivesDokument, My.Settings.ERROR_INDEX)
|
|
unvollstaendig = True
|
|
oUnexpectedError = True
|
|
|
|
|
|
'Überprüfung ob Wert dennoch indexiert werden soll?!
|
|
If INDEX_SQL_BEFEHL.SelectAnweisung = "WRITE_ALWAYS" Then
|
|
_Logger.Debug("Dennoch soll der Wert eingetragen werden")
|
|
Dim arrIndex() As String = Nothing
|
|
Dim arrValue() As String = Nothing
|
|
ReDim Preserve arrIndex(0)
|
|
ReDim Preserve arrValue(0)
|
|
arrIndex(0) = INDEX_SQL_BEFEHL.Index
|
|
arrValue(0) = oResultNachindexierung.ToString
|
|
Me._windreamNI.RunIndexing(dokument, arrIndex, arrValue, MyDataset, aktivesProfil.Profilname, aktivesProfil.DokumenttypString)
|
|
_Logger.Debug("Der falsche OCR-Wert: '" & oResultNachindexierung.ToString & "' wurde eingetragen")
|
|
Else
|
|
fehlermsg &= vbNewLine & " - Der deskriptive Indexwert " & oResultNachindexierung & " verweist auf keinen Eintrag in der Datenbank!"
|
|
End If
|
|
'1. aktives Dok
|
|
File_SetBooleanIndex(True, aktivesDokument, aktivesProfil.IndexValidation)
|
|
'2. Indexierungs-Datei
|
|
File_SetBooleanIndex(True, _dokxml, aktivesProfil.IndexValidation)
|
|
'Fehlermarkierung setzen
|
|
|
|
Case 1
|
|
_Logger.Debug("Der deskriptive Indexwert " & oResultNachindexierung & " verweist genau auf EINEN Eintrag in der Datenbank - Alles OK")
|
|
oUnexpectedError = False
|
|
Case 2
|
|
'Mehr als ein Ergebnis für den Deskriptiven Index also Kennzeichnen des Dokumentes über den Index der das Dokument für die Validierung kennzeichnet
|
|
_Logger.Warn("Der deskriptive Indexwert " & oResultNachindexierung & " verweist auf MEHR ALS EINEN Eintrag in der Datenbank!")
|
|
SetErrorMeldung("More then 1 row found in Database", aktivesDokument, My.Settings.ERROR_INDEX)
|
|
fehlermsg &= vbNewLine & " - Der deskriptive Indexwert " & oResultNachindexierung & " verweist auf MEHR ALS EINEN Eintrag in der Datenbank!"
|
|
oUnexpectedError = True
|
|
'1. aktives Dok
|
|
File_SetBooleanIndex(True, aktivesDokument, aktivesProfil.IndexValidation)
|
|
'2. Indexierungs-Datei
|
|
File_SetBooleanIndex(True, _dokxml, aktivesProfil.IndexValidation)
|
|
End Select
|
|
End If
|
|
Else
|
|
If aktivesProfil.Desk_windreamIndex = "" Then
|
|
_Logger.Warn("# ACHTUNG: der deskriptive Indexwert ist nicht hinterlegt! Dies kann zu Fehlern führen! #")
|
|
Else
|
|
If aktivesProfil.checkIndexsql = "" Then
|
|
_Logger.Warn("# ACHTUNG: Eine sql-Überprüfung des aus xml-gelesenen Indexwertes ist nicht hinterlegt! Dies kann zu falsch-positiven Werten führen! #")
|
|
Else
|
|
If oResultNachindexierung = "" Then
|
|
_Logger.Warn("# ACHTUNG: der gelesene Wert ist leer! Dies kann zu Fehlern führen! #")
|
|
End If
|
|
End If
|
|
End If
|
|
End If
|
|
Case "activedirectory"
|
|
_Logger.Debug("Indexierung gegen ActiveDirectory")
|
|
|
|
oResultNachindexierung = ClassActiveDirectory.GetAD_Attribut(selectArray(0), INDEX_SQL_BEFEHL.Spalte, aktivesProfil.DataSource, aktivesProfil.UserId, aktivesProfil.Password)
|
|
If oResultNachindexierung = ">1" Then
|
|
_Logger.Warn("Es wurde mehr als 1 Wert ausgelesen! Entweder ist der Filter AD nicht eindeutig oder ein anderer error_in_Indexierung ist aufgetreten")
|
|
Else
|
|
_Logger.Debug("Gelesener Attribut-Wert: " & oResultNachindexierung)
|
|
End If
|
|
|
|
|
|
|
|
End Select
|
|
|
|
End If
|
|
|
|
End If
|
|
'#####
|
|
'bis hier in _clsWorkfile integriert
|
|
'######
|
|
'nur wenn kein Fehler
|
|
If Not oUnexpectedError Then
|
|
If oResultNachindexierung Is Nothing Then
|
|
_Logger.Debug("oResultNachindexierung is nothing...Continue next")
|
|
Continue For
|
|
End If
|
|
Try
|
|
If Not IsNothing(oResultNachindexierung) Then
|
|
_Logger.Debug("oResultNachindexierung is not nothing...")
|
|
_Logger.Debug($"oResultNachindexierung = [{oResultNachindexierung.ToString}]...")
|
|
End If
|
|
Catch ex As Exception
|
|
_Logger.Warn("Unexpected error in checking isnothing for oResultNachindexierung: " & ex.Message)
|
|
_Logger.Warn("oResultNachindexierung Is Nothing..Continue For...")
|
|
Continue For
|
|
End Try
|
|
|
|
' wenn sowohl ein Index, als auch ein Wert gefunden/angegeben wurde,
|
|
' der in den windream-Index geschrieben werden kann
|
|
If INDEX_SQL_BEFEHL.Index IsNot Nothing Then
|
|
result &= " - " & oResultNachindexierung.ToString
|
|
_ergebnisSQL = True
|
|
Try
|
|
_Logger.Debug("Arraygößen werden angepasst:")
|
|
' die Arraygrößen anpassen
|
|
ReDim Preserve myNIArrayIndexe(verknüpfungZähler)
|
|
ReDim Preserve myNIArrayValues(verknüpfungZähler)
|
|
' den angegebenen Index eintragen
|
|
myNIArrayIndexe(verknüpfungZähler) = INDEX_SQL_BEFEHL.Index
|
|
|
|
' den, übergebenen/gefundenen IndexWert, eintragen
|
|
myNIArrayValues(verknüpfungZähler) = Convert.ToString(oResultNachindexierung)
|
|
|
|
Dim oRow As DataRow = myNIDatatable.NewRow
|
|
oRow(0) = INDEX_SQL_BEFEHL.Index
|
|
oRow(1) = Convert.ToString(oResultNachindexierung)
|
|
myNIDatatable.Rows.Add(oRow)
|
|
|
|
_Logger.Debug("INDEXWERT: '" & Convert.ToString(oResultNachindexierung) & "'")
|
|
verknüpfungZähler += 1
|
|
Catch ex As Exception
|
|
result &= " (" & verknüpfungZähler & ") => " & ex.Message & vbNewLine
|
|
End Try
|
|
Else
|
|
If oResultNachindexierung Is Nothing And aktivesProfil.Ni_Art.ToLower = "db" Then
|
|
'_Logger.Debug("SQL-Abfrage ergab kein Ergebnis - früher Ausstieg aus Routine ")
|
|
'Exit For
|
|
End If
|
|
If IndexwertAusWindream.GetType.ToString.Contains("System.Object") Then
|
|
' die Arraygrößen anpassen
|
|
ReDim Preserve myNIArrayIndexe(verknüpfungZähler)
|
|
ReDim Preserve myNIArrayValues(verknüpfungZähler)
|
|
' den angegebenen Index eintragen
|
|
myNIArrayIndexe(verknüpfungZähler) = INDEX_SQL_BEFEHL.Index
|
|
|
|
' den, übergebenen/gefundenen IndexWert, eintragen
|
|
myNIArrayValues(verknüpfungZähler) = Convert.ToString("")
|
|
_Logger.Debug("Nachindexwert ist Object")
|
|
verknüpfungZähler += 1
|
|
|
|
Dim oRow As DataRow = myNIDatatable.NewRow
|
|
oRow(0) = INDEX_SQL_BEFEHL.Index
|
|
oRow(1) = Convert.ToString("")
|
|
myNIDatatable.Rows.Add(oRow)
|
|
Else
|
|
'_Logger.Warn("SQL-Abfrage ergab kein Ergebnis")
|
|
If aktivesProfil.Ni_Art.ToLower = "xml" Then
|
|
If clsHelper.file_exists(_pathxmlfile, "NI") Then
|
|
|
|
If INDEX_SQL_BEFEHL.Index = aktivesProfil.Desk_windreamIndex Then
|
|
_Logger.Info("# Achtung: Der Deskriptive Index: " & aktivesProfil.Desk_windreamIndex & " sollte gesetzt werden! Wert konnte aber nicht gelesen werden bzw ist leer - Markierung des Doks")
|
|
'Kein Ergebnis für den Deskriptiven Index also Kennzeichnen des Dokumentes über den Index der das Dokument für die Validierung kennzeichnet
|
|
Dim _dokxml As WINDREAMLib.WMObject
|
|
_dokxml = Nothing
|
|
|
|
_dokxml = _windreamNI.oWMSession.GetWMObjectByPath(ConstWMEntityDocument, _pathxmlfile.Substring(2))
|
|
'1. aktives Dok
|
|
File_SetBooleanIndex(True, aktivesDokument, aktivesProfil.IndexValidation)
|
|
'2. Indexierungs-Datei
|
|
File_SetBooleanIndex(True, _dokxml, aktivesProfil.IndexValidation)
|
|
'Fehlermarkierung setzen
|
|
|
|
End If
|
|
End If
|
|
End If
|
|
End If
|
|
End If
|
|
Else
|
|
_Logger.Info("Unexpected error while indexing...(error_in_Indexierung is true)")
|
|
End If
|
|
|
|
|
|
End If
|
|
Next ' zur nächsten Verknüpfung gehen
|
|
End If
|
|
|
|
' wenn kein error_in_Indexierung aufgetreten ist
|
|
If oUnexpectedError = False Then
|
|
If unvollstaendig = False And Me.aktivesProfil.Ni_Art.ToLower <> "fulltext" Or Me.aktivesProfil.Ni_Art.ToLower <> "nurordnerrechte" Or Me.aktivesProfil.Ni_Art.ToLower <> "nur-ordner-indizes" Then
|
|
'###############################################################################################
|
|
'#### Nachindexierung ##########################################################################
|
|
Dim sw As New ClassStopwatch("RunIndexing_Case1")
|
|
oUnexpectedError = Me._windreamNI.RunIndexing(dokument, myNIArrayIndexe, myNIArrayValues, MyDataset, aktivesProfil.Profilname, aktivesProfil.DokumenttypString)
|
|
Dim msg = sw.Done
|
|
If msg <> "" Then
|
|
Stopwatch1 = $"{msg}"
|
|
End If
|
|
'#### Nachindexierung Ende #####################################################################
|
|
'###############################################################################################
|
|
If oUnexpectedError = True Then
|
|
_Logger.Debug("error_in_Indexierung is True - none of following steps will be run!")
|
|
End If
|
|
'Wenn ein SQL-Ergebnis im Durchlauf einen Wert lieferte wird der finale Index auf True gesetzt
|
|
If myNIArrayValues Is Nothing = False And Not oUnexpectedError Then
|
|
If Me.aktivesProfil.finalerIndex <> "" And Not oUnexpectedError And myNIArrayValues.Length >= 1 And myNIArrayValues(0) <> "" Then
|
|
Me._windreamNI.SetfinalIndex(dokument, Me.aktivesProfil.finalerIndex, True)
|
|
End If
|
|
'###### Spezifisches SQL nach jeder Datei!
|
|
If Me.aktivesProfil.SQL_Anweisung IsNot Nothing And Not oUnexpectedError And myNIArrayValues.Length >= 1 And myNIArrayValues(0) <> "" Then
|
|
_Logger.Debug("Me.aktivesProfil.SQL_Anweisung: " & Me.aktivesProfil.SQL_Anweisung)
|
|
If Me.aktivesProfil.SQL_Anweisung.StartsWith("EXECUTEVB") Then
|
|
_Logger.Debug("Execute VB-Script after indexing......")
|
|
Dim oVBScriptRAW As String = Me.aktivesProfil.SQL_Anweisung.Replace("EXECUTEVB ", "")
|
|
oVBScriptRAW = oVBScriptRAW.Replace("EXECUTEVB", "")
|
|
oVBScriptRAW = oVBScriptRAW.Replace("EXECUTEVB ", "")
|
|
|
|
_Logger.Debug("oVBScriptRAW [" & oVBScriptRAW & "]")
|
|
' Regulären Ausdruck zum Auslesen der windream-Indexe definieren
|
|
Dim preg As String = "\[%{1}[a-zA-Z0-9\!\$\&\/\(\)\=\?\,\.\-\;\:_öÖüÜäÄ\#\'\+\*\~\{\}\@\€\<\>\ ]+]{1}"
|
|
|
|
' SQL-String für aktuelles Profil laden
|
|
Dim oVBScriptCommand As String = oVBScriptRAW
|
|
' einen Regulären Ausdruck laden
|
|
Dim regulärerAusdruck As System.Text.RegularExpressions.Regex = New System.Text.RegularExpressions.Regex(preg)
|
|
' die Vorkommen im SQL-String auslesen
|
|
Dim elemente As System.Text.RegularExpressions.MatchCollection = regulärerAusdruck.Matches(oVBScriptCommand)
|
|
' alle Vorkommen der windream-Indexe im SQL-String durchlaufen
|
|
For Each element As System.Text.RegularExpressions.Match In elemente
|
|
|
|
' die Zeichen [% und ] entfernen (liefert den wirklichen windream-Index)
|
|
Dim elementOhneSonderzeichen As String = element.Value.Replace("[%", "")
|
|
elementOhneSonderzeichen = elementOhneSonderzeichen.Replace("]", "")
|
|
If elementOhneSonderzeichen.StartsWith("ddv") Then
|
|
Dim ddvariable As String = ""
|
|
elementOhneSonderzeichen = elementOhneSonderzeichen.Replace("ddv", "")
|
|
Dim filepath = My.Settings.vWLaufwerk & ":" & dokument.aPath
|
|
Select Case elementOhneSonderzeichen
|
|
Case "FULLFILENAME"
|
|
ddvariable = filepath
|
|
Case "FOLDERNAME"
|
|
ddvariable = Path.GetDirectoryName(filepath)
|
|
End Select
|
|
|
|
oVBScriptCommand = oVBScriptCommand.Replace(element.Value, ddvariable)
|
|
Else
|
|
Try
|
|
' den Wert des deskriptiven Indexes für das aktuelle Dokument auslesen
|
|
IndexwertAusWindream = dokument.GetVariableValue(elementOhneSonderzeichen)
|
|
Catch ex As Exception
|
|
' wenn ein Fehler aufgetreten ist, muss das Flag gesetzt werden
|
|
oUnexpectedError = True
|
|
|
|
_Logger.Warn("Fehler in Get Indexwert aus windream bei Spezifischem SQL: " & ex.Message.ToString)
|
|
End Try
|
|
oVBScriptCommand = oVBScriptCommand.Replace(element.Value, IndexwertAusWindream.ToString)
|
|
End If
|
|
|
|
|
|
'database.ExecuteonOracleDb(Sqlcommand, aktivesProfil.DataSource, aktivesProfil.UserId, aktivesProfil.Password)
|
|
'MsgBox(Me.aktivesDokument.aPath & vbNewLine & vbNewLine & Me.aktivesDokument.aName)
|
|
Next
|
|
|
|
_Logger.Debug("VBSCRIPTCOMMAND after replacing variables [" & oVBScriptCommand & "]")
|
|
|
|
Try
|
|
|
|
Dim oArrParams As String()
|
|
oArrParams = oVBScriptCommand.Split("#")
|
|
_Logger.Debug("VBSCRIPTCOMMAND - Path [" & oArrParams(0).ToString & "]")
|
|
Dim oVBScriptFile = oArrParams(0).ToString
|
|
_Logger.Debug("oVBScriptFile - Path [" & oVBScriptFile & "]")
|
|
If File.Exists(oVBScriptFile) Then
|
|
Dim start As New ProcessStartInfo
|
|
Dim task As New Process
|
|
|
|
Dim oParamArg As String = ""
|
|
|
|
Dim i As Integer = 0
|
|
Dim oStepArg As String
|
|
For Each oParam As String In oArrParams
|
|
If i <> 0 Then
|
|
If i = 1 Then
|
|
oStepArg = $"{oParam.Replace("'", """")}"
|
|
Else
|
|
oStepArg = $" {oParam.Replace("'", """")}"
|
|
End If
|
|
oParamArg += oStepArg
|
|
End If
|
|
|
|
i += 1
|
|
Next
|
|
|
|
|
|
Dim args As String = String.Format("""{0}"" ""{1}""", oArrParams(0).ToString, oParamArg)
|
|
start.FileName = "C:\WINDOWS\system32\cscript.exe"
|
|
start.Arguments = args
|
|
_Logger.Debug("Argument(s) For myProcess [" & args & "]")
|
|
start.UseShellExecute = False
|
|
' start.RedirectStandardOutput = True
|
|
' start.RedirectStandardError = False
|
|
task.StartInfo = start
|
|
task.StartInfo.CreateNoWindow = True
|
|
Dim _sw As Stopwatch = New Stopwatch()
|
|
_sw.Start()
|
|
task.Start()
|
|
' so = task.StandardOutput
|
|
Do While task.HasExited = False
|
|
If _sw.Elapsed.TotalSeconds = 30 Then
|
|
_Logger.Debug("Still waiting (30 sec) for ending of Task")
|
|
ElseIf _sw.Elapsed.TotalMinutes = 1 Then
|
|
_Logger.Debug("Still waiting (60 sec) for ending of Task - Exit now", True)
|
|
Exit Do
|
|
End If
|
|
Loop
|
|
_Logger.Debug("...process has exited: ")
|
|
_sw.Stop()
|
|
|
|
'Dim myProcess As New Process
|
|
'Dim oProcessID
|
|
'myProcess.StartInfo.FileName = oVBScriptFile
|
|
|
|
'Dim startInfo As New ProcessStartInfo(oVBScriptFile)
|
|
'startInfo.CreateNoWindow = True
|
|
'myProcess.StartInfo.Arguments = oParamArg
|
|
'_Logger.Debug("Argument For myProcess [" & myProcess.StartInfo.Arguments & "]")
|
|
'myProcess.Start()
|
|
'oProcessID = myProcess.Id
|
|
'_Logger.Debug("Script executed!")
|
|
'If IsNumeric(oProcessID) Then
|
|
' _Logger.Debug("got an PROCID: " & oProcessID.ToString)
|
|
|
|
|
|
' Dim oMyProcess1 As Process
|
|
' oMyProcess1 = Process.GetProcessById(oProcessID)
|
|
|
|
' Dim _sw1 As Stopwatch = New Stopwatch()
|
|
' _sw1.Start()
|
|
|
|
' Do While oMyProcess1.HasExited = False
|
|
|
|
' If _sw1.Elapsed.TotalSeconds = 30 Then
|
|
' _Logger.Debug("Still waiting (30 sec) for ending of process-id: " & oProcessID.ToString)
|
|
' ElseIf _sw1.Elapsed.TotalMinutes = 1 Then
|
|
' _Logger.Debug("Still waiting (60 sec) for ending of process-id: " & oProcessID.ToString & " - Exit now", True)
|
|
' Exit Do
|
|
' End If
|
|
' Loop
|
|
' _Logger.Debug("...process has exited: ")
|
|
' _sw1.Stop()
|
|
'End If
|
|
|
|
|
|
|
|
Else
|
|
_Logger.Warn($"VBSCRIPT not File.exists: {oVBScriptFile}")
|
|
End If
|
|
|
|
|
|
|
|
'task.WaitForExit()
|
|
' MsgBox(so.ReadToEnd)
|
|
'myProcess.StartInfo.Arguments = oParamArg
|
|
'_Logger.Debug("Argument For myProcess [" & myProcess.StartInfo.Arguments & "]")
|
|
'myProcess.Start()
|
|
|
|
''Process.Start(startInfo)
|
|
|
|
'oProcessID = myProcess.Id
|
|
'_Logger.Debug("Script executed!")
|
|
|
|
'If IsNumeric(oProcessID) Then
|
|
' _Logger.Debug("got an PROCID: " & oProcessID.ToString)
|
|
|
|
|
|
' Dim oMyProcess As Process
|
|
' oMyProcess = Process.GetProcessById(oProcessID)
|
|
|
|
' Dim _sw As Stopwatch = New Stopwatch()
|
|
' _sw.Start()
|
|
|
|
' Do While oMyProcess.HasExited = False
|
|
|
|
' If _sw.Elapsed.TotalSeconds = 30 Then
|
|
' _Logger.Debug("Still waiting (30 sec) for ending of process-id: " & oProcessID.ToString)
|
|
' ElseIf _sw.Elapsed.TotalMinutes = 1 Then
|
|
' _Logger.Debug("Still waiting (60 sec) for ending of process-id: " & oProcessID.ToString & " - Exit now", True)
|
|
' Exit Do
|
|
' End If
|
|
' Loop
|
|
' _Logger.Debug("...process has exited: ")
|
|
' _sw.Stop()
|
|
'End If
|
|
|
|
Catch ex As Exception
|
|
_Logger.Warn("Unexpected error in running script: " & ex.Message)
|
|
End Try
|
|
|
|
Else
|
|
If Me.aktivesProfil.SQL_Anweisung <> "" Then
|
|
_Logger.Debug("Spezifisches SQL nach erfolgreichem Indexieren der Datei wird durchgeführt")
|
|
_Logger.Debug("SQL: " & Me.aktivesProfil.SQL_Anweisung)
|
|
' Regulären Ausdruck zum Auslesen der windream-Indexe definieren
|
|
Dim preg As String = "\[%{1}[a-zA-Z0-9\!\$\&\/\(\)\=\?\,\.\-\;\:_öÖüÜäÄ\#\'\+\*\~\{\}\@\€\<\>\ ]+]{1}"
|
|
|
|
' SQL-String für aktuelles Profil laden
|
|
Dim Sqlcommand As String = aktivesProfil.SQL_Anweisung
|
|
' einen Regulären Ausdruck laden
|
|
Dim regulärerAusdruck As System.Text.RegularExpressions.Regex = New System.Text.RegularExpressions.Regex(preg)
|
|
' die Vorkommen im SQL-String auslesen
|
|
Dim elemente As System.Text.RegularExpressions.MatchCollection = regulärerAusdruck.Matches(Sqlcommand)
|
|
' alle Vorkommen der windream-Indexe im SQL-String durchlaufen
|
|
For Each element As System.Text.RegularExpressions.Match In elemente
|
|
|
|
' die Zeichen [% und ] entfernen (liefert den wirklichen windream-Index)
|
|
Dim elementOhneSonderzeichen As String = element.Value.Replace("[%", "")
|
|
elementOhneSonderzeichen = elementOhneSonderzeichen.Replace("]", "")
|
|
Try
|
|
' den Wert des deskriptiven Indexes für das aktuelle Dokument auslesen
|
|
IndexwertAusWindream = dokument.GetVariableValue(elementOhneSonderzeichen)
|
|
Catch ex As Exception
|
|
' wenn ein Fehler aufgetreten ist, muss das Flag gesetzt werden
|
|
oUnexpectedError = True
|
|
_Logger.Warn("Indexname/elementOhneSonderzeichen aus Regex: " & elementOhneSonderzeichen)
|
|
_Logger.Warn("Indexwert aus Windream: " & IndexwertAusWindream.ToString)
|
|
_Logger.Warn("Fehler in Get Indexwert aus windream bei Spezifischem SQL: ")
|
|
_Logger.Warn(ex.Message)
|
|
End Try
|
|
Sqlcommand = Sqlcommand.Replace(element.Value, IndexwertAusWindream.ToString)
|
|
'Wenn Speicherort gespeichert werden soll wird Platzhalter ersetzt!
|
|
Sqlcommand = Sqlcommand.Replace("vSpeicherort", "'" & My.Settings.vWLaufwerk & ":" & Me.aktivesDokument.aPath & "'")
|
|
_Logger.Debug("SQL-Command: " & Sqlcommand)
|
|
'database.ExecuteonOracleDb(Sqlcommand, aktivesProfil.DataSource, aktivesProfil.UserId, aktivesProfil.Password)
|
|
'MsgBox(Me.aktivesDokument.aPath & vbNewLine & vbNewLine & Me.aktivesDokument.aName)
|
|
Next
|
|
If Me.aktivesProfil.DbArt = "Oracle" Then
|
|
If database.ExecuteonOracleDb(aktivesProfil.Profilname, Sqlcommand, aktivesProfil.DataSource, aktivesProfil.InitialCatalog, aktivesProfil.UserId, aktivesProfil.Password) = 1 Then
|
|
_Logger.Debug("ORACLE SQL-Command erfolgreich ausgeführt!")
|
|
End If
|
|
ElseIf Me.aktivesProfil.DbArt = "MS-SQL" Then
|
|
_Logger.Debug("MSSQL-Command will be executed now.....")
|
|
_Logger.Debug("Sqlcommand: " & Sqlcommand)
|
|
If database.ExecuteonMSSQL(aktivesProfil.Profilname, Sqlcommand, aktivesProfil.DataSource, aktivesProfil.UserId, aktivesProfil.Password, aktivesProfil.InitialCatalog) = 1 Then
|
|
_Logger.Debug("MSSQL-Command erfolgreich ausgeführt!")
|
|
End If
|
|
End If
|
|
End If
|
|
End If
|
|
Else
|
|
If IsNothing(myNIArrayValues) Then
|
|
_Logger.Debug("NI_Values is nothing!")
|
|
Else
|
|
_Logger.Debug("NI_Values.Length: " & myNIArrayValues.Length)
|
|
_Logger.Debug("NI_Values(0): " & myNIArrayValues(0))
|
|
End If
|
|
|
|
End If
|
|
Else
|
|
If IsNothing(myNIArrayValues) Then
|
|
_Logger.Debug("oNiArrayValues is nothing!")
|
|
Else
|
|
|
|
End If
|
|
|
|
End If
|
|
If aktivesProfil.Ni_Art.ToLower = "xml" Then
|
|
If oUnexpectedError = False Then
|
|
Dim valid As Boolean
|
|
Try
|
|
'Überprüfen ob Validierung auf False steht?
|
|
valid = dokument.GetVariableValue(aktivesProfil.IndexValidation) '_windreamNI.GetValueforIndex(dokument.aPath & dokument.aName, aktivesProfil.vSQL_Anweisung)
|
|
Catch ex As Exception
|
|
_Logger.Warn("Schwerwiegender Fehler bei Auslesen des Validierungswertes:" & ex.Message)
|
|
End Try
|
|
If valid = True Then
|
|
'nur Zurücksetzten wenn Wert zuweisbar
|
|
If (myNIArrayValues.Length = 1 And myNIArrayValues(0) = "") = False Then
|
|
_Logger.Debug("Dokument sollte validiert werden - Nun erfolgreich indexiert - also Index '" & aktivesProfil.IndexValidation & "' zurücksetzen!")
|
|
'Den Flag Validation wieder auf False setzen
|
|
File_SetBooleanIndex(False, aktivesDokument, aktivesProfil.IndexValidation)
|
|
'Ebenso die Fehlermeldung
|
|
SetErrorMeldung("", aktivesDokument, My.Settings.ERROR_INDEX)
|
|
End If
|
|
End If
|
|
|
|
'###### Nachindexierung über XML - Löschen des Dokumentes ######
|
|
If unvollstaendig = False Then
|
|
'##### Löschen der xml-Indexdatei
|
|
If myNIArrayValues.Length = 1 And myNIArrayValues(0) = "" Then
|
|
_Logger.Debug("XML-Wert ist Leer und somit nicht auswertbar - Dok für Validierung markieren")
|
|
'Den Flag Validation auf True setzen
|
|
File_SetBooleanIndex(True, aktivesDokument, aktivesProfil.IndexValidation)
|
|
'Fehlermarkierung setzen
|
|
|
|
_Logger.Debug("Indexierung der xffres-Datei '" & System.IO.Path.GetFileNameWithoutExtension(dokument.aName) & "." & aktivesProfil.xmlEnd & "' - für die Validierung kennzeichnen")
|
|
'Nun die xffres Datei indexieren
|
|
Dim _dokxml As WINDREAMLib.WMObject
|
|
_dokxml = Nothing
|
|
_dokxml = _windreamNI.oWMSession.GetWMObjectByPath(ConstWMEntityDocument, _pathxmlfile.Substring(2))
|
|
'2. Indexierungs-Datei
|
|
File_SetBooleanIndex(True, _dokxml, aktivesProfil.IndexValidation)
|
|
'Fehlermarkierung setzen
|
|
|
|
Else
|
|
'Löschen der xml-Indexdatei
|
|
If CBool(Me.aktivesProfil.delete) = True Then
|
|
_Logger.Debug("Indexdatei soll gelöscht werden")
|
|
'Datei über die nachindexiert wurde soll gelöscht werden
|
|
System.IO.File.Delete(_pathxmlfile)
|
|
_Logger.Debug("XML-Index-Datei: " & _pathxmlfile)
|
|
_Logger.Debug("XML Index Datei ERFOLGREICH gelöscht!")
|
|
End If
|
|
End If
|
|
End If
|
|
|
|
Else
|
|
'MsgBox("Fehler" & vbNewLine & _MRKONVERT_FEHLER & vbNewLine & aktivesProfil.vSQL_Anweisung)
|
|
Select Case _MRKONVERT_FEHLER
|
|
Case 1
|
|
Dim valid As Boolean = dokument.GetVariableValue(aktivesProfil.IndexValidation) '_windreamNI.GetValueforIndex(dokument.aPath & dokument.aName, aktivesProfil.vSQL_Anweisung)
|
|
If valid = True Then
|
|
_Logger.Info("Konvertierungsfehler bei Nachindexierung xml - Index '" & aktivesProfil.IndexValidation & "' für Validierung bereits auf True gesetzt")
|
|
Else
|
|
_Logger.Info("Konvertierungsfehler bei Nachindexierung xml - Setze Index '" & aktivesProfil.IndexValidation & "' für Validierung!")
|
|
'Konvertierungsfehler
|
|
File_SetBooleanIndex(True, aktivesDokument, aktivesProfil.IndexValidation)
|
|
End If
|
|
'Fehlermarkierung setzen
|
|
|
|
|
|
If aktivesProfil.xmlEnd = "xffres" Then
|
|
'Den Flag Validation für das aktuelle Dok auf True setzen
|
|
Dim _dokxml As WINDREAMLib.WMObject
|
|
_dokxml = Nothing
|
|
_dokxml = _windreamNI.oWMSession.GetWMObjectByPath(ConstWMEntityDocument, _pathxmlfile.Substring(2)) 'WINDREAMLib.WMEntity.WMEntityDocument
|
|
'2. Indexierungs-Datei
|
|
File_SetBooleanIndex(True, _dokxml, aktivesProfil.IndexValidation)
|
|
'Fehlermarkierung setzen
|
|
|
|
End If
|
|
End Select
|
|
End If
|
|
End If
|
|
End If
|
|
Else
|
|
If unvollstaendig = False And Me.aktivesProfil.Ni_Art.ToLower <> "fulltext" Then
|
|
_Logger.Warn("Fehler bei IndexiereVerarbeiteDokument für die Datei: " & dokument.aName.ToString)
|
|
_Logger.Warn("Fehlermeldung: " & fehlermsg)
|
|
If My.Settings.vNIMailsenden = True Then
|
|
email.Send_EMail("Fehler in IndexiereVerarbeiteDokument für die Datei: " & dokument.aName.ToString & "<br> Profilname: " & aktivesProfil.Profilname & " <br> Fehlermeldung: " & fehlermsg)
|
|
End If
|
|
End If
|
|
End If
|
|
'#### Ende Nachindexierung
|
|
'#################################################################################################################################################
|
|
Dim swMessage As String
|
|
swMessage = swRegIndex.Done
|
|
If swMessage <> "" Then
|
|
Stopwatch1 += vbNewLine & $"{swMessage}"
|
|
End If
|
|
|
|
'Move and Rename ausführen
|
|
If LICENSE_MoveRename = True And Not oUnexpectedError And unvollstaendig = False Then
|
|
Dim swMoveandrename As New ClassStopwatch("MoveandRename")
|
|
oUnexpectedError = FNMoveRename(dokument)
|
|
|
|
Dim msg1 = swMoveandrename.Done
|
|
If msg1 <> "" Then
|
|
Stopwatch1 += vbNewLine & $"{msg1}"
|
|
|
|
End If
|
|
Else
|
|
If LICENSE_MoveRename = True And oUnexpectedError = True Or unvollstaendig = True Then
|
|
_Logger.Info("MoveRename Yes but error_in_Indexierung = True Or unvollstaendig = True")
|
|
_Logger.Debug("MoveRename Yes but error_in_Indexierung = True Or unvollstaendig = True")
|
|
End If
|
|
|
|
|
|
End If
|
|
|
|
'Indexierung gegen die Indizes des Ordners
|
|
If oUnexpectedError = False And (aktivesProfil.Ni_Art.ToLower = "nurordnerrechte" Or aktivesProfil.Ni_Art.ToLower = "nur-ordner-indizes" Or (aktivesProfil.GetOrdnerTypes = True And aktivesProfil.OriginalOrdnerType <> "")) Then
|
|
_Logger.Debug("Nachbearbeitung Indexe nach Ordner-Typen ist aktiviert")
|
|
'Die Ordernindizes-Namen laden
|
|
Dim Oindexe = _windream.GetIndicesByFoldertype(Me.aktivesProfil.OrdnerType, False)
|
|
'Die Objekttypindizes laden
|
|
Dim Dindexe = _windream.GetIndicesByObjecttype(Me.aktivesProfil.DokumenttypString, False, "NI")
|
|
If IsArray(Oindexe) And IsArray(Dindexe) Then
|
|
OrdnerIndizes_zuweisen(dokument)
|
|
Else
|
|
_Logger.Debug("IsArray(Oindexe) = False")
|
|
End If
|
|
End If
|
|
|
|
|
|
'Move2Folder ausführen
|
|
If aktivesProfil.move2Folder <> "" Then
|
|
If My.Settings.vLogErrorsonly = False Then _Logger.Info("Move2Folder is activated...")
|
|
|
|
If oUnexpectedError = False And unvollstaendig = False Then
|
|
Dim sw As New ClassStopwatch("Move2Folder")
|
|
_Logger.Debug("Move 2 Folder ist aktiviert")
|
|
Dim err As Boolean = Move2Folder(Me.aktivesDokument.aName, My.Settings.MRWD_Laufwerk & ":" & dokument.aPath)
|
|
Dim msg = sw.Done
|
|
If msg <> "" Then
|
|
Stopwatch1 += vbNewLine & $"{msg}"
|
|
|
|
End If
|
|
Else
|
|
If My.Settings.vLogErrorsonly = False Then _Logger.Info("... no Move2Folder as something went wrong!")
|
|
End If
|
|
End If
|
|
|
|
'CREATEFOLDER
|
|
|
|
|
|
If oUnexpectedError = False And aktivesProfil.CrFolderIndex <> "" And unvollstaendig = False Then
|
|
Dim docpath As String
|
|
If moved_Folder = "" Then
|
|
docpath = My.Settings.MRWD_Laufwerk & ":" & dokument.aPath
|
|
Else
|
|
docpath = moved_Folder
|
|
End If
|
|
Dim err As Boolean = CrFolderForIndex(docpath)
|
|
If err = True Then
|
|
If My.Settings.vNIMailsenden = True Then
|
|
email.Send_EMail("Fehler bei Create Folder for Index bei der Datei: '" & dokument.aName.ToString & "'<br> Fehler: Die Datei wurde indexiert aber der Ordner konnte nicht erstellt werden!")
|
|
End If
|
|
End If
|
|
Else
|
|
aktivesProfil.CrFolder_Created_Folder = ""
|
|
CURRENT_MOVE_FILEPATH = ""
|
|
End If
|
|
'Nachbearbeitung AD ausführen
|
|
If oUnexpectedError = False And aktivesProfil.NachbearbeitungAD = True And unvollstaendig = False Then
|
|
_Logger.Debug("Nachbearbeitung AD ist aktiviert")
|
|
Dim sw As New ClassStopwatch("AD-Rework")
|
|
Nachbearbeitung_AD(dokument)
|
|
Dim msg = sw.Done
|
|
If msg <> "" Then
|
|
Stopwatch1 += vbNewLine & $"{msg}"
|
|
End If
|
|
Else
|
|
If aktivesProfil.NachbearbeitungAD = True Then
|
|
_Logger.Info($"Nachbearbeitung AD ist aktiviert aber Unexpected Error ist{oUnexpectedError.ToString}")
|
|
End If
|
|
End If
|
|
oUnexpectedError = False
|
|
Try
|
|
If aktivesDokument.aLocked Then
|
|
_Logger.Debug("Document still is locked...now unlocking")
|
|
aktivesDokument.unlock()
|
|
End If
|
|
Catch ex As Exception
|
|
_Logger.Warn("Unexpected error in final Unlocking: " & ex.Message)
|
|
End Try
|
|
swMessage = swWorkDocument_All.Done
|
|
If swMessage <> "" Then
|
|
Stopwatch1 += vbNewLine & $"{swMessage}"
|
|
End If
|
|
_Logger.Debug("## Result Stopwatch: ##" & vbNewLine & Stopwatch1)
|
|
Catch ex As Exception
|
|
_Logger.Error(ex)
|
|
_Logger.Warn($"oResultNachindexierung so far: {oResultNachindexierung.ToString}")
|
|
If My.Settings.vNIMailsenden = True Then
|
|
email.Send_EMail("Schwerwiegender Fehler bei IndexiereVerarbeiteDokument - <br> Profil: " & aktivesProfil.Profilname & "<br> Datei: " & dokument.aName.ToString & "<br> Fehler: " & ex.Message)
|
|
End If
|
|
End Try
|
|
End Sub
|
|
Private Function FolderForIndex(oDynamicFolder As String, myWMDocument As WMObject) As String
|
|
Try
|
|
'######
|
|
Dim oPRegex As String = "\[%{1}[a-zA-Z0-9\!\$\&\/\(\)\=\?\,\.\-\;\:_öÖüÜäÄ\#\'\+\*\~\{\}\@\€\<\>\ ]+]{1}"
|
|
' einen Regulären Ausdruck laden
|
|
Dim regularExpression As Regex = New Regex(oPRegex)
|
|
' die Vorkommen im Folder-String auslesen
|
|
Dim oElements As MatchCollection = regularExpression.Matches(oDynamicFolder)
|
|
'####
|
|
' alle Vorkommen innerhalb des Ordnerstrings durchlaufen
|
|
For Each oMatchElement As Match In oElements
|
|
_Logger.Debug("Elementname in oDynamicFolder: '" & oMatchElement.ToString & "'")
|
|
Select Case oMatchElement.Value.Substring(2, 1)
|
|
'Manueller Indexwert
|
|
Case "m"
|
|
Dim oWMIndexname = oMatchElement.Value.Substring(3, oMatchElement.Value.Length - 4)
|
|
_Logger.Debug("getting metavalue from '" & oWMIndexname & "'...")
|
|
Dim oWMIndexValue As String = myWMDocument.GetVariableValue(oWMIndexname)
|
|
_Logger.Debug("oWMIndexValue: '" & oWMIndexValue & "'", False)
|
|
If Not oWMIndexValue = String.Empty Then
|
|
If IsDate(oWMIndexValue) Then
|
|
oWMIndexValue = CDate(oWMIndexValue).ToString("yyyyMMdd")
|
|
End If
|
|
' oWMIndexValue = oWMIndexValue.Replace("\", "")
|
|
oDynamicFolder = oDynamicFolder.Replace(oMatchElement.ToString, oWMIndexValue)
|
|
_Logger.Debug(" FolderPattern: '" & oDynamicFolder & "'", False)
|
|
Else
|
|
_Logger.Warn($"[{myWMDocument.aName}] - Attention in 'FolderForIndex': the Index-Value [{oWMIndexname}] is empty! No Dynamic folder will be used!", True)
|
|
Return ""
|
|
End If
|
|
Case "v"
|
|
Dim oFolderTemp As String
|
|
Dim oMonth As String = My.Computer.Clock.LocalTime.Month
|
|
If oMonth.Length = 1 Then
|
|
oMonth = "0" & oMonth
|
|
End If
|
|
Dim oDay As String = My.Computer.Clock.LocalTime.Day
|
|
If oDay.Length = 1 Then
|
|
oDay = "0" & oDay
|
|
End If
|
|
Dim oType = oMatchElement.Value.Substring(3, oMatchElement.Value.Length - 4)
|
|
If oType.StartsWith("_") Then
|
|
oType = oType.Replace("_", "")
|
|
End If
|
|
Select Case oType
|
|
Case "YYYY/MM/DD"
|
|
oFolderTemp = My.Computer.Clock.LocalTime.Year & "\" & oMonth & "\" & oDay
|
|
Case "YYYY/MM"
|
|
oFolderTemp = My.Computer.Clock.LocalTime.Year & "\" & oMonth
|
|
Case "YYYY"
|
|
oFolderTemp = My.Computer.Clock.LocalTime.Year
|
|
Case "YYYY-MM"
|
|
oFolderTemp = My.Computer.Clock.LocalTime.Year & "-" & oMonth
|
|
Case "MM"
|
|
oFolderTemp = oMonth
|
|
Case "DD"
|
|
oFolderTemp = oDay
|
|
End Select
|
|
oDynamicFolder = oDynamicFolder.Replace(oMatchElement.ToString, oFolderTemp)
|
|
_Logger.Debug("FolderPatter after V-element: '" & oDynamicFolder & "'", False)
|
|
Case Else
|
|
_Logger.Info("Attention in DynamicFolderConvention an invalid element has been found: Elementname: " & oMatchElement.Value.ToUpper)
|
|
Return ""
|
|
|
|
End Select
|
|
Next
|
|
_Logger.Debug("Checking oDynamicFolder on illegal PathChars: " & oDynamicFolder, False)
|
|
Dim invalidPathChars() As Char = Path.GetInvalidPathChars()
|
|
Dim oPathSplit As String() = oDynamicFolder.Split("\")
|
|
For Each oFolder In oPathSplit
|
|
If oFolder = "" Then
|
|
Continue For
|
|
End If
|
|
Dim rgPattern = My.Settings.REGEX_INVALID_PATH '----Invalid Characters
|
|
Dim objRegEx As New Regex(rgPattern)
|
|
Dim oClearFolder = objRegEx.Replace(oFolder, "")
|
|
If oFolder <> oClearFolder Then
|
|
oDynamicFolder = oDynamicFolder.Replace(oFolder, oClearFolder)
|
|
End If
|
|
|
|
Next
|
|
|
|
If Directory.Exists(oDynamicFolder) = False Then
|
|
Try
|
|
Directory.CreateDirectory(oDynamicFolder)
|
|
_Logger.Debug("Folder '" & oDynamicFolder & "' has been created...", False)
|
|
Catch ex As Exception
|
|
_Logger.Error(ex)
|
|
Return ""
|
|
End Try
|
|
|
|
End If
|
|
|
|
|
|
Return oDynamicFolder
|
|
Catch ex As Exception
|
|
_Logger.Error(ex)
|
|
Return ""
|
|
End Try
|
|
End Function
|
|
Private Function FNMoveRename(myWMDocument As WMObject) As Boolean
|
|
Try
|
|
Dim oReturnString As String
|
|
Dim oActWMPath As String = "\\windream\objects" & myWMDocument.aPath
|
|
Dim oExtension As String = System.IO.Path.GetExtension(oActWMPath)
|
|
TBTC_MOVE_RENAMETableAdapter.Connection.ConnectionString = My.Settings.DDECMConString
|
|
Me.TBTC_MOVE_RENAMETableAdapter.Fill(Me.MyDataset.TBTC_MOVE_RENAME, aktivesProfil.Profilname)
|
|
Dim oVERSIONOFF As Boolean
|
|
If MyDataset.TBTC_MOVE_RENAME.Rows.Count = 1 Then
|
|
_Logger.Debug($"Found a Move and Rename Definition: [{MyDataset.TBTC_MOVE_RENAME.Rows(0).Item("FOLDER_FOR_INDEX")}]")
|
|
oVERSIONOFF = MyDataset.TBTC_MOVE_RENAME.Rows(0).Item("VERSION_OFF")
|
|
Dim oTargetpath As String
|
|
'Regulären Ausdruck zum Auslesen der Indexe definieren
|
|
Dim oPRegex As String = "\[%{1}[a-zA-Z0-9ß\!\$\&\/\(\)\=\?\,\.\-\;\:_öÖüÜäÄ\#\'\+\*\~\{\}\@\€\<\>\ ]+]{1}"
|
|
If MyDataset.TBTC_MOVE_RENAME.Rows(0).Item("FOLDER_FOR_INDEX") <> "" Then
|
|
oTargetpath = MyDataset.TBTC_MOVE_RENAME.Rows(0).Item("FOLDER_FOR_INDEX")
|
|
oTargetpath = FolderForIndex(oTargetpath, myWMDocument)
|
|
Else
|
|
oTargetpath = Path.GetDirectoryName(oActWMPath)
|
|
End If
|
|
If oTargetpath = "" Then
|
|
Return True
|
|
End If
|
|
|
|
'schonmal den gesamten Pfad laden
|
|
Dim oNamenkonvention As String = oTargetpath & "\" & MyDataset.TBTC_MOVE_RENAME.Rows(0).Item("NAMECONVENTION") & oExtension
|
|
' einen Regulären Ausdruck laden
|
|
Dim oRegularExpression As System.Text.RegularExpressions.Regex = New System.Text.RegularExpressions.Regex(oPRegex)
|
|
' die Vorkommen im SQL-String auslesen
|
|
Dim oMatchelements As System.Text.RegularExpressions.MatchCollection = oRegularExpression.Matches(oNamenkonvention)
|
|
'####
|
|
If oMatchelements.Count = 0 Then
|
|
_Logger.Info("No RegularExpression Fileds in Nameconvention!", False)
|
|
End If
|
|
' alle Vorkommen innerhalbd er Namenkonvention durchlaufen
|
|
For Each oElement As System.Text.RegularExpressions.Match In oMatchelements
|
|
Select Case oElement.Value.Substring(2, 1)
|
|
'Manueller Indexwert
|
|
Case "m"
|
|
_Logger.Debug("Index will be checked...")
|
|
Dim oWMIndexname = oElement.Value.Substring(3, oElement.Value.Length - 4)
|
|
Dim oWMIndexValue As String = myWMDocument.GetVariableValue(oWMIndexname)
|
|
If oWMIndexValue <> String.Empty Then
|
|
|
|
Dim oClearedContent As String = String.Join("", oWMIndexValue.Split(Path.GetInvalidFileNameChars()))
|
|
If oClearedContent <> oWMIndexValue Then
|
|
_Logger.Info($"Cleaned the WMContent with GetInvalidFileNameChars from [{oWMIndexValue}] to [{oClearedContent}]")
|
|
oWMIndexValue = oClearedContent
|
|
End If
|
|
Dim firstVectorValue = oWMIndexValue.Split("~").First()
|
|
oNamenkonvention = oNamenkonvention.Replace(oElement.Value, firstVectorValue)
|
|
Else
|
|
_Logger.Info($"Attention: the indexvalue of index {oWMIndexname} is empty!")
|
|
Return True
|
|
End If
|
|
|
|
Case "v"
|
|
Dim oDatetemp As String
|
|
Dim oMonth As String = My.Computer.Clock.LocalTime.Month
|
|
If oMonth.Length = 1 Then
|
|
oMonth = "0" & oMonth
|
|
End If
|
|
Dim oDay As String = My.Computer.Clock.LocalTime.Day
|
|
If oDay.Length = 1 Then
|
|
oDay = "0" & oDay
|
|
End If
|
|
Dim oType = oElement.Value '.ToUpper.Replace("[v%", "")
|
|
oType = oType.Replace("[%v_", "")
|
|
oType = oType.Replace("[%v", "")
|
|
oType = oType.Replace("]", "")
|
|
Select Case oType
|
|
Case "YY_MM_DD"
|
|
oDatetemp = My.Computer.Clock.LocalTime.Year.ToString.Substring(2) & "_" & oMonth & "_" & oDay
|
|
Case "YYYY_MM_DD"
|
|
oDatetemp = My.Computer.Clock.LocalTime.Year & "_" & oMonth & "_" & oDay
|
|
Case "DD_MM_YY"
|
|
oDatetemp = oDay & "_" & oMonth & "_" & My.Computer.Clock.LocalTime.Year.ToString.Substring(2)
|
|
Case "DD_MM_YYYY"
|
|
oDatetemp = oDay & "_" & oMonth & "_" & My.Computer.Clock.LocalTime.Year
|
|
Case "YYMMDD"
|
|
oDatetemp = My.Computer.Clock.LocalTime.Year.ToString.Substring(2) & oMonth & oDay
|
|
Case "YYYYMMDD"
|
|
oDatetemp = My.Computer.Clock.LocalTime.Year & oMonth & oDay
|
|
Case "DDMMYY"
|
|
oDatetemp = oDay & oMonth & My.Computer.Clock.LocalTime.Year.ToString.Substring(2)
|
|
Case "DDMMYYYY"
|
|
oDatetemp = oDay & oMonth & My.Computer.Clock.LocalTime.Year
|
|
Case "YYYY"
|
|
oDatetemp = My.Computer.Clock.LocalTime.Year
|
|
Case "MM"
|
|
oDatetemp = oMonth
|
|
Case "DD"
|
|
oDatetemp = oDay
|
|
Case "DDMMYYYY"
|
|
oDatetemp = oDay & oMonth & My.Computer.Clock.LocalTime.Year
|
|
Case "OFilename"
|
|
oNamenkonvention = oNamenkonvention.Replace(oElement.Value, System.IO.Path.GetFileNameWithoutExtension(oActWMPath))
|
|
'Case "Username".ToUpper
|
|
' oNamenkonvention = oNamenkonvention.Replace(oElement.Value, Environment.UserName)
|
|
'Case "Usercode".ToUpper
|
|
' oNamenkonvention = oNamenkonvention.Replace(oElement.Value, USER_SHORT_NAME)
|
|
Case ""
|
|
End Select
|
|
If oDatetemp <> "" Then
|
|
oNamenkonvention = oNamenkonvention.Replace(oElement.Value, oDatetemp)
|
|
End If
|
|
|
|
Case "[%Version]".ToUpper
|
|
Try
|
|
Dim oNewFileName As String
|
|
Dim oVersion As Integer = 1
|
|
Dim oStammname As String = oNamenkonvention.Replace(oElement.Value, "")
|
|
Dim oNeuerName As String = oNamenkonvention.Replace(oElement.Value, "")
|
|
oStammname = oNeuerName.Replace("~", "")
|
|
oNeuerName = oNeuerName.Replace("~", "")
|
|
'Dim MoveFilename As String = DATEINAME.Replace(element.Value, "")
|
|
'Überprüfen ob File existiert
|
|
If File.Exists(oNeuerName & oExtension) = False Then
|
|
oNewFileName = oNeuerName
|
|
oNamenkonvention = oNewFileName
|
|
Else
|
|
Do While File.Exists(oNeuerName & oExtension)
|
|
oVersion = oVersion + 1
|
|
oNeuerName = oStammname & "~" & oVersion
|
|
oNewFileName = oNeuerName
|
|
Loop
|
|
oNamenkonvention = oNewFileName
|
|
End If
|
|
Catch ex As Exception
|
|
_Logger.Warn("Unexpected error in Umbenennnen der Datei - Fehler: " & vbNewLine & ex.Message)
|
|
Return True
|
|
End Try
|
|
Case Else
|
|
_Logger.Info("Attention: in nameconvention file an invalid elemt has been found - Elementname: " & oElement.Value.ToUpper)
|
|
Return True
|
|
End Select
|
|
Next
|
|
oReturnString = oNamenkonvention
|
|
Else
|
|
If MyDataset.TBTC_MOVE_RENAME.Rows.Count = 0 Then
|
|
Return False
|
|
Else
|
|
oReturnString = oActWMPath
|
|
End If
|
|
|
|
|
|
|
|
|
|
End If
|
|
Dim oOldFilename = oReturnString.Substring(oReturnString.LastIndexOf("\") + 1)
|
|
_Logger.Debug($"oOldFilename: {oOldFilename}")
|
|
Dim oCleanFileName As String = String.Join("", oOldFilename.Split(Path.GetInvalidFileNameChars()))
|
|
If oCleanFileName <> oOldFilename Then
|
|
_Logger.Info($"Cleaned the filename with GetInvalidFileNameChars from [{oOldFilename}] to [{oCleanFileName}]")
|
|
oReturnString = oReturnString.Replace(oOldFilename, oCleanFileName)
|
|
End If
|
|
Dim oOriginalPath = oReturnString.Substring(1, oReturnString.LastIndexOf("\"))
|
|
|
|
Dim oCleanPathName As String = String.Join("", oOriginalPath.Split(Path.GetInvalidPathChars()))
|
|
If oCleanPathName <> oOriginalPath Then
|
|
_Logger.Info($"Cleaned the path with GetInvalidPathChars from [{oOriginalPath}] to [{oCleanPathName}]")
|
|
oReturnString = oReturnString.Replace(oOriginalPath, oCleanPathName)
|
|
End If
|
|
|
|
Dim oPathFile As String = oReturnString.Replace(oExtension, "")
|
|
Dim oNewPathFilename = oPathFile + oExtension
|
|
'Dim MoveFilename As String = DATEINAME.Replace(element.Value, "")
|
|
If oVERSIONOFF = True Then
|
|
|
|
If File.Exists(oNewPathFilename) Then
|
|
Try
|
|
_Logger.Info("MOVERENAME-VERSIONING is OFF - Deleting existing file...")
|
|
File.Delete(oNewPathFilename)
|
|
Catch ex As Exception
|
|
_Logger.Warn($"Could Not delete file As VERSIONOFF Is True [{ex.Message}]")
|
|
End Try
|
|
End If
|
|
Else
|
|
'Überprüfen ob File existiert
|
|
Dim oNewVersion As Integer = 1
|
|
Do While File.Exists(oNewPathFilename)
|
|
|
|
oNewVersion = oNewVersion + 1
|
|
oNewPathFilename = oPathFile & "~" & oNewVersion & oExtension
|
|
|
|
Loop
|
|
If oNewPathFilename <> oReturnString Then
|
|
oReturnString = oNewPathFilename
|
|
End If
|
|
End If
|
|
|
|
|
|
If _windreamNI.NEW_MOVE_FILE(oReturnString, oActWMPath, "MO_RE") = True Then
|
|
Return False
|
|
Else
|
|
Return True
|
|
End If
|
|
|
|
Catch ex As Exception
|
|
_Logger.Error(ex)
|
|
Return True
|
|
End Try
|
|
End Function
|
|
Private Function OrdnerIndizes_zuweisen(ByVal _dokument As WMObject)
|
|
Try
|
|
'Die Ordernindizes-Namen laden
|
|
Dim Ordner_Indexe = _windream.GetIndicesByFoldertype(Me.aktivesProfil.OrdnerType, False)
|
|
'Die Objekttypindizes laden
|
|
Dim Objecttype_Indexe = _windream.GetIndicesByObjecttype(Me.aktivesProfil.DokumenttypString, False, "NI")
|
|
' Den Ordner als Objekt deklarieren
|
|
Dim WMFolder As WINDREAMLib.WMObject
|
|
|
|
If Me.aktivesProfil.OrdnerType_Ebene <> "Parent" Then
|
|
Dim _path = ""
|
|
Dim _folderArray As String() = _dokument.aPath.Split("\")
|
|
Dim index = (_folderArray.Length - 1) + CObj(Me.aktivesProfil.OrdnerType_Ebene) - 1
|
|
Dim i As Integer = 0
|
|
For Each _Ordner As String In _folderArray
|
|
_path = _path & "\" & _Ordner
|
|
If i = index Then
|
|
Exit For
|
|
End If
|
|
i += 1
|
|
Next
|
|
|
|
_Logger.Debug("der Folder '" & _path & "' soll die Quelle für die Indexwerte sein")
|
|
Try
|
|
WMFolder = _windreamNI.oWMSession.GetWMObjectByPath(WINDREAMLib.WMEntity.WMEntityFolder, _path)
|
|
Catch ex As Exception
|
|
_Logger.Warn("## Fehler in OrdnerIndizes_zuweisen WMFolder 'Not Parent' " & ex.Message)
|
|
Return False
|
|
End Try
|
|
Else
|
|
_Logger.Debug("der Parentfolder ist die Quelle für die Indexwerte")
|
|
Try
|
|
WMFolder = _dokument.aParentWMObject
|
|
Catch ex As Exception
|
|
_Logger.Warn("## Fehler in OrdnerIndizes_zuweisen WMFolder 'Parent': " & ex.Message)
|
|
Return False
|
|
End Try
|
|
|
|
End If
|
|
|
|
If IsArray(Ordner_Indexe) And IsArray(Objecttype_Indexe) And (Not WMFolder Is Nothing) Then
|
|
|
|
'Jeden Ordnertyp-Index durchlaufen
|
|
For Each OrdnerIdxName As String In Ordner_Indexe
|
|
'Dann jeden Objekttyp-Index durchlaufen
|
|
For Each DateiIdxName As String In Objecttype_Indexe
|
|
'Wenn der Name identisch ist
|
|
If DateiIdxName.ToLower = OrdnerIdxName.ToLower Then
|
|
_Logger.Debug("Indexname Ordnertyp: '" & OrdnerIdxName & "' wird als Quelle genutzt")
|
|
'MsgBox("Indexname Datei Ordner gleich!")
|
|
'Den Indexwert aus dem Ordner auslesen
|
|
Dim fold_idxValue = WMFolder.GetVariableValue(OrdnerIdxName)
|
|
If IsNothing(fold_idxValue) = False Then
|
|
If fold_idxValue <> "" Then
|
|
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) = OrdnerIdxName
|
|
arrValue(0) = fold_idxValue
|
|
Me._windreamNI.RunIndexing(aktivesDokument, arrIndex, arrValue, MyDataset, aktivesProfil.Profilname, aktivesProfil.DokumenttypString)
|
|
Else
|
|
_Logger.Warn("Indexwert ist leer")
|
|
End If
|
|
End If
|
|
|
|
End If
|
|
Next
|
|
Next
|
|
End If
|
|
Catch ex As Exception
|
|
_Logger.Error(ex)
|
|
Return False
|
|
End Try
|
|
Return True
|
|
End Function
|
|
Private Function Nachbearbeitung_AD(ByVal _dokument As WMObject)
|
|
Dim _erfolgreich As Boolean = True
|
|
Try
|
|
Dim DT As DataTable = _sqlite.Return_Datatable("select * from TBNI_NACHBEARBEITUNG_AD WHERE AKTIV = 1 AND NI_PROFILNAME = '" & aktivesProfil.Profilname & "'", True)
|
|
If DT.Rows.Count = 1 Then
|
|
Dim profilID As Integer
|
|
profilID = DT.Rows(0).Item("GUID")
|
|
'For Each DTrow As DataRow In DT.Rows
|
|
' profilID = DTrow.Item("GUID")
|
|
'Next
|
|
Dim DTR As DataTable = _sqlite.Return_Datatable("select * from TBNI_NB_STEP_AD WHERE PROFIL_ID = " & profilID, False)
|
|
If DTR.Rows.Count > 0 Then
|
|
Dim i As Integer = 0
|
|
Dim folgeRegel As Boolean
|
|
For Each row As DataRow In DTR.Rows
|
|
Try
|
|
If i > 0 Then
|
|
folgeRegel = True
|
|
End If
|
|
If _windreamRechte.FileFolder_DeleteAndOrSetRight(_dokument.aPath, profilID, row.Item("GUID"), folgeRegel, CURRENT_MOVE_FILEPATH, False) = False Then 'aktivesProfil.CrFolder_Created_Folder
|
|
_Logger.Warn("## Fehler in _windreamRechte.FileFolder_DeleteAndOrSetRight - Abbruch")
|
|
_erfolgreich = False
|
|
Exit For
|
|
End If
|
|
i += 1
|
|
Catch ex As Exception
|
|
|
|
End Try
|
|
|
|
Next
|
|
End If
|
|
Else
|
|
_Logger.Warn("## Achtung in Nachbearbeitung_AD: Der Select für Profil lieferte KEINE oder MEHR ALS EINE Zeile zurück!")
|
|
End If
|
|
Return _erfolgreich
|
|
Catch ex As Exception
|
|
_Logger.Error(ex)
|
|
Return False
|
|
End Try
|
|
End Function
|
|
Private Function Volltext_indexer(_dokument As WMObject, fulltext As String)
|
|
Try
|
|
' MsgBox(fulltext)
|
|
Dim namedoc = _dokument.aName
|
|
fulltext = fulltext.Replace(vbCrLf, "")
|
|
Dim ign_whitespace As Boolean = False
|
|
Dim IndexArray As String()
|
|
Dim ErgebnisArray As String()
|
|
Dim counter As Integer = 0
|
|
Dim Erfolgreich As Boolean = True
|
|
_Logger.Debug("working Volltext_indexer...")
|
|
' alle Regex-Links des Profils durchlaufen
|
|
For Each Fulltext_Indexierung As ClassNIVerknüpfung In Me.aktivesProfil.Verknüpfungen.Links
|
|
If Erfolgreich = True Then
|
|
'Ignore Whitespace
|
|
If Fulltext_Indexierung.SelectAnweisung.Contains("ignore=''") Then
|
|
fulltext = fulltext.Replace(" ", "")
|
|
End If
|
|
ErgebnisArray = Nothing
|
|
'#####
|
|
If Fulltext_Indexierung.Spalte.StartsWith("%") And Fulltext_Indexierung.Spalte.EndsWith("%") Then
|
|
Dim manwert As String
|
|
'Ein manueller Wert in der Verknüpfung
|
|
_Logger.Debug(">> Volltext_indexer: Indexierung mit einem manuellem Wert")
|
|
manwert = Fulltext_Indexierung.Spalte.Replace("%", "")
|
|
_Logger.Debug(">> Manueller Wert: " & manwert)
|
|
'Indexieren der Datei
|
|
' die Arraygrößen anpassen
|
|
ReDim Preserve IndexArray(0)
|
|
' den angegebenen Index eintragen
|
|
IndexArray(0) = Fulltext_Indexierung.Index
|
|
Dim arrValue() As String = Nothing
|
|
arrValue = Nothing
|
|
ReDim Preserve arrValue(0)
|
|
arrValue(0) = manwert
|
|
Erfolgreich = Me._windreamNI.RunIndexing(_dokument, IndexArray, arrValue, MyDataset, aktivesProfil.Profilname, aktivesProfil.DokumenttypString)
|
|
Else
|
|
Dim pos_von, pos_bis As Integer
|
|
'##
|
|
If Fulltext_Indexierung.SelectAnweisung.Contains(";") Then
|
|
Dim _posArray As String() = Fulltext_Indexierung.SelectAnweisung.Split(";")
|
|
Try
|
|
pos_von = _posArray(0)
|
|
Catch ex As Exception
|
|
pos_von = 0
|
|
End Try
|
|
Try
|
|
pos_bis = _posArray(1)
|
|
Catch ex As Exception
|
|
pos_bis = 0
|
|
End Try
|
|
Try
|
|
ign_whitespace = CBool(_posArray(2))
|
|
Catch ex As Exception
|
|
ign_whitespace = False
|
|
End Try
|
|
_Logger.Debug("Volltext-Indexierung - Regex: '" & Fulltext_Indexierung.Spalte & "' - Alle Vorkommen")
|
|
Else
|
|
pos_von = 10000
|
|
pos_bis = 0
|
|
_Logger.Debug("Volltext-Indexierung - Regex: '" & Fulltext_Indexierung.Spalte & "' - Pos.-Von: '" & pos_von & "' - Pos.-Bis: '" & pos_bis)
|
|
End If
|
|
|
|
|
|
ErgebnisArray = _fulltext.GetValuesFromFulltext(_dokument.aName, fulltext, Fulltext_Indexierung.Spalte, pos_von, pos_bis, ign_whitespace)
|
|
If Not ErgebnisArray Is Nothing Then
|
|
'im Array mehrfachvorkommen ausschliessen
|
|
ErgebnisArray = ErgebnisArray.Distinct.ToArray
|
|
Array.Sort(ErgebnisArray)
|
|
'Werte zwischenspeichern
|
|
MyDataset.Tables("TBVEKTOR_ARRAY").Clear()
|
|
For Each Value As String In ErgebnisArray
|
|
Dim RowNew As DataRow
|
|
RowNew = MyDataset.Tables("TBVEKTOR_ARRAY").NewRow()
|
|
'filling the row with values. Item property is used to set the field value.
|
|
RowNew.Item("IndexName") = Fulltext_Indexierung.Index
|
|
RowNew.Item("Value") = Value
|
|
MyDataset.Tables("TBVEKTOR_ARRAY").Rows.Add(RowNew)
|
|
Next
|
|
|
|
'Den Indexierungsvorgang für diesen RegEx ausführen
|
|
' die Arraygrößen anpassen
|
|
ReDim Preserve IndexArray(0)
|
|
' den angegebenen Index eintragen
|
|
IndexArray(0) = Fulltext_Indexierung.Index
|
|
'Indexieren
|
|
If ErgebnisArray.Length = 1 Then
|
|
Dim arrValue() As String = Nothing
|
|
arrValue = Nothing
|
|
ReDim Preserve arrValue(0)
|
|
arrValue(0) = ErgebnisArray(0)
|
|
Erfolgreich = Me._windreamNI.RunIndexing(_dokument, IndexArray, arrValue, MyDataset, aktivesProfil.Profilname, aktivesProfil.DokumenttypString)
|
|
If Erfolgreich = False Then
|
|
Erfolgreich = True
|
|
Else
|
|
Erfolgreich = False
|
|
End If
|
|
|
|
'Erfolgreich = Me._windreamNI.RunIndexing_Vektor(_dokument, IndexArray, arrValue)
|
|
Else
|
|
Erfolgreich = Me._windreamNI.RunIndexing_Vektor(_dokument, IndexArray, ErgebnisArray)
|
|
End If
|
|
|
|
|
|
Else
|
|
|
|
End If
|
|
End If
|
|
|
|
'counter = 0
|
|
'' Regulären Ausdruck zum Auslesen der windream-Indexe definieren
|
|
'Dim preg As String = Fulltext_Indexierung.Spalte '"\[%{1}[a-zA-Z0-9\!\$\&\/\(\)\=\?\,\.\-\;\:_öÖüÜäÄ\#\'\+\*\~\{\}\@\€\<\>\ ]+]{1}"
|
|
'' einen Regulären Ausdruck laden
|
|
'Dim regulärerAusdruck As System.Text.RegularExpressions.Regex = New System.Text.RegularExpressions.Regex(preg)
|
|
'' die Vorkommen im SQL-String auslesen
|
|
'Dim elemente As System.Text.RegularExpressions.MatchCollection = regulärerAusdruck.Matches(fulltext)
|
|
'' alle Vorkommen der windream-Indexe im SQL-String durchlaufen
|
|
'For Each element As System.Text.RegularExpressions.Match In elemente
|
|
|
|
' ReDim Preserve ErgebnisArray(counter)
|
|
' 'filling the row with values. Item property is used to set the field value.
|
|
' ErgebnisArray(counter) = element.ToString
|
|
' Dim RowNew As DataRow
|
|
' RowNew = MyDataset.Tables("TBVEKTOR_ARRAY").NewRow()
|
|
' 'filling the row with values. Item property is used to set the field value.
|
|
' RowNew.Item("IndexName") = Fulltext_Indexierung.Index
|
|
|
|
' RowNew.Item("Value") = element.ToString
|
|
|
|
' MyDataset.Tables("TBVEKTOR_ARRAY").Rows.Add(RowNew)
|
|
' 'ArrayCounter hochsetzen
|
|
' counter += 1
|
|
|
|
|
|
' 'Für jeden Wert im Array werden nun Duplikate gezählt
|
|
'Next ' zum nächsten Vorkommen
|
|
|
|
'ErgebnisArray = ErgebnisArray.Distinct.ToArray
|
|
'Array.Sort(ErgebnisArray)
|
|
|
|
'MyDataset.Tables("TBVEKTOR_ARRAY").Clear()
|
|
|
|
|
|
'For Each Value As String In ErgebnisArray
|
|
' Dim RowNew As DataRow
|
|
' RowNew = MyDataset.Tables("TBVEKTOR_ARRAY").NewRow()
|
|
' 'filling the row with values. Item property is used to set the field value.
|
|
' RowNew.Item("IndexName") = Fulltext_Indexierung.Index
|
|
' RowNew.Item("Value") = Value
|
|
' MyDataset.Tables("TBVEKTOR_ARRAY").Rows.Add(RowNew)
|
|
'Next
|
|
|
|
''Den Indexierungsvorgang für diesen RegEx ausführen
|
|
'' die Arraygrößen anpassen
|
|
'ReDim Preserve IndexArray(0)
|
|
'' den angegebenen Index eintragen
|
|
'IndexArray(0) = Fulltext_Indexierung.Index
|
|
''den, übergebenen/gefundenen IndexWert, eintragen
|
|
|
|
'Erfolgreich = Me._windreamNI.RunIndexing_Vektor(_dokument, IndexArray, ErgebnisArray)
|
|
Else
|
|
_Logger.Warn("## Fehler in Volltext_indexer- Erfolgreich = False")
|
|
End If
|
|
Next
|
|
|
|
Return Erfolgreich
|
|
Catch ex As Exception
|
|
_Logger.Error(ex)
|
|
|
|
Return True
|
|
End Try
|
|
End Function
|
|
'Ab Hier Error prüfen
|
|
Sub File_SetBooleanIndex(ByVal _value As Boolean, ByVal _dok As WINDREAMLib.WMObject, ByVal _Indexname As String)
|
|
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
|
|
_Logger.Debug("Validation 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
|
|
Me._windreamNI.RunIndexing(_dok, arrIndex, arrValue, MyDataset, aktivesProfil.Profilname, aktivesProfil.DokumenttypString)
|
|
If aktivesProfil.IndexFehler <> "" Then
|
|
_Logger.Debug("History-error will be set to true!")
|
|
arrIndex = Nothing
|
|
arrValue = Nothing
|
|
ReDim Preserve arrIndex(0)
|
|
ReDim Preserve arrValue(0)
|
|
arrIndex(0) = aktivesProfil.IndexFehler
|
|
arrValue(0) = "True"
|
|
Me._windreamNI.RunIndexing(_dok, arrIndex, arrValue, MyDataset, aktivesProfil.Profilname, aktivesProfil.DokumenttypString)
|
|
End If
|
|
Else
|
|
'Validation muß nicht angepasst werden
|
|
_Logger.Debug("Validation Index already set to '" & _value & "'.")
|
|
End If
|
|
End If
|
|
Catch ex As Exception
|
|
_Logger.Warn("Error in File_SetBooleanIndex")
|
|
_Logger.Error(ex)
|
|
End Try
|
|
|
|
|
|
End Sub
|
|
Sub SetErrorMeldung(ByVal _error As String, ByVal _dok As WINDREAMLib.WMObject, ByVal _Indexname As String)
|
|
Try
|
|
If Not _Indexname = String.Empty Then
|
|
'Überprüfen ob Validierung bereits gesetzt wurde?
|
|
Dim WMVALUE = Nothing
|
|
WMVALUE = _dok.GetVariableValue(_Indexname)
|
|
Dim _continue As Boolean = False
|
|
|
|
If WMVALUE Is Nothing Then
|
|
_continue = True
|
|
Else
|
|
If WMVALUE.ToString <> _error Then
|
|
_continue = True
|
|
Else
|
|
'Validation muß nicht angepasst werden
|
|
_Logger.Debug("value already equal errormessage")
|
|
_continue = False
|
|
End If
|
|
End If
|
|
If _continue = True Then
|
|
_Logger.Debug("indexvalue <> errormessage '" & _error & "'")
|
|
'Error muß angepasst werden
|
|
Dim arrIndex() As String
|
|
Dim arrValue() As String
|
|
'Nun die Datei indexieren
|
|
ReDim arrIndex(0)
|
|
ReDim arrValue(0)
|
|
arrIndex(0) = _Indexname
|
|
arrValue(0) = _error
|
|
Me._windreamNI.RunIndexing(_dok, arrIndex, arrValue, MyDataset, aktivesProfil.Profilname, aktivesProfil.DokumenttypString)
|
|
End If
|
|
End If
|
|
Catch ex As Exception
|
|
|
|
If ex.Message.Contains("Variable: Error not found") Then
|
|
_Logger.Warn("Error in SetErrorMeldung - Der 'Error'-Index existiert nicht!")
|
|
_Logger.Warn($"ERROR MESSAGE to set: [{_error}]")
|
|
Else
|
|
_Logger.Error(ex)
|
|
|
|
End If
|
|
If My.Settings.vNIMailsenden = True Then
|
|
email.Send_EMail("Schwerwiegender Fehler bei SetErrorMeldung - <br> Profil: " & aktivesProfil.Profilname & "<br> Datei: " & dokument.aName.ToString & "<br> Fehler: " & ex.Message)
|
|
End If
|
|
End Try
|
|
End Sub
|
|
Private 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
|
|
Private Shared Function REGEX_REPLACE(_STRING As String, ByVal oWMFile As WMObject)
|
|
Try
|
|
' Regulären Ausdruck zum Auslesen der windream-Indexe definieren
|
|
Dim preg As String = "\[%{1}[a-zA-Z0-9\!\$\&\/\(\)\=\?\,\.\-\;\:_öÖüÜäÄ\#\'\+\*\~\{\}\@\€\<\>\ ]+]{1}"
|
|
' einen Regulären Ausdruck laden
|
|
Dim regulärerAusdruck As System.Text.RegularExpressions.Regex = New System.Text.RegularExpressions.Regex(preg)
|
|
' die Vorkommen im SQL-String auslesen
|
|
Dim reg_elemente As System.Text.RegularExpressions.MatchCollection = regulärerAusdruck.Matches(_STRING)
|
|
Dim i As Integer = 0
|
|
' alle Vorkommen der windream-Indexe im SQL-String durchlaufen
|
|
For Each reg_element As System.Text.RegularExpressions.Match In reg_elemente
|
|
' die Zeichen [% und ] entfernen (liefert den wirklichen windream-Index)
|
|
Dim reg_element_Ohne_SZ As String = reg_element.Value.Replace("[%", "")
|
|
reg_element_Ohne_SZ = reg_element_Ohne_SZ.Replace("]", "")
|
|
_Logger.Debug($"{oWMFile.aName} # Indexwert aus Index/Variable [" & reg_element_Ohne_SZ & "] auslesen....")
|
|
Dim wdIndexwert
|
|
|
|
' den Wert des Indexes für das aktuelle Dokument auslesen
|
|
wdIndexwert = oWMFile.GetVariableValue(reg_element_Ohne_SZ)
|
|
If wdIndexwert Is Nothing = False Then
|
|
If Not wdIndexwert.GetType.ToString.Contains("System.Object") Then
|
|
_Logger.Debug($"{oWMFile.aName} # Namenkonvention (" & i & ") " & _STRING)
|
|
wdIndexwert = wdIndexwert.ToString.TrimEnd
|
|
wdIndexwert = wdIndexwert.ToString.TrimStart
|
|
_Logger.Debug($"{oWMFile.aName} # Ausgelesener Indexwert = '" & wdIndexwert & "'")
|
|
|
|
_STRING = _STRING.Replace(reg_element.Value, wdIndexwert.ToString)
|
|
i += 1
|
|
Else
|
|
_Logger.Warn("Achtung gelesener Wert ist ein Vektorfeld - keine Umbenennung möglich ")
|
|
Return Nothing
|
|
End If
|
|
End If
|
|
|
|
|
|
|
|
Next
|
|
Return _STRING
|
|
Catch ex As Exception
|
|
_Logger.Error(ex)
|
|
|
|
Return Nothing
|
|
End Try
|
|
End Function
|
|
Private Function Check_DeskIndexValue(ByVal _indexvalue As String, ByVal _sql As String, ByVal oWMFile As WMObject)
|
|
Try
|
|
Dim sql As String = _sql
|
|
Dim _vsql
|
|
Dim _replace As String
|
|
'LIKE UPPER('%[%String 01]')'
|
|
If IsNumeric(_indexvalue) Then
|
|
_replace = _indexvalue
|
|
' Else
|
|
' _replace = "'" & _indexvalue & "'"
|
|
End If
|
|
_vsql = REGEX_REPLACE(sql, oWMFile)
|
|
If _vsql = Nothing Then
|
|
Return 0
|
|
End If
|
|
_Logger.Debug("Check_DeskIndexValue - Select Scalar: " & _vsql)
|
|
|
|
If aktivesProfil.DbArt = "Oracle" Then
|
|
Dim ergebnis As Integer = database.CheckIndex_oracle(_vsql, aktivesProfil.DataSource, aktivesProfil.InitialCatalog, aktivesProfil.UserId, aktivesProfil.Password)
|
|
If ergebnis = 1 Then
|
|
Return 1
|
|
Else
|
|
If ergebnis > 1 Then
|
|
Return 2
|
|
Else
|
|
Return 0
|
|
End If
|
|
End If
|
|
ElseIf aktivesProfil.DbArt = "MS-SQL" Then
|
|
Dim ergebnis As Integer = database.CheckIndex_MSSSQL(aktivesProfil.Profilname, _vsql, aktivesProfil.DataSource, aktivesProfil.UserId, aktivesProfil.Password, aktivesProfil.InitialCatalog)
|
|
If ergebnis = 1 Then
|
|
Return 1
|
|
Else
|
|
If ergebnis > 1 Then
|
|
Return 2
|
|
Else
|
|
Return 0
|
|
End If
|
|
End If
|
|
ElseIf aktivesProfil.DbArt = "ODBC" Then
|
|
Dim ergebnis As Integer = database.CheckIndex_ODBC(aktivesProfil.Profilname, _vsql, aktivesProfil.DataSource, aktivesProfil.UserId, aktivesProfil.Password)
|
|
If ergebnis = 1 Then
|
|
Return 1
|
|
Else
|
|
If ergebnis > 1 Then
|
|
Return 2
|
|
Else
|
|
Return 0
|
|
End If
|
|
End If
|
|
End If
|
|
Catch ex As Exception
|
|
_Logger.Error(ex)
|
|
|
|
End Try
|
|
End Function
|
|
Private Sub chkbEmail_CheckedChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles chkbEmail.CheckedChanged
|
|
Try
|
|
If chkbEmail.Checked = True Then
|
|
Me.gbEmail.Enabled = True
|
|
Else
|
|
Me.gbEmail.Enabled = False
|
|
End If
|
|
Catch ex As Exception
|
|
MsgBox(ex.Message, MsgBoxStyle.Critical, "Fehler bei chkbEmail_CheckedChanged:")
|
|
End Try
|
|
|
|
End Sub
|
|
Private Sub btntestmail_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btntestmail.Click
|
|
Try
|
|
My.Settings.Save()
|
|
If Me.txtBetreff.Text = "" Or Me.txtEmpfaenger.Text = "" Or Me.txtMail_from.Text = "" Or Me.txtUser.Text = "" Or Me.txtPasswort.Text = "" Or
|
|
Me.txtSMTP.Text = "" Then
|
|
MsgBox("Bitte achten sie darauf alle Konfigurationsfelder für die Fehler-Email auszufüllen!", MsgBoxStyle.Critical, "Fehlende Eingaben:")
|
|
Else
|
|
email.Send_EMail("TEST-EMAIL", True) ' Gesendet am: " & My.Computer.Clock.LocalTime.ToShortDateString & "-" & My.Computer.Clock.LocalTime.ToLongTimeString
|
|
End If
|
|
Catch ex As Exception
|
|
MsgBox(ex.Message, MsgBoxStyle.Critical, "Fehler bei btntestmail.Click:")
|
|
End Try
|
|
|
|
End Sub
|
|
|
|
Private Sub tcMain_SelectedIndexChanged(ByVal sender As Object, ByVal e As System.EventArgs) Handles tcmain.SelectedIndexChanged
|
|
Select Case tcmain.SelectedIndex
|
|
Case 0
|
|
My.Settings.vemailPort = Me.txtPort.Text
|
|
My.Settings.Save()
|
|
Case 1
|
|
Me.txtPort.Text = My.Settings.vemailPort
|
|
End Select
|
|
End Sub
|
|
Sub Start_NachindexierungThreads()
|
|
If My.Settings.vLogErrorsonly = False Then
|
|
_MyLogger.Debug = True
|
|
Else
|
|
_MyLogger.Debug = False
|
|
End If
|
|
|
|
If bwProfil.IsBusy Or bwsearch.IsBusy Then
|
|
_Logger.Info("Achtung die Threads laufen noch!")
|
|
_Logger.Info("bwProfil: " & bwProfil.IsBusy)
|
|
_Logger.Info("bwsearch: " & bwsearch.IsBusy)
|
|
_Logger.Info("Restart der Nachindexierung wird eingeleitet - Form wird geschlossen")
|
|
NI_Restart = True
|
|
Me.Close()
|
|
Exit Sub
|
|
End If
|
|
Try
|
|
Dim directory As New IO.DirectoryInfo(_MyLogger.LogDirectory)
|
|
|
|
For Each file As IO.FileInfo In directory.GetFiles
|
|
If (Now - file.CreationTime).Days > 29 Then
|
|
file.Delete()
|
|
Else
|
|
Exit For
|
|
End If
|
|
|
|
Next
|
|
Catch ex As Exception
|
|
|
|
End Try
|
|
'Die NI wird ganz normal gestartet
|
|
Me.btnStartStop.Text = "Nachindexierung stoppen"
|
|
Me.numIntervall.Enabled = False
|
|
Me.pnlInfos.Visible = True
|
|
If Me.numIntervall.Value = 0 Then
|
|
Me.numIntervall.Value = 5
|
|
End If
|
|
manually_cancel = False
|
|
Me.timRun.Interval = Me.numIntervall.Value * 60 * 1000
|
|
Me.timRun.Start()
|
|
'Variable für den Fall Programmabbruch und Neustart!
|
|
bwProfil = New BackgroundWorker
|
|
bwsearch = New BackgroundWorker
|
|
bwDatei = New BackgroundWorker
|
|
AddHandler bwProfil.DoWork, AddressOf bwProfil_DoWork
|
|
AddHandler bwProfil.RunWorkerCompleted, AddressOf bwProfil_RunWorkerCompleted
|
|
AddHandler bwProfil.ProgressChanged, AddressOf bwProfil_ProgressChanged
|
|
bwProfil.WorkerReportsProgress = True
|
|
bwProfil.WorkerSupportsCancellation = True
|
|
|
|
AddHandler bwsearch.DoWork, AddressOf bwsearch_Documents
|
|
AddHandler bwsearch.RunWorkerCompleted, AddressOf bwsearch_RunWorkerCompleted
|
|
bwsearch.WorkerSupportsCancellation = True
|
|
|
|
|
|
AddHandler bwDatei.DoWork, AddressOf bwDatei_DoWork
|
|
AddHandler bwDatei.RunWorkerCompleted, AddressOf bwDatei_RunWorkerCompleted
|
|
AddHandler bwDatei.ProgressChanged, AddressOf bwDatei_ProgressChanged
|
|
bwDatei.WorkerReportsProgress = True
|
|
bwDatei.WorkerSupportsCancellation = True
|
|
|
|
My.Settings.NI_RUNNING = True
|
|
My.Settings.Save()
|
|
' den Indexierungsvorgang direkt (zum ersten Mal) durchführen
|
|
Me.Profile_Durchlaufen()
|
|
|
|
End Sub
|
|
Sub Abbruch_NI(cancel_Reason As String, Abbruch As Boolean, keeprunning As Boolean)
|
|
Try
|
|
_Logger.Info("Nachindexierung wird abgebrochen - Reason: " & cancel_Reason)
|
|
Try
|
|
If Me.bwProfil.IsBusy Or cancel_Reason = "Abbruch nach Timeout Suche" Then
|
|
_Logger.Warn("Thread Profil wird abgebrochen....")
|
|
Me.bwProfil.CancelAsync()
|
|
|
|
End If
|
|
Catch ex As Exception
|
|
_Logger.Error(ex)
|
|
|
|
End Try
|
|
Try
|
|
If Me.bwsearch.IsBusy Or cancel_Reason = "Abbruch nach Timeout Suche" Then
|
|
_Logger.Warn("Thread Search wird abgebrochen....")
|
|
Me.bwsearch.CancelAsync()
|
|
End If
|
|
Catch ex As Exception
|
|
_Logger.Warn("Fehler beim Abbrechen des Threads bwsearch: " & ex.Message)
|
|
End Try
|
|
Try
|
|
If Me.bwDatei.IsBusy Or cancel_Reason = "Abbruch nach Timeout Suche" Then
|
|
_Logger.Warn("Thread Datei wird abgebrochen....")
|
|
Me.bwDatei.CancelAsync()
|
|
End If
|
|
Catch ex As Exception
|
|
_Logger.Warn("Fehler beim Abbrechen des Threads bwDatei: " & ex.Message)
|
|
End Try
|
|
|
|
manually_cancel = True
|
|
_Logger.Info("Threads gestoppt - " & Now)
|
|
|
|
If keeprunning = False Then
|
|
_Logger.Debug("keeprunning = False - Zurücksetzen")
|
|
'Abbruch der Nachindexierung
|
|
My.Settings.NI_RUNNING = False
|
|
Me.numIntervall.Enabled = True
|
|
Me.pnlInfos.Visible = False
|
|
Me.tslblStatus.Visible = False
|
|
My.Settings.Save()
|
|
End If
|
|
If keeprunning = True And cancel_Reason = "Abbruch nach Timeout Suche" Then
|
|
_Logger.Warn("windream-Dienste werden neugestartet!!")
|
|
'Neustart windream-Client
|
|
Try
|
|
Process.Start("schtasks", "/run /I /TN " & My.Settings.VFS_RESTART)
|
|
_Logger.Warn("VFS-Dienst neugestartet")
|
|
System.Threading.Thread.Sleep(7000)
|
|
Process.Start("schtasks", "/run /I /TN " & My.Settings.WMCC_RESTART)
|
|
_Logger.Warn("wmcc neugestartet")
|
|
|
|
_Logger.Warn("Restart NI wird eingeleitet - Form wird geschlossen")
|
|
NI_Restart = True
|
|
Me.Close()
|
|
Catch ex As Exception
|
|
_Logger.Warn("Fehler bei Neustart der windream Dienste: " & ex.Message)
|
|
End Try
|
|
End If
|
|
Catch ex As Exception
|
|
_Logger.Error(ex)
|
|
|
|
End Try
|
|
End Sub
|
|
Private Sub btnStartStop_Click_1(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnStartStop.Click
|
|
If TimerRefresh.Enabled = False Then
|
|
TimerRefresh.Start()
|
|
Else
|
|
TimerRefresh.Stop()
|
|
End If
|
|
manuallyRun = True
|
|
If Me.btnStartStop.Text = "Nachindexierung stoppen" Then
|
|
If timRun.Enabled = True Then
|
|
timRun.Stop()
|
|
End If
|
|
Abbruch_NI("Manueller Abbruch 1 durch User " & Environment.UserName, False, False)
|
|
Me.btnStartStop.Text = "Nachindexierung starten"
|
|
Else
|
|
Me.btnStartStop.Text = "Nachindexierung stoppen"
|
|
Start_NachindexierungThreads()
|
|
End If
|
|
manuallyRun = False
|
|
End Sub
|
|
|
|
Private Sub TextBoxen_LostFocus(ByVal sender As Object, ByVal e As System.EventArgs) Handles _
|
|
_
|
|
txtUser.LostFocus, txtSMTP.LostFocus, txtPasswort.LostFocus,
|
|
txtMail_from.LostFocus, txtEmpfaenger.LostFocus, txtBody.LostFocus, txtBetreff.LostFocus
|
|
CType(sender, TextBox).BackColor = Color.White
|
|
My.Settings.Save()
|
|
End Sub
|
|
Private Sub TextBoxen_gotFocus(ByVal sender As Object, ByVal e As System.EventArgs) Handles _
|
|
_
|
|
txtUser.GotFocus, txtSMTP.GotFocus, txtPasswort.GotFocus,
|
|
txtMail_from.GotFocus, txtEmpfaenger.GotFocus, txtBody.GotFocus, txtBetreff.GotFocus
|
|
CType(sender, TextBox).BackColor = Color.Lime
|
|
End Sub
|
|
|
|
'Private Function MRGetValuesFromFile(ByVal vDatei As String, ByVal vIndexnameDA As String, ByVal vIndexnameKD As String, ByVal vindexnameDesIndex As String)
|
|
' Try
|
|
' _MRKundenKennzeichen = ""
|
|
' _MRDokumentart = _windreamNI.GetValueforIndex(vDatei.Substring(2), vIndexnameDA)
|
|
' If vIndexnameKD.ToString <> "" Then
|
|
' If vIndexnameKD = "xxxx" Then
|
|
' _MRKundenKennzeichen = "xxxx"
|
|
' Else
|
|
' _MRKundenKennzeichen = _windreamNI.GetValueforIndex(vDatei.Substring(2), vIndexnameKD)
|
|
' End If
|
|
|
|
' End If
|
|
|
|
' _Logger.Warn("Move and Rename gestartet")
|
|
' _Logger.Warn("Datum/Zeit: " & Now.Date & " " & Now.Date.ToShortTimeString)
|
|
' _Logger.Warn("Datei: " & vDatei)
|
|
' If vIndexnameKD.ToString <> "" Then
|
|
' _Logger.Warn("Indexname Kundenidentifikator: " & vIndexnameKD)
|
|
' Else
|
|
' _Logger.Info("Ein allgemeines Dokument für Move and Rename")
|
|
' End If
|
|
' If _MRKundenKennzeichen.ToString <> "" Then
|
|
' If _MRKundenKennzeichen = "xxxx" Then
|
|
' _Logger.Info("Es handelt sich um ein Allgemeines Kundenkennzeichen")
|
|
' Else
|
|
' _Logger.Info("Ausgelesener Kundenidentifikator: " & _MRKundenKennzeichen)
|
|
' End If
|
|
|
|
' End If
|
|
' _Logger.Info("Indexname Dokumentart: " & vIndexnameDA)
|
|
' _Logger.Info("Ausgelesene Dokumentart: " & _MRDokumentart)
|
|
' _Logger.Info("Indexname Deskriptiver Index: " & vindexnameDesIndex)
|
|
' _MRDeskrIndex = _windreamNI.GetValueforIndex(vDatei.Substring(2), vindexnameDesIndex)
|
|
' If _MRDeskrIndex = "" Then
|
|
' _Logger.Info("- Achtung: ein eindeutiger/deskriptiver Indexwert existiert noch nicht! Dok kann nicht verschoben und umbenannt werden!")
|
|
' _Logger.Info("Move and Rename wird abgebrochen")
|
|
' Return False
|
|
' Else
|
|
' _Logger.Info("Ausgelesener Deskriptiver Index: " & _MRDeskrIndex)
|
|
' End If
|
|
' If _MRKundenKennzeichen = "" Then
|
|
' _Logger.Info("ACHTUNG: Kundenidentifikator ist leer - Das Dokument stammt von einem Interessenten")
|
|
' _MRKundenKennzeichen = ""
|
|
' End If
|
|
|
|
' VWMO_RE_DOKUMENTARTZUORDNUNGTableAdapter.FillByDokartKD(DS_More.VWMO_RE_DOKUMENTARTZUORDNUNG, _MRDokumentart, _MRKundenKennzeichen)
|
|
' Dim _path, _praefix, _kunde, _ziel As String
|
|
' Dim DT As DataTable = DS_More.VWMO_RE_DOKUMENTARTZUORDNUNG
|
|
' If DT.Rows.Count = 1 Then
|
|
|
|
' End If
|
|
|
|
|
|
|
|
' Return MRfile_rename_move(vDatei)
|
|
' Catch ex As Exception
|
|
' ClassLoggerNI.Add(" Fehler bei: GetValuesFromFile")
|
|
' ClassLoggerNI.Add(" ###########################################################################")
|
|
' ClassLoggerNI.Add(" Fehlermeldung")
|
|
' ClassLoggerNI.Add(" " & ex.Message)
|
|
' Return False
|
|
' End Try
|
|
|
|
'End Function
|
|
'Private Function MRfile_rename_move(ByVal _file As String)
|
|
' _Logger.Info("Jetzt in Sub MRfile_rename_move")
|
|
' Try
|
|
' Dim extension As String = Path.GetExtension(_file)
|
|
|
|
' Dim myFolderPath As String
|
|
' myFolderPath = Path.GetDirectoryName(_file)
|
|
|
|
' Dim _WDLaufwerk, _newfilename As String
|
|
' _WDLaufwerk = My.Settings.MRWD_Laufwerk
|
|
' VWMO_RE_DOKUMENTARTZUORDNUNGTableAdapter.FillByDokartKD(DS_More.VWMO_RE_DOKUMENTARTZUORDNUNG, _MRDokumentart, _MRKundenKennzeichen)
|
|
' Dim _path, _praefix, _kunde, _ziel As String
|
|
' Dim DT As DataTable = DS_More.VWMO_RE_DOKUMENTARTZUORDNUNG
|
|
' If DT.Rows.Count = 1 Then
|
|
' _path = DT.Rows(0).Item("DOKUMENTARTORDNER")
|
|
' _Logger.Info("Ausgelesener Pfad: " & _path)
|
|
' _kunde = DT.Rows(0).Item("KUNDEN_NAME")
|
|
' _praefix = DT.Rows(0).Item("PRAEFIX")
|
|
' _Logger.Info("Umbennennen des Dokumentes:")
|
|
' 'Dokument kann umbenannt werden
|
|
' _newfilename = _praefix
|
|
' _Logger.Info("Ausgelesener Kurzname: " & _newfilename)
|
|
' _newfilename = _newfilename & _MRDeskrIndex & extension
|
|
' _Logger.Info("Neuer Dateiname: " & _newfilename)
|
|
|
|
' 'MsgBox("Dokart: " & _Dokumentart & vbNewLine & "KD-KZ: " & _KundenKennzeichen & vbNewLine & "PFad:" & P)
|
|
' _Logger.Info("Überprüfen file exists/Doppelter Dateiname")
|
|
' '### VERSIONIERUNG ###
|
|
' Dim version As Integer = 2
|
|
' Dim Stammname As String = _newfilename.Substring(0, _newfilename.LastIndexOf("."))
|
|
' Dim neuername As String = _newfilename.Substring(0, _newfilename.LastIndexOf("."))
|
|
' 'Überprüfen ob File existiert
|
|
' Do While file_exists(_path & "\" & neuername & extension) = True
|
|
' neuername = Stammname & "~" & version
|
|
' _newfilename = neuername & extension
|
|
' version = version + 1
|
|
' Loop
|
|
|
|
' _Logger.Info("Neuer Dateiname: " & _newfilename)
|
|
' _Logger.Info("Aktion Verschieben der Datei")
|
|
' _Logger.Info("Quelle: " & _file)
|
|
' _ziel = _path & "\" & _newfilename
|
|
' _Logger.Info("Ziel: " & _ziel)
|
|
|
|
|
|
' If myFolderPath <> _path Then
|
|
' My.Computer.FileSystem.MoveFile(_file, _ziel)
|
|
' _Logger.Info("Erfolgsmeldung - Datei wurde erfolgreich verschoben")
|
|
' 'ClassLoggerNI.Add(" ######### Erfolgsmeldung - Datei wurde erfolgreich umbenannt und verschoben ###########")
|
|
' Else
|
|
' _Logger.Info("Verschieben nicht notwendig: Ordnerpfad identisch!")
|
|
' My.Computer.FileSystem.RenameFile(_file, _newfilename)
|
|
' _Logger.Info("Erfolgsmeldung - Datei wurde erfolgreich umbenannt")
|
|
' End If
|
|
' Me.TBMO_RE_HISTORYTableAdapter.Insert(_file, _newfilename, _kunde, _MRDeskrIndex, _MRDokumentart, "ToolCollection")
|
|
|
|
|
|
|
|
' End If
|
|
|
|
|
|
' Return True
|
|
' Catch ex As Exception
|
|
' ClassLoggerNI.Add(" Fehler bei: MRfile_rename_move")
|
|
' ClassLoggerNI.Add(" ###########################################################################")
|
|
' ClassLoggerNI.Add(" Fehlermeldung")
|
|
' ClassLoggerNI.Add(" " & ex.Message)
|
|
' Return False
|
|
' End Try
|
|
'End Function
|
|
Private Function Move2Folder(ByVal vDateiName As String, ByVal vFilestring As String)
|
|
Try
|
|
_Logger.Debug("Move2Folder gestartet")
|
|
Dim extension As String = Path.GetExtension(vDateiName)
|
|
Dim _Pfad, _WDLaufwerk, _Ziel As String
|
|
_Ziel = Me.aktivesProfil.move2Folder & "\" & vDateiName
|
|
_Logger.Debug("Ziel: " & _Ziel, False)
|
|
Dim Stammname As String = _Ziel.Substring(0, _Ziel.LastIndexOf("."))
|
|
Dim version As Integer = 2
|
|
Do While clsHelper.file_exists(_Ziel, "NI") = True
|
|
_Logger.Debug("Achtung: Datei existiert bereits!", False)
|
|
Dim neuername As String = Stammname & "~" & version & extension
|
|
_Ziel = neuername
|
|
version = version + 1
|
|
Loop
|
|
If _windreamNI.NEW_MOVE_FILE(_Ziel, vFilestring, "Move2Folder") = True Then
|
|
If clsHelper.file_exists(vFilestring, "NI") = True Then
|
|
_Logger.Info("Datei existiert trotz Move noch am ursprünglichen Ort noch....wird gelöscht wenn an Ziel existiert....", False)
|
|
If clsHelper.file_exists(_Ziel, "NI") = True Then
|
|
My.Computer.FileSystem.DeleteFile(vFilestring)
|
|
_Logger.Info("Existiert und Quelldatei wurde gelöscht!", False)
|
|
End If
|
|
End If
|
|
End If
|
|
Return True
|
|
Catch ex As Exception
|
|
_Logger.Error(ex)
|
|
|
|
Return False
|
|
End Try
|
|
End Function
|
|
|
|
|
|
Private Function CrFolderForIndex(ByVal fullfilename As String)
|
|
|
|
Try
|
|
fullfilename = fullfilename.Replace("W:\", "\\windream\objects\")
|
|
|
|
If My.Settings.vLogErrorsonly = False Then _Logger.Info("fullfilename: '" & fullfilename & "'")
|
|
Dim newFolder = ""
|
|
Dim RootFolder As String = Path.GetDirectoryName(fullfilename)
|
|
|
|
'######
|
|
Dim _folderArray As String()
|
|
_folderArray = aktivesProfil.CrFolderIndex.Split("\")
|
|
|
|
'Für jeden Folder die maskierung entfernen
|
|
For Each _Uordner As String In _folderArray
|
|
Dim folder_temp
|
|
If _Uordner.StartsWith("[%") Then
|
|
Dim Indexwert As String
|
|
folder_temp = _Uordner.Replace("[%", "")
|
|
folder_temp = folder_temp.Replace("]", "")
|
|
_Logger.Debug("Index für CrFolder - Ordner: '" & folder_temp & "'")
|
|
'Den Indexwert auslesen
|
|
Try
|
|
_Logger.Debug("Versuch den Indexwert aus '" & CStr(folder_temp) & "' auszulesen.")
|
|
Indexwert = aktivesDokument.GetVariableValue(folder_temp)
|
|
_Logger.Debug("Ergebnis/Wert für neuen Ordner: '" & CStr(Indexwert) & "'")
|
|
Catch ex As Exception
|
|
_Logger.Error(ex)
|
|
Return True
|
|
End Try
|
|
|
|
If Not Indexwert = String.Empty Then
|
|
If IsDate(Indexwert) Then
|
|
Indexwert = CDate(Indexwert).ToString("yyyyMMdd")
|
|
End If
|
|
|
|
|
|
newFolder = newFolder & Indexwert & "\"
|
|
_Logger.Debug("newFolder: '" & newFolder & "'")
|
|
Else
|
|
_Logger.Warn("Achtung Ausnahme in 'CrFolderForIndex': der Index ist leer!")
|
|
Return True
|
|
End If
|
|
End If
|
|
'Überprüfen ob es ein Variable ORdneranlage sein soll (DATUM)
|
|
If _Uordner.StartsWith("[V%") Then
|
|
Dim _Month As String = My.Computer.Clock.LocalTime.Month
|
|
If _Month.Length = 1 Then
|
|
_Month = "0" & _Month
|
|
End If
|
|
Dim _day As String = My.Computer.Clock.LocalTime.Day
|
|
If _day.Length = 1 Then
|
|
_day = "0" & _day
|
|
End If
|
|
Dim type = _Uordner.Replace("[V%", "")
|
|
type = type.Replace("]", "")
|
|
Select Case type
|
|
Case "YYYY/MM/DD"
|
|
folder_temp = My.Computer.Clock.LocalTime.Year & "\" & _Month & "\" & _day
|
|
newFolder = newFolder & folder_temp & "\"
|
|
Case "YYYY/MM"
|
|
folder_temp = My.Computer.Clock.LocalTime.Year & "\" & _Month
|
|
newFolder = newFolder & folder_temp & "\"
|
|
Case "YYYY"
|
|
folder_temp = My.Computer.Clock.LocalTime.Year
|
|
newFolder = newFolder & folder_temp & "\"
|
|
Case "YYYY-MM"
|
|
folder_temp = My.Computer.Clock.LocalTime.Year & "-" & _Month
|
|
newFolder = newFolder & folder_temp & "\"
|
|
End Select
|
|
End If
|
|
'Überprüfen ob es ein manueller Ordner ist
|
|
If _Uordner.StartsWith("[M%") Then
|
|
folder_temp = _Uordner.Replace("[M%", "")
|
|
folder_temp = folder_temp.Replace("]", "")
|
|
newFolder = newFolder & folder_temp & "\"
|
|
End If
|
|
Next
|
|
|
|
If newFolder <> "" Then
|
|
If My.Settings.vLogErrorsonly = False Then _Logger.Info("newFolder: '" & newFolder & "'")
|
|
_Logger.Debug("Den Root-Folder zusammenfügen...")
|
|
'in einem separaten Ordner anlegen
|
|
If Me.aktivesProfil.CrFolder_Folder <> "" Then
|
|
RootFolder = Me.aktivesProfil.CrFolder_Folder
|
|
_Logger.Debug("RootFolder: '" & RootFolder & "'")
|
|
End If
|
|
RootFolder = RootFolder.Replace("W:\", "\\windream\objects\")
|
|
Dim fullpath As String = RootFolder & "\" & newFolder
|
|
fullpath.Replace("\\", "\")
|
|
_Logger.Debug("Fullpath (mit evtl. Sonderzeichen (SZ)) '" & fullpath & "'", False)
|
|
Dim invalidPathChars() As Char = IO.Path.GetInvalidPathChars()
|
|
For Each sonderChar As Char In invalidPathChars
|
|
'Sonderzeichen ausser Whitespace entfernen
|
|
If Char.IsWhiteSpace(sonderChar) = False Then
|
|
If fullpath.Contains(sonderChar) Then
|
|
fullpath = fullpath.Replace(sonderChar, "")
|
|
End If
|
|
End If
|
|
Next sonderChar
|
|
If My.Settings.vLogErrorsonly = False Then _Logger.Info("Fullpath (ohne SZ) '" & fullpath & "'")
|
|
|
|
If Directory.Exists(fullpath) = False Then
|
|
Directory.CreateDirectory(fullpath)
|
|
_Logger.Debug("Folder '" & fullpath & "' wurde angelegt")
|
|
End If
|
|
aktivesProfil.CrFolder_Created_Folder = fullpath
|
|
CURRENT_MOVE_FILEPATH = fullpath
|
|
|
|
|
|
If aktivesProfil.CrFolder_Move = True Then
|
|
|
|
_Logger.Debug("Datei soll direkt auch verschoben werden.")
|
|
'Die aktuelle Datei soll gleichzeitig verschoben werden
|
|
Dim extension As String = Path.GetExtension(fullfilename)
|
|
Dim Dateiname As String = Path.GetFileName(fullfilename)
|
|
Dim _Pfad, _WDLaufwerk, oWM_Target As String
|
|
oWM_Target = fullpath & Dateiname
|
|
|
|
_Logger.Debug("Ziel: " & oWM_Target)
|
|
'Nur verschieben und überprüfen wenn Pfad ungleich
|
|
If Path.GetDirectoryName(fullfilename) <> Path.GetDirectoryName(oWM_Target) Then
|
|
Dim Stammname As String = oWM_Target.Substring(0, oWM_Target.LastIndexOf("."))
|
|
Dim version As Integer = 2
|
|
Do While clsHelper.file_exists(oWM_Target, "NI") = True
|
|
version = version + 1
|
|
_Logger.Info("Achtung: Datei ' " & Path.GetFileName(oWM_Target) & "' existiert bereits!")
|
|
Dim neuername As String = Stammname & "~" & version & extension
|
|
oWM_Target = neuername
|
|
Loop
|
|
|
|
_windreamNI.NEW_MOVE_FILE(oWM_Target, fullfilename, "FolderForIndex")
|
|
Else
|
|
_Logger.Info("(CrFolderForIndex) Quell- und Zielordner identisch")
|
|
If Path.GetFileName(fullfilename) <> Path.GetFileName(oWM_Target) And File.Exists(oWM_Target) Then
|
|
_Logger.Warn("(CrFolderForIndex) Quell- und Zielname nicht identisch")
|
|
Dim sw As New ClassStopwatch("FileSystem.Rename")
|
|
FileSystem.Rename(oWM_Target, Path.GetDirectoryName(oWM_Target) & Path.GetFileName(fullfilename))
|
|
_Logger.Info($"Datei {Path.GetFileName(oWM_Target)} wurde nach CrFolderIndex-Methode umbenannt")
|
|
Dim msg = sw.Done
|
|
If msg <> String.Empty Then _Logger.Info(msg)
|
|
End If
|
|
End If
|
|
End If
|
|
|
|
Return False
|
|
Else
|
|
_Logger.Warn("Achtung es konnte kein dynamischer Pfad generiert werden!")
|
|
Return True
|
|
End If
|
|
|
|
Catch ex As Exception
|
|
_Logger.Error(ex)
|
|
Return True
|
|
End Try
|
|
End Function
|
|
|
|
Private Sub TimerRefresh_Tick(sender As Object, e As EventArgs) Handles TimerRefresh.Tick
|
|
If CURRENT_STATE <> "" Then
|
|
Select Case CURRENT_STATE
|
|
Case "Abbruch Timeout"
|
|
Me.lblStatus.Text = "(Status: WARTEN nach Abbruch durch Timeout.)"
|
|
Me.tslblStatus.Visible = True
|
|
tslblStatus.Text = "Status: WARTEN nach Abbruch durch Timeout"
|
|
CURRENT_STATE = ""
|
|
End Select
|
|
|
|
End If
|
|
End Sub
|
|
End Class |