Imports DigitalData.Modules.EDMI.API.Constants Imports DigitalData.Modules.EDMI.API.DatabaseWithFallback Public Class ClassFinalizeDoc Public Shared Function Write_Final_Metadata(WMObject As WINDREAMLib.WMObject) Try Dim _error As Boolean = False If CURRENT_DT_FINAL_INDEXING Is Nothing Then Dim oSQL = String.Format("select * from TBPM_PROFILE_FINAL_INDEXING where PROFIL_ID = {0}", CURRENT_ProfilGUID) 'CURRENT_DT_FINAL_INDEXING = DatabaseFallback.GetDatatableECM(oSQL) ', "Write_Final_Metadata") CURRENT_DT_FINAL_INDEXING = DatabaseFallback.GetDatatable("TBPM_PROFILE_FINAL_INDEXING", New GetDatatableOptions(oSQL, DatabaseType.ECM) With { .FilterExpression = $"PROFIL_ID = {CURRENT_ProfilGUID}" }) End If If CURRENT_DT_FINAL_INDEXING.Rows.Count > 0 Then 'Jetzt finale Indexe setzen LOGGER.Debug("working final indices for doc: " & WMObject.aName) For Each dr As DataRow In CURRENT_DT_FINAL_INDEXING.Rows Dim value As String = dr.Item("VALUE").ToString Dim INDEXNAME = dr.Item("INDEXNAME").ToString Dim oContinueOnIndifferentState As Boolean = CBool(dr.Item("CONTINUE_INDETERMINED")) If value.ToUpper = "SQL-Command".ToUpper Then '###### Indexierung mit variablen SQL ### LOGGER.Debug("indexing with dynamic sql...") 'Dim SQL_COMMAND = dr.Item("SQL_COMMAND") '' Regulären Ausdruck zum Auslesen der Indexe definieren 'Dim preg As String = "\[%{1}[a-zA-Z0-9\!\$\&\/\(\)\=\?\,\.\-\;\:_öÖüÜäÄ\#\'\+\*\~\{\}\@\€\<\>\ ]+]{1}" '' einen Regulären Ausdruck laden 'Dim regulärerAusdruck As System.Text.RegularExpressions.Regex = New System.Text.RegularExpressions.Regex(preg) '' die Vorkommen im SQL-String auslesen 'Dim elemente As System.Text.RegularExpressions.MatchCollection = regulärerAusdruck.Matches(SQL_COMMAND) ''#### '' alle Vorkommen innerhalbd er Namenkonvention durchlaufen 'For Each element As System.Text.RegularExpressions.Match In elemente ' Try ' If LogErrorsOnly = False Then LOGGER.Info(" element in RegeX: " & element.Value) ' Dim WDINDEXNAME = element.Value.Substring(2, element.Value.Length - 3) ' Dim wertWD = WMObject.GetVariableValue(WDINDEXNAME) ' If Not IsNothing(wertWD) Then ' SQL_COMMAND = SQL_COMMAND.ToString.Replace(element.Value, wertWD) ' Else ' LOGGER.Info(">>Attention: indexvalue is invalid") ' End If ' Catch ex As Exception ' LOGGER.Info("Unexpected Error in Checking control values for Variable SQL Result - ERROR: " & ex.Message) ' End Try 'Next Dim sql_Statement = clsPatterns.ReplaceUserValues(dr.Item("SQL_COMMAND")) sql_Statement = clsPatterns.ReplaceInternalValues(sql_Statement) sql_Statement = clsPatterns.ReplaceWindreamIndicies(sql_Statement, WMObject, True) LOGGER.Debug("sql after ReplaceAllValues: " & sql_Statement) Dim oDynamic_value = DatabaseFallback.GetScalarValueECM(sql_Statement) ', CONNECTION_STRING_ECM, "Write_Final_Metadata/dynamic_value") If Not IsNothing(oDynamic_value) Then value = oDynamic_value Else Continue For End If Else If value.StartsWith("v") Then Select Case dr.Item("VALUE").ToString Case "vDate" value = Now.ToShortDateString Case "vUserName" value = USER_USERNAME Case Else value = dr.Item("VALUE") End Select End If End If Dim result() As String ReDim Preserve result(0) result(0) = value Dim oIndexType = WINDREAM.GetTypeOfIndex(INDEXNAME) LOGGER.Debug($"oIndexType {oIndexType.ToString}") If oIndexType > 4000 And oIndexType < 5000 Then 'Hier muss nun separat als Vektorfeld indexiert werden If Indexiere_VektorfeldPM(value, INDEXNAME, WMObject) = True Then LOGGER.Debug("FINALER INDEX '" & INDEXNAME.Replace("[%VKT", "") & "' WURDE ERFOLGREICH GESETZT") Else MsgBox("Unexpected error in finalindexing vektorvalue - check the log", MsgBoxStyle.Critical) _error = True End If Else LOGGER.Debug("now indexing..") If Indexiere_File(INDEXNAME, result, WMObject) = True Then LOGGER.Debug("FINALER INDEX '" & INDEXNAME & "' WURDE ERFOLGREICH GESETZT") LOGGER.Debug("") 'Nun das Logging If CURRENT_PROFILE_LOG_INDEX <> "" Then Dim logstr = Return_LOGString(value, "DDFINALINDEX", INDEXNAME) Indexiere_VektorfeldPM(logstr, CURRENT_PROFILE_LOG_INDEX, WMObject) End If Else MsgBox("Unexpected error in final index - check the log", MsgBoxStyle.Critical) _error = True End If End If If _error = True Then Exit For End If Next If _error = True Then Return False Else Return True End If Else Return True End If Catch ex As Exception LOGGER.Error(ex) LOGGER.Info("unexpected error in Write_Final_Metadata: " & ex.Message.ToString, True) Return False End Try End Function Private Shared Function Indexiere_File(idxxname As String, idxvalue As Object, WMObject As WINDREAMLib.WMObject) Dim File_indexiert As Boolean = False ' Try 'Die Arrays vorbereiten Dim arrIndex() As String = Nothing Dim arrValue() As String = Nothing arrIndex = Nothing arrValue = Nothing 'Den Indexnamen übergeben ReDim Preserve arrIndex(0) arrIndex(0) = idxxname 'Das Array der Idnexwerte überprüfen If idxvalue Is Nothing = False Then If idxvalue.Length() > 1 Then LOGGER.Debug("Indexing Index '" & idxxname & "' with Arrayvalue") Dim anzahl As Integer = 0 For Each indexvalue As String In idxvalue ReDim Preserve arrValue(anzahl) arrValue(anzahl) = indexvalue anzahl += 1 Next Else LOGGER.Debug("Indexing Index '" & idxxname & "' with value '" & idxvalue(0) & "'") ReDim Preserve arrValue(0) arrValue(0) = idxvalue(0).ToString End If 'Dim _windreamPM As New ClassPMWindream 'Jetzt das eigentliche Indexieren der Datei File_indexiert = WINDREAM.RunIndexing(WMObject, arrIndex, arrValue) Return File_indexiert End If 'Catch ex As Exception ' LOGGER.Info("Unvorhergesehener Fehler bei Indexiere_File: " & ex.Message.ToString, True) ' Return Err() 'End Try End Function Private Shared Function Indexiere_VektorfeldPM(input As String, NameVectorfield As String, WMObject As WINDREAMLib.WMObject) Dim _success As Boolean = True Dim Anzahl As Integer = 0 Dim myInputArr As String() 'Jeden Wert des Vektorfeldes durchlaufen Dim wertWD = WMObject.GetVariableValue(NameVectorfield) If wertWD Is Nothing = False Then 'Es wird gegen ein Vektorfeld nachindexiert If wertWD.GetType.ToString.Contains("System.Object") Then 'es handelt sich um ein Vektorfeld - Zuweisen der Indexwerte des Vektorfeldes zu Array For Each obj As Object In wertWD If obj Is Nothing = False Then 'Das Array anpassen ReDim Preserve myInputArr(Anzahl) 'Den Wert im Array speichern myInputArr(Anzahl) = obj.ToString Anzahl += 1 End If Next End If 'Das Array anpassen ReDim Preserve myInputArr(Anzahl) 'und den letzten Wert übergeben myInputArr(Anzahl) = input Else 'Das Array anpassen ReDim Preserve myInputArr(Anzahl) 'und den letzten Wert übergeben myInputArr(Anzahl) = input End If If myInputArr.Length > 0 Then 'Jetzt die Datei indexieren If Indexiere_File(NameVectorfield, myInputArr, WMObject) = False Then _success = False 'errmessage = "Fehler beim Indexieren Vektorfeld '" & NameVKTIndex & "' - ERROR: " & idxerr_message End If End If Return _success End Function Private Shared Function Return_PM_VEKTOR(input As String, VKTBezeichner As String) Dim PM_String As String Try Dim Bezeichner As String = VKTBezeichner.Replace("[%VKT", "") PM_String = "DD-PM#" & Bezeichner & "#" & input & "#" & USER_USERNAME & "#" & Now.ToString Catch ex As Exception LOGGER.Error(ex) LOGGER.Info("Fehler in Return_PM_VEKTOR: " & ex.Message, True) PM_String = "DD-PM ERROR: " & ex.Message End Try Return PM_String End Function Private Shared Function Return_LOGString(input As String, old As String, indexname As String) Dim PM_String As String Try If old = "DDFINALINDEX" Then PM_String = "DD-PMlog-FINAL" & "#" & indexname & "#" & input & "#" & USER_USERNAME & "#" & Now.ToString Else PM_String = "DD-PMlog-CHG" & "#" & indexname & "#" & "NEW: '" & input & "' - OLD: '" & old & "'" & "#" & USER_USERNAME & "#" & Now.ToString End If Catch ex As Exception LOGGER.Error(ex) LOGGER.Info("Fehler in Return_LOGString: " & ex.Message, True) PM_String = "DD-PM ERROR: " & ex.Message End Try Return PM_String End Function End Class