diff --git a/app/DD-Record-Organiser/ClassControlBuilder.vb b/app/DD-Record-Organiser/ClassControlBuilder.vb index 6d5d515..1637312 100644 --- a/app/DD-Record-Organiser/ClassControlBuilder.vb +++ b/app/DD-Record-Organiser/ClassControlBuilder.vb @@ -25,6 +25,9 @@ Public Class ClassControlBuilder End Property ' +++ RecordChanged Event +++ + + Public WatchRecordChanges As Boolean = True + Public Custom Event OnRecordChanged As EventHandler AddHandler(value As EventHandler) Me.Events.AddHandler(_onRecordChangedName, value) @@ -59,7 +62,7 @@ Public Class ClassControlBuilder Public Sub RecordChanged(sender As Object, ByVal e As EventArgs) Dim onRecordChangedHandler As EventHandler = CType(Me.Events(_onRecordChangedName), EventHandler) - If (onRecordChangedHandler IsNot Nothing) Then + If (onRecordChangedHandler IsNot Nothing And WatchRecordChanges) Then Console.WriteLine("RecordChanged") onRecordChangedHandler.Invoke(sender, e) End If diff --git a/app/DD-Record-Organiser/ClassControlCommandsUI.vb b/app/DD-Record-Organiser/ClassControlCommandsUI.vb index a122761..a374fc9 100644 --- a/app/DD-Record-Organiser/ClassControlCommandsUI.vb +++ b/app/DD-Record-Organiser/ClassControlCommandsUI.vb @@ -489,6 +489,7 @@ Public Class ClassControlCommandsUI Private Sub UpdateAllControls(FormID As Integer, RecordID As Integer, controls As Control.ControlCollection) Try For Each ctrl As Control In controls + Console.WriteLine("Updating Control " + ctrl.Name) Dim CONTROL_ID As Integer = DirectCast(ctrl.Tag, ClassControlMetadata).Id 'GetControlID_for_RecordID(ctrl.Name, RecordID) If LogErrorsOnly = False Then ClassLogger.Add(" >> CONTROL_ID: " & CONTROL_ID, False) @@ -521,13 +522,14 @@ Public Class ClassControlCommandsUI Dim ValueExists = ClassDatabase.Execute_Scalar(String.Format("SELECT RECORD_ID FROM VWPMO_VALUES WHERE RECORD_ID = {0} AND CONTROL_ID = {1}", RecordID, CONTROL_ID)) If IsNothing(ValueExists) Then ' Neues Control - If CONTROL_ID = 995 Or CONTROL_ID = 996 Or CONTROL_ID = 997 Or CONTROL_ID = 810 Then - Console.WriteLine("sdasd") - End If + 'If CONTROL_ID = 995 Or CONTROL_ID = 996 Or CONTROL_ID = 997 Or CONTROL_ID = 810 Then + ' Console.WriteLine("sdasd") + 'End If If LogErrorsOnly = False Then ClassLogger.Add(" >> InsertControlValue: " & CONTROL_ID & "|" & RecordID & "|" & CONTROL_VALUE, False) If Not IsNothing(CONTROL_VALUE) Then If TypeOf ctrl Is CustomComboBox And CONTROL_VALUE = "" Then - Exit Sub + 'Exit Sub - Zuviel des guten + Continue For End If InsertControlValue(CONTROL_ID, RecordID, CONTROL_VALUE) End If diff --git a/app/DD-Record-Organiser/ClassControlValues.vb b/app/DD-Record-Organiser/ClassControlValues.vb index 38cfa49..fa9ac33 100644 --- a/app/DD-Record-Organiser/ClassControlValues.vb +++ b/app/DD-Record-Organiser/ClassControlValues.vb @@ -488,7 +488,6 @@ Public Class ClassControlValues dgv.DataSource = Nothing dgv.Refresh() End If - Console.WriteLine("Clearing DataGridView") End Select End Sub diff --git a/app/DD-Record-Organiser/ClassRecordState.vb b/app/DD-Record-Organiser/ClassRecordState.vb new file mode 100644 index 0000000..ff3c500 --- /dev/null +++ b/app/DD-Record-Organiser/ClassRecordState.vb @@ -0,0 +1,55 @@ +Public Class ClassRecordState + + Public Shared Sub LockRecord(RecordId As Integer) + Try + Dim Username As String = Environment.UserName + Dim SQL As String = String.Format("UPDATE TBPMO_RECORD SET IN_WORK = 1, IN_WORK_WHO = '{0}' WHERE GUID = {1}", Username, RecordId) + + ClassDatabase.Execute_non_Query(SQL) + Console.WriteLine("Record " & RecordId & " locked") + Catch ex As Exception + MsgBox("Error in LockRecord: " & vbNewLine & ex.Message,MsgBoxStyle.Critical) + End Try + End Sub + + Public Shared Sub UnlockRecord(RecordId As Integer) + Try + Dim SQL As String = String.Format("UPDATE TBPMO_RECORD SET IN_WORK = 0, IN_WORK_WHO = NULL WHERE GUID = {0}", RecordId) + + ClassDatabase.Execute_non_Query(SQL) + Console.WriteLine("Record " & RecordId & " UNlocked") + Catch ex As Exception + MsgBox("Error in UnlockRecord: " & vbNewLine & ex.Message, MsgBoxStyle.Critical) + End Try + End Sub + + Public Shared Function IsRecordLocked(RecordId As Integer) As String + Try + Dim SQL As String = String.Format("SELECT IN_WORK, IN_WORK_WHO FROM TBPMO_RECORD WHERE GUID = {0}", RecordId) + Dim dt As DataTable = ClassDatabase.Return_Datatable(SQL) + + If dt.Rows.Count = 1 Then + + Dim IN_WORK As Boolean = dt.Rows(0).Item("IN_WORK") + Dim IN_WORK_WHO As String = dt.Rows(0).Item("IN_WORK_WHO").ToString + + If IN_WORK = True Then + ' Record ist in Arbeit, benutzer zurückgeben + Return IN_WORK_WHO + ElseIf IN_WORK = False Then + ' Record ist nicht in Arbeit, nothing zurück geben + Return Nothing + End If + + ElseIf dt.Rows.Count = 0 Then + Throw New Exception("Record " & RecordId & " does not exist") + Else + Throw New Exception("Record" & RecordId & " is not unique") + End If + Catch ex As Exception + MsgBox("Error in IsRecordInWork: " + vbNewLine + ex.Message, MsgBoxStyle.Critical) + Return Nothing + End Try + End Function + +End Class diff --git a/app/DD-Record-Organiser/DD-Record-Organiser.vbproj b/app/DD-Record-Organiser/DD-Record-Organiser.vbproj index 7abc640..32e0db4 100644 --- a/app/DD-Record-Organiser/DD-Record-Organiser.vbproj +++ b/app/DD-Record-Organiser/DD-Record-Organiser.vbproj @@ -251,6 +251,7 @@ + frmRight_Management.vb diff --git a/app/DD-Record-Organiser/frmConstructor_Main.vb b/app/DD-Record-Organiser/frmConstructor_Main.vb index 587dd31..e2a5e65 100644 --- a/app/DD-Record-Organiser/frmConstructor_Main.vb +++ b/app/DD-Record-Organiser/frmConstructor_Main.vb @@ -132,6 +132,9 @@ Public Class frmConstructor_Main Save_Grid_Layout() Save_Splitter_Layout() ClassWindowLocation.SaveFormLocationSize(Me, CONSTRUCTORID, CURRENT_SCREEN_ID, "CONSTRUCTOR_MAIN") + + ' Verhindert, das noch geöffnete Records für immer gelockt sind + ClassRecordState.UnlockRecord(SELECTED_RECORD_ID) End Sub @@ -1372,8 +1375,27 @@ Public Class frmConstructor_Main End If End Sub + + Sub EnableEditMode() + Dim EditingUser = ClassRecordState.IsRecordLocked(SELECTED_RECORD_ID) + ' Überprüfen, ob der Record gerade bearbeitet wird + If Not IsNothing(EditingUser) Then + If USER_LANGUAGE = "de-DE" Then + MsgBox(String.Format("Dieser Datensatz wird gerade vom Benutzer {0} bearbeitet und kann nur lesend abgerufen werden.", EditingUser), MsgBoxStyle.Exclamation) + Else + MsgBox(String.Format("This Record is currently being edited by User {0} and only available in Read-Only mode.", EditingUser), MsgBoxStyle.Exclamation) + End If + ' Wenn Record bearbeitet wird, EnableEditMode abbrechen! + Exit Sub + + Else + 'Wenn Record bearbeitet werden kann, IN_WORK auf 1 setzen, um Bearbeitung durch andere zu verhindern! + ClassRecordState.LockRecord(SELECTED_RECORD_ID) + End If + + Lock_RecordControls(False) Me.tsButtonDelete.Enabled = True Me.tsButtonAdd.Enabled = True @@ -1388,7 +1410,9 @@ Public Class frmConstructor_Main CURRENT_RECORD_ID = RECORD_ID ' Abhängige Listen laden + CtrlBuilder.WatchRecordChanges = False ClassControlValues.LoadControlValuesListWithPlaceholders(ENTITY_ID, RECORD_ID, PARENT_ID, CtrlBuilder.AllControls, ENTITY_ID) + CtrlBuilder.WatchRecordChanges = True RECORD_ENABLED = True CURRENT_RECORD_ENABLED = True @@ -1399,6 +1423,8 @@ Public Class frmConstructor_Main End Sub Sub DisableEditMode() + ClassRecordState.UnlockRecord(SELECTED_RECORD_ID) + Lock_RecordControls(True) RECORD_ENABLED = False CURRENT_RECORD_ENABLED = False @@ -1817,7 +1843,9 @@ Public Class frmConstructor_Main ' ClassControlValues.LoadControlValuesList(firstRecordId, PARENT_ID, ENTITY_ID, CtrlBuilder.MasterPanel.Controls) 'End If ' Hinfällig, da hier die Record-ID nicht gebraucht wird + CtrlBuilder.WatchRecordChanges = False ClassControlValues.LoadControlValuesList(ENTITY_ID, CtrlBuilder.MasterPanel.Controls) + CtrlBuilder.WatchRecordChanges = True 'Zurücksetzen ENTITY_LOADED = True @@ -1855,7 +1883,9 @@ Public Class frmConstructor_Main ENTITY_RELOAD_AFT_CONTROL_LOAD = False 'Daten zu Record in jedem Fall laden 'ClassControlValues.LoadControlValues(SELECTED_RECORD_ID, ENTITY_ID, CtrlBuilder.AllControls) + CtrlBuilder.WatchRecordChanges = False ClassControlValues.LoadControlValues(SELECTED_RECORD_ID, PARENT_ID, ENTITY_ID, CtrlBuilder.AllControls, ENTITY_ID) + CtrlBuilder.WatchRecordChanges = True ' Laden der Daten bedeutet nicht dass Daten vom Benutzer geändert wurden! RECORD_CHANGED = False Update_Record_Label(Grid_RecordID) @@ -2369,7 +2399,9 @@ Public Class frmConstructor_Main Dim sw1 As New Stopwatch sw1.Start() ENTITY_RELOAD_AFT_CONTROL_LOAD = False + CtrlBuilder.WatchRecordChanges = False ClassControlValues.LoadControlValues(SELECTED_RECORD_ID, PARENT_ID, ENTITY_ID, CtrlBuilder.AllControls, ENTITY_ID) + CtrlBuilder.WatchRecordChanges = True Dim elapsed1 As Double elapsed1 = sw1.Elapsed.TotalSeconds sw1.Stop()