690 lines
40 KiB
VB.net
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
|