Imports WINDREAMLib Imports System.IO Imports DigitalData.Modules.Logging Imports DigitalData.Modules.Database Public Class clsNI_WorkFile Private Shared _Logger As DigitalData.Modules.Logging.Logger Private _MyLogger As LogConfig Public Shared aktivesProfil As ClassNIProfil Public Shared _windream As ClassNIWindream Private Shared _XML As New ClassxmlZugriff Public Shared _SetFileValidation As Boolean = False 'Public Shared _fileerror As Boolean = False Private Shared _WDFileINWORK As WMObject Private Shared _WDOrdnerpfad As String Private Shared _pathxmlfile As String Private Shared errormsg As String Private Shared _file_Folderpath As String Private Shared _file_DeskriptiverWert As Object Private Shared MyDataset As ToolCollection.MyDataset Private _firebird As Firebird Private Shared NI_Indexe() As String 'zum Speichern der Indexe Private Shared NI_Values() As String 'zum Speichern der Werte Sub New(LogConfig As LogConfig) MyBase.New() _MyLogger = LogConfig _Logger = _MyLogger.GetLogger() End Sub Public Function Work_File(ByVal dokument As WMObject) As Boolean Try errormsg = "" _file_Folderpath = "" Dim oErrorInWorkFile As Boolean = False _WDFileINWORK = dokument _WDOrdnerpfad = Path.GetDirectoryName(My.Settings.vWLaufwerk & ":" & dokument.aPath) _Logger.Info("## Indexierung von Dokument '" & dokument.aName & "' ##") _file_Folderpath = Path.GetDirectoryName(My.Settings.vWLaufwerk & ":" & dokument.aPath) 'Die Hilfstabelle leeren MyDataset.TBVEKTOR_ARRAY.Clear() '============================================================================ 'Als erstes überprüfen ob eine Überprüfung des Indexes per SQL hinterlegt ist '============================================================================ oErrorInWorkFile = Check_Deskriptiven_Index() 'Wenn alles ok ist - gibt es False zurück If oErrorInWorkFile = False Then NI_Indexe = Nothing ' zum Speichern der Indexe NI_Values = Nothing ' zum Speichern der Werte 'Die Indexierungsschritte abarbeiten oErrorInWorkFile = Work_Verknuepfungen() If oErrorInWorkFile = False Then End If Else 'Validation-Flags setzen SetValidation() End If Catch ex As Exception 'bei einem Fehler einen Eintrag in der Logdatei machen _Logger.Warn("ACHTUNG Schwerwiegender Fehler in Work_File: " & ex.Message) Return False End Try End Function Private Shared Function Check_Deskriptiven_Index() As Boolean If aktivesProfil.checkIndexsql <> String.Empty Then 'Überprüfen ob der deskriptive Index einen Wert zurückliefert Get_Desk_index() If Not _file_DeskriptiverWert Is Nothing Then If _file_DeskriptiverWert Is String.Empty Then 'Fehler weil _file_DeskriptiverWert leer ist _Logger.Warn("# Check_Deskriptiven_Index - _file_DeskriptiverWert ist 'leer' - Abbruch") Return True End If Else 'Fehler weil _file_DeskriptiverWert NOTHING ist Return True End If 'Je nach Indexierungstyp andere Ansätze Select Case aktivesProfil.Ni_Art.ToLower Case "db" 'Liefert False zurück, wenn der Wert ok ist Return Deskr_Value_Valid_DB() Case "xml" '#### Indexierung über xml-Dokument Dim _pathxmlfile As String _pathxmlfile = _file_Folderpath & "\" & System.IO.Path.GetFileNameWithoutExtension(_WDFileINWORK.aPath) & "." & aktivesProfil.xmlEnd 'aktivesProfil.xmlFolder If clsHelper.file_exists(_pathxmlfile, "NI") = False Then _pathxmlfile = _file_Folderpath & "\" & System.IO.Path.GetFileNameWithoutExtension(_WDFileINWORK.aPath) & "." & "xfres" If clsHelper.file_exists(_pathxmlfile, "NI") = False Then _Logger.Warn(" >> ACHTUNG 1: Nachindexdatei '" & _pathxmlfile & "' existiert nicht!") 'Fehlermeldung eintragen Indexiere_ErrorIndex("Nachindexdatei NOT EXISTING", _WDFileINWORK, My.Settings.ERROR_INDEX) errormsg &= " >> ACHTUNG 1: Nachindexdatei '" & _pathxmlfile & "' existiert nicht!" Return True End If Else 'Liefert False zurück, wenn der Wert ok ist Return Deskr_Value_Valid_DB() End If End Select Else 'Es ist keine Überprüfung hinterlegt - also False zurückliefern Return False End If End Function Private Shared Function Deskr_Value_Valid_DB() As Boolean Select Case clsNI_DB.CHECK_DESKR_INDEX(aktivesProfil.DbArt, aktivesProfil.Desk_windreamIndex, _file_DeskriptiverWert.ToString, aktivesProfil.checkIndexsql, aktivesProfil.DataSource, aktivesProfil.InitialCatalog, aktivesProfil.UserId, aktivesProfil.Password) 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 verweist auf KEINEN Eintrag in der Datenbank! - Markierung des Doks") errormsg &= " >> Der deskriptive Indexwert verweist auf KEINEN Eintrag in der Datenbank!" _SetFileValidation = True Return True Case 1 _Logger.Warn(" - Der deskriptive Indexwert verweist genau auf EINEN Eintrag in der Datenbank - Alles OK") _SetFileValidation = False Return 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 verweist auf MEHR ALS EINEN Eintrag in der Datenbank oder es trat ein genereller Fehler auf!") errormsg &= " >> Der deskriptive Indexwert verweist auf MEHR ALS EINEN Eintrag in der Datenbank oder es trat ein genereller Fehler auf!" _SetFileValidation = True Return True End Select End Function Private Function Work_Verknuepfungen() As Boolean Try Dim _err_in_Work_Verkn As Boolean = False ' alle Verknüpfungen/Links des aktuellen Suchergebnisses durchlaufen If IsNothing(aktivesProfil.Verknüpfungen.Links) = False Then Select Case aktivesProfil.Ni_Art.ToLower Case "fulltext" Fulltext_init(_WDFileINWORK, _WDFileINWORK.GetVariableValue(aktivesProfil.Desk_windreamIndex)) Case Else ' alle Verknüpfungen/Links des aktuellen Suchergebnisses durchlaufen For Each Index_Link As ClassNIVerknüpfung In aktivesProfil.Verknüpfungen.Links If _err_in_Work_Verkn = False Then _err_in_Work_Verkn = Work_IndexLink(Index_Link.SelectAnweisung, Index_Link.Spalte, Index_Link.Index) Else Exit For End If Next End Select 'Rückgabe Fehler ja/nein Return _err_in_Work_Verkn Else 'Keine Verknüpfung also auch kein Fehler ;) Return False End If Catch ex As Exception _Logger.Error(ex) Return True End Try End Function Private Shared Sub Get_Desk_index() _file_DeskriptiverWert = Nothing Try If aktivesProfil.Desk_windreamIndex <> String.Empty Then 'den Wert des deskriptiven Indexes für das aktuelle Dokument auslesen _file_DeskriptiverWert = _WDFileINWORK.GetVariableValue(aktivesProfil.Desk_windreamIndex) Else _Logger.Warn("Get_Desk_index: Es wurde kein deskriptiver Index hinterlegt!", False) End If Catch ex As Exception Dim errormsg As String = "UNVORHERGESEHENER FEHLER in bei Get_Desk_index (GetVariableValue für Index '" & aktivesProfil.Desk_windreamIndex & "'): " & ex.Message _Logger.Warn(errormsg) End Try If _file_DeskriptiverWert Is Nothing Then _Logger.Warn("- ACHTUNG: Deskriptiver Indexwert ist NOTHING", False) Exit Sub Else _Logger.Warn("- Ausgelesener Deskriptive Indexwert: '" & _file_DeskriptiverWert.ToString & "'", False) End If If _file_DeskriptiverWert Is String.Empty Then errormsg &= vbNewLine & " ACHTUNG - Für den Deskriptiven Index konnte kein Wert gelesen werden - Indexierungsvorgang wird nun abgebrochen" ' wenn die Abfrage in windream kein Ergebnis gab, muss das Fehlerflag gesetzt werden _Logger.Warn(errormsg) End If End Sub Private Shared Sub SetValidation() If _SetFileValidation = True Then File_SetBooleanIndex(True, _WDFileINWORK, aktivesProfil.IndexValidation) File_SetBooleanIndex(True, _WDFileINWORK, aktivesProfil.IndexFehler) End If End Sub Private Shared Function Fulltext_init(_dokument As WMObject, fulltext As String) Try 'Zeilenumbrüche entfernen fulltext = fulltext.Replace(vbCrLf, "") Dim ign_whitespace As Boolean = False Dim IndexArray As String() Dim ErgebnisArray As String() Dim counter As Integer = 0 Dim ErrorinIndexierung As Boolean = False ' alle Regex-Links des Profils durchlaufen For Each Volltext_Indexierung As ClassNIVerknüpfung In aktivesProfil.Verknüpfungen.Links If ErrorinIndexierung = False Then 'Ignore Whitespace If Volltext_Indexierung.SelectAnweisung.Contains("ignore=''") Then fulltext = fulltext.Replace(" ", "") End If ErgebnisArray = Nothing '### If Volltext_Indexierung.Spalte.StartsWith("%") And Volltext_Indexierung.Spalte.EndsWith("%") Then Dim manwert As String 'Ein manueller Wert in der Verknüpfung _Logger.Info(">> Fulltext_init: Indexierung mit einem manuellem Wert") manwert = Volltext_Indexierung.Spalte.Replace("%", "") _Logger.Info(">> Manueller Wert: " & manwert) 'Indexieren der Datei ' die Arraygrößen anpassen ReDim Preserve IndexArray(0) ' den angegebenen Index eintragen IndexArray(0) = Volltext_Indexierung.Index Dim arrValue() As String = Nothing arrValue = Nothing ReDim Preserve arrValue(0) arrValue(0) = manwert ErrorinIndexierung = _windream.RunIndexing(_dokument, IndexArray, arrValue, MyDataset, aktivesProfil.Profilname, aktivesProfil.DokumenttypString) Else Dim pos_von, pos_bis As Integer '## If Volltext_Indexierung.SelectAnweisung.Contains(";") Then Dim _posArray As String() = Volltext_Indexierung.SelectAnweisung.Split(";") pos_von = _posArray(0) pos_bis = _posArray(1) _Logger.Debug("- Volltext-Indexierung - Regex: '" & Volltext_Indexierung.Spalte & "' - Alle Vorkommen") Try ign_whitespace = CBool(_posArray(2)) Catch ex As Exception ign_whitespace = False End Try Else pos_von = 10000 pos_bis = 0 _Logger.Debug("- Volltext-Indexierung - Regex: '" & Volltext_Indexierung.Spalte & "' - Pos.-Von: '" & pos_von & "' - Pos.-Bis: '" & pos_bis) End If ErgebnisArray = clsNIFulltext.GetValuesFromFulltext(_dokument.aName, fulltext, Volltext_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") = Volltext_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) = Volltext_Indexierung.Index 'Indexieren If ErgebnisArray.Length = 1 Then Dim arrValue() As String = Nothing arrValue = Nothing ReDim Preserve arrValue(0) arrValue(0) = ErgebnisArray(0) ErrorinIndexierung = _windream.RunIndexing(_dokument, IndexArray, arrValue, MyDataset, aktivesProfil.Profilname, aktivesProfil.DokumenttypString) Else ErrorinIndexierung = _windream.RunIndexing_Vektor(_dokument, IndexArray, ErgebnisArray) End If Else _Logger.Info("- Ergebnisarray is nothing") Return True End If End If '#### Else _Logger.Info("## Fehler in Fulltext_init - ErrorinIndexierung = True") Return True End If Next Return ErrorinIndexierung Catch ex As Exception _Logger.Error(ex) Return True End Try End Function Private Shared Function Check_DeskIndexValue(ByVal _indexvalue As String, ByVal _sql As String) Try Dim sql As String = _sql Dim _vsql As String Dim _replace As String If IsNumeric(_indexvalue) Then _replace = _indexvalue Else _replace = "'" & _indexvalue & "'" End If _vsql = sql.Replace("[%" & aktivesProfil.Desk_windreamIndex & "]", _replace) _Logger.Debug("- Check Deskriptiven Index-Value - Select Scalar: " & _vsql) If aktivesProfil.DbArt = "Oracle" Then Dim ergebnis As Integer = clsNI_DB.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 = clsNI_DB.CheckIndex_MSSSQL(_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 End If Catch ex As Exception _Logger.Error(ex) Return 99 End Try End Function Private Function Work_IndexLink(SelectString As String, _Spalte As String, _Index As String) Try Dim IndexwertAusWindream As Object Dim eindeutigerWertausWindream As String Dim database As New ClassNIDatenbankzugriff(_MyLogger) Dim selectArray() 'Regulären Ausdruck zum Auslesen der windream-Indexe definieren Dim preg As String = "\[%{1}[a-zA-Z0-9\!\$\&\/\(\)\=\?\,\.\-\;\:_öÖüÜäÄ\#\'\+\*\~\{\}\@\€\<\>\ ]+]{1}" 'Ersetzen des Dateinamens - für CURSOR NachindexierungPr If SelectString.Contains("[DATEINAME]") Then SelectString = SelectString.Replace("[DATEINAME]", _WDFileINWORK.aName) End If If SelectString.Contains("[FULLNAME]") Then SelectString = SelectString.Replace("[FULLNAME]", My.Settings.MRWD_Laufwerk & ":" & _WDFileINWORK.aPath) End If If SelectString.Contains("[%DOCFilename]") Then SelectString = SelectString.Replace("[%DOCFilename]", _WDFileINWORK.aName) End If If SelectString.Contains("[%DOCFilenameoE]") Then Dim Filename As String = Path.GetDirectoryName(My.Settings.vWLaufwerk & ":" & _WDFileINWORK.aPath) SelectString = SelectString.Replace("[%DOCFilenameoE]", Path.GetFileNameWithoutExtension(Filename)) End If If SelectString.Contains("[%DOCPath]") Then SelectString = SelectString.Replace("[FULLNAME]", Path.GetDirectoryName(My.Settings.vWLaufwerk & ":" & _WDFileINWORK.aPath)) End If If SelectString.Contains("[%DATENow]") Then SelectString = SelectString.Replace("[%DATENow]", Now.ToShortDateString) End If If SelectString.Contains("[%DOCFULLPATH]") Then SelectString = SelectString.Replace("[%DOCFULLPATH]", My.Settings.MRWD_Laufwerk & ":" & _WDFileINWORK.aPath) End If ' einen Regulären Ausdruck laden Dim regulärerAusdruck As System.Text.RegularExpressions.Regex = New System.Text.RegularExpressions.Regex(preg) ' die Vorkommen im SelectString auslesen Dim elemente As System.Text.RegularExpressions.MatchCollection = regulärerAusdruck.Matches(SelectString) 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("- für Regex Element '" & element.Value & "' wurden die Klammern entfernt: " & idxName_ohneSonderzeichen) Try ' den Wert des deskriptiven Indexes für das aktuelle Dokument auslesen IndexwertAusWindream = _WDFileINWORK.GetVariableValue(idxName_ohneSonderzeichen) If element.ToString = aktivesProfil.Desk_windreamIndex Then eindeutigerWertausWindream = IndexwertAusWindream End If Catch ex As Exception _Logger.Warn("ACHTUNG: Schwerwiegender Fehler bei Auslesen des einschränkenden Wertes aus Index':" & idxName_ohneSonderzeichen & "': " & ex.Message) ' wenn ein Fehler aufgetreten ist, muss das Flag gesetzt werden Return True 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 Then ' IndexwertAusWindream ist Nothing (idxName_ohneSonderzeichen) _Logger.Warn("ACHTUNG: der einschränkende Wert aus Windream für Index '" & idxName_ohneSonderzeichen & "' ist NOTHING") _Logger.Warn(">> Select-String bisher: " & SelectString) ' wenn die Abfrage in windream kein Ergebnis gab, muss das error_in_Indexierungflag gesetzt werden Return True Else ' den Platzhalter im SQL-String durch den Wert ersetzen SelectString = SelectString.Replace(element.Value, IndexwertAusWindream.ToString) _Logger.Debug(">> SelectString.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 SelectString = SelectString.Replace(element.Value, _Spalte) ElseIf element.Value.ToUpper = "[%VIEW]" Then ' den Platzhalter für den auszulesenden View durch den Viewnamen ersetzen SelectString = SelectString.Replace(element.Value, _Spalte) End If End If Next ' zum nächsten Wert in der SQL-Anweisung gehen _Logger.Debug(">> SelectString nach For Each (" & SelectString & ")") Dim _NidxWert = Nothing ' Der Nachindexierungswert: entweder aus Datenbankabfrage oder aus xml-File '==================================== 'Es wird ein manueller Wert indexiert '==================================== If _Spalte.StartsWith("%") And _Spalte.EndsWith("%") Then 'Ein manueller Wert in der Verknüpfung _Logger.Debug(">> Indexierung mit einem manuellem Wert") _NidxWert = _Spalte.Replace("%", "") _Logger.Debug(">> Manueller Wert: " & _NidxWert) Else '========================================== 'Indexierung gegen einen auszulesenden Wert '========================================== Dim Arr() As Object Dim Anzahl_NI_Werte As Integer = 0 If IndexwertAusWindream Is Nothing = False Then If IndexwertAusWindream.GetType.ToString.Contains("System.Object") Then 'Es wird gegen ein Vektorfeld nachindexiert _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 i As Integer = 0 For Each obj As Object In Arr 'Im Select den Objektverweis mit Werta aus Vektorfeld ersetzen SelectString = SelectString.Replace("System.Object[]", obj.ToString) 'Select-Befehl an Array übergeben selectArray(i) = SelectString _Logger.Debug(">> SELECT-BEFEHL: " & selectArray(i)) i += 1 Next Else ReDim Preserve selectArray(0) 'MsgBox("Nur ein Einfachindex :(" & vbNewLine & IndexwertAusWindream.ToString) selectArray(0) = SelectString _Logger.Debug(">> INDEXIERUNG GEGEN EINEN EINFACHINDEX '" & selectArray(0) & "'") End If Else ReDim Preserve selectArray(0) 'MsgBox("Nur ein Einfachindex :(" & vbNewLine & IndexwertAusWindream.ToString) selectArray(0) = SelectString _Logger.Debug(">> IndexwertAusWindream Is Nothing: Select: " & selectArray(0)) End If 'Indexwert über DB oder Datei Select Case aktivesProfil.Ni_Art.ToLower Case "db" _Logger.Debug(">> SQL-Abfragen durchlaufen") Dim i As Integer 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 aktivesProfil.DbArt = "Oracle" Then _NidxWert = database.GetValueFromOracleDb(aktivesProfil.Profilname, selectArray(i), aktivesProfil.DataSource, aktivesProfil.InitialCatalog, aktivesProfil.UserId, aktivesProfil.Password, MyDataset, _Index) ElseIf aktivesProfil.DbArt = "MS-SQL" Then _NidxWert = database.GetValueFromMssqlDb(_WDFileINWORK.aName, aktivesProfil.Profilname, selectArray(i), aktivesProfil.DataSource, aktivesProfil.UserId, aktivesProfil.Password, MyDataset, aktivesProfil.InitialCatalog, _Index) ElseIf aktivesProfil.DbArt = "ODBC" Then _NidxWert = database.GetValueFromOdbcDb(aktivesProfil.Profilname, selectArray(i), aktivesProfil.DataSource, aktivesProfil.UserId, aktivesProfil.Password, _Index) ElseIf aktivesProfil.DbArt = "OLE (Access)" Then _NidxWert = database.GetValueFromOleDb(aktivesProfil.Profilname, selectArray(i), aktivesProfil.DataSource, aktivesProfil.UserId, aktivesProfil.Password, _Index) ElseIf aktivesProfil.DbArt = "Firebird" Then _NidxWert = database.GetValueFromFirebird(aktivesProfil.Profilname, selectArray(i), _Index, MyDataset) End If Next Case "xml" '#### Indexierung über xml-Dokument Dim dok As String = System.IO.Path.GetFileNameWithoutExtension(_WDFileINWORK.aPath) 'Indexierung über luratech-Ergebnis Files If aktivesProfil.xmlEnd = "xffres" Then _Logger.Debug("- Indexierung über XML-Dokument Abby/Luratech") 'Pfad für xml-File verketten _pathxmlfile = _WDOrdnerpfad & "\" & Path.GetFileNameWithoutExtension(_WDFileINWORK.aPath) & "." & aktivesProfil.xmlEnd 'aktivesProfil.xmlFolder _pathxmlfile = _pathxmlfile.Replace("W:", "\\windream\objects") 'Dateipfad für xffres/xml-Datei zusammenbauen If File.Exists(_pathxmlfile) Then 'Übergabe der Dateiparameter und des xml-Knotens _NidxWert = Trim(_XML.GetValueFromLuratechxml(System.IO.Path.GetFileNameWithoutExtension(_WDFileINWORK.aPath) & "." & aktivesProfil.xmlEnd, _pathxmlfile, _Spalte, aktivesProfil.Profilname)) 'wert aus Luratech darf nicht leer sein If _NidxWert Is Nothing Then File_SetBooleanIndex(True, _WDFileINWORK, aktivesProfil.IndexValidation) _Logger.Warn(">> ACHTUNG: Wert aus Formrec. ist nothing") Return True End If Else _Logger.Warn(" >> ACHTUNG 2: Nachindexdatei: " & _pathxmlfile & " existiert nicht!") Return True End If ElseIf aktivesProfil.xmlEnd = "xml (ZugFerd)" Then _Logger.Warn(" - Indexierung über XML-Dokument ZugFerd") 'Pfad für xml-File verketten _pathxmlfile = _WDOrdnerpfad & "\" & Path.GetFileNameWithoutExtension(_WDFileINWORK.aPath) & ".xml" 'Dateipfad für xml-Datei zusammenbauen If File.Exists(_pathxmlfile) Then 'Übergabe der Dateiparameter und des xml-Knotens _NidxWert = Trim(_XML.GetValueFromZugFerdxml(System.IO.Path.GetFileNameWithoutExtension(_WDFileINWORK.aPath) & ".xml", _pathxmlfile, _Spalte, aktivesProfil.Profilname)) 'wert aus Luratech darf nicht leer sein If _NidxWert Is Nothing Then File_SetBooleanIndex(True, _WDFileINWORK, aktivesProfil.IndexValidation) _Logger.Warn(">> ACHTUNG: Wert aus ZugFerd-Datei ist nothing") Return True End If Else _Logger.Warn(" >> ACHTUNG 2: Nachindexdatei ZugFerd: " & _pathxmlfile & " existiert nicht!") Return True End If End If 'wenn Wert geliefert und Index ist deskriptiver Index If aktivesProfil.Desk_windreamIndex = _Index And aktivesProfil.checkIndexsql <> "" Then If (_NidxWert = "") Or (_NidxWert Is Nothing) Then _Logger.Warn(">> ACHTUNG: der gelesene Wert ist leer! Dies kann zu Fehlern führen! #") File_SetBooleanIndex(True, _WDFileINWORK, aktivesProfil.IndexValidation) _NidxWert = Nothing Return True Else Dim _dokxml As WINDREAMLib.WMObject _dokxml = Nothing 'Dim _path2xmlfile As String = ordnerpfad & "\" & System.IO.Path.GetFileNameWithoutExtension(dokument.aPath) & "." & aktivesProfil.xmlEnd _dokxml = _windream.oWMSession.GetWMObjectByPath(WINDREAMLib.WMEntity.WMEntityDocument, _pathxmlfile.Substring(2)) 'WINDREAMLib.WMEntity.WMEntityDocument 'Überprüfen ob deskriptiver Wert eindeutig? _Logger.Debug("- Überprüfung ob deskriptiver Wert eindeutig?") Dim Check As Integer = Check_DeskIndexValue(_NidxWert, aktivesProfil.checkIndexsql) 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.Info("- Der deskriptive Indexwert '" & _NidxWert & "' verweist auf keinen Eintrag in der Datenbank! - Markierung des Doks") 'Überprüfung ob Wert dennoch indexiert werden soll?! If SelectString = "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 arrValue(0) = _NidxWert.ToString _windream.RunIndexing(_WDFileINWORK, arrIndex, arrValue, MyDataset, aktivesProfil.Profilname, aktivesProfil.DokumenttypString) _Logger.Debug("- Der falsche OCR-Wert: '" & _NidxWert.ToString & "' wurde eingetragen") Return True End If '1. aktives Dok SetValidation() '2. Indexierungs-Datei If _SetFileValidation = True Then File_SetBooleanIndex(True, _dokxml, aktivesProfil.IndexValidation) Return True Case 1 _Logger.Debug("- Der deskriptive Indexwert " & _NidxWert & " verweist genau auf EINEN Eintrag in der Datenbank - Alles OK") 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 " & _NidxWert & " verweist auf MEHR ALS EINEN Eintrag in der Datenbank!") '1. aktives Dok SetValidation() '2. Indexierungs-Datei If _SetFileValidation = True Then File_SetBooleanIndex(True, _dokxml, aktivesProfil.IndexValidation) Return True Case 99 'Fehler in Überprüfung _Logger.Warn(" - Fehler in der Überprüfung des gelesenen Wertes - Markierung des Doks") 'Überprüfung ob Wert dennoch indexiert werden soll?! '1. aktives Dok SetValidation() '2. Indexierungs-Datei If _SetFileValidation = True Then File_SetBooleanIndex(True, _dokxml, aktivesProfil.IndexValidation) Return True 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 _NidxWert = "" 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") _NidxWert = ClassActiveDirectory.GetAD_Attribut(selectArray(0), _Spalte, aktivesProfil.DataSource, aktivesProfil.UserId, aktivesProfil.Password) If _NidxWert = ">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.Warn(" - Gelesener Attribut-Wert: " & _NidxWert) End If End Select End If 'ENDE Return False Catch ex As Exception _Logger.Error(ex) Return True End Try End Function Private Shared Sub File_SetBooleanIndex(ByVal _value As Boolean, ByVal _dok As WINDREAMLib.WMObject, ByVal _Indexname As String) If _Indexname <> String.Empty Then 'Überprüfen ob Validierung bereits gesetzt wurde? Dim akt_Status As Boolean = CBool(_dok.GetVariableValue(_Indexname)) If akt_Status <> _value Then 'Validation muß angepasst werden _Logger.Debug("- Validation/Error Index NOCH NICHT auf '" & _value.ToString & "' gesetzt") 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 _windream.RunIndexing(_dok, arrIndex, arrValue, MyDataset, aktivesProfil.Profilname, aktivesProfil.DokumenttypString) Else 'Index muß nicht angepasst werden _Logger.Debug("- Validation Index bereits auf '" & _value & "' gesetzt") End If End If End Sub Private Shared Sub Indexiere_ErrorIndex(ByVal _error As String, ByVal _dok As WINDREAMLib.WMObject, ByVal _Indexname As String) Try 'Überprüfen ob Validierung bereits gesetzt wurde? Dim akt_Status As String = CStr(_dok.GetVariableValue(_Indexname)) If akt_Status <> _error Then 'Error muß angepasst werden _Logger.Debug("- current Errrormsg <>") 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) = _error _windream.RunIndexing(_dok, arrIndex, arrValue, MyDataset, aktivesProfil.Profilname, aktivesProfil.DokumenttypString) Else 'Validation muß nicht angepasst werden _Logger.Debug("- current Errormsg already = '" & _error & "'") End If Catch ex As Exception If ex.Message.Contains("Variable: Error not found") Then _Logger.Warn("ACHTUNG Fehler bei SetErrorMeldung - Der 'Error'-Index existiert nicht: " & ex.Message) Else _Logger.Warn("ACHTUNG unvorhergesehener Fehler bei SetErrorMeldung: " & ex.Message) End If End Try End Sub End Class