ToolCollection/ToolCollection/clsNI_WorkFile.vb
Digital Data - Marlon Schreiber 3a25947af0 MS
2019-02-05 18:49:13 +01:00

690 lines
40 KiB
VB.net

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 _filevalidation 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 error_WorkFile 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
'============================================================================
error_WorkFile = Check_Deskriptiven_Index()
'Wenn alles ok ist - gibt es False zurück
If error_WorkFile = False Then
NI_Indexe = Nothing ' zum Speichern der Indexe
NI_Values = Nothing ' zum Speichern der Werte
'Die Indexierungsschritte abarbeiten
error_WorkFile = Work_Verknuepfungen()
If error_WorkFile = False Then
End If
End If
'Wenn Fehler dann die Datei markieren
If error_WorkFile = True Then
'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)
If My.Settings.vNIMailsenden = True Then
ClassNIEmail.Add("Schwerwiegender Fehler bei Work_File - <br> Profil: " & aktivesProfil.Profilname & "<br> Datei: " & dokument.aName.ToString & "<br> Fehler: " & ex.Message)
End If
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, aktivesProfil.IndexFehler)
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!"
Return True
Case 1
_Logger.Warn(" - Der deskriptive Indexwert verweist genau auf EINEN Eintrag in der Datenbank - Alles OK")
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!"
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)
If My.Settings.vNIMailsenden = True Then
ClassNIEmail.Add(errormsg)
End If
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 _filevalidation = True Then File_SetBooleanIndex(True, _WDFileINWORK, aktivesProfil.IndexValidation)
If _fileerror = True Then File_SetBooleanIndex(True, _WDFileINWORK, aktivesProfil.IndexFehler)
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(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("Wert") = 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(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 _filevalidation = 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 _filevalidation = 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 _filevalidation = 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)
'Ü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 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