diff --git a/Global_Indexer/frmIndex.vb b/Global_Indexer/frmIndex.vb index ece054e..4fa771a 100644 --- a/Global_Indexer/frmIndex.vb +++ b/Global_Indexer/frmIndex.vb @@ -13,68 +13,36 @@ Imports DigitalData.Modules.Windream Imports Limilabs.Mail Public Class frmIndex + #Region "+++++ Variablen ++++++" - Public vPathFile As String - Private MULTIFILES As Integer - Private ReadOnly akttxtbox As TextBox - Dim DT_INDEXEMAN As DataTable + Public FormLoaded As Boolean = False - Private Shared ReadOnly _Instance As frmIndex = Nothing - Dim DropType As String - Private Shared WMDirect As Boolean = False - - Dim sql_history_INSERT_INTO As String - Dim sql_history_Index_Values As String - - Private NewFileString As String - Private CancelAttempts As Integer = 0 + Public vPathFile As String + Private Const LANG_DE = "de-DE" Private Const MaxCancelAttempts = 2 - - Private Property ViewerString As String - - Private Const TEXT_MISSING_INPUT_DE = "Bitte vervollständigen Sie die Eingaben!" - Private Const TEXT_MISSING_INPUT_EN = "Please complete your entries!" - - Private Const TEXT_CHECK_MANUAL_INDEXES_DE = "Die Überprüfung der manuellen Indexe ist fehlerhaft. Bitte informieren Sie Ihrenm Systembetreuer." - Private Const TEXT_CHECK_MANUAL_INDEXES_EN = "There is an error in the validation settings of the manual indexes. Please inform your administrator." - Private Const TEXT_CATCH_BLOCK_DE = "Unvorhergesehener Fehler in {0}: Fehlermeldung {1}" Private Const TEXT_CATCH_BLOCK_EN = "Unexpected Error in {0}: Errormessage {1}" - - Private Const LANG_DE = "de-DE" - - Private Property DocTypes As New List(Of DocType) - - Private ReadOnly _Logger As Logger + Private Const TEXT_CHECK_MANUAL_INDEXES_DE = "Die Überprüfung der manuellen Indexe ist fehlerhaft. Bitte informieren Sie Ihrenm Systembetreuer." + Private Const TEXT_CHECK_MANUAL_INDEXES_EN = "There is an error in the validation settings of the manual indexes. Please inform your administrator." + Private Const TEXT_MISSING_INPUT_DE = "Bitte vervollständigen Sie die Eingaben!" + Private Const TEXT_MISSING_INPUT_EN = "Please complete your entries!" + Private Shared ReadOnly _Instance As frmIndex = Nothing + Private Shared WMDirect As Boolean = False Private ReadOnly _FormHelper As FormHelper + Private ReadOnly _Logger As Logger Private ReadOnly _PostProcessing As ClassPostprocessing - + Private ReadOnly akttxtbox As TextBox + Private CancelAttempts As Integer = 0 + Dim DropType As String + Dim DT_INDEXEMAN As DataTable + Private MULTIFILES As Integer + Private NewFileString As String + Dim sql_history_Index_Values As String + Dim sql_history_INSERT_INTO As String + Private Property DocTypes As New List(Of DocType) + Private Property ViewerString As String #End Region - Public Class DocType - Public Property Guid - Public Property Name - - Public Overrides Function ToString() As String - Return Name - End Function - End Class - Private Sub ShowErrorMessage(Exception As Exception, MethodTitle As String, Optional MoreInfo As String = "") - Dim oMessage As String - Dim oMoreInfo As String = IIf(MoreInfo = "", "", "(" & MoreInfo & ")") - - If USER_LANGUAGE = LANG_DE Then - oMessage = String.Format(TEXT_CATCH_BLOCK_DE, MethodTitle, Exception.Message) & oMoreInfo - Else - oMessage = String.Format(TEXT_CATCH_BLOCK_EN, MethodTitle, Exception.Message) & oMoreInfo - End If - - _Logger.Warn(oMessage) - _Logger.Error(Exception) - - MsgBox(oMessage, MsgBoxStyle.Critical, Text) - End Sub - Public Sub New() ' Dieser Aufruf ist für den Designer erforderlich. InitializeComponent() @@ -90,63 +58,17 @@ Public Class frmIndex _Logger.Debug("frmIndex LookupGridLocalizer initialized ...") End Sub - Public Sub CloseViewer() - If DocumentViewer1 Is Nothing Then - LOGGER.Warn("DocumentViewer is already closed!") - End If + Public Shared Function encode(ByVal str As String) As String + 'supply True as the construction parameter to indicate + 'that you wanted the class to emit BOM (Byte Order Mark) + 'NOTE: this BOM value is the indicator of a UTF-8 string + Dim utf8Encoding As New System.Text.UTF8Encoding(True) + Dim encodedString() As Byte - Try - LOGGER.Debug("Calling CloseDocument on Viewer") - DocumentViewer1.CloseDocument() - Catch ex As Exception - LOGGER.Warn("Calling CloseDocument on Viewer FAILED") - LOGGER.Error(ex) - End Try + encodedString = utf8Encoding.GetBytes(str) - Try - LOGGER.Debug("Calling Done on Viewer") - DocumentViewer1?.Done() - Catch ex As Exception - LOGGER.Warn("Calling Done on Viewer FAILED") - LOGGER.Error(ex) - End Try - End Sub - - Public Sub DisposeViewer() - DocumentViewer1.Dispose() - End Sub - - '#Region "+++++ Allgemeine Funktionen ++++++" - Sub ShowError(text As String) - labelError.Visibility = DevExpress.XtraBars.BarItemVisibility.Always - labelError.Caption = text - End Sub - - Sub ClearError() - labelError.Visibility = DevExpress.XtraBars.BarItemVisibility.Never - labelError.Caption = String.Empty - End Sub - - Sub ShowNotice(text As String) - labelNotice.Visibility = DevExpress.XtraBars.BarItemVisibility.Always - labelNotice.Caption = text - End Sub - - Sub ClearNotice() - labelNotice.Visibility = DevExpress.XtraBars.BarItemVisibility.Never - labelNotice.Caption = String.Empty - End Sub - - Private Sub SetFilePreview(ShowPreview As Boolean) - If ShowPreview Then - SplitContainer1.Panel2Collapsed = False - PreviewFile() - checkItemPreview.Checked = True - Else - SplitContainer1.Panel2Collapsed = True - checkItemPreview.Checked = False - End If - End Sub + Return utf8Encoding.GetString(encodedString) + End Function Sub addLabel(indexname As String, hinweis As String, ylbl As Integer, anz As String) Dim lbl As New Windows.Forms.Label With { @@ -159,205 +81,23 @@ Public Class frmIndex pnlIndex.Controls.Add(lbl) End Sub - Private Sub AddLabelAndControl(labelText As String, ctrl As Control, indexName As String) - - '--- Label vorbereiten ------------------------------------ - Dim lbl As New Windows.Forms.Label With { - .Name = $"lbl_{indexName}", - .Text = labelText, - .AutoSize = True, - .Anchor = AnchorStyles.Left, - .Margin = New Padding(4, 4, 4, 4) - } - - '--- Control vorbereiten ---------------------------------- - ctrl.Anchor = AnchorStyles.Left Or AnchorStyles.Right - ctrl.Margin = New Padding(4, 4, 4, 4) - ctrl.Width = 300 'falls AutoSize=False - ctrl.Dock = DockStyle.Fill - - '--- Zeile dynamisch anlegen ------------------------------ - tlpIndex.RowCount += 1 - tlpIndex.RowStyles.Add(New RowStyle(SizeType.AutoSize)) - - tlpIndex.Controls.Add(lbl, 0, tlpIndex.RowCount - 1) 'Spalte 0 = Label - tlpIndex.Controls.Add(ctrl, 1, tlpIndex.RowCount - 1) 'Spalte 1 = Control - End Sub - - Function Indexwert_checkValueDB(indexname As String, wert As String) + Function Check_HistoryValues(Indexname As String, Dokart As String) As String Try - Dim DR As DataRow - For Each DR In DT_INDEXEMAN.Rows - If DR.Item("NAME") = indexname Then - If DR.Item("SQL_CHECK").ToString <> String.Empty Then - Dim connectionString As String - Dim sql As String - connectionString = DATABASE_ECM.Get_ConnectionStringforID(DR.Item("CONNECTION_ID")) - If connectionString <> "" Then - Dim sqlscalar = DR.Item("SQL_CHECK") - Select Case DR.Item("DATENTYP") - Case ClassConstants.INDEX_TYPE_INTEGER - sqlscalar = sqlscalar.ToString.Replace("@manValue", wert) - Case Else - sqlscalar = sqlscalar.ToString.Replace("@manValue", "'" & wert & "'") - End Select - - sql = sqlscalar - Dim ergebnis As Integer - If DR.Item("SQL_PROVIDER") = "Oracle" Then - - ' ergebnis = ClassDatabase.OracleExecute_Scalar(sql, connectionString) - LOGGER.Warn("Oracle is not supported") - Else - 'MSQL - ergebnis = DATABASE_ECM.GetScalarValueWithConnection(sql, connectionString) - End If - - Select Case ergebnis - Case 1 - Return True - Case 2 - ShowNotice("Indexwert nicht eindeutig: " & sql) - Return False - Case 99 - Return False - End Select - - End If - Else - Return True + Dim result = Nothing + Dim DT As DataTable = MyDataset.TBTEMP_INDEXRESULTS + If DT.Rows.Count > 0 Then + For Each row As DataRow In DT.Rows + If row.Item("Indexname") = Indexname And row.Item("Dokumentart") = Dokart Then + result = row.Item("Value") + Return result End If - - End If - Next - Catch ex As Exception - ShowErrorMessage(ex, "Indexwert_checkValue") - Return False - End Try - End Function - - Function GetManIndex_Value(indexname As String, RequestFor As String, opt As Boolean) - Try - Dim DT As DataTable - Dim DR As DataRow - DT = MyDataset.VWDDINDEX_MAN - For Each DR In DT.Rows - If DR.Item("INDEXNAME").ToString.ToLower = indexname.ToLower Then - If DR.Item("Indexiert") = True Then - _Logger.Info("## Manueller Index: " & indexname) - Select Case RequestFor - Case "FILE" - If DR.Item("Indexwert_File").ToString <> String.Empty Then - _Logger.Info(" >>Es liegt ein separater nachbearbeiteter Wert für die Dateibenennung vor: " & DR.Item("Indexwert_File").ToString) - _Logger.Info(" >>Zurückgegebener NachbearbeitungsWert: " & DR.Item("Indexwert_File")) - Return DR.Item("Indexwert_File") - Else - If DR.Item("Indexwert").ToString <> String.Empty Then - _Logger.Info("Zurückgegebener manueller Indexwert: " & DR.Item("Indexwert")) - Return DR.Item("Indexwert") - Else - If opt = False Then - _Logger.Info("Achtung, der Indexwert des manuellen Indexes '" & indexname & "' ist String.empty!") - ShowNotice("Indexiert = True - Der Index: " & DR.Item("INDEXNAME") & " wurde nicht ordnungsgemäss indexiert! - Automatischer Index konnte nicht gesetzt werden!") - Return Nothing - Else - Return "" - End If - - End If - End If - Case Else - If DR.Item("Indexwert").ToString <> String.Empty Then - _Logger.Info(" >>Zurückgegebener manueller Indexwert: " & DR.Item("Indexwert")) - Return DR.Item("Indexwert") - Else - If opt = False Then - _Logger.Info("Achtung, der Indexwert des manuellen Indexes '" & indexname & "' ist String.empty!") - ShowNotice("Indexiert = True - Der Index: " & DR.Item("INDEXNAME") & " wurde nicht ordnungsgemäss indexiert! - Automatischer Index konnte nicht gesetzt werden!") - Return Nothing - Else - Return "" - End If - End If - End Select - Else - ShowNotice("Der Index: " & DR.Item("INDEXNAME") & " wurde nicht ordnungsgemäss indexiert! - Automatischer Index konnte nicht gesetzt werden!") - Return Nothing - End If - Exit For - End If - Next - Catch ex As Exception - ShowErrorMessage(ex, "GetManIndex_Value") - Return Nothing - End Try - End Function - Function GetAutoIndex_Value(indexname As String) - Try - Dim oDataTable As DataTable - - oDataTable = MyDataset.VWDDINDEX_AUTOM - For Each oDataRow As DataRow In oDataTable.Rows - If oDataRow.Item("INDEXNAME").ToString.ToLower = indexname.ToLower Then - Dim oIndexWert = oDataRow.Item("Indexwert") - Dim oIsIndexed = oDataRow.Item("Indexiert") - - If oIsIndexed = True Then - If oIndexWert.ToString <> String.Empty Then - oIndexWert = oIndexWert.ToString - - ' If Index is a vectorfield (read: Value contains the VECTORSEPARATOR character), use the first value - If oIndexWert.Contains(ClassConstants.VECTORSEPARATOR) Then - Return oIndexWert.ToString.Split(ClassConstants.VECTORSEPARATOR).FirstOrDefault() - Else - ' Else just return the normal value - Return oIndexWert - End If - Else - ShowNotice("Der Automatische Index: " & oDataRow.Item("INDEXNAME") & " wurde nicht ordnungsgemäss indexiert!") - Return "" - End If - Else - ShowNotice("Der Automatische Index: " & oDataRow.Item("INDEXNAME") & " wurde nicht ordnungsgemäss indexiert!") - Return "" - End If - Exit For - End If - Next - Catch ex As Exception - ShowErrorMessage(ex, "GetAutoIndex_Value") - Return "" - End Try - End Function - - Function GetAutomaticIndexSQLValue(SQLCommand As String, vconnectionID As Integer, vProvider As String) As String - Try - Dim oConnectionString As String - oConnectionString = DATABASE_ECM.Get_ConnectionStringforID(vconnectionID) - If oConnectionString <> "" Then - 'NEU - Dim oErgebnis - 'Welcher Provider? - If vProvider.ToLower = "oracle" Then - LOGGER.Warn("Oracle Database Queries are not supported") - Else 'im Moment nur SQL-Server - oErgebnis = DATABASE_ECM.GetScalarValueWithConnection(SQLCommand, oConnectionString) - End If - - If LogErrorsOnly = False Then - _Logger.Info(" >>SQL-ConnectionString: " & oConnectionString.Substring(0, oConnectionString.LastIndexOf("="))) - End If - - If oErgebnis Is Nothing Then - Return "" - Else - Return oErgebnis - End If + Next + Else + Return Nothing End If - Catch ex As Exception - ShowErrorMessage(ex, "GetAutomaticIndexSQLValue") - Return "" + ShowErrorMessage(ex, "Check_HistoryValues") + Return Nothing End Try End Function @@ -512,6 +252,348 @@ Public Class frmIndex End Try End Function + Sub ClearError() + labelError.Visibility = DevExpress.XtraBars.BarItemVisibility.Never + labelError.Caption = String.Empty + End Sub + + Sub ClearNotice() + labelNotice.Visibility = DevExpress.XtraBars.BarItemVisibility.Never + labelNotice.Caption = String.Empty + End Sub + + Public Sub CloseViewer() + If DocumentViewer1 Is Nothing Then + LOGGER.Warn("DocumentViewer is already closed!") + End If + + Try + LOGGER.Debug("Calling CloseDocument on Viewer") + DocumentViewer1.CloseDocument() + Catch ex As Exception + LOGGER.Warn("Calling CloseDocument on Viewer FAILED") + LOGGER.Error(ex) + End Try + + Try + LOGGER.Debug("Calling Done on Viewer") + DocumentViewer1?.Done() + Catch ex As Exception + LOGGER.Warn("Calling Done on Viewer FAILED") + LOGGER.Error(ex) + End Try + End Sub + + Public Sub DisposeViewer() + DocumentViewer1.Dispose() + End Sub + + Function FillIndexe_Autom(dokart_id As Integer) As Boolean + Try + VWINDEX_AUTOMTableAdapter.Fill(MyDataset.VWDDINDEX_AUTOM, dokart_id) + Dim oDatatable = MyDataset.VWDDINDEX_AUTOM + Dim placeholderRegex As New Regex("\[%{1}[a-zA-Z0-9\!\$\&\/\(\)\=\?\,\.\-\;\:_öÖüÜäÄ\#\'\+\*\~\{\}\@\€\<\>\ ]+]{1}") + + If oDatatable.Rows.Count = 0 Then Return True + + For Each oRow As DataRow In oDatatable + Dim indexName = oRow.Item("INDEXNAME").ToString + _Logger.Info($"Working on AutomaticIndex: {indexName}...") + + Dim sql = oRow.ItemEx("SQL_RESULT", "") + Dim sqlActive = oRow.ItemEx("SQL_ACTIVE", False) + Dim connId = oRow.ItemEx("CONNECTION_ID", -1) + Dim provider = oRow.ItemEx("SQL_PROVIDER", "") + Dim value = oRow.ItemEx("VALUE", "") + Dim endResult As New List(Of String) + + ' #### Fall: Kein SQL oder SQL ist nicht aktiv + If String.IsNullOrWhiteSpace(sql) OrElse Not sqlActive Then + Dim resolved = GetPlaceholderValue(value, CURRENT_WORKFILE, USER_SHORTNAME) + oRow("Indexiert") = True + oRow("Indexwert") = If(resolved, value) + Continue For + End If + + ' #### Fall: SQL aktiv – einfache Platzhalter ersetzen + Dim matches = placeholderRegex.Matches(sql) + + For Each match As Match In matches + Dim ph = StripPlaceholder(match.Value) + Dim resolvedPH = GetPlaceholderValue(ph, CURRENT_WORKFILE, USER_SHORTNAME) + If Not String.IsNullOrWhiteSpace(resolvedPH) Then + sql = sql.Replace(match.Value, resolvedPH) + Continue For + End If + + Dim isOptional = DATABASE_ECM.GetScalarValue($"SELECT OPTIONAL FROM TBDD_INDEX_MAN WHERE DOK_ID = {dokart_id} AND UPPER(NAME) = UPPER('{ph}')") + Dim manIndex = GetManIndex_Value(ph, "IDX_AUTO", isOptional) + + If Not String.IsNullOrWhiteSpace(manIndex) AndAlso Not manIndex.Contains(ClassConstants.VECTORSEPARATOR) Then + sql = sql.Replace(match.Value, manIndex) + End If + Next + + ' #### Platzhalter durch Umgebungsvariablen ersetzen + sql = ClassPatterns.ReplaceControlValues(sql, pnlIndex) + sql = ClassPatterns.ReplaceInternalValues(sql) + sql = ClassPatterns.ReplaceUserValues(sql, USER_PRENAME, USER_SURNAME, USER_SHORTNAME, USER_LANGUAGE, USER_EMAIL, USER_ID, dokart_id) + + If Not String.IsNullOrWhiteSpace(sql) Then _Logger.Debug("SQL after Replace: " & sql) + + ' #### Fall: Vektor-Platzhalter oder Vektor-Index + If placeholderRegex.Matches(sql).Count > 0 OrElse indexName.Contains("Vektor") Then + Try + Dim connString = DATABASE_ECM.Get_ConnectionStringforID(connId) + Dim resultDT = DATABASE_ECM.GetDatatableWithConnection(sql, connString) + + If resultDT IsNot Nothing Then + For Each resultRow As DataRow In resultDT.Rows + endResult.Add(resultRow.Item(0).ToString()) + Next + + If endResult.Count > 0 Then + oRow("Indexiert") = True + oRow("Indexwert") = String.Join(ClassConstants.VECTORSEPARATOR, endResult) + End If + End If + Catch ex As Exception + ShowErrorMessage(ex, $"FillIndexe_Autom - Vektorfield [{indexName}]") + End Try + Else + ' #### Fall: Nur einfacher SQL ohne Vektor + Dim result = GetAutomaticIndexSQLValue(sql, connId, provider) + _Logger.Info($"Got simple SQLResult: {result}") + oRow("Indexiert") = True + oRow("Indexwert") = result + End If + Next + + Return True + Catch ex As Exception + ShowErrorMessage(ex, "FillIndexe_Autom") + Return False + End Try + End Function + + Function GetAutoIndex_Value(indexname As String) + Try + Dim oDataTable As DataTable + + oDataTable = MyDataset.VWDDINDEX_AUTOM + For Each oDataRow As DataRow In oDataTable.Rows + If oDataRow.Item("INDEXNAME").ToString.ToLower = indexname.ToLower Then + Dim oIndexWert = oDataRow.Item("Indexwert") + Dim oIsIndexed = oDataRow.Item("Indexiert") + + If oIsIndexed = True Then + If oIndexWert.ToString <> String.Empty Then + oIndexWert = oIndexWert.ToString + + ' If Index is a vectorfield (read: Value contains the VECTORSEPARATOR character), use the first value + If oIndexWert.Contains(ClassConstants.VECTORSEPARATOR) Then + Return oIndexWert.ToString.Split(ClassConstants.VECTORSEPARATOR).FirstOrDefault() + Else + ' Else just return the normal value + Return oIndexWert + End If + Else + ShowNotice("Der Automatische Index: " & oDataRow.Item("INDEXNAME") & " wurde nicht ordnungsgemäss indexiert!") + Return "" + End If + Else + ShowNotice("Der Automatische Index: " & oDataRow.Item("INDEXNAME") & " wurde nicht ordnungsgemäss indexiert!") + Return "" + End If + Exit For + End If + Next + Catch ex As Exception + ShowErrorMessage(ex, "GetAutoIndex_Value") + Return "" + End Try + End Function + + Function GetAutomaticIndexSQLValue(SQLCommand As String, vconnectionID As Integer, vProvider As String) As String + Try + Dim oConnectionString As String + oConnectionString = DATABASE_ECM.Get_ConnectionStringforID(vconnectionID) + If oConnectionString <> "" Then + 'NEU + Dim oErgebnis + 'Welcher Provider? + If vProvider.ToLower = "oracle" Then + LOGGER.Warn("Oracle Database Queries are not supported") + Else 'im Moment nur SQL-Server + oErgebnis = DATABASE_ECM.GetScalarValueWithConnection(SQLCommand, oConnectionString) + End If + + If LogErrorsOnly = False Then + _Logger.Info(" >>SQL-ConnectionString: " & oConnectionString.Substring(0, oConnectionString.LastIndexOf("="))) + End If + + If oErgebnis Is Nothing Then + Return "" + Else + Return oErgebnis + End If + End If + Catch ex As Exception + ShowErrorMessage(ex, "GetAutomaticIndexSQLValue") + Return "" + End Try + End Function + + Function GetManIndex_Value(indexname As String, RequestFor As String, opt As Boolean) + Try + Dim DT As DataTable + Dim DR As DataRow + DT = MyDataset.VWDDINDEX_MAN + For Each DR In DT.Rows + If DR.Item("INDEXNAME").ToString.ToLower = indexname.ToLower Then + If DR.Item("Indexiert") = True Then + _Logger.Info("## Manueller Index: " & indexname) + Select Case RequestFor + Case "FILE" + If DR.Item("Indexwert_File").ToString <> String.Empty Then + _Logger.Info(" >>Es liegt ein separater nachbearbeiteter Wert für die Dateibenennung vor: " & DR.Item("Indexwert_File").ToString) + _Logger.Info(" >>Zurückgegebener NachbearbeitungsWert: " & DR.Item("Indexwert_File")) + Return DR.Item("Indexwert_File") + Else + If DR.Item("Indexwert").ToString <> String.Empty Then + _Logger.Info("Zurückgegebener manueller Indexwert: " & DR.Item("Indexwert")) + Return DR.Item("Indexwert") + Else + If opt = False Then + _Logger.Info("Achtung, der Indexwert des manuellen Indexes '" & indexname & "' ist String.empty!") + ShowNotice("Indexiert = True - Der Index: " & DR.Item("INDEXNAME") & " wurde nicht ordnungsgemäss indexiert! - Automatischer Index konnte nicht gesetzt werden!") + Return Nothing + Else + Return "" + End If + + End If + End If + Case Else + If DR.Item("Indexwert").ToString <> String.Empty Then + _Logger.Info(" >>Zurückgegebener manueller Indexwert: " & DR.Item("Indexwert")) + Return DR.Item("Indexwert") + Else + If opt = False Then + _Logger.Info("Achtung, der Indexwert des manuellen Indexes '" & indexname & "' ist String.empty!") + ShowNotice("Indexiert = True - Der Index: " & DR.Item("INDEXNAME") & " wurde nicht ordnungsgemäss indexiert! - Automatischer Index konnte nicht gesetzt werden!") + Return Nothing + Else + Return "" + End If + End If + End Select + Else + ShowNotice("Der Index: " & DR.Item("INDEXNAME") & " wurde nicht ordnungsgemäss indexiert! - Automatischer Index konnte nicht gesetzt werden!") + Return Nothing + End If + Exit For + End If + Next + Catch ex As Exception + ShowErrorMessage(ex, "GetManIndex_Value") + Return Nothing + End Try + End Function + + Function GetPlaceholderValue(InputValue As String, FileName As String, UserShortName As String) As String + Dim oResult As String + + Try + Select Case InputValue.ToString.ToUpper + Case "$filename_ext".ToUpper + oResult = Path.GetFileName(FileName) + Case "$filename".ToUpper + oResult = Path.GetFileNameWithoutExtension(FileName) + Case "$extension".ToUpper + oResult = Path.GetExtension(FileName).Replace(".", "") + Case "$FileCreateDate".ToUpper + Dim oFileInfo As New FileInfo(FileName) + Dim oCreationDate As Date = oFileInfo.CreationTime + oResult = oCreationDate.ToShortDateString + Case "$FileCreatedWho".ToUpper + + Dim fileInfo As FileInfo = New FileInfo(FileName) + Dim fileSecurity As FileSecurity = fileInfo.GetAccessControl() + + ' Ersteller auslesen + Dim oOwner As System.Security.Principal.NTAccount = DirectCast(fileSecurity.GetOwner(GetType(System.Security.Principal.NTAccount)), System.Security.Principal.NTAccount) + oResult = oOwner.Value + Case "$DateDDMMYYY".ToUpper + oResult = System.DateTime.Now.ToShortDateString + Case "$Username".ToUpper + oResult = Environment.UserName + Case "$Usercode".ToUpper + oResult = UserShortName + Case Else + oResult = InputValue + End Select + Catch ex As Exception + _Logger.Warn("Error in ReplacePlaceholders: " & ex.Message) + _Logger.Error(ex.Message) + oResult = Nothing + End Try + + Return oResult + End Function + + Function Indexwert_checkValueDB(indexname As String, wert As String) + Try + Dim DR As DataRow + For Each DR In DT_INDEXEMAN.Rows + If DR.Item("NAME") = indexname Then + If DR.Item("SQL_CHECK").ToString <> String.Empty Then + Dim connectionString As String + Dim sql As String + connectionString = DATABASE_ECM.Get_ConnectionStringforID(DR.Item("CONNECTION_ID")) + If connectionString <> "" Then + Dim sqlscalar = DR.Item("SQL_CHECK") + Select Case DR.Item("DATENTYP") + Case ClassConstants.INDEX_TYPE_INTEGER + sqlscalar = sqlscalar.ToString.Replace("@manValue", wert) + Case Else + sqlscalar = sqlscalar.ToString.Replace("@manValue", "'" & wert & "'") + End Select + + sql = sqlscalar + Dim ergebnis As Integer + If DR.Item("SQL_PROVIDER") = "Oracle" Then + + ' ergebnis = ClassDatabase.OracleExecute_Scalar(sql, connectionString) + LOGGER.Warn("Oracle is not supported") + Else + 'MSQL + ergebnis = DATABASE_ECM.GetScalarValueWithConnection(sql, connectionString) + End If + + Select Case ergebnis + Case 1 + Return True + Case 2 + ShowNotice("Indexwert nicht eindeutig: " & sql) + Return False + Case 99 + Return False + End Select + + End If + Else + Return True + End If + + End If + Next + Catch ex As Exception + ShowErrorMessage(ex, "Indexwert_checkValue") + Return False + End Try + End Function + Sub Indexwert_Postprocessing(indexname As String, wert_in As String) Try Dim DT As DataTable @@ -553,6 +635,70 @@ Public Class frmIndex End Try End Sub + Sub Load_String() + Try + Me.VWDDINDEX_MANTableAdapter.Connection.ConnectionString = MyConnectionString + Me.VWINDEX_AUTOMTableAdapter.Connection.ConnectionString = MyConnectionString + Catch ex As Exception + _Logger.Warn(" - Unexpected error in Speichern der Verbindung - Fehler: " & vbNewLine & ex.Message) + _Logger.Error(ex.Message) + MsgBox("Unexpected error in Speichern der Verbindung: " & vbNewLine & ex.Message, MsgBoxStyle.Exclamation) + End Try + End Sub + + Function Move_Rename_Only(Quelle As String, _NewFilename As String, extension As String, _versionTz As String) + 'Überprüfen ob File existiert + If File.Exists(_NewFilename) = False Then + CURRENT_NEWFILENAME = _NewFilename + Else + 'Versionieren + Dim version As Integer = 1 + Dim Stammname As String = _NewFilename + Dim neuername As String = _NewFilename + Do While File.Exists(neuername) + version += 1 + neuername = Stammname.Replace(extension, "") & _versionTz & version & extension + CURRENT_NEWFILENAME = neuername + Loop + End If + + 'Die Datei wird nun an den neuen Ort kopiert + My.Computer.FileSystem.MoveFile(CURRENT_WORKFILE, CURRENT_NEWFILENAME) + + Dim Insert_String As String + Try + Dim oCurrentWorkfile = CURRENT_WORKFILE.Replace("'", "''") + Dim oCurrentNewFilename = CURRENT_NEWFILENAME.Replace("'", "''") + Dim oUser As String = $"{Environment.UserDomainName}\{Environment.UserName}" + + Insert_String = sql_history_INSERT_INTO & $",ADDED_WHO, ADDED_WHERE, FILE_HASH) VALUES ('{oCurrentWorkfile}','{oCurrentNewFilename}'{sql_history_Index_Values},'{oUser}','{Environment.MachineName}','{CURRENT_WORKFILE_HASH}')" + If DATABASE_ECM.ExecuteNonQuery(Insert_String) = True Then + If CURRENT_MESSAGEID <> "" Then + Dim max As String = "SELECT MAX(GUID) FROM TBGI_HISTORY" + Dim GUID = DATABASE_ECM.GetScalarValue(max) + Try + If GUID > 0 Then + Dim sql As String + If CURRENT_ISATTACHMENT = True Then + sql = "Update TBGI_HISTORY SET ATTACHMENT = 1, MSG_ID = '" & CURRENT_MESSAGEID & "' WHERE GUID = " & GUID + DATABASE_ECM.GetScalarValue(sql) + Else + sql = "Update TBGI_HISTORY SET ATTACHMENT = 0, MSG_ID = '" & CURRENT_MESSAGEID & "' WHERE GUID = " & GUID + DATABASE_ECM.GetScalarValue(sql) + End If + End If + Catch ex As Exception + + End Try + End If + End If + Return False + Catch ex As Exception + ShowErrorMessage(ex, "Move_Rename_Only") + Return True + End Try + End Function + Function Name_Generieren() Try _Logger.Debug("#### Name_Generieren ####") @@ -739,7 +885,6 @@ Public Class frmIndex Else Return False End If - Catch ex As Exception ShowErrorMessage(ex, "Name_Generieren") Return False @@ -747,6 +892,1408 @@ Public Class frmIndex End Function + Sub PreviewFile() + Try + DocumentViewer1.LoadFile(CURRENT_WORKFILE) + Catch ex As Exception + ShowErrorMessage(ex, "PreviewFile") + End Try + End Sub + + Sub Refresh_Dokart() + Try + Dim sql = String.Format("SELECT DISTINCT DOCTYPE_ID, DOCTYPE, SEQUENCE FROM VWGI_DOCTYPE where USERNAME = '{0}' ORDER BY SEQUENCE", Environment.UserName) + _Logger.Info("SQL DoctypeList: " & sql) + Dim oDoctypes = DATABASE_ECM.GetDatatable(sql) + + ComboboxDoctype.EditValue = Nothing + ComboboxDoctype.Properties.DataSource = Nothing + + DocTypes.Clear() + For Each oRow As DataRow In oDoctypes.Rows + Dim oDocType = New DocType With { + .Guid = oRow.Item("DOCTYPE_ID"), + .Name = oRow.Item("DOCTYPE") + } + DocTypes.Add(oDocType) + Next + + ComboboxDoctype.Properties.DataSource = DocTypes + Catch ex As Exception + ShowErrorMessage(ex, "Refresh_Dokart") + End Try + End Sub + + '#Region "+++++ Allgemeine Funktionen ++++++" + Sub ShowError(text As String) + labelError.Visibility = DevExpress.XtraBars.BarItemVisibility.Always + labelError.Caption = text + End Sub + + Sub ShowNotice(text As String) + labelNotice.Visibility = DevExpress.XtraBars.BarItemVisibility.Always + labelNotice.Caption = text + End Sub + + Function StripPlaceholder(Placeholder As String) As String + Dim oResult = Placeholder + oResult = Regex.Replace(oResult, "^\[%", "") + oResult = Regex.Replace(oResult, "\]$", "") + Return oResult + End Function + + Public Function TextStringToByteArray(ByRef str As String) As Byte() + Dim enc As System.Text.Encoding = Encoding.GetEncoding(65001) + + Return enc.GetBytes(str) + End Function + + Private Sub AddLabelAndControl(labelText As String, ctrl As Control, indexName As String) + + '--- Label vorbereiten ------------------------------------ + Dim lbl As New Windows.Forms.Label With { + .Name = $"lbl_{indexName}", + .Text = labelText, + .AutoSize = True, + .Anchor = AnchorStyles.Left, + .Margin = New Padding(4, 4, 4, 4) + } + + '--- Control vorbereiten ---------------------------------- + ctrl.Anchor = AnchorStyles.Left Or AnchorStyles.Right + ctrl.Margin = New Padding(4, 4, 4, 4) + ctrl.Width = 300 'falls AutoSize=False + ctrl.Dock = DockStyle.Fill + + '--- Zeile dynamisch anlegen ------------------------------ + tlpIndex.RowCount += 1 + tlpIndex.RowStyles.Add(New RowStyle(SizeType.AutoSize)) + + tlpIndex.Controls.Add(lbl, 0, tlpIndex.RowCount - 1) 'Spalte 0 = Label + tlpIndex.Controls.Add(ctrl, 1, tlpIndex.RowCount - 1) 'Spalte 1 = Control + End Sub + + Private Sub BarButtonItem_OK_ItemClick(sender As Object, e As DevExpress.XtraBars.ItemClickEventArgs) Handles BarButtonItem_OK.ItemClick + Try + ClearError() + ClearNotice() + + Me.Cursor = Cursors.WaitCursor + CURRENT_DT_REGEX = DATABASE_ECM.GetDatatable("SELECT * FROM TBGI_FUNCTION_REGEX") + For Each rowregex As DataRow In CURRENT_DT_REGEX.Rows + If rowregex.Item("FUNCTION_NAME") = "CLEAN_FILENAME" Then + REGEX_CLEAN_FILENAME = rowregex.Item("REGEX") + End If + Next + If BarCheckItem_MultiIndexing.Checked = True Then + 'Die erste Datei indexieren + If WORK_FILE() = True Then + 'Und nun die folgenden + Dim DTFiles2Work As DataTable = DATABASE_ECM.GetDatatable("SELECT * FROM TBGI_FILES_USER WHERE WORKED = 0 AND GUID <> " & CURRENT_WORKFILE_GUID & " AND UPPER(USER@WORK) = UPPER('" & Environment.UserName & "')") + If DTFiles2Work IsNot Nothing Then + Dim err = False + For Each oRow As DataRow In DTFiles2Work.Rows + CURRENT_WORKFILE_GUID = oRow.Item("GUID") + CURRENT_WORKFILE = oRow.Item("FILENAME2WORK") + CURRENT_WORKFILE_HASH = oRow.ItemEx("FILE_HASH", "") + DropType = oRow.Item("HANDLE_TYPE") + + If WORK_FILE() = False Then + err = True + Exit For + End If + Next + Me.Cursor = Cursors.Default + If err = False Then + If USER_LANGUAGE = LANG_DE Then + MsgBox("Alle Dateien wurden mit Multiindexing erfolgreich verarbeitet!", MsgBoxStyle.Information, "Erfolgsmeldung:") + Else + MsgBox("All files were successfully processed through Multiindexing", MsgBoxStyle.Information, "Success") + End If + + CloseViewer() + + CancelAttempts = 2 + Me.Close() + End If + End If + End If + Else + If WORK_FILE() = True Then + Me.Cursor = Cursors.Default + If CONFIG.Config.ShowIndexResult = True Then + If USER_LANGUAGE = LANG_DE Then + _FormHelper.ShowSuccessMessage($"Die Datei wurde erfolgreich verarbeitet!{vbNewLine}Ablagepfad:{vbNewLine}{CURRENT_NEWFILENAME}", "Erfolgsmeldung") + Else + _FormHelper.ShowSuccessMessage($"File sucessfully processed!{vbNewLine}Path:{vbNewLine}{CURRENT_NEWFILENAME}", "Success") + End If + + End If + + CloseViewer() + + CancelAttempts = 2 + Me.Close() + End If + End If + Catch ex As Exception + MsgBox("Uncaught error while indexing: " & vbNewLine & ex.Message, MsgBoxStyle.Critical, Text) + Finally + Me.Cursor = Cursors.Default + End Try + End Sub + + Private Sub BarButtonItem1_ItemClick(sender As Object, e As DevExpress.XtraBars.ItemClickEventArgs) Handles BarButtonItem1.ItemClick + DATABASE_ECM.ExecuteNonQuery($"DELETE FROM TBGI_FILES_USER WHERE GUID = {CURRENT_WORKFILE_GUID}") + + CancelAttempts = 2 + Close() + End Sub + + Private Sub BarButtonItem2_ItemClick(sender As Object, e As DevExpress.XtraBars.ItemClickEventArgs) Handles BarButtonItem2.ItemClick + Try + MsgBox($"Deleting [{CURRENT_WORKFILE}]", MsgBoxStyle.Information, Text) + + File.SetAttributes(CURRENT_WORKFILE, FileAttributes.Normal) + File.Delete(CURRENT_WORKFILE) + Catch ex As Exception + _Logger.Error(ex) + MsgBox(ex.Message) + End Try + End Sub + + Private Sub BarCheckItem_MultiIndexing_CheckedChanged(sender As Object, e As DevExpress.XtraBars.ItemClickEventArgs) Handles BarCheckItem_MultiIndexing.CheckedChanged + Dim item As DevExpress.XtraBars.BarCheckItem = CType(sender, DevExpress.XtraBars.BarCheckItem) + If item.Checked Then + BarButtonItem1.Enabled = False + MULTIINDEXING_ACTIVE = True + If USER_LANGUAGE = LANG_DE Then + Me.BarButtonItem_OK.Caption = "Dateien indexieren" + Else + Me.BarButtonItem_OK.Caption = "Index Files" + End If + Else + BarButtonItem1.Enabled = True + MULTIINDEXING_ACTIVE = False + If USER_LANGUAGE = LANG_DE Then + Me.BarButtonItem_OK.Caption = "Datei indexieren" + Else + Me.BarButtonItem_OK.Caption = "Index File" + End If + End If + End Sub + + Private Sub BarCheckItem1_CheckedChanged(sender As Object, e As DevExpress.XtraBars.ItemClickEventArgs) Handles checkItemTopMost.CheckedChanged + If FormLoaded = True Then + TopMost = checkItemTopMost.Checked + CONFIG.Config.TopMost = checkItemTopMost.Checked + CONFIG.Save() + End If + End Sub + + Private Sub btnVorschau_Click(sender As System.Object, e As System.EventArgs) + PreviewFile() + End Sub + + Private Sub Button1_Click(sender As Object, e As EventArgs) + If File.Exists(CURRENT_FILENAME) Then + Select Case CancelAttempts + Case 0 + If USER_LANGUAGE = LANG_DE Then + MsgBox("Bitte indexieren Sie die Datei vollständig!" & vbNewLine & "(Abbruch 1 des Indexierungsvorgangs)", MsgBoxStyle.Information) + Else + MsgBox("Please Index file completely" & vbNewLine & "(Abort 1 of Indexdialog)", MsgBoxStyle.Information) + End If + CancelAttempts += 1 + Case 1 + Dim result As MsgBoxResult + If USER_LANGUAGE = LANG_DE Then + result = MessageBox.Show("Sie brechen nun zum zweiten Mal den Indexierungsvorgang ab!" & vbNewLine & "Wollen Sie die Indexierung aller Dateien abbrechen?", "Bestätigung erforderlich:", MessageBoxButtons.YesNo, MessageBoxIcon.Question) + Else + result = MessageBox.Show("You are aborting the indexdialog for the 2nd time!" & vbNewLine & "Do You want to abort indexing?", "Confirmation needed:", MessageBoxButtons.YesNo, MessageBoxIcon.Question) + End If + + If result = MsgBoxResult.Yes Then + Dim containsfw_file As Boolean = False + Try + ABORT_INDEXING = True + Dim sql As String = "SELECT * FROM TBGI_FILES_USER WHERE WORKED = 0 AND UPPER(USER@WORK) = UPPER('" & Environment.UserName & "')" + + Dim DT As DataTable = DATABASE_ECM.GetDatatable(sql) + + Dim anz = DT.Rows.Count + For Each Filerow As DataRow In DT.Rows + Dim filestring As String = Filerow.Item("FILENAME2WORK") + Dim handletype As String = Filerow.Item("HANDLE_TYPE") + + If handletype = "|MSGONLY|" Or handletype = "|ATTMNTEXTRACTED|" Then + Try + System.IO.File.Delete(filestring) + Catch ex As Exception + + End Try + + ElseIf handletype.StartsWith("|FW") Then + containsfw_file = True + End If + Next + 'Zuerst die Daten des Ablaufs löschen + If DATABASE_ECM.ExecuteNonQuery("DELETE FROM TBGI_FILES_USER WHERE UPPER(USER@WORK) = UPPER('" & Environment.UserName & "')") = True Then + If containsfw_file = True Then + If USER_LANGUAGE = LANG_DE Then + MsgBox("Der Indexierungsprozess beinhaltete (auch) Dateien per Folderwatch!" & vbNewLine & "Diese Dateien wurden nicht gelöscht und verbleiben im Folderwatch-Verzeichnis!" & vbNewLine & "Bitte verschieben Sie die Dateien ggfls.", MsgBoxStyle.Information, "Achtung - Hinweis:") + Else + MsgBox("The Indexingprocess contained (also) files from folderwatch!" & vbNewLine & "These files weren't deleted and will stay in the folderwatch-folder!" & vbNewLine & "Please move these files manually.", MsgBoxStyle.Information, "Achtung - Hinweis:") + End If + + End If + End If + Catch ex As Exception + _Logger.Error(ex) + MsgBox("Unexpected Error in Abort Indexing: " & vbNewLine & ex.Message, MsgBoxStyle.Critical) + End Try + + Close() + End If + End Select + End If + End Sub + + Private Sub checkItemDeleteSource_CheckedChanged(sender As Object, e As DevExpress.XtraBars.ItemClickEventArgs) Handles checkItemDeleteSource.CheckedChanged + If FormLoaded = True And checkItemDeleteSource.Visibility <> DevExpress.XtraBars.BarItemVisibility.Never Then + CURR_DELETE_ORIGIN = checkItemDeleteSource.Checked + CONFIG.Config.DeleteOriginalFile = checkItemDeleteSource.Checked + CONFIG.Save() + End If + End Sub + + Private Sub checkItemPreselection_CheckedChanged(sender As Object, e As DevExpress.XtraBars.ItemClickEventArgs) Handles checkItemPreselection.CheckedChanged + CONFIG.Config.ProfilePreselection = checkItemPreselection.Checked + CONFIG.Save() + End Sub + + Private Sub checkItemPreview_CheckedChanged(sender As Object, e As DevExpress.XtraBars.ItemClickEventArgs) Handles checkItemPreview.CheckedChanged + SetFilePreview(checkItemPreview.Checked) + CONFIG.Config.FilePreview = checkItemPreview.Checked + CONFIG.Save() + End Sub + + Private Sub ComboboxDoctype_KeyUp(sender As Object, e As KeyEventArgs) Handles ComboboxDoctype.KeyUp + If e.KeyCode = Keys.F2 Then + Dim oCombo As SearchLookUpEdit = sender + oCombo.ShowPopup() + End If + End Sub + + Private Sub ComboBoxEdit1_SelectedIndexChanged(sender As Object, e As EventArgs) Handles ComboboxDoctype.EditValueChanged + If ComboboxDoctype.EditValue IsNot Nothing And FormLoaded = True Then + + WINDREAM = New Windream(LOGCONFIG, False, WMDrive, WINDREAM_BASEPATH, True, "", "", "", "") + If Not IsNothing(WINDREAM) Then + If WINDREAM.SessionLoggedin Then + + Dim oSelectedItem As DocType = ComboboxDoctype.EditValue + + CURRENT_DOKART_ID = oSelectedItem.Guid + CURRENT_LASTDOKART = oSelectedItem.Name + + ClearNotice() + + ClearError() + + pnlIndex.Controls.Clear() + Dim sql As String = "Select WINDREAM_DIRECT, ZIEL_PFAD, DUPLICATE_HANDLING from TBDD_DOKUMENTART WHERE GUID = " & oSelectedItem.Guid + Dim oDoctypes As DataTable = DATABASE_ECM.GetDatatable(sql) + + Dim oDocType As DataRow = oDoctypes.Rows.Item(0) + WMDirect = oDocType.Item("WINDREAM_DIRECT") + Dim oDestination As String = oDocType.Item("ZIEL_PFAD") + Dim oNewDestination As String + If WMDirect Then + Dim oNormalized As String = WINDREAM.GetNormalizedPath(oDestination, False) + oNewDestination = Path.Combine(WINDREAM.ClientBasePath, oNormalized) + Else + oNewDestination = oDestination + End If + + LOGGER.Debug("Path from Database is [{0}]", oDestination) + LOGGER.Debug("Checking for path [{0}]", oNewDestination) + Dim oPathExists As Boolean + If WMDirect Then + oPathExists = WINDREAM.TestFolderExists(oNewDestination) + Else + oPathExists = Directory.Exists(oNewDestination) + End If + + If oPathExists = False Then + Dim oMessage As String + + If USER_LANGUAGE = "de-DE" Then + oMessage = $"Der Pfad für das ausgewählte Profil ist nicht erreichbar:{vbNewLine}[{oNewDestination}].{vbNewLine}{vbNewLine}Bitte wählen Sie ein anderes Profil." + Else + oMessage = $"Profile Path is not available:{vbNewLine}[{oNewDestination}].{vbNewLine}{vbNewLine}Please select another profile." + End If + + MsgBox(oMessage, MsgBoxStyle.Information, Text) + ComboboxDoctype.EditValue = Nothing + Else + + CURRENT_DOKART_DUPLICATE_HANDLING = oDocType.Item("DUPLICATE_HANDLING") + Refresh_IndexeMan(oSelectedItem.Guid) + End If + Else + MsgBox("Es konnte keine Session aufgebaut werden.") + End If + Else + MsgBox("Es konnte keine Windream-Verbindung aufgebaut werden.") + End If + End If + End Sub + + Private Function CreateFolderForIndex(DynamicFolderConfig As String) + Try + Dim oRootFolder As String = Path.GetDirectoryName(CURRENT_NEWFILENAME) + + If DynamicFolderConfig <> String.Empty Then + '###### + Dim oRegexString As String = "\[%{1}[a-zA-Z0-9\!\$\&\/\(\)\=\?\,\.\-\;\:_öÖüÜäÄ\#\'\+\*\~\{\}\@\€\<\>\ ]+]{1}" + ' einen Regulären Ausdruck laden + Dim oRegex As Regex = New Regex(oRegexString) + ' die Vorkommen im Folder-String auslesen + Dim oMatches As MatchCollection = oRegex.Matches(DynamicFolderConfig) + '#### + + ' alle Vorkommen innerhalb des Ordnerstrings durchlaufen + For Each oMatch As Match In oMatches + _Logger.Info("Elementname in FolderString: '" & oMatch.ToString & "'") + Select Case oMatch.Value.Substring(2, 1).ToUpper + + 'Manueller Indexwert + Case "M" + Dim oManIndexName = oMatch.Value.Substring(3, oMatch.Value.Length - 4) + Dim oIsOptional As Boolean = DATABASE_ECM.GetScalarValue("SELECT OPTIONAL FROM TBDD_INDEX_MAN WHERE DOK_ID = " & CURRENT_DOKART_ID & " AND UPPER(NAME) = UPPER('" & oManIndexName & "')") + _Logger.Info("Versuch den Indexwert aus '" & oManIndexName & "' auszulesen.") + Dim oManIndexValue As String = GetManIndex_Value(oManIndexName, "FILE", oIsOptional) + _Logger.Info("Ergebnis/Wert für neuen Ordner: '" & oManIndexName & "'") + If Not oManIndexValue = String.Empty Then + If IsDate(oManIndexValue) Then + oManIndexValue = CDate(oManIndexValue).ToString("yyyyMMdd") + End If + + oManIndexValue = FILESYSTEM.GetCleanPath(oManIndexValue) + DynamicFolderConfig = DynamicFolderConfig.Replace(oMatch.ToString, oManIndexValue) + + _Logger.Info("FolderPattern: '" & DynamicFolderConfig & "'") + Else + + If oIsOptional = True Then + _Logger.Info("Optionaler Indexwert ist NICHT gefüllt") + DynamicFolderConfig = DynamicFolderConfig.Replace(oMatch.ToString, String.Empty) + Else + _Logger.Info(" - Achtung Ausnahme in 'CrFolderForIndex': der Index ist leer!") + Return True + End If + End If + Case "A" + Dim oAutoIndexName = oMatch.Value.Substring(3, oMatch.Value.Length - 4) + _Logger.Info("Versuch den Auto-Indexwert aus '" & oAutoIndexName & "' auszulesen.") + Dim oAutoIndexValue As String = GetAutoIndex_Value(oAutoIndexName) + _Logger.Info("Ergebnis/Wert für neuen Ordner: '" & oAutoIndexName & "'") + If Not oAutoIndexValue = String.Empty Then + + oAutoIndexValue = FILESYSTEM.GetCleanPath(oAutoIndexValue) + If oAutoIndexValue = "EMPTY_OI" Then + DynamicFolderConfig = DynamicFolderConfig.Replace(oMatch.ToString, "") + Else + DynamicFolderConfig = DynamicFolderConfig.Replace(oMatch.ToString, oAutoIndexValue) + _Logger.Info("FolderPattern: '" & DynamicFolderConfig & "'") + End If + Else + _Logger.Info(" - Achtung Ausnahme in 'CrFolderForIndex': der Index ist leer!") + End If + Case "V" + Dim oElementTemp As String + 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 = oMatch.Value.Substring(3, oMatch.Value.Length - 4) + If type.StartsWith("_") Then + type = type.Replace("_", "") + End If + Select Case type + Case "YYYY/MM/DD" + oElementTemp = My.Computer.Clock.LocalTime.Year & "\" & _Month & "\" & _day + Case "YYYY/MM" + oElementTemp = My.Computer.Clock.LocalTime.Year & "\" & _Month + Case "YYYY" + oElementTemp = My.Computer.Clock.LocalTime.Year + Case "YYYY-MM" + oElementTemp = My.Computer.Clock.LocalTime.Year & "-" & _Month + End Select + DynamicFolderConfig = DynamicFolderConfig.Replace(oMatch.ToString, oElementTemp) + _Logger.Info("FolderPatter nach V-Element: '" & DynamicFolderConfig & "'") + Case Else + _Logger.Warn(" - Achtung - in der Namenkonvention wurde ein Element gefunden welches nicht zugeordnet werden kann!" & vbNewLine & "Elementname: " & oMatch.Value.ToUpper) + + If USER_LANGUAGE = LANG_DE Then + MsgBox("Achtung - in der Namenkonvention wurde ein Element gefunden welches nicht zugeordnet werden kann!" & vbNewLine & "Elementname: " & oMatch.Value.ToUpper, MsgBoxStyle.Exclamation, "Unexpected error in Name generieren:") + Else + MsgBox("Attention - One element in Namingconvention could not be matched!" & vbNewLine & "Elementname: " & oMatch.Value.ToUpper, MsgBoxStyle.Exclamation, "Unexpected error in Name generieren:") + End If + End Select + Next + End If + + _Logger.Info("Den Root-Folder zusammenfügen>> ") + + Dim oNewFullPath As String = System.IO.Path.Combine(oRootFolder, DynamicFolderConfig) + + _Logger.Info("Fullpath (mit evtl. Sonderzeichen (SZ)) '" & oNewFullPath & "'") + Dim invalidPathChars() As Char = Path.GetInvalidPathChars() + For Each sonderChar As Char In invalidPathChars + 'Sonderzeichen ausser Whitespace entfernen + If Char.IsWhiteSpace(sonderChar) = False Then + If oNewFullPath.Contains(sonderChar) Then + oNewFullPath = oNewFullPath.Replace(sonderChar, "") + End If + End If + Next sonderChar + oNewFullPath = WINDREAM.GetCleanedPath(oNewFullPath) + + _Logger.Info("Fullpath (ohne SZ) '" & oNewFullPath & "'") + If Directory.Exists(oNewFullPath) = False Then + Try + Dim oCreatedPath = Directory.CreateDirectory(oNewFullPath) + oNewFullPath = oCreatedPath.FullName + _Logger.Info("Folder '" & oNewFullPath & "' wurde angelegt") + Catch ex As Exception + _Logger.Info("Error in CreateFolderforIndex-Method - Root Folder '" & oNewFullPath & "' could not be created. " & ex.Message) + _Logger.Error(ex.Message) + MsgBox("Attention: Root Folder '" & oNewFullPath & "' could not be created." & vbNewLine & ex.Message, MsgBoxStyle.Critical) + Return False + End Try + End If + + CURRENT_NEWFILENAME = Path.Combine(oNewFullPath, Path.GetFileName(CURRENT_NEWFILENAME)) + + Return True + Catch ex As Exception + ShowErrorMessage(ex, "CreateFolderForIndex") + Return False + End Try + End Function + + Private Sub frmIndex_FormClosing(sender As Object, e As System.Windows.Forms.FormClosingEventArgs) Handles Me.FormClosing + If File.Exists(CURRENT_FILENAME) Then + Select Case CancelAttempts + Case 0 + If USER_LANGUAGE = LANG_DE Then + MsgBox($"Bitte indexieren Sie die Datei vollständig!{vbNewLine}(Abbruch 1 des Indexierungsvorgangs)", MsgBoxStyle.Information) + Else + MsgBox($"Please Index file completely{vbNewLine}(Abort 1 of Indexdialog)", MsgBoxStyle.Information) + End If + CancelAttempts += 1 + e.Cancel = True + Case 1 + Dim result As MsgBoxResult + If USER_LANGUAGE = LANG_DE Then + result = MessageBox.Show($"Sie brechen nun zum zweiten Mal den Indexierungsvorgang ab!{vbNewLine}Wollen Sie die Indexierung aller Dateien abbrechen?", "Bestätigung erforderlich:", MessageBoxButtons.YesNo, MessageBoxIcon.Question) + Else + result = MessageBox.Show($"You abort the indexdialog for the 2nd time!{vbNewLine}Do You want to abort indexing?", "Confirmation needed:", MessageBoxButtons.YesNo, MessageBoxIcon.Question) + End If + + If result = MsgBoxResult.Yes Then + Dim containsfw_file As Boolean = False + Try + ABORT_INDEXING = True + Dim sql As String = $"SELECT * FROM TBGI_FILES_USER WHERE WORKED = 0 AND UPPER(USER@WORK) = UPPER('{Environment.UserName}')" + Dim DT As DataTable = DATABASE_ECM.GetDatatable(sql) + + Dim anz = DT.Rows.Count + For Each Filerow As DataRow In DT.Rows + Dim filestring As String = Filerow.Item("FILENAME2WORK") + Dim handletype As String = Filerow.Item("HANDLE_TYPE") + + If handletype = "|MSGONLY|" Or handletype = "|ATTMNTEXTRACTED|" Then + Try + System.IO.File.Delete(filestring) + Catch ex As Exception + + End Try + + ElseIf handletype.StartsWith("|FW") Then + containsfw_file = True + End If + Next + 'Zuerst die Daten des Ablaufs löschen + If DATABASE_ECM.ExecuteNonQuery("DELETE FROM TBGI_FILES_USER WHERE UPPER(USER@WORK) = UPPER('" & Environment.UserName & "')") = True Then + If containsfw_file = True Then + If USER_LANGUAGE = LANG_DE Then + MsgBox("Der Indexierungsprozess beinhaltete (auch) Dateien per Folderwatch!" & vbNewLine & "Diese Dateien wurden nicht gelöscht und verbleiben im Folderwatch-Verzeichnis!" & vbNewLine & "Bitte verschieben Sie die Dateien ggfls.", MsgBoxStyle.Information, "Achtung - Hinweis:") + Else + MsgBox("The Indexingprocess contained (also) files from folderwatch!" & vbNewLine & "These files weren't deleted and will stay in the folderwatch-folder!" & vbNewLine & "Please move these files manually.", MsgBoxStyle.Information, "Achtung - Hinweis:") + End If + + End If + End If + Catch ex As Exception + _Logger.Error(ex) + MsgBox("Unexpected Error in Abort Indexing: " & vbNewLine & ex.Message, MsgBoxStyle.Critical) + End Try + + Try + INDEXING_ACTIVE = False + CloseViewer() + + ClassWindowLocation.SaveFormLocationSize(Me) + My.Settings.Save() + Catch ex As Exception + _Logger.Info(" - Unexpected error in Schliessen des Formulares - Fehler: " & vbNewLine & ex.Message) + _Logger.Error(ex.Message) + MsgBox(ex.Message, MsgBoxStyle.Critical, "Unexpected error in Schliessen des Formulares:") + End Try + + e.Cancel = False + Else + e.Cancel = True + End If + Case Else + Try + INDEXING_ACTIVE = False + + CloseViewer() + ClassWindowLocation.SaveFormLocationSize(Me) + My.Settings.Save() + Catch ex As Exception + ShowErrorMessage(ex, "Form Close") + End Try + End Select + Else + INDEXING_ACTIVE = False + End If + End Sub + + Private Sub frmIndex_Load(sender As Object, e As System.EventArgs) Handles Me.Load + ' Abbruchzähler zurücksetzen + CancelAttempts = 0 + + INDEXING_ACTIVE = True + + Try + CURRENT_ISATTACHMENT = False + DropType = DATABASE_ECM.GetScalarValue("SELECT HANDLE_TYPE FROM TBGI_FILES_USER WHERE GUID = " & CURRENT_WORKFILE_GUID) + + CURR_DELETE_ORIGIN = CONFIG.Config.DeleteOriginalFile + checkItemDeleteSource.Enabled = True + checkItemDeleteSource.Checked = CONFIG.Config.DeleteOriginalFile + + DocumentViewer1.Init(LOGCONFIG, VIEWER_LICENSE) + + If DropType Is Nothing Then + _Logger.Debug("File with Id [{0}] was not found in TBGI_FILES_USER. Exiting.", CURRENT_WORKFILE_GUID) + CancelAttempts = MaxCancelAttempts + Close() + Else + CURRENT_DROPTYPE = DropType.Replace("|", "") + + If DropType.StartsWith("|FW") Then + ' Eine Datei aus FolderWatch wird IMMER gelöscht, egal wie die Einstellung in der Config lautet + CURR_DELETE_ORIGIN = True + checkItemDeleteSource.Visibility = DevExpress.XtraBars.BarItemVisibility.Never + ElseIf DropType.Contains("|OUTLOOK_MESSAGE|") Then + ' Eine (DragDrop)-Outlook Nachricht wird NIE gelöscht, egal wie die Einstellung in der Config lautet + CURR_DELETE_ORIGIN = False + checkItemDeleteSource.Visibility = DevExpress.XtraBars.BarItemVisibility.Never + Else + checkItemDeleteSource.Visibility = DevExpress.XtraBars.BarItemVisibility.Always + End If + + If DropType = "|DROPFROMFSYSTEM|" Then + If USER_LANGUAGE <> LANG_DE Then + Me.Text = "Indexing of dropped file" + Else + Me.Text = "Indexierung der gedroppten Datei" + End If + ElseIf DropType = "|OUTLOOK_MESSAGE|" Or DropType = "|FW_MSGONLY|" Then + Select Case DropType + Case "|FW_MSGONLY|" + _Logger.Info(".msg-file from folderwatch") + If USER_LANGUAGE <> LANG_DE Then + Me.Text = "Indexing of msg-File (without Attachments) - from Folderwatch" + Else + Me.Text = "Indexierung der msg-Datei (ohne Anhang) - aus Folderwatch" + End If + Case "|OUTLOOK_MESSAGE|" + _Logger.Info(".msg-file through dragdrop") + If USER_LANGUAGE <> LANG_DE Then + Me.Text = "Indexing of msg-File (without Attachments)" + Else + Me.Text = "Indexierung der msg-Datei (ohne Anhang)" + End If + End Select + + ElseIf DropType = "|MSGONLY|" Then + If USER_LANGUAGE = LANG_DE Then + Me.Text = "Indexierung der msg-Datei (ohne Anhang)" + Else + Me.Text = "Indexing of msg-File (without Attachments)" + End If + ElseIf DropType = "|ATTMNTEXTRACTED|" Or DropType = "|OUTLOOK_ATTACHMENT|" Then + CURRENT_ISATTACHMENT = True + + If USER_LANGUAGE = LANG_DE Then + Me.Text = "Indexierung eines Email-Attachments" + Else + Me.Text = "Indexing of email-Attachment" + End If + ElseIf DropType = "|FW_SIMPLEINDEXER|" Then + + If USER_LANGUAGE = LANG_DE Then + Me.Text = "Indexierung einer Folderwatch-Datei" + Else + Me.Text = "Indexing of Folderwatch-File" + End If + End If + + labelFilePath.Caption = CURRENT_WORKFILE + + ClassWindowLocation.LoadFormLocationSize(Me) + + SetFilePreview(CONFIG.Config.FilePreview) + + SplitContainer1.SplitterDistance = CONFIG.Config.SplitterDistanceViewer + + Load_String() + + DTTBGI_REGEX_DOCTYPE = DATABASE_ECM.GetDatatable("SELECT DISTINCT T1.DOCTYPE as DocType, T.* FROM TBGI_REGEX_DOCTYPE T, VWGI_DOCTYPE T1 WHERE T.DOCTYPE_ID = T1.DOCTYPE_ID") + MULTIFILES = DATABASE_ECM.GetScalarValue("SELECT COUNT(*) FROM TBGI_FILES_USER WHERE WORKED = 0 AND GUID <> " & CURRENT_WORKFILE_GUID & " AND UPPER(USER@WORK) = UPPER('" & Environment.UserName & "')") + Dim allFiles As Integer = MULTIFILES + 1 + MULTIINDEXING_ACTIVE = False + + If allFiles < 2 Then + BarCheckItem_MultiIndexing.Caption = "Multi-Indexing" + BarCheckItem_MultiIndexing.Enabled = False + BarButtonItem1.Enabled = False + Else + If USER_LANGUAGE = LANG_DE Then + BarCheckItem_MultiIndexing.Caption = "Multi-Indexing - (" & allFiles & ") zu indexierende Dateien" + Else + BarCheckItem_MultiIndexing.Caption = "Multi-Indexing - (" & allFiles & ") files to be indexed" + End If + BarCheckItem_MultiIndexing.Checked = False + BarCheckItem_MultiIndexing.Enabled = True + BarButtonItem1.Enabled = True + End If + End If + Catch ex As Exception + ShowErrorMessage(ex, "Form Open") + End Try + End Sub + + Private Sub frmIndex_Shown(sender As Object, e As System.EventArgs) Handles Me.Shown + BringToFront() + Focus() + Cursor = Cursors.Default + Refresh_Dokart() + pnlIndex.Controls.Clear() + + checkItemTopMost.Checked = CONFIG.Config.TopMost + TopMost = CONFIG.Config.TopMost + BringToFront() + + FormLoaded = True + + Try + _Logger.Info("Profile Preselected enabled: {0}", CONFIG.Config.ProfilePreselection) + ' Letzte Auswahl merken überschreibt die automatische selektion + If CONFIG.Config.ProfilePreselection Then + checkItemPreselection.Checked = True + + If CURRENT_LASTDOKART <> "" Then + _Logger.Info("Last Saved DocType: {0}", CURRENT_LASTDOKART) + + Dim oDocTypes As List(Of DocType) = DocTypes + Dim oFoundDocType = oDocTypes. + Where(Function(dt) dt.Name = CURRENT_LASTDOKART). + FirstOrDefault() + + If oFoundDocType IsNot Nothing Then + _Logger.Info("Setting Last Saved DocType: {0}", CURRENT_LASTDOKART) + + ComboboxDoctype.EditValue = oFoundDocType + ComboboxDoctype.SelectNextControl(ComboboxDoctype, forward:=True, tabStopOnly:=True, nested:=True, wrap:=False) + End If + + End If + End If + + Dim oApplyRegex = ComboboxDoctype.EditValue Is Nothing And DTTBGI_REGEX_DOCTYPE.Rows.Count > 0 + _Logger.Info("Applying Profile Selection Regex: [{0}]", oApplyRegex) + + If oApplyRegex Then + For Each oRoW As DataRow In DTTBGI_REGEX_DOCTYPE.Rows + Dim oOnlyFilename = Path.GetFileName(CURRENT_WORKFILE) + If Regex.IsMatch(oOnlyFilename, oRoW.Item("Regex"), RegexOptions.IgnoreCase) Then + + _Logger.Debug("There is a match on REGEX_DOCTYPE: [{0}]", oRoW.Item("DOCTYPE")) + _Logger.Debug("Regex: [{0}], FileName: [{1}]", oRoW.Item("Regex"), oOnlyFilename) + + Dim oDoctypes As List(Of DocType) = DocTypes + Dim oFoundDocType As DocType = oDoctypes. + Where(Function(dt) dt.Guid = oRoW.Item("DOCTYPE_ID")). + FirstOrDefault() + + If oFoundDocType IsNot Nothing Then + _Logger.Debug("DocType found: [{0}]", oFoundDocType) + ComboboxDoctype.EditValue = oFoundDocType + ComboboxDoctype.SelectNextControl(ComboboxDoctype, forward:=True, tabStopOnly:=True, nested:=True, wrap:=False) + + Exit For + End If + End If + Next + End If + + If ComboboxDoctype.EditValue Is Nothing Then + ComboboxDoctype.Select() + End If + Catch ex As Exception + ShowErrorMessage(ex, "Form Shown") + End Try + End Sub + + Private Function GetLookupData(pLookup As LookupControl3, pSQLCommand As String, pConnectionId As Integer) + Dim oConnectionString = DATABASE_ECM.Get_ConnectionStringforID(pConnectionId) + + If oConnectionString IsNot Nothing And pSQLCommand.Length > 0 Then + LOGGER.Debug("Connection String (redacted): [{0}]", oConnectionString.Substring(0, 30)) + + If ClassPatterns.HasComplexPatterns(pSQLCommand) Then + LOGGER.Debug(" >>sql enthält Platzhalter und wird erst während der Laufzeit gefüllt!", False) + Return Nothing + Else + pSQLCommand = ClassPatterns.ReplaceInternalValues(pSQLCommand) + pSQLCommand = ClassPatterns.ReplaceUserValues(pSQLCommand, USER_PRENAME, USER_SURNAME, USER_SHORTNAME, USER_LANGUAGE, USER_EMAIL, USER_ID, CURRENT_DOKART_ID) + + Dim oDatatable = DATABASE_ECM.GetDatatableWithConnection(pSQLCommand, oConnectionString) + Return oDatatable + End If + Else + LOGGER.Warn("Connection String for control [{0}] is empty!", pLookup.Name) + Return Nothing + End If + End Function + + Private Sub labelFilePath_ItemClick(sender As Object, e As DevExpress.XtraBars.ItemClickEventArgs) Handles labelFilePath.ItemClick + Clipboard.SetText(CURRENT_WORKFILE) + + If USER_LANGUAGE = LANG_DE Then + MsgBox("Aktuellen Pfad in die Zwischenablage kopiert!", MsgBoxStyle.Information, Text) + Else + MsgBox("Current Path copied to Clipboard!", MsgBoxStyle.Information, Text) + End If + End Sub + + Private Sub LoadIndexe_Man() + Try + Dim oScreen As New DigitalData.Modules.Windows.Screen() + Dim oDpiscale = oScreen.GetScreenScaling(Me) + + Dim oRowTop As Integer = 20 * oDpiscale + Dim oLabelLeft As Integer = 20 + Dim oControlLeft As Integer = 250 + Dim oControlWidth As Integer = 420 + Dim oZeilenhoehe As Integer = 30 * oDpiscale + + _Logger.Info("Loading Indicies for Screen Scaling Factor [{0}]", oDpiscale) + + Dim oControls As New ControlCreator(LOGCONFIG, pnlIndex, Me) With { + .OnControlChanged = AddressOf PrepareDependingControl, + .OnLookupData = AddressOf GetLookupData + } + + If DT_INDEXEMAN.Rows.Count = 0 Then + ShowError("Keine Manuellen Indizes für die " & vbNewLine & "Dokumentart " & ComboboxDoctype.Text & " definiert") + _Logger.Info(" - Keine Manuellen Indizes für die " & vbNewLine & "Dokumentart " & ComboboxDoctype.Text & " definiert") + End If + + For Each oRow As DataRow In DT_INDEXEMAN.Rows + Dim oDataType = oRow.Item("DATATYPE") + Dim MultiSelect As Boolean = oRow.Item("MULTISELECT") + Dim AddNewItems As Boolean = oRow.Item("VKT_ADD_ITEM") + Dim PreventDuplicates As Boolean = oRow.Item("VKT_PREVENT_MULTIPLE_VALUES") + Dim oControlName As String = oRow.Item("NAME") + Dim oConnectionId = oRow.ItemEx("CONNECTION_ID", 0) + Dim oSQLSuggestion = oRow.Item("SUGGESTION") + Dim oSQLResult = oRow.Item("SQL_RESULT") + + LOGGER.Debug("IndexName: {0}", oControlName) + LOGGER.Debug("SQL: {0}", oSQLResult) + + Dim DefaultValue = Check_HistoryValues(oControlName, oRow.Item("DOKUMENTART")) + If DefaultValue Is Nothing Then + DefaultValue = GetPlaceholderValue(oRow.Item("DEFAULT_VALUE"), CURRENT_WORKFILE, USER_SHORTNAME) + End If + + Dim ctrl As Control = Nothing + + Dim lbl As Windows.Forms.Label = Nothing + + ' Label nur anzeigen, wenn nicht BOOLEAN + If oDataType <> ClassConstants.INDEX_TYPE_BOOLEAN Then + lbl = New Windows.Forms.Label() + lbl.Text = oRow.Item("COMMENT").ToString() + lbl.Left = oLabelLeft + lbl.Top = oRowTop + lbl.Width = oControlLeft - oLabelLeft - 10 + lbl.AutoSize = True + lbl.MaximumSize = New Size(lbl.Width, 0) ' Max Breite, Höhe unbegrenzt + lbl.Height = lbl.PreferredHeight + lbl.TextAlign = ContentAlignment.MiddleLeft + lbl.UseCompatibleTextRendering = True + pnlIndex.Controls.Add(lbl) + End If + + ' Control erzeugen und platzieren + Select Case oDataType + Case ClassConstants.INDEX_TYPE_BOOLEAN + Dim chk As CheckEdit = oControls.AddCheckBox(oControlName, oRowTop, DefaultValue, oRow.Item("COMMENT").ToString) + If chk IsNot Nothing Then + chk.Left = oControlLeft + chk.Top = oRowTop + chk.Width = oControlWidth + chk.Margin = New Padding(0, 4, 0, 4) + pnlIndex.Controls.Add(chk) + End If + Case ClassConstants.INDEX_TYPE_INTEGER, ClassConstants.INDEX_TYPE_VARCHAR + If (oSQLSuggestion = True AndAlso oSQLResult.ToString.Length > 0) OrElse MultiSelect = True Then + ctrl = oControls.AddLookupControl(oControlName, oRowTop, MultiSelect, oDataType, oSQLResult, oConnectionId, DefaultValue, AddNewItems, PreventDuplicates) + Else + If oControlName.ToLower() = "dateiname" Then + ctrl = oControls.AddTextBox(oControlName, oRowTop, System.IO.Path.GetFileNameWithoutExtension(CURRENT_WORKFILE), oDataType) + Else + ctrl = oControls.AddTextBox(oControlName, oRowTop, DefaultValue, oDataType) + End If + End If + Case "DATE" + ctrl = oControls.AddDateTimePicker(oControlName, oRowTop, DefaultValue) + Case Else + MsgBox("Bitte überprüfen Sie den Datentyp des hinterlegten Indexwertes!", MsgBoxStyle.Critical, "Achtung:") + _Logger.Warn(" - Datentyp nicht hinterlegt - LoadIndexe_Man") + End Select + + If ctrl IsNot Nothing Then + ctrl.Left = oControlLeft + ctrl.Top = oRowTop + ctrl.Width = oControlWidth + pnlIndex.Controls.Add(ctrl) + + If IsNotNullOrEmpty(DefaultValue) Then + + Me.BeginInvoke( + Sub() + _Logger.Debug("Triggering PrepareDependingControl for [{0}] via BeginInvoke", ctrl.Name) + PrepareDependingControl(ctrl) + End Sub) + + End If + End If + + Dim zeilenhoeheAktuell As Integer + + If oDataType <> ClassConstants.INDEX_TYPE_BOOLEAN Then + ' Verwende die Höhe vom Label oder Mindesthöhe + zeilenhoeheAktuell = Math.Max(lbl.Height, 30 * oDpiscale) + Else + ' Für Boolean Controls kannst du die Standardhöhe nehmen + zeilenhoeheAktuell = 30 * oDpiscale + End If + + oRowTop += zeilenhoeheAktuell + Next + + ' Panel- und Formhöhe anpassen, wenn nötig + Dim oPanelHeight = oRowTop + 10 + If pnlIndex.Height < oPanelHeight Then + If (Me.Height - 315) < oPanelHeight Then + Me.Height = (Me.Height - 315) + oPanelHeight + End If + pnlIndex.Height = oPanelHeight + End If + + SendKeys.Send("{TAB}") + Catch ex As Exception + ShowErrorMessage(ex, "LoadIndexe_Man") + End Try + End Sub + + Private Function Move_File_and_Index() + Dim oError As Boolean + Try + CURRENT_DOC_ID = 0 + Dim oSQL As String = "SELECT FOLDER_FOR_INDEX FROM TBDD_DOKUMENTART WHERE GUID = " & CURRENT_DOKART_ID + Dim oFolderForIndex = DATABASE_ECM.GetScalarValue(oSQL) + If Not IsDBNull(oFolderForIndex) Then + CreateFolderForIndex(oFolderForIndex) + Else + CreateFolderForIndex(String.Empty) + End If + + If CURR_DOKART_WD_DIRECT = False Then + 'Datei verschieben + oError = Move_Rename_Only(CURRENT_WORKFILE, CURRENT_NEWFILENAME, CURR_WORKFILE_EXTENSION, VERSION_DELIMITER) + Else + Dim oExportSuccessful As Boolean = False + 'Variable Folder + If DropType = "|DROPFROMFSYSTEM|" Or DropType = "|OUTLOOK_ATTACHMENT|" Or DropType = "|ATTMNTEXTRACTED|" Or DropType = "|FW_SIMPLEINDEXER|" Then + oExportSuccessful = SINGLEFILE_2_WINDREAM(CURR_DOKART_OBJECTTYPE) + ElseIf DropType = "|OUTLOOK_MESSAGE|" Or DropType = "|FW_MSGONLY|" Or DropType = "|MSGONLY|" Or DropType = "|FW_OUTLOOK_MESSAGE|" Then + oExportSuccessful = SINGLEFILE_2_WINDREAM(CURR_DOKART_OBJECTTYPE) + End If + If oExportSuccessful = True Then + Dim ofilename = Path.GetFileName(CURRENT_NEWFILENAME) + Dim odwDocID As Int64 + If WM_DB_SERVER <> "" Then + oSQL = $"select max(dwdocid) from {WM_DB_SERVER}.dbo.BaseAttributes where szLongName = '{ofilename}'" + Dim oDocID = DATABASE_ECM.GetScalarValue(oSQL) + If Not IsNothing(oDocID) Then + CURRENT_DOC_ID = oDocID + End If + End If + + 'Kein Fehler in Export2windream + oError = False + If Write_Indizes() = True Then + 'Kein Fehler in Setzen der windream-Indizes + Dim Insert_String As String + Try + Dim tempCur_WF = CURRENT_WORKFILE.Replace("'", "''") + Dim tempCur_New_FN = CURRENT_NEWFILENAME.Replace("'", "''") + Dim oUser As String = $"{Environment.UserDomainName}\{Environment.UserName}" + + Insert_String = sql_history_INSERT_INTO & $",ADDED_WHO, ADDED_WHERE, FILE_HASH) VALUES ('{tempCur_WF}','{tempCur_New_FN}'{sql_history_Index_Values},'{oUser}','{Environment.MachineName}','{CURRENT_WORKFILE_HASH}')" + DATABASE_ECM.GetScalarValue(Insert_String) + If DropType.Contains("MSG") Or DropType = "|ATTMNTEXTRACTED|" Or DropType = "|OUTLOOK_ATTACHMENT|" Then + If CURRENT_MESSAGEID <> "" Then + Dim max As String = "SELECT MAX(GUID) FROM TBGI_HISTORY" + Dim GUID = DATABASE_ECM.GetScalarValue(max) + Try + If GUID > 0 Then + Dim sqlUpdate As String + If DropType = "|ATTMNTEXTRACTED|" Or DropType = "|OUTLOOK_ATTACHMENT|" Then + sqlUpdate = "Update TBGI_HISTORY SET ATTACHMENT = 1, MSG_ID = '" & CURRENT_MESSAGEID & "' WHERE GUID = " & GUID + DATABASE_ECM.ExecuteNonQuery(sqlUpdate) + Else + sqlUpdate = "Update TBGI_HISTORY SET ATTACHMENT = 0, MSG_ID = '" & CURRENT_MESSAGEID & "' WHERE GUID = " & GUID + DATABASE_ECM.ExecuteNonQuery(sqlUpdate) + End If + End If + Catch ex As Exception + _Logger.Error(ex) + End Try + End If + End If + Catch ex As Exception + _Logger.Error(ex) + MsgBox("Error in Insert-History - View logfile: " & ex.Message, MsgBoxStyle.Critical) + _Logger.Warn(" - Unexpected error in Insert-History - Fehler: " & vbNewLine & ex.Message) + _Logger.Warn(" - Unexpected error in Insert-History - SQL: " & Insert_String) + oError = True + End Try + Else + oError = True + End If + Else + oError = True + + If USER_LANGUAGE = LANG_DE Then + MsgBox("Der Export nach windream war nicht erfolgreich - Check LogFile", MsgBoxStyle.Exclamation) + Else + MsgBox("Export to windream was unsucessful - Check LogFile", MsgBoxStyle.Exclamation) + End If + End If + End If + 'False oder True zurückgeben + 'Kein Fehler aufgetreten + If oError = False Then + Return True + Else + 'Fehler aufgetreten + Return False + End If + Catch ex As Exception + ShowErrorMessage(ex, "Move_File2_Target") + Return False + End Try + End Function + + Private Sub PrepareDependingControl(Control As Control) + If TypeOf Control Is Windows.Forms.Label Then + Exit Sub + End If + + Try + Dim oMeta = DirectCast(Control.Tag, ControlCreator.ControlMeta) + Dim oIndexName As String = oMeta.IndexName + Dim oSQL = $"SELECT * FROM TBDD_INDEX_MAN WHERE SQL_RESULT LIKE '%{oIndexName}%' AND DOK_ID = {CURRENT_DOKART_ID}" + Dim oDatatable As DataTable = DATABASE_ECM.GetDatatable(oSQL) + + If Not IsNothing(oDatatable) Then + LOGGER.Debug("Found [{0}] depending controls for [{1}]", oDatatable.Rows.Count, Control.Name) + + For Each oRow As DataRow In oDatatable.Rows + Dim oControlName As String = oRow.ItemEx("NAME", "") + Dim oConnectionId As Integer = oRow.ItemEx("CONNECTION_ID", -1) + Dim oControlSql As String = oRow.ItemEx("SQL_RESULT", "") + + If oConnectionId = -1 Or oControlSql = String.Empty Then + LOGGER.Warn("Missing SQL Query or ConnectionId for Control [{0}]! Continuing.", oControlName) + Continue For + End If + + oControlSql = ClassPatterns.ReplaceUserValues(oControlSql, USER_PRENAME, USER_SURNAME, USER_SHORTNAME, USER_LANGUAGE, USER_EMAIL, USER_ID, CURRENT_DOKART_ID) + oControlSql = ClassPatterns.ReplaceInternalValues(oControlSql) + oControlSql = ClassPatterns.ReplaceControlValues(oControlSql, pnlIndex) + LOGGER.Debug("Setting new value for [{0}]", oControlName) + SetDependingControlResult(oControlName, oControlSql, oConnectionId) + Next + End If + Catch ex As Exception + LOGGER.Error(ex) + End Try + End Sub + + Private Sub Refresh_IndexeMan(dokartid As Integer) + Dim sql + Try + sql = "select T1.BEZEICHNUNG AS DOKUMENTART,T.* from TBDD_INDEX_MAN T, TBDD_DOKUMENTART T1 where T.ACTIVE = 1 AND T.DOK_ID = T1.GUID AND T.DOK_ID = " & dokartid & " ORDER BY T.SEQUENCE" + DT_INDEXEMAN = DATABASE_ECM.GetDatatable(sql) + pnlIndex.Visible = True + LoadIndexe_Man() + Catch ex As System.Exception + ShowErrorMessage(ex, "Refresh_IndexeMan", "DOKART-ID: " & dokartid) + End Try + End Sub + + Private Sub SetDependingControlResult(IndexName As String, SqlCommand As String, SqlConnectionId As Integer) + Try + If String.IsNullOrWhiteSpace(SqlCommand) OrElse SqlCommand.Contains("''") OrElse SqlCommand.Contains("IN ()") Then + LOGGER.Warn("Skipped SQL execution for Index [{0}]: Invalid or empty SQL: [{1}]", IndexName, SqlCommand) + Exit Sub + End If + + Dim oConnectionString = DATABASE_ECM.Get_ConnectionStringforID(SqlConnectionId) + Dim oDatatable As DataTable = DATABASE_ECM.GetDatatableWithConnection(SqlCommand, oConnectionString) + Dim oFoundControl As Control = Nothing + + For Each oControl As Control In pnlIndex.Controls + If TypeOf oControl Is Windows.Forms.Label Then + Continue For + End If + + Dim oMeta = DirectCast(oControl.Tag, ControlCreator.ControlMeta) + Dim oIndex As String = oMeta.IndexName + + If oIndex = IndexName Then + oFoundControl = oControl + Exit For + End If + Next + + If oFoundControl Is Nothing Then + LOGGER.Warn("Depending Control for Index [{0}] not found!", IndexName) + Exit Sub + End If + + If oDatatable Is Nothing Then + LOGGER.Warn("Error in SQL Command: {0}", SqlCommand) + Exit Sub + End If + + Select Case oFoundControl.GetType.Name + Case GetType(TextEdit).Name + If oDatatable.Rows.Count > 0 Then + Dim oFirstRow As DataRow = oDatatable.Rows.Item(0) + + If oFirstRow.ItemArray.Length > 0 Then + Dim oValue = oFirstRow.Item(0).ToString() + + LOGGER.Debug("Setting Value for TextEdit [{0}]: [{1}]", oFoundControl.Name, oValue) + DirectCast(oFoundControl, TextEdit).Text = oValue + End If + End If + Case GetType(LookupControl3).Name + LOGGER.Debug("Setting Value for LookupControl [{0}]: [{1}]", oFoundControl.Name, "DATATABLE") + Dim oLookupControl = DirectCast(oFoundControl, LookupControl3) + oLookupControl.Properties.DataSource = oDatatable + + If oDatatable.Columns.Count > 0 Then + oLookupControl.Properties.ValueMember = oDatatable.Columns.Item(0).ColumnName + oLookupControl.Properties.DisplayMember = oDatatable.Columns.Item(0).ColumnName + End If + Case GetType(Windows.Forms.ComboBox).Name + LOGGER.Debug("Setting Value for Combobox [{0}]: [{1}]", oFoundControl.Name, "DATATABLE") + DirectCast(oFoundControl, Windows.Forms.ComboBox).DataSource = oDatatable + Case Else + LOGGER.Debug("Could not set depending control result for [{0}]", oFoundControl.GetType.Name) + End Select + Catch ex As Exception + LOGGER.Error(ex) + End Try + End Sub + + Private Function SetEmailIndicies(pIndexAttachment As Boolean) As Boolean + Try + Dim oIndexNames As Dictionary(Of String, Object) + + Dim oSQL As String = $"SELECT * FROM TBGI_OBJECTTYPE_EMAIL_INDEX WHERE OBJECTTYPE = '{CURR_DOKART_OBJECTTYPE}'" + Dim oTable As DataTable = DATABASE_ECM.GetDatatable(oSQL) + + If IsNothing(oTable) Then + LOGGER.Error("Database returned NULL for Email Indicies query (OBJECTTYPE = [{0}]).", CURR_DOKART_OBJECTTYPE) + Return False + End If + + If oTable.Rows.Count = 0 Then + LOGGER.Warn("No Email Indicies defined for OBJECTTYPE = [{0}].", CURR_DOKART_OBJECTTYPE) + MsgBox($"Definition von Email Indizes für den Objekttyp [{CURR_DOKART_OBJECTTYPE}] fehlt." + vbNewLine + "Bitte informieren Sie Ihren Systembetreuer.", MsgBoxStyle.Critical) + Return False + End If + + If oTable.Rows.Count > 1 Then + LOGGER.Warn("Multiple Email Indicies definitions found for OBJECTTYPE = [{0}]. Using none and exiting.", CURR_DOKART_OBJECTTYPE) + Return False + End If + + Dim oRow As DataRow = oTable.Rows.Item(0) + + If pIndexAttachment = False Then + LOGGER.Info("Indexing main Email file for OBJECTTYPE = [{0}].", CURR_DOKART_OBJECTTYPE) + LOGGER.Debug("Original filename: [{0}]", CURRENT_NEWFILENAME) + + Dim oMsgFilePath As String = CURRENT_NEWFILENAME + If CURRENT_NEWFILENAME.StartsWith(WINDREAM_BASEPATH) = False Then + oMsgFilePath = WINDREAM_BASEPATH & oMsgFilePath + End If + + LOGGER.Debug("Email file path: [{0}]", oMsgFilePath) + + Dim oMail As IMail = EMAIL.Load_Email(oMsgFilePath) + LOGGER.Debug($"Load Email from path: {oMail}") + + Dim oMessageId As String = oMail.MessageID + LOGGER.Debug($"MessageId: {oMessageId}") + Dim oMessageFrom As String = EMAIL.Get_MessageSender(oMail) + LOGGER.Debug($"MessageForm: {oMessageFrom}") + Dim oMessageTo As String = EMAIL.Get_MessageReceiver(oMail) + LOGGER.Debug($"Receiver: {oMessageTo}") + Dim oDateIn As Date = EMAIL.Get_MessageDate(oMail) + LOGGER.Debug($"Date: {oDateIn}") + Dim oSubject As String = oMail.Subject + LOGGER.Debug($"Subject: {oSubject}") + + LOGGER.Debug("Extracted Email fields → ID=[{0}], From=[{1}], To=[{2}], Date=[{3}], Subject=[{4}]", + oMessageId, oMessageFrom, oMessageTo, oDateIn, oSubject) + + CURRENT_MESSAGEID = oMessageId + CURRENT_MESSAGEDATE = oDateIn + + If oSubject IsNot Nothing Then + CURRENT_MESSAGESUBJECT = oSubject + Else + CURRENT_MESSAGESUBJECT = "" + LOGGER.Info("Email has no subject. Using default ''.") + End If + + oIndexNames = New Dictionary(Of String, Object) From { + {"IDX_EMAIL_ID", oMessageId}, + {"IDX_EMAIL_FROM", oMessageFrom}, + {"IDX_EMAIL_TO", oMessageTo}, + {"IDX_EMAIL_SUBJECT", CURRENT_MESSAGESUBJECT}, + {"IDX_EMAIL_DATE_IN", oDateIn} + } + Else + LOGGER.Info("Indexing Email attachment for OBJECTTYPE = [{0}].", CURR_DOKART_OBJECTTYPE) + + oIndexNames = New Dictionary(Of String, Object) From { + {"IDX_EMAIL_ID", CURRENT_MESSAGEID}, + {"IDX_EMAIL_SUBJECT", CURRENT_MESSAGESUBJECT}, + {"IDX_EMAIL_DATE_IN", CURRENT_MESSAGEDATE}, + {"IDX_CHECK_ATTACHMENT", True} + } + End If + + For Each oIndex In oIndexNames + Try + If oIndex.Value Is Nothing Then + LOGGER.Warn("Skipping Index [{0}] because value was NULL.", oIndex.Key) + Continue For + End If + + If TypeOf oIndex.Value Is String AndAlso oIndex.Value = String.Empty Then + LOGGER.Warn("Skipping Index [{0}] because value was empty.", oIndex.Key) + Continue For + End If + + Dim oIndexingSuccessful = WriteIndex2File(oRow.Item(oIndex.Key), oIndex.Value) + + If oIndexingSuccessful = False Then + LOGGER.Error("Indexing failed at Index [{0}] with value [{1}].", oIndex.Key, oIndex.Value) + MsgBox($"Error while Indexing Email at Index [{oIndex.Key}]", MsgBoxStyle.Critical) + Return False + End If + + LOGGER.Debug("Index [{0}] successfully written with value [{1}].", oIndex.Key, oIndex.Value) + Catch ex As Exception + LOGGER.Error(ex, "Exception while indexing Email at Index [{0}].", oIndex.Key) + Return False + End Try + Next + + LOGGER.Info("Successfully indexed Email (OBJECTTYPE = [{0}]).", CURR_DOKART_OBJECTTYPE) + Return True + Catch ex As Exception + LOGGER.Error(ex, "Unexpected exception in SetEmailIndicies.") + Return False + End Try + End Function + + Private Sub SetFilePreview(ShowPreview As Boolean) + If ShowPreview Then + SplitContainer1.Panel2Collapsed = False + PreviewFile() + checkItemPreview.Checked = True + Else + SplitContainer1.Panel2Collapsed = True + checkItemPreview.Checked = False + End If + End Sub + + Private Sub ShowErrorMessage(Exception As Exception, MethodTitle As String, Optional MoreInfo As String = "") + Dim oMessage As String + Dim oMoreInfo As String = IIf(MoreInfo = "", "", "(" & MoreInfo & ")") + + If USER_LANGUAGE = LANG_DE Then + oMessage = String.Format(TEXT_CATCH_BLOCK_DE, MethodTitle, Exception.Message) & oMoreInfo + Else + oMessage = String.Format(TEXT_CATCH_BLOCK_EN, MethodTitle, Exception.Message) & oMoreInfo + End If + + _Logger.Warn(oMessage) + _Logger.Error(Exception) + + MsgBox(oMessage, MsgBoxStyle.Critical, Text) + End Sub + + Private Function SINGLEFILE_2_WINDREAM(_Objekttyp As String) As Boolean + Try + CURR_DOKART_OBJECTTYPE = _Objekttyp + Dim oWMCheckPath = WINDREAM.VersionWMFilename(CURRENT_NEWFILENAME, System.IO.Path.GetExtension(CURRENT_NEWFILENAME)) + If CURRENT_NEWFILENAME.ToUpper <> oWMCheckPath.ToString.ToUpper Then + _Logger.Info($"Target [{CURRENT_NEWFILENAME}] already existed!! - NewWMFilename [{oWMCheckPath}]") + CURRENT_NEWFILENAME = oWMCheckPath + End If + + Dim oStreamSuccessful = WINDREAM.NewFileStream(CURRENT_WORKFILE, CURRENT_NEWFILENAME, CURR_DOKART_OBJECTTYPE) + Dim oTempPath As String = WINDREAM_BASEPATH & CURRENT_NEWFILENAME + + _Logger.Debug("Checks for file [{0}]", oTempPath) + _Logger.Debug("File streamed to Windream: {0}", oStreamSuccessful) + _Logger.Debug("File exists in Destination: {0}", File.Exists(oTempPath)) + + Return oStreamSuccessful + Catch ex As Exception + ShowErrorMessage(ex, "SINGLEFILE_2_WINDREAM") + Return False + End Try + End Function + + Private Sub SplitContainer1_SplitterMoved(sender As Object, e As SplitterEventArgs) Handles SplitContainer1.SplitterMoved + CONFIG.Config.SplitterDistanceViewer = SplitContainer1.SplitterDistance + End Sub + + Private Function UnicodeBytesToString(ByVal bytes() As Byte) As String + Return System.Text.Encoding.UTF8.GetString(bytes) + End Function + + Private Function WORK_FILE() As Boolean + Try + Me.VWDDINDEX_MANTableAdapter.Fill(Me.MyDataset.VWDDINDEX_MAN, CURRENT_DOKART_ID) + _Logger.Debug("Manuelle Indexe geladen") + + If MyDataset.VWDDINDEX_MAN.Rows.Count > 0 Then + Dim oDokart As DocType = ComboboxDoctype.EditValue + + CURRENT_DOKART_ID = oDokart.Guid + If CheckWrite_IndexeMan(oDokart.Guid) = True Then + '##### Manuelle Indexe indexiert ##### + _Logger.Info("Datei [" & CURRENT_WORKFILE & "] wird nun indexiert...") + If FillIndexe_Autom(oDokart.Guid) = True Then + _Logger.Debug(" ...FillIndexe_Autom durchlaufen") + + 'Den Zielnamen zusammenbauen + If Name_Generieren() = True Then + 'Die Datei verschieben + If Move_File_and_Index() = True Then + _Logger.Debug(" ...Move_File2_Target durchlaufen") + + _Logger.Info("Datei '" & CURRENT_NEWFILENAME & "' erfolgreich erzeugt.") + Dim oDEL As String = "DELETE FROM TBGI_FILES_USER WHERE GUID = " & CURRENT_WORKFILE_GUID + DATABASE_ECM.ExecuteNonQuery(oDEL) + + 'Dokumentenviewer ausblenden um keinen Zugriffsfehler zu produzieren + CloseViewer() + _Logger.Debug(" ...Viewer geschlossen") + + If CURR_DELETE_ORIGIN = True Then + _Logger.Info("Datei [" & CURRENT_WORKFILE & "] wird gelöscht.") + Try + File.SetAttributes(CURRENT_WORKFILE, FileAttributes.Normal) + File.Delete(CURRENT_WORKFILE) + Catch ex As Exception + _Logger.Error(ex) + End Try + _Logger.Info("Datei [" & CURRENT_WORKFILE & "] wurde gelöscht.") + End If + + Return True + End If + Else + If USER_LANGUAGE = LANG_DE Then + MsgBox("Unerwarteter Fehler in Name_Generieren - Bitte überprüfen sie die Logdatei", MsgBoxStyle.Critical) + Else + MsgBox("Unexpected error in Name_Generieren - Please check the Logfile", MsgBoxStyle.Critical) + End If + Return False + End If + Else + If USER_LANGUAGE = LANG_DE Then + MsgBox("Unerwarteter Fehler in FillIndexe_Autom - Bitte überprüfen sie die Logdatei", MsgBoxStyle.Critical) + Else + MsgBox("Unexpected error in FillIndexe_Autom - Please check the Logfile", MsgBoxStyle.Critical) + End If + Return False + End If + End If + Else + If USER_LANGUAGE = LANG_DE Then + MsgBox("Bitte überprüfen Sie die Konfiguration dieser Dokumentart." & vbNewLine & "Es sind KEINE manuellen Indizes konfiguriert oder aktiv geschaltet!", MsgBoxStyle.Exclamation) + Else + MsgBox("Please check the configuration for this document-type." & vbNewLine & "There are NO manual indicies that are either configured or set to active!", MsgBoxStyle.Exclamation) + End If + Return False + End If + Catch ex As Exception + ShowErrorMessage(ex, "WORK_FILE") + Return False + End Try + End Function + Private Function Write_Indizes() As Boolean Try _Logger.Info("Starting indexing for file [{0}] (DropType = {1})", CURRENT_NEWFILENAME, DropType) @@ -904,1573 +2451,13 @@ Public Class frmIndex End Try End Function - Private Function SetEmailIndicies(pIndexAttachment As Boolean) As Boolean - Try - Dim oIndexNames As Dictionary(Of String, Object) + Public Class DocType + Public Property Guid + Public Property Name - Dim oSQL As String = $"SELECT * FROM TBGI_OBJECTTYPE_EMAIL_INDEX WHERE OBJECTTYPE = '{CURR_DOKART_OBJECTTYPE}'" - Dim oTable As DataTable = DATABASE_ECM.GetDatatable(oSQL) + Public Overrides Function ToString() As String + Return Name + End Function - If IsNothing(oTable) Then - LOGGER.Error("Database returned NULL for Email Indicies query (OBJECTTYPE = [{0}]).", CURR_DOKART_OBJECTTYPE) - Return False - End If - - If oTable.Rows.Count = 0 Then - LOGGER.Warn("No Email Indicies defined for OBJECTTYPE = [{0}].", CURR_DOKART_OBJECTTYPE) - MsgBox($"Definition von Email Indizes für den Objekttyp [{CURR_DOKART_OBJECTTYPE}] fehlt." + vbNewLine + "Bitte informieren Sie Ihren Systembetreuer.", MsgBoxStyle.Critical) - Return False - End If - - If oTable.Rows.Count > 1 Then - LOGGER.Warn("Multiple Email Indicies definitions found for OBJECTTYPE = [{0}]. Using none and exiting.", CURR_DOKART_OBJECTTYPE) - Return False - End If - - Dim oRow As DataRow = oTable.Rows.Item(0) - - If pIndexAttachment = False Then - LOGGER.Info("Indexing main Email file for OBJECTTYPE = [{0}].", CURR_DOKART_OBJECTTYPE) - LOGGER.Debug("Original filename: [{0}]", CURRENT_NEWFILENAME) - - Dim oMsgFilePath As String = CURRENT_NEWFILENAME - If CURRENT_NEWFILENAME.StartsWith(WINDREAM_BASEPATH) = False Then - oMsgFilePath = WINDREAM_BASEPATH & oMsgFilePath - End If - - LOGGER.Debug("Email file path: [{0}]", oMsgFilePath) - - Dim oMail As IMail = EMAIL.Load_Email(oMsgFilePath) - LOGGER.Debug($"Load Email from path: {oMail}") - - Dim oMessageId As String = oMail.MessageID - LOGGER.Debug($"MessageId: {oMessageId}") - Dim oMessageFrom As String = EMAIL.Get_MessageSender(oMail) - LOGGER.Debug($"MessageForm: {oMessageFrom}") - Dim oMessageTo As String = EMAIL.Get_MessageReceiver(oMail) - LOGGER.Debug($"Receiver: {oMessageTo}") - Dim oDateIn As Date = EMAIL.Get_MessageDate(oMail) - LOGGER.Debug($"Date: {oDateIn}") - Dim oSubject As String = oMail.Subject - LOGGER.Debug($"Subject: {oSubject}") - - LOGGER.Debug("Extracted Email fields → ID=[{0}], From=[{1}], To=[{2}], Date=[{3}], Subject=[{4}]", - oMessageId, oMessageFrom, oMessageTo, oDateIn, oSubject) - - CURRENT_MESSAGEID = oMessageId - CURRENT_MESSAGEDATE = oDateIn - - If oSubject IsNot Nothing Then - CURRENT_MESSAGESUBJECT = oSubject - Else - CURRENT_MESSAGESUBJECT = "" - LOGGER.Info("Email has no subject. Using default ''.") - End If - - oIndexNames = New Dictionary(Of String, Object) From { - {"IDX_EMAIL_ID", oMessageId}, - {"IDX_EMAIL_FROM", oMessageFrom}, - {"IDX_EMAIL_TO", oMessageTo}, - {"IDX_EMAIL_SUBJECT", CURRENT_MESSAGESUBJECT}, - {"IDX_EMAIL_DATE_IN", oDateIn} - } - Else - LOGGER.Info("Indexing Email attachment for OBJECTTYPE = [{0}].", CURR_DOKART_OBJECTTYPE) - - oIndexNames = New Dictionary(Of String, Object) From { - {"IDX_EMAIL_ID", CURRENT_MESSAGEID}, - {"IDX_EMAIL_SUBJECT", CURRENT_MESSAGESUBJECT}, - {"IDX_EMAIL_DATE_IN", CURRENT_MESSAGEDATE}, - {"IDX_CHECK_ATTACHMENT", True} - } - End If - - For Each oIndex In oIndexNames - Try - If oIndex.Value Is Nothing Then - LOGGER.Warn("Skipping Index [{0}] because value was NULL.", oIndex.Key) - Continue For - End If - - If TypeOf oIndex.Value Is String AndAlso oIndex.Value = String.Empty Then - LOGGER.Warn("Skipping Index [{0}] because value was empty.", oIndex.Key) - Continue For - End If - - Dim oIndexingSuccessful = WriteIndex2File(oRow.Item(oIndex.Key), oIndex.Value) - - If oIndexingSuccessful = False Then - LOGGER.Error("Indexing failed at Index [{0}] with value [{1}].", oIndex.Key, oIndex.Value) - MsgBox($"Error while Indexing Email at Index [{oIndex.Key}]", MsgBoxStyle.Critical) - Return False - End If - - LOGGER.Debug("Index [{0}] successfully written with value [{1}].", oIndex.Key, oIndex.Value) - Catch ex As Exception - LOGGER.Error(ex, "Exception while indexing Email at Index [{0}].", oIndex.Key) - Return False - End Try - Next - - LOGGER.Info("Successfully indexed Email (OBJECTTYPE = [{0}]).", CURR_DOKART_OBJECTTYPE) - Return True - Catch ex As Exception - LOGGER.Error(ex, "Unexpected exception in SetEmailIndicies.") - Return False - End Try - End Function - - Private Function SINGLEFILE_2_WINDREAM(_Objekttyp As String) As Boolean - Try - CURR_DOKART_OBJECTTYPE = _Objekttyp - Dim oWMCheckPath = WINDREAM.VersionWMFilename(CURRENT_NEWFILENAME, System.IO.Path.GetExtension(CURRENT_NEWFILENAME)) - If CURRENT_NEWFILENAME.ToUpper <> oWMCheckPath.ToString.ToUpper Then - _Logger.Info($"Target [{CURRENT_NEWFILENAME}] already existed!! - NewWMFilename [{oWMCheckPath}]") - CURRENT_NEWFILENAME = oWMCheckPath - End If - - Dim oStreamSuccessful = WINDREAM.NewFileStream(CURRENT_WORKFILE, CURRENT_NEWFILENAME, CURR_DOKART_OBJECTTYPE) - Dim oTempPath As String = WINDREAM_BASEPATH & CURRENT_NEWFILENAME - - _Logger.Debug("Checks for file [{0}]", oTempPath) - _Logger.Debug("File streamed to Windream: {0}", oStreamSuccessful) - _Logger.Debug("File exists in Destination: {0}", File.Exists(oTempPath)) - - Return oStreamSuccessful - Catch ex As Exception - ShowErrorMessage(ex, "SINGLEFILE_2_WINDREAM") - Return False - End Try - End Function - Function Move_Rename_Only(Quelle As String, _NewFilename As String, extension As String, _versionTz As String) - 'Überprüfen ob File existiert - If File.Exists(_NewFilename) = False Then - CURRENT_NEWFILENAME = _NewFilename - Else - 'Versionieren - Dim version As Integer = 1 - Dim Stammname As String = _NewFilename - Dim neuername As String = _NewFilename - Do While File.Exists(neuername) - version += 1 - neuername = Stammname.Replace(extension, "") & _versionTz & version & extension - CURRENT_NEWFILENAME = neuername - Loop - End If - - 'Die Datei wird nun an den neuen Ort kopiert - My.Computer.FileSystem.MoveFile(CURRENT_WORKFILE, CURRENT_NEWFILENAME) - - Dim Insert_String As String - Try - Dim oCurrentWorkfile = CURRENT_WORKFILE.Replace("'", "''") - Dim oCurrentNewFilename = CURRENT_NEWFILENAME.Replace("'", "''") - Dim oUser As String = $"{Environment.UserDomainName}\{Environment.UserName}" - - Insert_String = sql_history_INSERT_INTO & $",ADDED_WHO, ADDED_WHERE, FILE_HASH) VALUES ('{oCurrentWorkfile}','{oCurrentNewFilename}'{sql_history_Index_Values},'{oUser}','{Environment.MachineName}','{CURRENT_WORKFILE_HASH}')" - If DATABASE_ECM.ExecuteNonQuery(Insert_String) = True Then - If CURRENT_MESSAGEID <> "" Then - Dim max As String = "SELECT MAX(GUID) FROM TBGI_HISTORY" - Dim GUID = DATABASE_ECM.GetScalarValue(max) - Try - If GUID > 0 Then - Dim sql As String - If CURRENT_ISATTACHMENT = True Then - sql = "Update TBGI_HISTORY SET ATTACHMENT = 1, MSG_ID = '" & CURRENT_MESSAGEID & "' WHERE GUID = " & GUID - DATABASE_ECM.GetScalarValue(sql) - Else - sql = "Update TBGI_HISTORY SET ATTACHMENT = 0, MSG_ID = '" & CURRENT_MESSAGEID & "' WHERE GUID = " & GUID - DATABASE_ECM.GetScalarValue(sql) - End If - End If - Catch ex As Exception - - End Try - End If - End If - Return False - Catch ex As Exception - ShowErrorMessage(ex, "Move_Rename_Only") - Return True - End Try - End Function - - Private Sub frmIndex_FormClosing(sender As Object, e As System.Windows.Forms.FormClosingEventArgs) Handles Me.FormClosing - If File.Exists(CURRENT_FILENAME) Then - Select Case CancelAttempts - Case 0 - If USER_LANGUAGE = LANG_DE Then - MsgBox($"Bitte indexieren Sie die Datei vollständig!{vbNewLine}(Abbruch 1 des Indexierungsvorgangs)", MsgBoxStyle.Information) - Else - MsgBox($"Please Index file completely{vbNewLine}(Abort 1 of Indexdialog)", MsgBoxStyle.Information) - End If - CancelAttempts += 1 - e.Cancel = True - Case 1 - Dim result As MsgBoxResult - If USER_LANGUAGE = LANG_DE Then - result = MessageBox.Show($"Sie brechen nun zum zweiten Mal den Indexierungsvorgang ab!{vbNewLine}Wollen Sie die Indexierung aller Dateien abbrechen?", "Bestätigung erforderlich:", MessageBoxButtons.YesNo, MessageBoxIcon.Question) - Else - result = MessageBox.Show($"You abort the indexdialog for the 2nd time!{vbNewLine}Do You want to abort indexing?", "Confirmation needed:", MessageBoxButtons.YesNo, MessageBoxIcon.Question) - End If - - If result = MsgBoxResult.Yes Then - Dim containsfw_file As Boolean = False - Try - ABORT_INDEXING = True - Dim sql As String = $"SELECT * FROM TBGI_FILES_USER WHERE WORKED = 0 AND UPPER(USER@WORK) = UPPER('{Environment.UserName}')" - Dim DT As DataTable = DATABASE_ECM.GetDatatable(sql) - - Dim anz = DT.Rows.Count - For Each Filerow As DataRow In DT.Rows - Dim filestring As String = Filerow.Item("FILENAME2WORK") - Dim handletype As String = Filerow.Item("HANDLE_TYPE") - - If handletype = "|MSGONLY|" Or handletype = "|ATTMNTEXTRACTED|" Then - Try - System.IO.File.Delete(filestring) - Catch ex As Exception - - End Try - - ElseIf handletype.StartsWith("|FW") Then - containsfw_file = True - End If - Next - 'Zuerst die Daten des Ablaufs löschen - If DATABASE_ECM.ExecuteNonQuery("DELETE FROM TBGI_FILES_USER WHERE UPPER(USER@WORK) = UPPER('" & Environment.UserName & "')") = True Then - If containsfw_file = True Then - If USER_LANGUAGE = LANG_DE Then - MsgBox("Der Indexierungsprozess beinhaltete (auch) Dateien per Folderwatch!" & vbNewLine & "Diese Dateien wurden nicht gelöscht und verbleiben im Folderwatch-Verzeichnis!" & vbNewLine & "Bitte verschieben Sie die Dateien ggfls.", MsgBoxStyle.Information, "Achtung - Hinweis:") - Else - MsgBox("The Indexingprocess contained (also) files from folderwatch!" & vbNewLine & "These files weren't deleted and will stay in the folderwatch-folder!" & vbNewLine & "Please move these files manually.", MsgBoxStyle.Information, "Achtung - Hinweis:") - End If - - End If - End If - - - Catch ex As Exception - _Logger.Error(ex) - MsgBox("Unexpected Error in Abort Indexing: " & vbNewLine & ex.Message, MsgBoxStyle.Critical) - End Try - - Try - INDEXING_ACTIVE = False - CloseViewer() - - ClassWindowLocation.SaveFormLocationSize(Me) - My.Settings.Save() - Catch ex As Exception - _Logger.Info(" - Unexpected error in Schliessen des Formulares - Fehler: " & vbNewLine & ex.Message) - _Logger.Error(ex.Message) - MsgBox(ex.Message, MsgBoxStyle.Critical, "Unexpected error in Schliessen des Formulares:") - End Try - - e.Cancel = False - Else - e.Cancel = True - End If - Case Else - Try - INDEXING_ACTIVE = False - - CloseViewer() - ClassWindowLocation.SaveFormLocationSize(Me) - My.Settings.Save() - Catch ex As Exception - ShowErrorMessage(ex, "Form Close") - End Try - End Select - Else - INDEXING_ACTIVE = False - End If - End Sub - - Private Sub frmIndex_Load(sender As Object, e As System.EventArgs) Handles Me.Load - ' Abbruchzähler zurücksetzen - CancelAttempts = 0 - - INDEXING_ACTIVE = True - - Try - CURRENT_ISATTACHMENT = False - DropType = DATABASE_ECM.GetScalarValue("SELECT HANDLE_TYPE FROM TBGI_FILES_USER WHERE GUID = " & CURRENT_WORKFILE_GUID) - - CURR_DELETE_ORIGIN = CONFIG.Config.DeleteOriginalFile - checkItemDeleteSource.Enabled = True - checkItemDeleteSource.Checked = CONFIG.Config.DeleteOriginalFile - - DocumentViewer1.Init(LOGCONFIG, VIEWER_LICENSE) - - If DropType Is Nothing Then - _Logger.Debug("File with Id [{0}] was not found in TBGI_FILES_USER. Exiting.", CURRENT_WORKFILE_GUID) - CancelAttempts = MaxCancelAttempts - Close() - Else - CURRENT_DROPTYPE = DropType.Replace("|", "") - - If DropType.StartsWith("|FW") Then - ' Eine Datei aus FolderWatch wird IMMER gelöscht, egal wie die Einstellung in der Config lautet - CURR_DELETE_ORIGIN = True - checkItemDeleteSource.Visibility = DevExpress.XtraBars.BarItemVisibility.Never - ElseIf DropType.Contains("|OUTLOOK_MESSAGE|") Then - ' Eine (DragDrop)-Outlook Nachricht wird NIE gelöscht, egal wie die Einstellung in der Config lautet - CURR_DELETE_ORIGIN = False - checkItemDeleteSource.Visibility = DevExpress.XtraBars.BarItemVisibility.Never - Else - checkItemDeleteSource.Visibility = DevExpress.XtraBars.BarItemVisibility.Always - End If - - If DropType = "|DROPFROMFSYSTEM|" Then - If USER_LANGUAGE <> LANG_DE Then - Me.Text = "Indexing of dropped file" - Else - Me.Text = "Indexierung der gedroppten Datei" - End If - ElseIf DropType = "|OUTLOOK_MESSAGE|" Or DropType = "|FW_MSGONLY|" Then - Select Case DropType - Case "|FW_MSGONLY|" - _Logger.Info(".msg-file from folderwatch") - If USER_LANGUAGE <> LANG_DE Then - Me.Text = "Indexing of msg-File (without Attachments) - from Folderwatch" - Else - Me.Text = "Indexierung der msg-Datei (ohne Anhang) - aus Folderwatch" - End If - Case "|OUTLOOK_MESSAGE|" - _Logger.Info(".msg-file through dragdrop") - If USER_LANGUAGE <> LANG_DE Then - Me.Text = "Indexing of msg-File (without Attachments)" - Else - Me.Text = "Indexierung der msg-Datei (ohne Anhang)" - End If - End Select - - ElseIf DropType = "|MSGONLY|" Then - If USER_LANGUAGE = LANG_DE Then - Me.Text = "Indexierung der msg-Datei (ohne Anhang)" - Else - Me.Text = "Indexing of msg-File (without Attachments)" - End If - ElseIf DropType = "|ATTMNTEXTRACTED|" Or DropType = "|OUTLOOK_ATTACHMENT|" Then - CURRENT_ISATTACHMENT = True - - If USER_LANGUAGE = LANG_DE Then - Me.Text = "Indexierung eines Email-Attachments" - Else - Me.Text = "Indexing of email-Attachment" - End If - ElseIf DropType = "|FW_SIMPLEINDEXER|" Then - - If USER_LANGUAGE = LANG_DE Then - Me.Text = "Indexierung einer Folderwatch-Datei" - Else - Me.Text = "Indexing of Folderwatch-File" - End If - End If - - labelFilePath.Caption = CURRENT_WORKFILE - - ClassWindowLocation.LoadFormLocationSize(Me) - - SetFilePreview(CONFIG.Config.FilePreview) - - SplitContainer1.SplitterDistance = CONFIG.Config.SplitterDistanceViewer - - Load_String() - - DTTBGI_REGEX_DOCTYPE = DATABASE_ECM.GetDatatable("SELECT DISTINCT T1.DOCTYPE as DocType, T.* FROM TBGI_REGEX_DOCTYPE T, VWGI_DOCTYPE T1 WHERE T.DOCTYPE_ID = T1.DOCTYPE_ID") - MULTIFILES = DATABASE_ECM.GetScalarValue("SELECT COUNT(*) FROM TBGI_FILES_USER WHERE WORKED = 0 AND GUID <> " & CURRENT_WORKFILE_GUID & " AND UPPER(USER@WORK) = UPPER('" & Environment.UserName & "')") - Dim allFiles As Integer = MULTIFILES + 1 - MULTIINDEXING_ACTIVE = False - - If allFiles < 2 Then - BarCheckItem_MultiIndexing.Caption = "Multi-Indexing" - BarCheckItem_MultiIndexing.Enabled = False - BarButtonItem1.Enabled = False - Else - If USER_LANGUAGE = LANG_DE Then - BarCheckItem_MultiIndexing.Caption = "Multi-Indexing - (" & allFiles & ") zu indexierende Dateien" - Else - BarCheckItem_MultiIndexing.Caption = "Multi-Indexing - (" & allFiles & ") files to be indexed" - End If - BarCheckItem_MultiIndexing.Checked = False - BarCheckItem_MultiIndexing.Enabled = True - BarButtonItem1.Enabled = True - End If - End If - - Catch ex As Exception - ShowErrorMessage(ex, "Form Open") - End Try - End Sub - - Sub Load_String() - Try - Me.VWDDINDEX_MANTableAdapter.Connection.ConnectionString = MyConnectionString - Me.VWINDEX_AUTOMTableAdapter.Connection.ConnectionString = MyConnectionString - Catch ex As Exception - _Logger.Warn(" - Unexpected error in Speichern der Verbindung - Fehler: " & vbNewLine & ex.Message) - _Logger.Error(ex.Message) - MsgBox("Unexpected error in Speichern der Verbindung: " & vbNewLine & ex.Message, MsgBoxStyle.Exclamation) - End Try - End Sub - - Private Sub frmIndex_Shown(sender As Object, e As System.EventArgs) Handles Me.Shown - BringToFront() - Focus() - Cursor = Cursors.Default - Refresh_Dokart() - pnlIndex.Controls.Clear() - - checkItemTopMost.Checked = CONFIG.Config.TopMost - TopMost = CONFIG.Config.TopMost - BringToFront() - - FormLoaded = True - - Try - _Logger.Info("Profile Preselected enabled: {0}", CONFIG.Config.ProfilePreselection) - ' Letzte Auswahl merken überschreibt die automatische selektion - If CONFIG.Config.ProfilePreselection Then - checkItemPreselection.Checked = True - - If CURRENT_LASTDOKART <> "" Then - _Logger.Info("Last Saved DocType: {0}", CURRENT_LASTDOKART) - - Dim oDocTypes As List(Of DocType) = DocTypes - Dim oFoundDocType = oDocTypes. - Where(Function(dt) dt.Name = CURRENT_LASTDOKART). - FirstOrDefault() - - If oFoundDocType IsNot Nothing Then - _Logger.Info("Setting Last Saved DocType: {0}", CURRENT_LASTDOKART) - - ComboboxDoctype.EditValue = oFoundDocType - ComboboxDoctype.SelectNextControl(ComboboxDoctype, forward:=True, tabStopOnly:=True, nested:=True, wrap:=False) - End If - - End If - End If - - Dim oApplyRegex = ComboboxDoctype.EditValue Is Nothing And DTTBGI_REGEX_DOCTYPE.Rows.Count > 0 - _Logger.Info("Applying Profile Selection Regex: [{0}]", oApplyRegex) - - If oApplyRegex Then - For Each oRoW As DataRow In DTTBGI_REGEX_DOCTYPE.Rows - Dim oOnlyFilename = Path.GetFileName(CURRENT_WORKFILE) - If Regex.IsMatch(oOnlyFilename, oRoW.Item("Regex"), RegexOptions.IgnoreCase) Then - - _Logger.Debug("There is a match on REGEX_DOCTYPE: [{0}]", oRoW.Item("DOCTYPE")) - _Logger.Debug("Regex: [{0}], FileName: [{1}]", oRoW.Item("Regex"), oOnlyFilename) - - Dim oDoctypes As List(Of DocType) = DocTypes - Dim oFoundDocType As DocType = oDoctypes. - Where(Function(dt) dt.Guid = oRoW.Item("DOCTYPE_ID")). - FirstOrDefault() - - If oFoundDocType IsNot Nothing Then - _Logger.Debug("DocType found: [{0}]", oFoundDocType) - ComboboxDoctype.EditValue = oFoundDocType - ComboboxDoctype.SelectNextControl(ComboboxDoctype, forward:=True, tabStopOnly:=True, nested:=True, wrap:=False) - - Exit For - End If - End If - Next - End If - - If ComboboxDoctype.EditValue Is Nothing Then - ComboboxDoctype.Select() - End If - Catch ex As Exception - ShowErrorMessage(ex, "Form Shown") - End Try - End Sub - Sub Refresh_Dokart() - Try - Dim sql = String.Format("SELECT DISTINCT DOCTYPE_ID, DOCTYPE, SEQUENCE FROM VWGI_DOCTYPE where USERNAME = '{0}' ORDER BY SEQUENCE", Environment.UserName) - _Logger.Info("SQL DoctypeList: " & sql) - Dim oDoctypes = DATABASE_ECM.GetDatatable(sql) - - ComboboxDoctype.EditValue = Nothing - ComboboxDoctype.Properties.DataSource = Nothing - - DocTypes.Clear() - For Each oRow As DataRow In oDoctypes.Rows - Dim oDocType = New DocType With { - .Guid = oRow.Item("DOCTYPE_ID"), - .Name = oRow.Item("DOCTYPE") - } - DocTypes.Add(oDocType) - Next - - ComboboxDoctype.Properties.DataSource = DocTypes - Catch ex As Exception - ShowErrorMessage(ex, "Refresh_Dokart") - End Try - End Sub - - Private Sub ComboBoxEdit1_SelectedIndexChanged(sender As Object, e As EventArgs) Handles ComboboxDoctype.EditValueChanged - If ComboboxDoctype.EditValue IsNot Nothing And FormLoaded = True Then - - WINDREAM = New Windream(LOGCONFIG, False, WMDrive, WINDREAM_BASEPATH, True, "", "", "", "") - If Not IsNothing(WINDREAM) Then - If WINDREAM.SessionLoggedin Then - - Dim oSelectedItem As DocType = ComboboxDoctype.EditValue - - CURRENT_DOKART_ID = oSelectedItem.Guid - CURRENT_LASTDOKART = oSelectedItem.Name - - ClearNotice() - - ClearError() - - pnlIndex.Controls.Clear() - Dim sql As String = "Select WINDREAM_DIRECT, ZIEL_PFAD, DUPLICATE_HANDLING from TBDD_DOKUMENTART WHERE GUID = " & oSelectedItem.Guid - Dim oDoctypes As DataTable = DATABASE_ECM.GetDatatable(sql) - - Dim oDocType As DataRow = oDoctypes.Rows.Item(0) - WMDirect = oDocType.Item("WINDREAM_DIRECT") - Dim oDestination As String = oDocType.Item("ZIEL_PFAD") - Dim oNewDestination As String - If WMDirect Then - Dim oNormalized As String = WINDREAM.GetNormalizedPath(oDestination, False) - oNewDestination = Path.Combine(WINDREAM.ClientBasePath, oNormalized) - Else - oNewDestination = oDestination - End If - - LOGGER.Debug("Path from Database is [{0}]", oDestination) - LOGGER.Debug("Checking for path [{0}]", oNewDestination) - Dim oPathExists As Boolean - If WMDirect Then - oPathExists = WINDREAM.TestFolderExists(oNewDestination) - Else - oPathExists = Directory.Exists(oNewDestination) - End If - - If oPathExists = False Then - Dim oMessage As String - - If USER_LANGUAGE = "de-DE" Then - oMessage = $"Der Pfad für das ausgewählte Profil ist nicht erreichbar:{vbNewLine}[{oNewDestination}].{vbNewLine}{vbNewLine}Bitte wählen Sie ein anderes Profil." - Else - oMessage = $"Profile Path is not available:{vbNewLine}[{oNewDestination}].{vbNewLine}{vbNewLine}Please select another profile." - End If - - MsgBox(oMessage, MsgBoxStyle.Information, Text) - ComboboxDoctype.EditValue = Nothing - Else - - CURRENT_DOKART_DUPLICATE_HANDLING = oDocType.Item("DUPLICATE_HANDLING") - Refresh_IndexeMan(oSelectedItem.Guid) - End If - - Else - MsgBox("Es konnte keine Session aufgebaut werden.") - End If - Else - MsgBox("Es konnte keine Windream-Verbindung aufgebaut werden.") - End If - End If - End Sub - - Private Sub Refresh_IndexeMan(dokartid As Integer) - Dim sql - Try - sql = "select T1.BEZEICHNUNG AS DOKUMENTART,T.* from TBDD_INDEX_MAN T, TBDD_DOKUMENTART T1 where T.ACTIVE = 1 AND T.DOK_ID = T1.GUID AND T.DOK_ID = " & dokartid & " ORDER BY T.SEQUENCE" - DT_INDEXEMAN = DATABASE_ECM.GetDatatable(sql) - pnlIndex.Visible = True - LoadIndexe_Man() - Catch ex As System.Exception - ShowErrorMessage(ex, "Refresh_IndexeMan", "DOKART-ID: " & dokartid) - End Try - End Sub - - Function Check_HistoryValues(Indexname As String, Dokart As String) As String - Try - Dim result = Nothing - Dim DT As DataTable = MyDataset.TBTEMP_INDEXRESULTS - If DT.Rows.Count > 0 Then - For Each row As DataRow In DT.Rows - If row.Item("Indexname") = Indexname And row.Item("Dokumentart") = Dokart Then - result = row.Item("Value") - Return result - End If - Next - Else - Return Nothing - End If - Catch ex As Exception - ShowErrorMessage(ex, "Check_HistoryValues") - Return Nothing - End Try - End Function - - Private Sub LoadIndexe_Man() - Try - Dim oScreen As New DigitalData.Modules.Windows.Screen() - Dim oDpiscale = oScreen.GetScreenScaling(Me) - - Dim oRowTop As Integer = 20 * oDpiscale - Dim oLabelLeft As Integer = 20 - Dim oControlLeft As Integer = 250 - Dim oControlWidth As Integer = 420 - Dim oZeilenhoehe As Integer = 30 * oDpiscale - - _Logger.Info("Loading Indicies for Screen Scaling Factor [{0}]", oDpiscale) - - Dim oControls As New ControlCreator(LOGCONFIG, pnlIndex, Me) With { - .OnControlChanged = AddressOf PrepareDependingControl, - .OnLookupData = AddressOf GetLookupData - } - - If DT_INDEXEMAN.Rows.Count = 0 Then - ShowError("Keine Manuellen Indizes für die " & vbNewLine & "Dokumentart " & ComboboxDoctype.Text & " definiert") - _Logger.Info(" - Keine Manuellen Indizes für die " & vbNewLine & "Dokumentart " & ComboboxDoctype.Text & " definiert") - End If - - For Each oRow As DataRow In DT_INDEXEMAN.Rows - Dim oDataType = oRow.Item("DATATYPE") - Dim MultiSelect As Boolean = oRow.Item("MULTISELECT") - Dim AddNewItems As Boolean = oRow.Item("VKT_ADD_ITEM") - Dim PreventDuplicates As Boolean = oRow.Item("VKT_PREVENT_MULTIPLE_VALUES") - Dim oControlName As String = oRow.Item("NAME") - Dim oConnectionId = oRow.ItemEx("CONNECTION_ID", 0) - Dim oSQLSuggestion = oRow.Item("SUGGESTION") - Dim oSQLResult = oRow.Item("SQL_RESULT") - - LOGGER.Debug("IndexName: {0}", oControlName) - LOGGER.Debug("SQL: {0}", oSQLResult) - - Dim DefaultValue = Check_HistoryValues(oControlName, oRow.Item("DOKUMENTART")) - If DefaultValue Is Nothing Then - DefaultValue = GetPlaceholderValue(oRow.Item("DEFAULT_VALUE"), CURRENT_WORKFILE, USER_SHORTNAME) - End If - - Dim ctrl As Control = Nothing - - Dim lbl As Windows.Forms.Label = Nothing - - ' Label nur anzeigen, wenn nicht BOOLEAN - If oDataType <> ClassConstants.INDEX_TYPE_BOOLEAN Then - lbl = New Windows.Forms.Label() - lbl.Text = oRow.Item("COMMENT").ToString() - lbl.Left = oLabelLeft - lbl.Top = oRowTop - lbl.Width = oControlLeft - oLabelLeft - 10 - lbl.AutoSize = True - lbl.MaximumSize = New Size(lbl.Width, 0) ' Max Breite, Höhe unbegrenzt - lbl.Height = lbl.PreferredHeight - lbl.TextAlign = ContentAlignment.MiddleLeft - lbl.UseCompatibleTextRendering = True - pnlIndex.Controls.Add(lbl) - End If - - ' Control erzeugen und platzieren - Select Case oDataType - Case ClassConstants.INDEX_TYPE_BOOLEAN - Dim chk As CheckEdit = oControls.AddCheckBox(oControlName, oRowTop, DefaultValue, oRow.Item("COMMENT").ToString) - If chk IsNot Nothing Then - chk.Left = oControlLeft - chk.Top = oRowTop - chk.Width = oControlWidth - chk.Margin = New Padding(0, 4, 0, 4) - pnlIndex.Controls.Add(chk) - End If - Case ClassConstants.INDEX_TYPE_INTEGER, ClassConstants.INDEX_TYPE_VARCHAR - If (oSQLSuggestion = True AndAlso oSQLResult.ToString.Length > 0) OrElse MultiSelect = True Then - ctrl = oControls.AddLookupControl(oControlName, oRowTop, MultiSelect, oDataType, oSQLResult, oConnectionId, DefaultValue, AddNewItems, PreventDuplicates) - Else - If oControlName.ToLower() = "dateiname" Then - ctrl = oControls.AddTextBox(oControlName, oRowTop, System.IO.Path.GetFileNameWithoutExtension(CURRENT_WORKFILE), oDataType) - Else - ctrl = oControls.AddTextBox(oControlName, oRowTop, DefaultValue, oDataType) - End If - End If - Case "DATE" - ctrl = oControls.AddDateTimePicker(oControlName, oRowTop, DefaultValue) - Case Else - MsgBox("Bitte überprüfen Sie den Datentyp des hinterlegten Indexwertes!", MsgBoxStyle.Critical, "Achtung:") - _Logger.Warn(" - Datentyp nicht hinterlegt - LoadIndexe_Man") - End Select - - If ctrl IsNot Nothing Then - ctrl.Left = oControlLeft - ctrl.Top = oRowTop - ctrl.Width = oControlWidth - pnlIndex.Controls.Add(ctrl) - - If IsNotNullOrEmpty(DefaultValue) Then - - Me.BeginInvoke( - Sub() - _Logger.Debug("Triggering PrepareDependingControl for [{0}] via BeginInvoke", ctrl.Name) - PrepareDependingControl(ctrl) - End Sub) - - End If - End If - - Dim zeilenhoeheAktuell As Integer - - If oDataType <> ClassConstants.INDEX_TYPE_BOOLEAN Then - ' Verwende die Höhe vom Label oder Mindesthöhe - zeilenhoeheAktuell = Math.Max(lbl.Height, 30 * oDpiscale) - Else - ' Für Boolean Controls kannst du die Standardhöhe nehmen - zeilenhoeheAktuell = 30 * oDpiscale - End If - - oRowTop += zeilenhoeheAktuell - Next - - ' Panel- und Formhöhe anpassen, wenn nötig - Dim oPanelHeight = oRowTop + 10 - If pnlIndex.Height < oPanelHeight Then - If (Me.Height - 315) < oPanelHeight Then - Me.Height = (Me.Height - 315) + oPanelHeight - End If - pnlIndex.Height = oPanelHeight - End If - - SendKeys.Send("{TAB}") - - Catch ex As Exception - ShowErrorMessage(ex, "LoadIndexe_Man") - End Try - End Sub - - Private Function GetLookupData(pLookup As LookupControl3, pSQLCommand As String, pConnectionId As Integer) - Dim oConnectionString = DATABASE_ECM.Get_ConnectionStringforID(pConnectionId) - - If oConnectionString IsNot Nothing And pSQLCommand.Length > 0 Then - LOGGER.Debug("Connection String (redacted): [{0}]", oConnectionString.Substring(0, 30)) - - If ClassPatterns.HasComplexPatterns(pSQLCommand) Then - LOGGER.Debug(" >>sql enthält Platzhalter und wird erst während der Laufzeit gefüllt!", False) - Return Nothing - Else - pSQLCommand = ClassPatterns.ReplaceInternalValues(pSQLCommand) - pSQLCommand = ClassPatterns.ReplaceUserValues(pSQLCommand, USER_PRENAME, USER_SURNAME, USER_SHORTNAME, USER_LANGUAGE, USER_EMAIL, USER_ID, CURRENT_DOKART_ID) - - Dim oDatatable = DATABASE_ECM.GetDatatableWithConnection(pSQLCommand, oConnectionString) - Return oDatatable - End If - Else - LOGGER.Warn("Connection String for control [{0}] is empty!", pLookup.Name) - Return Nothing - End If - End Function - - Private Sub PrepareDependingControl(Control As Control) - If TypeOf Control Is Windows.Forms.Label Then - Exit Sub - End If - - Try - Dim oMeta = DirectCast(Control.Tag, ControlCreator.ControlMeta) - Dim oIndexName As String = oMeta.IndexName - Dim oSQL = $"SELECT * FROM TBDD_INDEX_MAN WHERE SQL_RESULT LIKE '%{oIndexName}%' AND DOK_ID = {CURRENT_DOKART_ID}" - Dim oDatatable As DataTable = DATABASE_ECM.GetDatatable(oSQL) - - If Not IsNothing(oDatatable) Then - LOGGER.Debug("Found [{0}] depending controls for [{1}]", oDatatable.Rows.Count, Control.Name) - - For Each oRow As DataRow In oDatatable.Rows - Dim oControlName As String = oRow.ItemEx("NAME", "") - Dim oConnectionId As Integer = oRow.ItemEx("CONNECTION_ID", -1) - Dim oControlSql As String = oRow.ItemEx("SQL_RESULT", "") - - If oConnectionId = -1 Or oControlSql = String.Empty Then - LOGGER.Warn("Missing SQL Query or ConnectionId for Control [{0}]! Continuing.", oControlName) - Continue For - End If - - oControlSql = ClassPatterns.ReplaceUserValues(oControlSql, USER_PRENAME, USER_SURNAME, USER_SHORTNAME, USER_LANGUAGE, USER_EMAIL, USER_ID, CURRENT_DOKART_ID) - oControlSql = ClassPatterns.ReplaceInternalValues(oControlSql) - oControlSql = ClassPatterns.ReplaceControlValues(oControlSql, pnlIndex) - LOGGER.Debug("Setting new value for [{0}]", oControlName) - SetDependingControlResult(oControlName, oControlSql, oConnectionId) - Next - End If - Catch ex As Exception - LOGGER.Error(ex) - End Try - End Sub - - Private Sub SetDependingControlResult(IndexName As String, SqlCommand As String, SqlConnectionId As Integer) - Try - If String.IsNullOrWhiteSpace(SqlCommand) OrElse SqlCommand.Contains("''") OrElse SqlCommand.Contains("IN ()") Then - LOGGER.Warn("Skipped SQL execution for Index [{0}]: Invalid or empty SQL: [{1}]", IndexName, SqlCommand) - Exit Sub - End If - - Dim oConnectionString = DATABASE_ECM.Get_ConnectionStringforID(SqlConnectionId) - Dim oDatatable As DataTable = DATABASE_ECM.GetDatatableWithConnection(SqlCommand, oConnectionString) - Dim oFoundControl As Control = Nothing - - For Each oControl As Control In pnlIndex.Controls - If TypeOf oControl Is Windows.Forms.Label Then - Continue For - End If - - Dim oMeta = DirectCast(oControl.Tag, ControlCreator.ControlMeta) - Dim oIndex As String = oMeta.IndexName - - If oIndex = IndexName Then - oFoundControl = oControl - Exit For - End If - Next - - If oFoundControl Is Nothing Then - LOGGER.Warn("Depending Control for Index [{0}] not found!", IndexName) - Exit Sub - End If - - If oDatatable Is Nothing Then - LOGGER.Warn("Error in SQL Command: {0}", SqlCommand) - Exit Sub - End If - - Select Case oFoundControl.GetType.Name - Case GetType(TextEdit).Name - If oDatatable.Rows.Count > 0 Then - Dim oFirstRow As DataRow = oDatatable.Rows.Item(0) - - If oFirstRow.ItemArray.Length > 0 Then - Dim oValue = oFirstRow.Item(0).ToString() - - LOGGER.Debug("Setting Value for TextEdit [{0}]: [{1}]", oFoundControl.Name, oValue) - DirectCast(oFoundControl, TextEdit).Text = oValue - End If - End If - Case GetType(LookupControl3).Name - LOGGER.Debug("Setting Value for LookupControl [{0}]: [{1}]", oFoundControl.Name, "DATATABLE") - Dim oLookupControl = DirectCast(oFoundControl, LookupControl3) - oLookupControl.Properties.DataSource = oDatatable - - If oDatatable.Columns.Count > 0 Then - oLookupControl.Properties.ValueMember = oDatatable.Columns.Item(0).ColumnName - oLookupControl.Properties.DisplayMember = oDatatable.Columns.Item(0).ColumnName - End If - Case GetType(Windows.Forms.ComboBox).Name - LOGGER.Debug("Setting Value for Combobox [{0}]: [{1}]", oFoundControl.Name, "DATATABLE") - DirectCast(oFoundControl, Windows.Forms.ComboBox).DataSource = oDatatable - Case Else - LOGGER.Debug("Could not set depending control result for [{0}]", oFoundControl.GetType.Name) - End Select - Catch ex As Exception - LOGGER.Error(ex) - End Try - End Sub - - Function GetPlaceholderValue(InputValue As String, FileName As String, UserShortName As String) As String - Dim oResult As String - - Try - Select Case InputValue.ToString.ToUpper - Case "$filename_ext".ToUpper - oResult = Path.GetFileName(FileName) - Case "$filename".ToUpper - oResult = Path.GetFileNameWithoutExtension(FileName) - Case "$extension".ToUpper - oResult = Path.GetExtension(FileName).Replace(".", "") - Case "$FileCreateDate".ToUpper - Dim oFileInfo As New FileInfo(FileName) - Dim oCreationDate As Date = oFileInfo.CreationTime - oResult = oCreationDate.ToShortDateString - Case "$FileCreatedWho".ToUpper - - Dim fileInfo As FileInfo = New FileInfo(FileName) - Dim fileSecurity As FileSecurity = fileInfo.GetAccessControl() - - ' Ersteller auslesen - Dim oOwner As System.Security.Principal.NTAccount = DirectCast(fileSecurity.GetOwner(GetType(System.Security.Principal.NTAccount)), System.Security.Principal.NTAccount) - oResult = oOwner.Value - Case "$DateDDMMYYY".ToUpper - oResult = System.DateTime.Now.ToShortDateString - Case "$Username".ToUpper - oResult = Environment.UserName - Case "$Usercode".ToUpper - oResult = UserShortName - Case Else - oResult = InputValue - End Select - Catch ex As Exception - _Logger.Warn("Error in ReplacePlaceholders: " & ex.Message) - _Logger.Error(ex.Message) - oResult = Nothing - End Try - - Return oResult - End Function - - Function StripPlaceholder(Placeholder As String) As String - Dim oResult = Placeholder - oResult = Regex.Replace(oResult, "^\[%", "") - oResult = Regex.Replace(oResult, "\]$", "") - Return oResult - End Function - - Function FillIndexe_Autom(dokart_id As Integer) As Boolean - Try - VWINDEX_AUTOMTableAdapter.Fill(MyDataset.VWDDINDEX_AUTOM, dokart_id) - Dim oDatatable = MyDataset.VWDDINDEX_AUTOM - Dim placeholderRegex As New Regex("\[%{1}[a-zA-Z0-9\!\$\&\/\(\)\=\?\,\.\-\;\:_öÖüÜäÄ\#\'\+\*\~\{\}\@\€\<\>\ ]+]{1}") - - If oDatatable.Rows.Count = 0 Then Return True - - For Each oRow As DataRow In oDatatable - Dim indexName = oRow.Item("INDEXNAME").ToString - _Logger.Info($"Working on AutomaticIndex: {indexName}...") - - Dim sql = oRow.ItemEx("SQL_RESULT", "") - Dim sqlActive = oRow.ItemEx("SQL_ACTIVE", False) - Dim connId = oRow.ItemEx("CONNECTION_ID", -1) - Dim provider = oRow.ItemEx("SQL_PROVIDER", "") - Dim value = oRow.ItemEx("VALUE", "") - Dim endResult As New List(Of String) - - ' #### Fall: Kein SQL oder SQL ist nicht aktiv - If String.IsNullOrWhiteSpace(sql) OrElse Not sqlActive Then - Dim resolved = GetPlaceholderValue(value, CURRENT_WORKFILE, USER_SHORTNAME) - oRow("Indexiert") = True - oRow("Indexwert") = If(resolved, value) - Continue For - End If - - ' #### Fall: SQL aktiv – einfache Platzhalter ersetzen - Dim matches = placeholderRegex.Matches(sql) - - For Each match As Match In matches - Dim ph = StripPlaceholder(match.Value) - Dim resolvedPH = GetPlaceholderValue(ph, CURRENT_WORKFILE, USER_SHORTNAME) - If Not String.IsNullOrWhiteSpace(resolvedPH) Then - sql = sql.Replace(match.Value, resolvedPH) - Continue For - End If - - Dim isOptional = DATABASE_ECM.GetScalarValue($"SELECT OPTIONAL FROM TBDD_INDEX_MAN WHERE DOK_ID = {dokart_id} AND UPPER(NAME) = UPPER('{ph}')") - Dim manIndex = GetManIndex_Value(ph, "IDX_AUTO", isOptional) - - If Not String.IsNullOrWhiteSpace(manIndex) AndAlso Not manIndex.Contains(ClassConstants.VECTORSEPARATOR) Then - sql = sql.Replace(match.Value, manIndex) - End If - Next - - ' #### Platzhalter durch Umgebungsvariablen ersetzen - sql = ClassPatterns.ReplaceControlValues(sql, pnlIndex) - sql = ClassPatterns.ReplaceInternalValues(sql) - sql = ClassPatterns.ReplaceUserValues(sql, USER_PRENAME, USER_SURNAME, USER_SHORTNAME, USER_LANGUAGE, USER_EMAIL, USER_ID, dokart_id) - - If Not String.IsNullOrWhiteSpace(sql) Then _Logger.Debug("SQL after Replace: " & sql) - - ' #### Fall: Vektor-Platzhalter oder Vektor-Index - If placeholderRegex.Matches(sql).Count > 0 OrElse indexName.Contains("Vektor") Then - Try - Dim connString = DATABASE_ECM.Get_ConnectionStringforID(connId) - Dim resultDT = DATABASE_ECM.GetDatatableWithConnection(sql, connString) - - If resultDT IsNot Nothing Then - For Each resultRow As DataRow In resultDT.Rows - endResult.Add(resultRow.Item(0).ToString()) - Next - - If endResult.Count > 0 Then - oRow("Indexiert") = True - oRow("Indexwert") = String.Join(ClassConstants.VECTORSEPARATOR, endResult) - End If - End If - Catch ex As Exception - ShowErrorMessage(ex, $"FillIndexe_Autom - Vektorfield [{indexName}]") - End Try - Else - ' #### Fall: Nur einfacher SQL ohne Vektor - Dim result = GetAutomaticIndexSQLValue(sql, connId, provider) - _Logger.Info($"Got simple SQLResult: {result}") - oRow("Indexiert") = True - oRow("Indexwert") = result - End If - Next - - Return True - - Catch ex As Exception - ShowErrorMessage(ex, "FillIndexe_Autom") - Return False - End Try - End Function - - Private Sub btnVorschau_Click(sender As System.Object, e As System.EventArgs) - PreviewFile() - End Sub - - Sub PreviewFile() - Try - DocumentViewer1.LoadFile(CURRENT_WORKFILE) - Catch ex As Exception - ShowErrorMessage(ex, "PreviewFile") - End Try - End Sub - Private Function UnicodeBytesToString(ByVal bytes() As Byte) As String - Return System.Text.Encoding.UTF8.GetString(bytes) - End Function - Public Function TextStringToByteArray(ByRef str As String) As Byte() - Dim enc As System.Text.Encoding = Encoding.GetEncoding(65001) - - Return enc.GetBytes(str) - End Function - Public Shared Function encode(ByVal str As String) As String - 'supply True as the construction parameter to indicate - 'that you wanted the class to emit BOM (Byte Order Mark) - 'NOTE: this BOM value is the indicator of a UTF-8 string - Dim utf8Encoding As New System.Text.UTF8Encoding(True) - Dim encodedString() As Byte - - encodedString = utf8Encoding.GetBytes(str) - - Return utf8Encoding.GetString(encodedString) - End Function - Private Function WORK_FILE() As Boolean - Try - Me.VWDDINDEX_MANTableAdapter.Fill(Me.MyDataset.VWDDINDEX_MAN, CURRENT_DOKART_ID) - _Logger.Debug("Manuelle Indexe geladen") - - If MyDataset.VWDDINDEX_MAN.Rows.Count > 0 Then - Dim oDokart As DocType = ComboboxDoctype.EditValue - - CURRENT_DOKART_ID = oDokart.Guid - If CheckWrite_IndexeMan(oDokart.Guid) = True Then - '##### Manuelle Indexe indexiert ##### - _Logger.Info("Datei [" & CURRENT_WORKFILE & "] wird nun indexiert...") - If FillIndexe_Autom(oDokart.Guid) = True Then - _Logger.Debug(" ...FillIndexe_Autom durchlaufen") - - 'Den Zielnamen zusammenbauen - If Name_Generieren() = True Then - 'Die Datei verschieben - If Move_File_and_Index() = True Then - _Logger.Debug(" ...Move_File2_Target durchlaufen") - - _Logger.Info("Datei '" & CURRENT_NEWFILENAME & "' erfolgreich erzeugt.") - Dim oDEL As String = "DELETE FROM TBGI_FILES_USER WHERE GUID = " & CURRENT_WORKFILE_GUID - DATABASE_ECM.ExecuteNonQuery(oDEL) - - 'Dokumentenviewer ausblenden um keinen Zugriffsfehler zu produzieren - CloseViewer() - _Logger.Debug(" ...Viewer geschlossen") - - If CURR_DELETE_ORIGIN = True Then - _Logger.Info("Datei [" & CURRENT_WORKFILE & "] wird gelöscht.") - Try - File.SetAttributes(CURRENT_WORKFILE, FileAttributes.Normal) - File.Delete(CURRENT_WORKFILE) - Catch ex As Exception - _Logger.Error(ex) - End Try - _Logger.Info("Datei [" & CURRENT_WORKFILE & "] wurde gelöscht.") - End If - - Return True - End If - - Else - If USER_LANGUAGE = LANG_DE Then - MsgBox("Unerwarteter Fehler in Name_Generieren - Bitte überprüfen sie die Logdatei", MsgBoxStyle.Critical) - Else - MsgBox("Unexpected error in Name_Generieren - Please check the Logfile", MsgBoxStyle.Critical) - End If - Return False - End If - Else - If USER_LANGUAGE = LANG_DE Then - MsgBox("Unerwarteter Fehler in FillIndexe_Autom - Bitte überprüfen sie die Logdatei", MsgBoxStyle.Critical) - Else - MsgBox("Unexpected error in FillIndexe_Autom - Please check the Logfile", MsgBoxStyle.Critical) - End If - Return False - End If - End If - Else - If USER_LANGUAGE = LANG_DE Then - MsgBox("Bitte überprüfen Sie die Konfiguration dieser Dokumentart." & vbNewLine & "Es sind KEINE manuellen Indizes konfiguriert oder aktiv geschaltet!", MsgBoxStyle.Exclamation) - Else - MsgBox("Please check the configuration for this document-type." & vbNewLine & "There are NO manual indicies that are either configured or set to active!", MsgBoxStyle.Exclamation) - End If - Return False - End If - Catch ex As Exception - ShowErrorMessage(ex, "WORK_FILE") - Return False - End Try - End Function - - Private Function Move_File_and_Index() - Dim oError As Boolean - Try - CURRENT_DOC_ID = 0 - Dim oSQL As String = "SELECT FOLDER_FOR_INDEX FROM TBDD_DOKUMENTART WHERE GUID = " & CURRENT_DOKART_ID - Dim oFolderForIndex = DATABASE_ECM.GetScalarValue(oSQL) - If Not IsDBNull(oFolderForIndex) Then - CreateFolderForIndex(oFolderForIndex) - Else - CreateFolderForIndex(String.Empty) - End If - - If CURR_DOKART_WD_DIRECT = False Then - 'Datei verschieben - oError = Move_Rename_Only(CURRENT_WORKFILE, CURRENT_NEWFILENAME, CURR_WORKFILE_EXTENSION, VERSION_DELIMITER) - Else - Dim oExportSuccessful As Boolean = False - 'Variable Folder - If DropType = "|DROPFROMFSYSTEM|" Or DropType = "|OUTLOOK_ATTACHMENT|" Or DropType = "|ATTMNTEXTRACTED|" Or DropType = "|FW_SIMPLEINDEXER|" Then - oExportSuccessful = SINGLEFILE_2_WINDREAM(CURR_DOKART_OBJECTTYPE) - ElseIf DropType = "|OUTLOOK_MESSAGE|" Or DropType = "|FW_MSGONLY|" Or DropType = "|MSGONLY|" Or DropType = "|FW_OUTLOOK_MESSAGE|" Then - oExportSuccessful = SINGLEFILE_2_WINDREAM(CURR_DOKART_OBJECTTYPE) - End If - If oExportSuccessful = True Then - Dim ofilename = Path.GetFileName(CURRENT_NEWFILENAME) - Dim odwDocID As Int64 - If WM_DB_SERVER <> "" Then - oSQL = $"select max(dwdocid) from {WM_DB_SERVER}.dbo.BaseAttributes where szLongName = '{ofilename}'" - Dim oDocID = DATABASE_ECM.GetScalarValue(oSQL) - If Not IsNothing(oDocID) Then - CURRENT_DOC_ID = oDocID - End If - End If - - 'Kein Fehler in Export2windream - oError = False - If Write_Indizes() = True Then - 'Kein Fehler in Setzen der windream-Indizes - Dim Insert_String As String - Try - Dim tempCur_WF = CURRENT_WORKFILE.Replace("'", "''") - Dim tempCur_New_FN = CURRENT_NEWFILENAME.Replace("'", "''") - Dim oUser As String = $"{Environment.UserDomainName}\{Environment.UserName}" - - Insert_String = sql_history_INSERT_INTO & $",ADDED_WHO, ADDED_WHERE, FILE_HASH) VALUES ('{tempCur_WF}','{tempCur_New_FN}'{sql_history_Index_Values},'{oUser}','{Environment.MachineName}','{CURRENT_WORKFILE_HASH}')" - DATABASE_ECM.GetScalarValue(Insert_String) - If DropType.Contains("MSG") Or DropType = "|ATTMNTEXTRACTED|" Or DropType = "|OUTLOOK_ATTACHMENT|" Then - If CURRENT_MESSAGEID <> "" Then - Dim max As String = "SELECT MAX(GUID) FROM TBGI_HISTORY" - Dim GUID = DATABASE_ECM.GetScalarValue(max) - Try - If GUID > 0 Then - Dim sqlUpdate As String - If DropType = "|ATTMNTEXTRACTED|" Or DropType = "|OUTLOOK_ATTACHMENT|" Then - sqlUpdate = "Update TBGI_HISTORY SET ATTACHMENT = 1, MSG_ID = '" & CURRENT_MESSAGEID & "' WHERE GUID = " & GUID - DATABASE_ECM.ExecuteNonQuery(sqlUpdate) - Else - sqlUpdate = "Update TBGI_HISTORY SET ATTACHMENT = 0, MSG_ID = '" & CURRENT_MESSAGEID & "' WHERE GUID = " & GUID - DATABASE_ECM.ExecuteNonQuery(sqlUpdate) - End If - End If - Catch ex As Exception - _Logger.Error(ex) - End Try - End If - End If - - Catch ex As Exception - _Logger.Error(ex) - MsgBox("Error in Insert-History - View logfile: " & ex.Message, MsgBoxStyle.Critical) - _Logger.Warn(" - Unexpected error in Insert-History - Fehler: " & vbNewLine & ex.Message) - _Logger.Warn(" - Unexpected error in Insert-History - SQL: " & Insert_String) - oError = True - End Try - Else - oError = True - End If - Else - oError = True - - If USER_LANGUAGE = LANG_DE Then - MsgBox("Der Export nach windream war nicht erfolgreich - Check LogFile", MsgBoxStyle.Exclamation) - Else - MsgBox("Export to windream was unsucessful - Check LogFile", MsgBoxStyle.Exclamation) - End If - End If - End If - 'False oder True zurückgeben - 'Kein Fehler aufgetreten - If oError = False Then - Return True - Else - 'Fehler aufgetreten - Return False - End If - Catch ex As Exception - ShowErrorMessage(ex, "Move_File2_Target") - Return False - End Try - End Function - - Private Function CreateFolderForIndex(DynamicFolderConfig As String) - Try - Dim oRootFolder As String = Path.GetDirectoryName(CURRENT_NEWFILENAME) - - If DynamicFolderConfig <> String.Empty Then - '###### - Dim oRegexString As String = "\[%{1}[a-zA-Z0-9\!\$\&\/\(\)\=\?\,\.\-\;\:_öÖüÜäÄ\#\'\+\*\~\{\}\@\€\<\>\ ]+]{1}" - ' einen Regulären Ausdruck laden - Dim oRegex As Regex = New Regex(oRegexString) - ' die Vorkommen im Folder-String auslesen - Dim oMatches As MatchCollection = oRegex.Matches(DynamicFolderConfig) - '#### - - ' alle Vorkommen innerhalb des Ordnerstrings durchlaufen - For Each oMatch As Match In oMatches - _Logger.Info("Elementname in FolderString: '" & oMatch.ToString & "'") - Select Case oMatch.Value.Substring(2, 1).ToUpper - - 'Manueller Indexwert - Case "M" - Dim oManIndexName = oMatch.Value.Substring(3, oMatch.Value.Length - 4) - Dim oIsOptional As Boolean = DATABASE_ECM.GetScalarValue("SELECT OPTIONAL FROM TBDD_INDEX_MAN WHERE DOK_ID = " & CURRENT_DOKART_ID & " AND UPPER(NAME) = UPPER('" & oManIndexName & "')") - _Logger.Info("Versuch den Indexwert aus '" & oManIndexName & "' auszulesen.") - Dim oManIndexValue As String = GetManIndex_Value(oManIndexName, "FILE", oIsOptional) - _Logger.Info("Ergebnis/Wert für neuen Ordner: '" & oManIndexName & "'") - If Not oManIndexValue = String.Empty Then - If IsDate(oManIndexValue) Then - oManIndexValue = CDate(oManIndexValue).ToString("yyyyMMdd") - End If - - oManIndexValue = FILESYSTEM.GetCleanPath(oManIndexValue) - DynamicFolderConfig = DynamicFolderConfig.Replace(oMatch.ToString, oManIndexValue) - - _Logger.Info("FolderPattern: '" & DynamicFolderConfig & "'") - Else - - If oIsOptional = True Then - _Logger.Info("Optionaler Indexwert ist NICHT gefüllt") - DynamicFolderConfig = DynamicFolderConfig.Replace(oMatch.ToString, String.Empty) - Else - _Logger.Info(" - Achtung Ausnahme in 'CrFolderForIndex': der Index ist leer!") - Return True - End If - End If - Case "A" - Dim oAutoIndexName = oMatch.Value.Substring(3, oMatch.Value.Length - 4) - _Logger.Info("Versuch den Auto-Indexwert aus '" & oAutoIndexName & "' auszulesen.") - Dim oAutoIndexValue As String = GetAutoIndex_Value(oAutoIndexName) - _Logger.Info("Ergebnis/Wert für neuen Ordner: '" & oAutoIndexName & "'") - If Not oAutoIndexValue = String.Empty Then - - oAutoIndexValue = FILESYSTEM.GetCleanPath(oAutoIndexValue) - If oAutoIndexValue = "EMPTY_OI" Then - DynamicFolderConfig = DynamicFolderConfig.Replace(oMatch.ToString, "") - Else - DynamicFolderConfig = DynamicFolderConfig.Replace(oMatch.ToString, oAutoIndexValue) - _Logger.Info("FolderPattern: '" & DynamicFolderConfig & "'") - End If - - Else - _Logger.Info(" - Achtung Ausnahme in 'CrFolderForIndex': der Index ist leer!") - End If - Case "V" - Dim oElementTemp As String - 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 = oMatch.Value.Substring(3, oMatch.Value.Length - 4) - If type.StartsWith("_") Then - type = type.Replace("_", "") - End If - Select Case type - Case "YYYY/MM/DD" - oElementTemp = My.Computer.Clock.LocalTime.Year & "\" & _Month & "\" & _day - Case "YYYY/MM" - oElementTemp = My.Computer.Clock.LocalTime.Year & "\" & _Month - Case "YYYY" - oElementTemp = My.Computer.Clock.LocalTime.Year - Case "YYYY-MM" - oElementTemp = My.Computer.Clock.LocalTime.Year & "-" & _Month - End Select - DynamicFolderConfig = DynamicFolderConfig.Replace(oMatch.ToString, oElementTemp) - _Logger.Info("FolderPatter nach V-Element: '" & DynamicFolderConfig & "'") - Case Else - _Logger.Warn(" - Achtung - in der Namenkonvention wurde ein Element gefunden welches nicht zugeordnet werden kann!" & vbNewLine & "Elementname: " & oMatch.Value.ToUpper) - - If USER_LANGUAGE = LANG_DE Then - MsgBox("Achtung - in der Namenkonvention wurde ein Element gefunden welches nicht zugeordnet werden kann!" & vbNewLine & "Elementname: " & oMatch.Value.ToUpper, MsgBoxStyle.Exclamation, "Unexpected error in Name generieren:") - Else - MsgBox("Attention - One element in Namingconvention could not be matched!" & vbNewLine & "Elementname: " & oMatch.Value.ToUpper, MsgBoxStyle.Exclamation, "Unexpected error in Name generieren:") - End If - End Select - Next - End If - - _Logger.Info("Den Root-Folder zusammenfügen>> ") - - Dim oNewFullPath As String = System.IO.Path.Combine(oRootFolder, DynamicFolderConfig) - - _Logger.Info("Fullpath (mit evtl. Sonderzeichen (SZ)) '" & oNewFullPath & "'") - Dim invalidPathChars() As Char = Path.GetInvalidPathChars() - For Each sonderChar As Char In invalidPathChars - 'Sonderzeichen ausser Whitespace entfernen - If Char.IsWhiteSpace(sonderChar) = False Then - If oNewFullPath.Contains(sonderChar) Then - oNewFullPath = oNewFullPath.Replace(sonderChar, "") - End If - End If - Next sonderChar - oNewFullPath = WINDREAM.GetCleanedPath(oNewFullPath) - - _Logger.Info("Fullpath (ohne SZ) '" & oNewFullPath & "'") - If Directory.Exists(oNewFullPath) = False Then - Try - Dim oCreatedPath = Directory.CreateDirectory(oNewFullPath) - oNewFullPath = oCreatedPath.FullName - _Logger.Info("Folder '" & oNewFullPath & "' wurde angelegt") - Catch ex As Exception - _Logger.Info("Error in CreateFolderforIndex-Method - Root Folder '" & oNewFullPath & "' could not be created. " & ex.Message) - _Logger.Error(ex.Message) - MsgBox("Attention: Root Folder '" & oNewFullPath & "' could not be created." & vbNewLine & ex.Message, MsgBoxStyle.Critical) - Return False - End Try - End If - - CURRENT_NEWFILENAME = Path.Combine(oNewFullPath, Path.GetFileName(CURRENT_NEWFILENAME)) - - Return True - Catch ex As Exception - ShowErrorMessage(ex, "CreateFolderForIndex") - Return False - End Try - End Function - - Private Sub Button1_Click(sender As Object, e As EventArgs) - If File.Exists(CURRENT_FILENAME) Then - Select Case CancelAttempts - Case 0 - If USER_LANGUAGE = LANG_DE Then - MsgBox("Bitte indexieren Sie die Datei vollständig!" & vbNewLine & "(Abbruch 1 des Indexierungsvorgangs)", MsgBoxStyle.Information) - Else - MsgBox("Please Index file completely" & vbNewLine & "(Abort 1 of Indexdialog)", MsgBoxStyle.Information) - End If - CancelAttempts += 1 - Case 1 - Dim result As MsgBoxResult - If USER_LANGUAGE = LANG_DE Then - result = MessageBox.Show("Sie brechen nun zum zweiten Mal den Indexierungsvorgang ab!" & vbNewLine & "Wollen Sie die Indexierung aller Dateien abbrechen?", "Bestätigung erforderlich:", MessageBoxButtons.YesNo, MessageBoxIcon.Question) - Else - result = MessageBox.Show("You are aborting the indexdialog for the 2nd time!" & vbNewLine & "Do You want to abort indexing?", "Confirmation needed:", MessageBoxButtons.YesNo, MessageBoxIcon.Question) - End If - - If result = MsgBoxResult.Yes Then - Dim containsfw_file As Boolean = False - Try - ABORT_INDEXING = True - Dim sql As String = "SELECT * FROM TBGI_FILES_USER WHERE WORKED = 0 AND UPPER(USER@WORK) = UPPER('" & Environment.UserName & "')" - - Dim DT As DataTable = DATABASE_ECM.GetDatatable(sql) - - Dim anz = DT.Rows.Count - For Each Filerow As DataRow In DT.Rows - Dim filestring As String = Filerow.Item("FILENAME2WORK") - Dim handletype As String = Filerow.Item("HANDLE_TYPE") - - If handletype = "|MSGONLY|" Or handletype = "|ATTMNTEXTRACTED|" Then - Try - System.IO.File.Delete(filestring) - Catch ex As Exception - - End Try - - ElseIf handletype.StartsWith("|FW") Then - containsfw_file = True - End If - Next - 'Zuerst die Daten des Ablaufs löschen - If DATABASE_ECM.ExecuteNonQuery("DELETE FROM TBGI_FILES_USER WHERE UPPER(USER@WORK) = UPPER('" & Environment.UserName & "')") = True Then - If containsfw_file = True Then - If USER_LANGUAGE = LANG_DE Then - MsgBox("Der Indexierungsprozess beinhaltete (auch) Dateien per Folderwatch!" & vbNewLine & "Diese Dateien wurden nicht gelöscht und verbleiben im Folderwatch-Verzeichnis!" & vbNewLine & "Bitte verschieben Sie die Dateien ggfls.", MsgBoxStyle.Information, "Achtung - Hinweis:") - Else - MsgBox("The Indexingprocess contained (also) files from folderwatch!" & vbNewLine & "These files weren't deleted and will stay in the folderwatch-folder!" & vbNewLine & "Please move these files manually.", MsgBoxStyle.Information, "Achtung - Hinweis:") - End If - - End If - End If - - Catch ex As Exception - _Logger.Error(ex) - MsgBox("Unexpected Error in Abort Indexing: " & vbNewLine & ex.Message, MsgBoxStyle.Critical) - End Try - - Close() - End If - End Select - End If - End Sub - - Private Sub BarCheckItem1_CheckedChanged(sender As Object, e As DevExpress.XtraBars.ItemClickEventArgs) Handles checkItemTopMost.CheckedChanged - If FormLoaded = True Then - TopMost = checkItemTopMost.Checked - CONFIG.Config.TopMost = checkItemTopMost.Checked - CONFIG.Save() - End If - End Sub - - Private Sub checkItemDeleteSource_CheckedChanged(sender As Object, e As DevExpress.XtraBars.ItemClickEventArgs) Handles checkItemDeleteSource.CheckedChanged - If FormLoaded = True And checkItemDeleteSource.Visibility <> DevExpress.XtraBars.BarItemVisibility.Never Then - CURR_DELETE_ORIGIN = checkItemDeleteSource.Checked - CONFIG.Config.DeleteOriginalFile = checkItemDeleteSource.Checked - CONFIG.Save() - End If - End Sub - - Private Sub labelFilePath_ItemClick(sender As Object, e As DevExpress.XtraBars.ItemClickEventArgs) Handles labelFilePath.ItemClick - Clipboard.SetText(CURRENT_WORKFILE) - - If USER_LANGUAGE = LANG_DE Then - MsgBox("Aktuellen Pfad in die Zwischenablage kopiert!", MsgBoxStyle.Information, Text) - Else - MsgBox("Current Path copied to Clipboard!", MsgBoxStyle.Information, Text) - End If - End Sub - - Private Sub checkItemPreview_CheckedChanged(sender As Object, e As DevExpress.XtraBars.ItemClickEventArgs) Handles checkItemPreview.CheckedChanged - SetFilePreview(checkItemPreview.Checked) - CONFIG.Config.FilePreview = checkItemPreview.Checked - CONFIG.Save() - End Sub - - Private Sub SplitContainer1_SplitterMoved(sender As Object, e As SplitterEventArgs) Handles SplitContainer1.SplitterMoved - CONFIG.Config.SplitterDistanceViewer = SplitContainer1.SplitterDistance - End Sub - - Private Sub BarButtonItem1_ItemClick(sender As Object, e As DevExpress.XtraBars.ItemClickEventArgs) Handles BarButtonItem1.ItemClick - DATABASE_ECM.ExecuteNonQuery($"DELETE FROM TBGI_FILES_USER WHERE GUID = {CURRENT_WORKFILE_GUID}") - - CancelAttempts = 2 - Close() - End Sub - - Private Sub checkItemPreselection_CheckedChanged(sender As Object, e As DevExpress.XtraBars.ItemClickEventArgs) Handles checkItemPreselection.CheckedChanged - CONFIG.Config.ProfilePreselection = checkItemPreselection.Checked - CONFIG.Save() - End Sub - - Private Sub BarButtonItem2_ItemClick(sender As Object, e As DevExpress.XtraBars.ItemClickEventArgs) Handles BarButtonItem2.ItemClick - Try - MsgBox($"Deleting [{CURRENT_WORKFILE}]", MsgBoxStyle.Information, Text) - - File.SetAttributes(CURRENT_WORKFILE, FileAttributes.Normal) - File.Delete(CURRENT_WORKFILE) - - Catch ex As Exception - _Logger.Error(ex) - MsgBox(ex.Message) - End Try - End Sub - - Private Sub ComboboxDoctype_KeyUp(sender As Object, e As KeyEventArgs) Handles ComboboxDoctype.KeyUp - If e.KeyCode = Keys.F2 Then - Dim oCombo As SearchLookUpEdit = sender - oCombo.ShowPopup() - End If - End Sub - - Private Sub BarCheckItem_MultiIndexing_CheckedChanged(sender As Object, e As DevExpress.XtraBars.ItemClickEventArgs) Handles BarCheckItem_MultiIndexing.CheckedChanged - Dim item As DevExpress.XtraBars.BarCheckItem = CType(sender, DevExpress.XtraBars.BarCheckItem) - If item.Checked Then - BarButtonItem1.Enabled = False - MULTIINDEXING_ACTIVE = True - If USER_LANGUAGE = LANG_DE Then - Me.BarButtonItem_OK.Caption = "Dateien indexieren" - Else - Me.BarButtonItem_OK.Caption = "Index Files" - End If - Else - BarButtonItem1.Enabled = True - MULTIINDEXING_ACTIVE = False - If USER_LANGUAGE = LANG_DE Then - Me.BarButtonItem_OK.Caption = "Datei indexieren" - Else - Me.BarButtonItem_OK.Caption = "Index File" - End If - End If - End Sub - - Private Sub BarButtonItem_OK_ItemClick(sender As Object, e As DevExpress.XtraBars.ItemClickEventArgs) Handles BarButtonItem_OK.ItemClick - Try - ClearError() - ClearNotice() - - Me.Cursor = Cursors.WaitCursor - CURRENT_DT_REGEX = DATABASE_ECM.GetDatatable("SELECT * FROM TBGI_FUNCTION_REGEX") - For Each rowregex As DataRow In CURRENT_DT_REGEX.Rows - If rowregex.Item("FUNCTION_NAME") = "CLEAN_FILENAME" Then - REGEX_CLEAN_FILENAME = rowregex.Item("REGEX") - End If - Next - If BarCheckItem_MultiIndexing.Checked = True Then - 'Die erste Datei indexieren - If WORK_FILE() = True Then - 'Und nun die folgenden - Dim DTFiles2Work As DataTable = DATABASE_ECM.GetDatatable("SELECT * FROM TBGI_FILES_USER WHERE WORKED = 0 AND GUID <> " & CURRENT_WORKFILE_GUID & " AND UPPER(USER@WORK) = UPPER('" & Environment.UserName & "')") - If DTFiles2Work IsNot Nothing Then - Dim err = False - For Each oRow As DataRow In DTFiles2Work.Rows - CURRENT_WORKFILE_GUID = oRow.Item("GUID") - CURRENT_WORKFILE = oRow.Item("FILENAME2WORK") - CURRENT_WORKFILE_HASH = oRow.ItemEx("FILE_HASH", "") - DropType = oRow.Item("HANDLE_TYPE") - - If WORK_FILE() = False Then - err = True - Exit For - End If - Next - Me.Cursor = Cursors.Default - If err = False Then - If USER_LANGUAGE = LANG_DE Then - MsgBox("Alle Dateien wurden mit Multiindexing erfolgreich verarbeitet!", MsgBoxStyle.Information, "Erfolgsmeldung:") - Else - MsgBox("All files were successfully processed through Multiindexing", MsgBoxStyle.Information, "Success") - End If - - CloseViewer() - - CancelAttempts = 2 - Me.Close() - End If - End If - End If - Else - If WORK_FILE() = True Then - Me.Cursor = Cursors.Default - If CONFIG.Config.ShowIndexResult = True Then - If USER_LANGUAGE = LANG_DE Then - _FormHelper.ShowSuccessMessage($"Die Datei wurde erfolgreich verarbeitet!{vbNewLine}Ablagepfad:{vbNewLine}{CURRENT_NEWFILENAME}", "Erfolgsmeldung") - Else - _FormHelper.ShowSuccessMessage($"File sucessfully processed!{vbNewLine}Path:{vbNewLine}{CURRENT_NEWFILENAME}", "Success") - End If - - End If - - CloseViewer() - - CancelAttempts = 2 - Me.Close() - End If - End If - Catch ex As Exception - MsgBox("Uncaught error while indexing: " & vbNewLine & ex.Message, MsgBoxStyle.Critical, Text) - Finally - Me.Cursor = Cursors.Default - End Try - End Sub - -End Class + End Class +End Class \ No newline at end of file