diff --git a/app/DD-Record-Organizer/App.config b/app/DD-Record-Organizer/App.config index ecfcfaf..30b37e2 100644 --- a/app/DD-Record-Organizer/App.config +++ b/app/DD-Record-Organizer/App.config @@ -117,6 +117,10 @@ + + + + diff --git a/app/DD-Record-Organizer/Classes/ClassDOC_SEARCH.vb b/app/DD-Record-Organizer/Classes/ClassDOC_SEARCH.vb index 6911c98..42da4f6 100644 --- a/app/DD-Record-Organizer/Classes/ClassDOC_SEARCH.vb +++ b/app/DD-Record-Organizer/Classes/ClassDOC_SEARCH.vb @@ -6,6 +6,19 @@ Public Class ClassDOC_SEARCH Private Shared ENTITY_ID As Integer Private Shared RECORD_ID As Integer Private Shared AsyncRunning As Boolean = False + Private Shared EnableVerboseGridLogging As Boolean = ReadVerboseLoggingSetting() + Private Shared Function ReadVerboseLoggingSetting() As Boolean + Try + Dim oValue = System.Configuration.ConfigurationManager.AppSettings("DocSearch_VerboseLogging") + If Not String.IsNullOrWhiteSpace(oValue) Then + LOGGER.Info("DocSearch_VerboseLogging setting found: " & oValue) + Return Boolean.Parse(oValue) + End If + Catch ex As Exception + ' Fehler beim Lesen → sicher auf False + End Try + Return False + End Function Private Shared Function GET_DOCSEARCH_DATATABLE(Optional BG As Boolean = False) Try Dim OPTION1 @@ -188,16 +201,16 @@ Public Class ClassDOC_SEARCH "VWPMO_DOC_SEARCH T " & vbCrLf & "INNER JOIN TBPMO_DOC_RECORD_LINK TRL ON T.DocID = TRL.DOC_ID" & vbCrLf & "INNER JOIN TBPMO_RECORD TR ON TRL.RECORD_ID = TR.GUID" & vbCrLf & - "INNER JOIN TBPMO_STRUCTURE_NODES_USER_TEMP TTEMP ON TR.GUID = TTEMP.RECORD_ID" & vbCrLf & + "INNER JOIN TBPMO_STRUCTURE_NODES_USER_TEMP TTEMP WITH (NOLOCK) ON TR.GUID = TTEMP.RECORD_ID" & vbCrLf & "INNER JOIN VWPMO_WD_OBJECT_RIGHTS TRIGHTS ON T.DocID = TRIGHTS.dwObjectID" & vbCrLf & - "LEFT JOIN TBPMO_DOCSEARCH_RESULTLIST_CONFIG TRC ON TR.FORM_ID = TRC.ENTITY_ID AND TRC.LANGUAGE = '{7}' AND TRC.GUID = {8}" & vbCrLf & - "LEFT JOIN TBPMO_DOCSEARCH_RESULTLIST_CONFIG TRC1 ON TR.FORM_ID = TRC1.ENTITY_ID AND TRC1.LANGUAGE = '{7}' AND TRC1.GUID = {9}" & vbCrLf & - "LEFT JOIN TBPMO_DOCSEARCH_RESULTLIST_CONFIG TRC2 ON TR.FORM_ID = TRC2.ENTITY_ID AND TRC2.LANGUAGE = '{7}' AND TRC2.GUID = {10}" & vbCrLf & - "LEFT JOIN TBPMO_DOCSEARCH_RESULTLIST_CONFIG TRC3 ON TR.FORM_ID = TRC3.ENTITY_ID AND TRC3.LANGUAGE = '{7}' AND TRC3.GUID = {11}" & vbCrLf & - "LEFT JOIN TBPMO_CONTROL_VALUE T1 ON TRL.RECORD_ID = T1.RECORD_ID AND T1.CONTROL_ID = {2} " & vbCrLf & - "LEFT JOIN TBPMO_CONTROL_VALUE T2 ON TRL.RECORD_ID = T2.RECORD_ID AND T2.CONTROL_ID = {3} " & vbCrLf & - "LEFT JOIN TBPMO_CONTROL_VALUE T3 ON TRL.RECORD_ID = T3.RECORD_ID AND T3.CONTROL_ID = {4} " & vbCrLf & - "LEFT JOIN TBPMO_CONTROL_VALUE T4 ON TRL.RECORD_ID = T4.RECORD_ID AND T4.CONTROL_ID = {5} " & vbCrLf & + "LEFT JOIN TBPMO_DOCSEARCH_RESULTLIST_CONFIG TRC WITH (NOLOCK) ON TR.FORM_ID = TRC.ENTITY_ID AND TRC.LANGUAGE = '{7}' AND TRC.GUID = {8}" & vbCrLf & + "LEFT JOIN TBPMO_DOCSEARCH_RESULTLIST_CONFIG TRC1 WITH (NOLOCK) ON TR.FORM_ID = TRC1.ENTITY_ID AND TRC1.LANGUAGE = '{7}' AND TRC1.GUID = {9}" & vbCrLf & + "LEFT JOIN TBPMO_DOCSEARCH_RESULTLIST_CONFIG TRC2 WITH (NOLOCK) ON TR.FORM_ID = TRC2.ENTITY_ID AND TRC2.LANGUAGE = '{7}' AND TRC2.GUID = {10}" & vbCrLf & + "LEFT JOIN TBPMO_DOCSEARCH_RESULTLIST_CONFIG TRC3 WITH (NOLOCK) ON TR.FORM_ID = TRC3.ENTITY_ID AND TRC3.LANGUAGE = '{7}' AND TRC3.GUID = {11}" & vbCrLf & + "LEFT JOIN TBPMO_CONTROL_VALUE T1 WITH (NOLOCK) ON TRL.RECORD_ID = T1.RECORD_ID AND T1.CONTROL_ID = {2} " & vbCrLf & + "LEFT JOIN TBPMO_CONTROL_VALUE T2 WITH (NOLOCK) ON TRL.RECORD_ID = T2.RECORD_ID AND T2.CONTROL_ID = {3} " & vbCrLf & + "LEFT JOIN TBPMO_CONTROL_VALUE T3 WITH (NOLOCK) ON TRL.RECORD_ID = T3.RECORD_ID AND T3.CONTROL_ID = {4} " & vbCrLf & + "LEFT JOIN TBPMO_CONTROL_VALUE T4 WITH (NOLOCK) ON TRL.RECORD_ID = T4.RECORD_ID AND T4.CONTROL_ID = {5} " & vbCrLf & "WHERE TR.FORM_ID = {1} AND TTEMP.USER_ID = {0} AND TRIGHTS.dwUserOrGroupID = {6}", USER_GUID, ENTITY_ID, OPTION1, OPTION2, OPTION3, OPTION4, USERID_FK_INT_ECM, USER_LANGUAGE, VALUE_CONF1, VALUE_CONF2, VALUE_CONF3, VALUE_CONF4) ElseIf CURRENT_SEARCH_TYPE = "FULLTEXT_SUBNODES" Then Dim sqlft = SQL_FULLTEXT @@ -215,10 +228,10 @@ Public Class ClassDOC_SEARCH "[dbo].[FNPMO_DOC_GET_DROPDOWN_VALUE] (T.DocID,{1},'DROPDOWN4','{0}',TRL.RECORD_ID) AS DROPDOWN4" & vbCrLf & "FROM " & vbCrLf & "VWPMO_DOC_SEARCH T" & vbCrLf & - "INNER JOIN TBPMO_DOC_RECORD_LINK TRL ON T.DocID = TRL.DOC_ID" & vbCrLf & - "INNER JOIN TBPMO_RECORD TR ON TRL.RECORD_ID = TR.GUID" & vbCrLf & - "INNER JOIN TBPMO_STRUCTURE_NODES_USER_TEMP TTEMP ON TR.GUID = TTEMP.RECORD_ID" & vbCrLf & - "INNER JOIN VWPMO_WD_OBJECT_RIGHTS TRIGHTS ON T.DocID = TRIGHTS.dwObjectID" & vbCrLf & + "INNER JOIN TBPMO_DOC_RECORD_LINK TRL WITH (NOLOCK) ON T.DocID = TRL.DOC_ID" & vbCrLf & + "INNER JOIN TBPMO_RECORD TR WITH (NOLOCK) ON TRL.RECORD_ID = TR.GUID" & vbCrLf & + "INNER JOIN TBPMO_STRUCTURE_NODES_USER_TEMP TTEMP WITH (NOLOCK) ON TR.GUID = TTEMP.RECORD_ID" & vbCrLf & + "INNER JOIN VWPMO_WD_OBJECT_RIGHTS TRIGHTS WITH (NOLOCK) ON T.DocID = TRIGHTS.dwObjectID" & vbCrLf & "WHERE TR.FORM_ID = {1} AND TTEMP.USER_ID = {2} AND TRIGHTS.dwUserOrGroupID = {3}" & vbCrLf & "AND T.DocID IN ({6})", USER_LANGUAGE, ENTITY_ID, USER_GUID, USERID_FK_INT_ECM, OPTION1, OPTION2, sqlft) End If @@ -392,7 +405,9 @@ Public Class ClassDOC_SEARCH Dim fullpath = FILE_ROW.Item("FULL_FILENAME") Dim objecttype = FILE_ROW.Item("OBJECTTYPE") Dim DocID = FILE_ROW.Item("DocID") - LOGGER.Debug($"Creating Row for DocID [{DocID}]") + If EnableVerboseGridLogging Then + LOGGER.Debug($"Creating Row for DocID [{DocID}]") + End If 'Dim Folderpath = Path.GetDirectoryName(fullpath) Dim filename = Path.GetFileName(fullpath) Dim extension = Path.GetExtension(fullpath) @@ -446,7 +461,10 @@ Public Class ClassDOC_SEARCH rowvalue = "" End If _step = "9.1 rowvalue for Colname [" & Colname & "]: [" & rowvalue.ToString & "]" - LOGGER.Debug("rowvalue for Colname [" & Colname & "]: [" & rowvalue.ToString & "]") + If EnableVerboseGridLogging Then + LOGGER.Debug("rowvalue for Colname [" & Colname & "]: [" & rowvalue.ToString & "]") + End If + Catch ex As Exception If CURRENT_SEARCH_TYPE = "RECORD" Then LOGGER.Warn("Unexpected Error in GetVariableValue for Column [" & Colname & "] - Error: " & ex.Message) diff --git a/app/DD-Record-Organizer/Classes/ClassDocGrid.vb b/app/DD-Record-Organizer/Classes/ClassDocGrid.vb index 831fe9c..54ddac6 100644 --- a/app/DD-Record-Organizer/Classes/ClassDocGrid.vb +++ b/app/DD-Record-Organizer/Classes/ClassDocGrid.vb @@ -343,9 +343,9 @@ Public Class ClassDocGrid Dim sql = String.Format( "SELECT T.[GUID],T.[DocID],T.[CONFIG_ID],T1.HEADER_CAPTION,T.[VALUE],T1.[LANGUAGE], " & "T1.COLUMN_VIEW,T1.EDITABLE,T1.TYPE_ID,T1.VISIBLE,T.CHANGED_WHEN,T.CHANGED_WHO " & - "FROM TBPMO_DOC_VALUES T " & - "INNER JOIN TBPMO_STRUCTURE_NODES_USER_TEMP TTEMP ON T.RECORD_ID = TTEMP.RECORD_ID " & - "RIGHT JOIN TBPMO_DOCSEARCH_RESULTLIST_CONFIG T1 ON T.CONFIG_ID = T1.GUID " & + "FROM TBPMO_DOC_VALUES T WITH (NOLOCK) " & + "INNER JOIN TBPMO_STRUCTURE_NODES_USER_TEMP TTEMP WITH (NOLOCK) ON T.RECORD_ID = TTEMP.RECORD_ID " & + "RIGHT JOIN TBPMO_DOCSEARCH_RESULTLIST_CONFIG T1 WITH (NOLOCK) ON T.CONFIG_ID = T1.GUID " & "WHERE T1.ENTITY_ID = {0} AND LANGUAGE = '{1}' AND T1.CONFIG_COLUMNS = 1", CURRENT_ENTITY_ID, USER_LANGUAGE) Return MYDB_ECM.GetDatatable(sql) @@ -358,8 +358,8 @@ Public Class ClassDocGrid Dim sql = String.Format( "SELECT T.[GUID],T.[DocID],T.[CONFIG_ID],T1.HEADER_CAPTION,T.[VALUE],T1.[LANGUAGE], " & "T1.COLUMN_VIEW,T1.EDITABLE,T1.TYPE_ID,T1.VISIBLE,T.CHANGED_WHEN,T.CHANGED_WHO " & - "FROM TBPMO_DOC_VALUES T " & - "RIGHT JOIN TBPMO_DOCSEARCH_RESULTLIST_CONFIG T1 ON T.CONFIG_ID = T1.GUID " & + "FROM TBPMO_DOC_VALUES T WITH (NOLOCK) " & + "RIGHT JOIN TBPMO_DOCSEARCH_RESULTLIST_CONFIG T1 WITH (NOLOCK) ON T.CONFIG_ID = T1.GUID " & "WHERE T1.ENTITY_ID = {0} AND LANGUAGE = '{1}' AND T1.CONFIG_COLUMNS = 1 AND T.RECORD_ID = {2}", CURRENT_ENTITY_ID, USER_LANGUAGE, RECORD_ID) Return MYDB_ECM.GetDatatable(sql) @@ -434,6 +434,7 @@ Public Class ClassDocGrid ' ── 3. KRITISCH: Performance-optimiertes DataSource-Setzen ─────────── _isGridRefreshing = True ' Flag setzen VOR DataSource-Änderung + IsBulkSelectionActive = True ' Try pDocGridView.BeginDataUpdate() ' Events unterdrücken pDocGridView.BeginUpdate() ' UI-Updates unterdrücken @@ -527,6 +528,7 @@ Public Class ClassDocGrid ' ── 6. KRITISCH: Flag ERST JETZT zurücksetzen! ──────────────────────────── _isGridRefreshing = False + IsBulkSelectionActive = False ' ← NEU: erst hier, NACH BestFitColumns ' Alle Spalten aus ReadOnly setzen, danach werden alle passenden auf nicht ReadOnly gesetzt For Each column As GridColumn In pDocGridView.Columns diff --git a/app/DD-Record-Organizer/Log_ewa.txt b/app/DD-Record-Organizer/Log_ewa.txt deleted file mode 100644 index 1c7a20f..0000000 Binary files a/app/DD-Record-Organizer/Log_ewa.txt and /dev/null differ diff --git a/app/DD-Record-Organizer/Log_orgFLOW.txt b/app/DD-Record-Organizer/Log_orgFLOW.txt new file mode 100644 index 0000000..9485f36 --- /dev/null +++ b/app/DD-Record-Organizer/Log_orgFLOW.txt @@ -0,0 +1,162 @@ +10:26:37.5843|frmNodeNavigation_Entity6|DEBUG >> MoveNext -> FocusedNodeChanged: NodeID=1889, NodeCaption='52 Kreispläne', NodeConfigID=23, RecordID=660188 +10:26:37.5843|MSSQLServer|DEBUG >> GetConnection -> The Following Connection is open: Server=ARNSR033;Database=DD_ECM;User Id=XXXXX;Password=XXXXX; +10:26:37.5843|MSSQLServer|DEBUG >> MaybeGetTransaction -> Transaction Mode: [WithTransaction] +10:26:37.5843|MSSQLServer|DEBUG >> GetDatatableWithConnectionObject -> GetDatatableWithConnectionObject: Running Query [SELECT * FROM TBOF_MAP_RIGHT_NODE_ADD_USER WITH (NOLOCK) WHERE FK_TBPMO_SN_CONFIG_ID = 23 AND FK_TBDDUSER_ID = 0] and Parameters [] +10:26:37.5843|frmNodeNavigation_Entity6|INFO >> MoveNext -> Node changed: NodeID=23, NodeGUID=835919, ConfigNodesFound=0, ButtonVisible=Never, HasAddRightForConfigNode=False, ConfigTableRows=0 +10:26:37.5843|frmNodeNavigation_Entity6|DEBUG >> UpdateCreateNodeButtonState -> UpdateCreateNodeButtonState called - Visibility=Never, CurrentEnabled=False, AvailableNodes=0, ConfigTableExists=True, HasAddRightForConfigNode=False, RIGHT_RECORD_AND_FILE_READ_ONLY=False, USER_IS_ADMIN=True +10:26:37.5843|MSSQLServer|DEBUG >> GetConnection -> The Following Connection is open: Server=ARNSR033;Database=DD_ECM;User Id=XXXXX;Password=XXXXX; +10:26:37.5843|MSSQLServer|DEBUG >> MaybeGetTransaction -> Transaction Mode: [WithTransaction] +10:26:37.5843|MSSQLServer|DEBUG >> GetDatatableWithConnectionObject -> GetDatatableWithConnectionObject: Running Query [SELECT * FROM TBPMO_DOC_RECORD_LINK WHERE RECORD_ID = 660188] and Parameters [] +10:26:37.5993|MSSQLServer|DEBUG >> GetConnection -> The Following Connection is open: Server=ARNSR033;Database=DD_ECM;User Id=XXXXX;Password=XXXXX; +10:26:37.5993|MSSQLServer|DEBUG >> MaybeGetTransaction -> Transaction Mode: [WithTransaction] +10:26:37.5993|MSSQLServer|DEBUG >> GetDatatableWithConnectionObject -> GetDatatableWithConnectionObject: Running Query [SELECT IN_WORK, IN_WORK_WHO FROM TBPMO_RECORD WHERE GUID = 660188] and Parameters [] +10:26:37.5993|MSSQLServer|DEBUG >> GetConnection -> The Following Connection is open: Server=ARNSR033;Database=DD_ECM;User Id=XXXXX;Password=XXXXX; +10:26:37.5993|MSSQLServer|DEBUG >> MaybeGetTransaction -> Transaction Mode: [WithTransaction] +10:26:37.5993|MSSQLServer|DEBUG >> ExecuteNonQueryWithConnectionObject -> ExecuteNonQueryWithConnectionObject: Running Command [EXEC PRPMO_RECORD_CHECK_INTEGRITY 660188,'digitaldata',False] and Parameters [] +10:26:37.6713|frmNodeNavigation_Entity6|DEBUG >> MoveNext -> [OVERLAY] ShowOverlayForm called at 10:26:37.671 +10:26:37.6713|frmNodeNavigation_Entity6|DEBUG >> MoveNext -> Show_Selected_Record_Data_NonBlocking: RecordID=660188, LoadData=True +10:26:37.6713|frmNodeNavigation_Entity6|DEBUG >> MoveNext -> RECORD ID: 660188 +10:26:37.6713|MSSQLServer|DEBUG >> GetConnection -> The Following Connection is open: Server=ARNSR033;Database=DD_ECM;User Id=XXXXX;Password=XXXXX; +10:26:37.6713|MSSQLServer|DEBUG >> MaybeGetTransaction -> Transaction Mode: [WithTransaction] +10:26:37.6713|MSSQLServer|DEBUG >> GetDatatableWithConnectionObject -> GetDatatableWithConnectionObject: Running Query [SELECT * FROM VWPMO_VALUES WHERE RECORD_ID = 660188] and Parameters [] +10:26:37.6753|MSSQLServer|DEBUG >> GetConnection -> The Following Connection is open: Server=ARNSR033;Database=DD_ECM;User Id=XXXXX;Password=XXXXX; +10:26:37.6753|MSSQLServer|DEBUG >> MaybeGetTransaction -> Transaction Mode: [WithTransaction] +10:26:37.6753|MSSQLServer|DEBUG >> GetDatatableWithConnectionObject -> GetDatatableWithConnectionObject: Running Query [SELECT * FROM VWPMO_CONTROL_HINT WHERE FORM_ID = 6] and Parameters [] +10:26:37.6753|MSSQLServer|DEBUG >> GetConnection -> The Following Connection is open: Server=ARNSR033;Database=DD_ECM;User Id=XXXXX;Password=XXXXX; +10:26:37.6753|MSSQLServer|DEBUG >> MaybeGetTransaction -> Transaction Mode: [WithTransaction] +10:26:37.6753|MSSQLServer|DEBUG >> GetDatatableWithConnectionObject -> GetDatatableWithConnectionObject: Running Query [SELECT + ADDED_WHO, + CONVERT(VARCHAR(16),ADDED_WHEN,20) AS ADDED_WHEN, + COALESCE(CHANGED_WHO,'') AS CHANGED_WHO, + COALESCE(CONVERT(VARCHAR(16),CHANGED_WHEN,20),'') AS CHANGED_WHEN + FROM TBPMO_RECORD WITH (NOLOCK) WHERE GUID = 660188] and Parameters [] +10:26:37.6753|frmNodeNavigation_Entity6|DEBUG >> MoveNext -> [OVERLAY] CloseOverlayForm (after ControlLoading) called at 10:26:37.683 +10:26:37.6753|frmNodeNavigation_Entity6|DEBUG >> MoveNext -> [DOCSEARCH] RUN_DOCSEARCH START at 10:26:37.687 +10:26:37.6753|frmNodeNavigation_Entity6|DEBUG >> MoveNext -> [DOCSEARCH] Get_DOC_RESULTTABLE START at 10:26:37.688 +10:26:37.6753|ClassInit|DEBUG >> GET_DOCSEARCH_DATATABLE -> SQL_DOC_SEARCH: SELECT + CONVERT(BIGINT,T.DocID) DocID + ,T.dwVersionID + ,T.FULL_FILENAME + ,T.[Filename] + ,T.Doctype + ,T.[Version] + ,T.Creation_DateTime + ,T.Change_DateTime + ,T.OBJECTTYPE + ,T.DISPLAY_NAME + ,T.IN_WORK + ,T.IN_WORK_USER + ,T.IN_WORK_COMMENT, + ISNULL(T1.VALUE,'') AS OPTION1, + ISNULL(T2.VALUE,'') AS OPTION2, + ISNULL(T3.VALUE,'') AS OPTION3, + ISNULL(T4.VALUE,'') AS OPTION4, + [dbo].[FNPMO_DOC_GET_IDX] (T.DocID,6,'DOCIDX1') AS DOCIDX1, + [dbo].[FNPMO_DOC_GET_IDX] (T.DocID,6,'DOCIDX2') AS DOCIDX2, + [dbo].[FNPMO_DOC_GET_IDX] (T.DocID,6,'DOCIDX3') AS DOCIDX3, + [dbo].[FNPMO_DOC_GET_IDX] (T.DocID,6,'DOCIDX4') AS DOCIDX4, + [dbo].[FNPMO_DOC_GET_DROPDOWN_VALUE] (T.DocID,6,'DROPDOWN1','7',TRL.RECORD_ID) AS DROPDOWN1, + [dbo].[FNPMO_DOC_GET_DROPDOWN_VALUE] (T.DocID,6,'DROPDOWN2','7',TRL.RECORD_ID) AS DROPDOWN2, + [dbo].[FNPMO_DOC_GET_DROPDOWN_VALUE] (T.DocID,6,'DROPDOWN3','7',TRL.RECORD_ID) AS DROPDOWN3, + [dbo].[FNPMO_DOC_GET_DROPDOWN_VALUE] (T.DocID,6,'DROPDOWN4','7',TRL.RECORD_ID) AS DROPDOWN4, + COALESCE([dbo].[FNPMO_DOC_GET_DOC_VALUE] (T.DocID,TRL.RECORD_ID,TRC.GUID),'') AS VALUE1, + COALESCE([dbo].[FNPMO_DOC_GET_DOC_VALUE] (T.DocID,TRL.RECORD_ID,TRC1.GUID),'') AS VALUE2, + COALESCE([dbo].[FNPMO_DOC_GET_DOC_VALUE] (T.DocID,TRL.RECORD_ID,TRC2.GUID),'') AS VALUE3, + COALESCE([dbo].[FNPMO_DOC_GET_DOC_VALUE] (T.DocID,TRL.RECORD_ID,TRC3.GUID),'') AS VALUE4, + COALESCE([dbo].[FNPMO_DOC_GET_DOC_VALUE] (T.DocID,TRL.RECORD_ID,TRC4.GUID),'') AS VALUE5, + COALESCE([dbo].[FNPMO_DOC_GET_DOC_VALUE] (T.DocID,TRL.RECORD_ID,TRC5.GUID),'') AS VALUE6, + dwAccessRight AS ACCESS_RIGHT +FROM + VWPMO_DOC_SEARCH T + INNER JOIN TBPMO_DOC_RECORD_LINK TRL ON T.DocID = TRL.DOC_ID + INNER JOIN TBPMO_RECORD TR ON TRL.RECORD_ID = TR.GUID + INNER JOIN VWPMO_WD_OBJECT_RIGHTS TRIGHTS ON T.DocID = TRIGHTS.dwObjectID + LEFT JOIN TBPMO_DOCSEARCH_RESULTLIST_CONFIG TRC ON TR.FORM_ID = TRC.ENTITY_ID AND TRC.LANGUAGE = 'de-DE' AND TRC.GUID = 106 + LEFT JOIN TBPMO_DOCSEARCH_RESULTLIST_CONFIG TRC1 ON TR.FORM_ID = TRC1.ENTITY_ID AND TRC1.LANGUAGE = 'de-DE' AND TRC1.GUID = 107 + LEFT JOIN TBPMO_DOCSEARCH_RESULTLIST_CONFIG TRC2 ON TR.FORM_ID = TRC2.ENTITY_ID AND TRC2.LANGUAGE = 'de-DE' AND TRC2.GUID = 109 + LEFT JOIN TBPMO_DOCSEARCH_RESULTLIST_CONFIG TRC3 ON TR.FORM_ID = TRC3.ENTITY_ID AND TRC3.LANGUAGE = 'de-DE' AND TRC3.GUID = 0 + LEFT JOIN TBPMO_DOCSEARCH_RESULTLIST_CONFIG TRC4 ON TR.FORM_ID = TRC4.ENTITY_ID AND TRC4.LANGUAGE = 'de-DE' AND TRC4.GUID = 0 + LEFT JOIN TBPMO_DOCSEARCH_RESULTLIST_CONFIG TRC5 ON TR.FORM_ID = TRC5.ENTITY_ID AND TRC5.LANGUAGE = 'de-DE' AND TRC5.GUID = 0 + LEFT JOIN TBPMO_CONTROL_VALUE T1 ON TRL.RECORD_ID = T1.RECORD_ID AND T1.CONTROL_ID = 0 + LEFT JOIN TBPMO_CONTROL_VALUE T2 ON TRL.RECORD_ID = T2.RECORD_ID AND T2.CONTROL_ID = 0 + LEFT JOIN TBPMO_CONTROL_VALUE T3 ON TRL.RECORD_ID = T3.RECORD_ID AND T3.CONTROL_ID = 0 + LEFT JOIN TBPMO_CONTROL_VALUE T4 ON TRL.RECORD_ID = T4.RECORD_ID AND T4.CONTROL_ID = 0 +WHERE + TRL.RECORD_ID = 660188 AND TR.FORM_ID = 6 AND TRIGHTS.dwUserOrGroupID = 1001479 +10:26:37.6753|MSSQLServer|DEBUG >> GetConnection -> The Following Connection is open: Server=ARNSR033;Database=DD_ECM;User Id=XXXXX;Password=XXXXX; +10:26:37.6753|MSSQLServer|DEBUG >> MaybeGetTransaction -> Transaction Mode: [WithTransaction] +10:26:37.6753|MSSQLServer|DEBUG >> GetDatatableWithConnectionObject -> GetDatatableWithConnectionObject: Running Query [SELECT + CONVERT(BIGINT,T.DocID) DocID + ,T.dwVersionID + ,T.FULL_FILENAME + ,T.[Filename] + ,T.Doctype + ,T.[Version] + ,T.Creation_DateTime + ,T.Change_DateTime + ,T.OBJECTTYPE + ,T.DISPLAY_NAME + ,T.IN_WORK + ,T.IN_WORK_USER + ,T.IN_WORK_COMMENT, + ISNULL(T1.VALUE,'') AS OPTION1, + ISNULL(T2.VALUE,'') AS OPTION2, + ISNULL(T3.VALUE,'') AS OPTION3, + ISNULL(T4.VALUE,'') AS OPTION4, + [dbo].[FNPMO_DOC_GET_IDX] (T.DocID,6,'DOCIDX1') AS DOCIDX1, + [dbo].[FNPMO_DOC_GET_IDX] (T.DocID,6,'DOCIDX2') AS DOCIDX2, + [dbo].[FNPMO_DOC_GET_IDX] (T.DocID,6,'DOCIDX3') AS DOCIDX3, + [dbo].[FNPMO_DOC_GET_IDX] (T.DocID,6,'DOCIDX4') AS DOCIDX4, + [dbo].[FNPMO_DOC_GET_DROPDOWN_VALUE] (T.DocID,6,'DROPDOWN1','7',TRL.RECORD_ID) AS DROPDOWN1, + [dbo].[FNPMO_DOC_GET_DROPDOWN_VALUE] (T.DocID,6,'DROPDOWN2','7',TRL.RECORD_ID) AS DROPDOWN2, + [dbo].[FNPMO_DOC_GET_DROPDOWN_VALUE] (T.DocID,6,'DROPDOWN3','7',TRL.RECORD_ID) AS DROPDOWN3, + [dbo].[FNPMO_DOC_GET_DROPDOWN_VALUE] (T.DocID,6,'DROPDOWN4','7',TRL.RECORD_ID) AS DROPDOWN4, + COALESCE([dbo].[FNPMO_DOC_GET_DOC_VALUE] (T.DocID,TRL.RECORD_ID,TRC.GUID),'') AS VALUE1, + COALESCE([dbo].[FNPMO_DOC_GET_DOC_VALUE] (T.DocID,TRL.RECORD_ID,TRC1.GUID),'') AS VALUE2, + COALESCE([dbo].[FNPMO_DOC_GET_DOC_VALUE] (T.DocID,TRL.RECORD_ID,TRC2.GUID),'') AS VALUE3, + COALESCE([dbo].[FNPMO_DOC_GET_DOC_VALUE] (T.DocID,TRL.RECORD_ID,TRC3.GUID),'') AS VALUE4, + COALESCE([dbo].[FNPMO_DOC_GET_DOC_VALUE] (T.DocID,TRL.RECORD_ID,TRC4.GUID),'') AS VALUE5, + COALESCE([dbo].[FNPMO_DOC_GET_DOC_VALUE] (T.DocID,TRL.RECORD_ID,TRC5.GUID),'') AS VALUE6, + dwAccessRight AS ACCESS_RIGHT +FROM + VWPMO_DOC_SEARCH T + INNER JOIN TBPMO_DOC_RECORD_LINK TRL ON T.DocID = TRL.DOC_ID + INNER JOIN TBPMO_RECORD TR ON TRL.RECORD_ID = TR.GUID + INNER JOIN VWPMO_WD_OBJECT_RIGHTS TRIGHTS ON T.DocID = TRIGHTS.dwObjectID + LEFT JOIN TBPMO_DOCSEARCH_RESULTLIST_CONFIG TRC ON TR.FORM_ID = TRC.ENTITY_ID AND TRC.LANGUAGE = 'de-DE' AND TRC.GUID = 106 + LEFT JOIN TBPMO_DOCSEARCH_RESULTLIST_CONFIG TRC1 ON TR.FORM_ID = TRC1.ENTITY_ID AND TRC1.LANGUAGE = 'de-DE' AND TRC1.GUID = 107 + LEFT JOIN TBPMO_DOCSEARCH_RESULTLIST_CONFIG TRC2 ON TR.FORM_ID = TRC2.ENTITY_ID AND TRC2.LANGUAGE = 'de-DE' AND TRC2.GUID = 109 + LEFT JOIN TBPMO_DOCSEARCH_RESULTLIST_CONFIG TRC3 ON TR.FORM_ID = TRC3.ENTITY_ID AND TRC3.LANGUAGE = 'de-DE' AND TRC3.GUID = 0 + LEFT JOIN TBPMO_DOCSEARCH_RESULTLIST_CONFIG TRC4 ON TR.FORM_ID = TRC4.ENTITY_ID AND TRC4.LANGUAGE = 'de-DE' AND TRC4.GUID = 0 + LEFT JOIN TBPMO_DOCSEARCH_RESULTLIST_CONFIG TRC5 ON TR.FORM_ID = TRC5.ENTITY_ID AND TRC5.LANGUAGE = 'de-DE' AND TRC5.GUID = 0 + LEFT JOIN TBPMO_CONTROL_VALUE T1 ON TRL.RECORD_ID = T1.RECORD_ID AND T1.CONTROL_ID = 0 + LEFT JOIN TBPMO_CONTROL_VALUE T2 ON TRL.RECORD_ID = T2.RECORD_ID AND T2.CONTROL_ID = 0 + LEFT JOIN TBPMO_CONTROL_VALUE T3 ON TRL.RECORD_ID = T3.RECORD_ID AND T3.CONTROL_ID = 0 + LEFT JOIN TBPMO_CONTROL_VALUE T4 ON TRL.RECORD_ID = T4.RECORD_ID AND T4.CONTROL_ID = 0 +WHERE + TRL.RECORD_ID = 660188 AND TR.FORM_ID = 6 AND TRIGHTS.dwUserOrGroupID = 1001479] and Parameters [] +10:26:40.2543|frmNodeNavigation_Entity6|DEBUG >> MoveNext -> [DOCSEARCH] Get_DOC_RESULTTABLE END at 10:26:40.254 - Rows=1236 +10:26:40.2543|frmNodeNavigation_Entity6|DEBUG >> MoveNext -> [DOCSEARCH] FillColumns START at 10:26:40.254 +10:26:40.2543|ClassInit|DEBUG >> GetOrLoad -> Cache MISS: DocDetailValues_E6_R660188_Lde-DE - Loading from DB... +10:26:40.2543|MSSQLServer|DEBUG >> GetConnection -> The Following Connection is open: Server=ARNSR033;Database=DD_ECM;User Id=XXXXX;Password=XXXXX; +10:26:40.2543|MSSQLServer|DEBUG >> MaybeGetTransaction -> Transaction Mode: [WithTransaction] +10:26:40.2543|MSSQLServer|DEBUG >> GetDatatableWithConnectionObject -> GetDatatableWithConnectionObject: Running Query [SELECT T.[GUID],T.[DocID],T.[CONFIG_ID],T1.HEADER_CAPTION,T.[VALUE],T1.[LANGUAGE], T1.COLUMN_VIEW,T1.EDITABLE,T1.TYPE_ID,T1.VISIBLE,T.CHANGED_WHEN,T.CHANGED_WHO FROM TBPMO_DOC_VALUES T WITH (NOLOCK) RIGHT JOIN TBPMO_DOCSEARCH_RESULTLIST_CONFIG T1 WITH (NOLOCK) ON T.CONFIG_ID = T1.GUID WHERE T1.ENTITY_ID = 6 AND LANGUAGE = 'de-DE' AND T1.CONFIG_COLUMNS = 1 AND T.RECORD_ID = 660188] and Parameters [] +10:26:40.4074|ClassInit|DEBUG >> FillColumns -> Values loaded... +10:26:40.4074|ClassInit|DEBUG >> FillColumns -> tables added to ds.Tables... +10:26:40.4074|ClassInit|DEBUG >> FillColumns -> tables added to ds.Tables... +10:26:40.4074|ClassInit|DEBUG >> FillColumns -> parentColumn.DataType: System.Int32 +10:26:40.4074|ClassInit|DEBUG >> FillColumns -> childColumn.DataType: System.Int32 +10:26:40.4104|ClassInit|DEBUG >> FillColumns -> relationdocIdDetails created... +10:26:40.4564|ClassInit|DEBUG >> FillColumns -> Adapting DisplayFormat (DATETIME for Column Revisions-Datum +10:26:40.4813|frmNodeNavigation_Entity6|DEBUG >> MoveNext -> [DOCSEARCH] FillColumns END at 10:26:40.481 +10:26:40.4813|frmNodeNavigation_Entity6|DEBUG >> MoveNext -> [DOCSEARCH] RUN_DOCSEARCH END at 10:26:40.482 - 1236 documents found +10:26:40.4813|frmNodeNavigation_Entity6|DEBUG >> MoveNext -> Node_AfterSelect=True - DocView collapsed +10:26:40.4813|frmNodeNavigation_Entity6|DEBUG >> MoveNext -> Show_Selected_Record_Data_NonBlocking completed +10:26:40.4813|ClassInit|INFO >> Check_Set_Rights -> ClassRightManagement...NO DEFINTION FOR GROUP- OR USER-RIGHT! +10:26:40.4813|ClassInit|DEBUG >> Check_Set_Rights -> ClassRightManagement-RIGHT_EDIT_R: False +10:26:40.4813|ClassInit|DEBUG >> Check_Set_Rights -> ClassRightManagement-RIGHT_ADD_R: False +10:26:40.4874|ClassInit|DEBUG >> Check_Set_Rights -> ClassRightManagement-RIGHT_DELETE_R: False +10:26:40.4874|ClassInit|DEBUG >> Check_Set_Rights -> ClassRightManagement-RIGHT_ADD_DOC: False +10:26:40.4874|ClassInit|DEBUG >> Check_Set_Rights -> ClassRightManagement-RIGHT_VIEW_DOC: True +10:26:40.4874|ClassInit|DEBUG >> Check_Set_Rights -> ClassRightManagement-RIGHT_DELETE_DOC: False +10:26:40.4874|ClassInit|DEBUG >> Check_Set_Rights -> ClassRightManagement-RIGHT_READ_ONLY_DOC: False diff --git a/app/DD-Record-Organizer/My Project/AssemblyInfo.vb b/app/DD-Record-Organizer/My Project/AssemblyInfo.vb index c33abd3..4e23526 100644 --- a/app/DD-Record-Organizer/My Project/AssemblyInfo.vb +++ b/app/DD-Record-Organizer/My Project/AssemblyInfo.vb @@ -33,7 +33,7 @@ Imports System.Runtime.InteropServices ' übernehmen, indem Sie "*" eingeben: ' - + \ No newline at end of file diff --git a/app/DD-Record-Organizer/OrgFlow.vbproj b/app/DD-Record-Organizer/OrgFlow.vbproj index 6948e6b..a05770d 100644 --- a/app/DD-Record-Organizer/OrgFlow.vbproj +++ b/app/DD-Record-Organizer/OrgFlow.vbproj @@ -1726,7 +1726,7 @@ PreserveNewest - + diff --git a/app/DD-Record-Organizer/frmDocRecordLink.vb b/app/DD-Record-Organizer/frmDocRecordLink.vb index 1be9629..e7ccd71 100644 --- a/app/DD-Record-Organizer/frmDocRecordLink.vb +++ b/app/DD-Record-Organizer/frmDocRecordLink.vb @@ -1,182 +1,127 @@ Imports System.IO Imports DevExpress.XtraGrid.Columns Public Class frmDocRecordLink - Public Property myDocuments As New List(Of ClassDocGrid.clsWMDoc) Private CURRENT_LINK_ENTITY_ID As Integer = 0 Private ENTITY_LOAD_ACTIVE As Boolean = False Private DT_ENTITYDATA As DataTable + Private Class ClassEntity Public title As String Public id As Integer - Public Overrides Function ToString() As String Return Me.title End Function End Class - Private Function GET_CURRENT_ENTITY_DATA() - If IsNothing(CURRENT_DT_ENTITY_RECORDS) Then - Return Nothing - End If - Dim oDatatable As DataTable = CURRENT_DT_ENTITY_RECORDS.Copy - Return oDatatable - End Function - Sub Refresh_Grid_Data(current As Boolean, ENTITY_DATATABLE As DataTable) - Dim DT_RECORDS As DataTable - If current = True Then - DT_RECORDS = GET_CURRENT_ENTITY_DATA() - Else - DT_RECORDS = ENTITY_DATATABLE - End If + Private Function GET_CURRENT_ENTITY_DATA() As DataTable + If IsNothing(CURRENT_DT_ENTITY_RECORDS) Then Return Nothing + Return CURRENT_DT_ENTITY_RECORDS.Copy() + End Function + + ''' + ''' Lädt das Grid neu. + ''' Wenn current=True wird versucht, die zuletzt gewählte Entity korrekt zu laden. + ''' + Sub Refresh_Grid_Data(current As Boolean, ENTITY_DATATABLE As DataTable) If CURRENT_LINK_ENTITY_ID = 0 Then CURRENT_LINK_ENTITY_ID = CURRENT_ENTITY_ID End If + Dim DT_RECORDS As DataTable + If current = True Then + If CURRENT_LINK_ENTITY_ID = CURRENT_ENTITY_ID Then + DT_RECORDS = GET_CURRENT_ENTITY_DATA() + Else + DT_RECORDS = ReturnDataforEntity(CURRENT_LINK_ENTITY_ID) + DT_ENTITYDATA = DT_RECORDS + End If + Else + DT_RECORDS = ENTITY_DATATABLE + End If + Try grvwGrid.Columns.Clear() dgEntityRecords.DataSource = DT_RECORDS - - Catch ex As Exception ClassHelper.MSGBOX_Handler("ERROR", "Unexpected Error in format grid", ex.Message, ex.StackTrace) End Try - End Sub + Private Sub frmDocRecordLink_Load(sender As Object, e As EventArgs) Handles Me.Load - ' OLD WAY - If myDocuments.Count = 0 Then - ENTITY_LOAD_ACTIVE = True - If ClassDocGrid.DT_RESULTFILES.Rows.Count = 1 Then - txtFileInfo.Text = ClassDocGrid.DT_RESULTFILES.Rows(0).Item("DOC_PATH") - Else - txtFileInfo.Text = String.Format("{0} files selected for linking to record", ClassDocGrid.DT_RESULTFILES.Rows.Count) - End If - Try - If CURRENT_LINK_ENTITY_ID = 0 Then - Refresh_Grid_Data(True, Nothing) - CURRENT_LINK_ENTITY_ID = CURRENT_ENTITY_ID - Else - Dim DT_RESULT As DataTable - If CURRENT_LINK_ENTITY_ID = CURRENT_ENTITY_ID Then - DT_RESULT = CURRENT_DT_ENTITY_RECORDS - Else - DT_RESULT = ReturnDataforEntity(CURRENT_LINK_ENTITY_ID) - End If - - If Not IsNothing(DT_RESULT) Then - Refresh_Grid_Data(False, DT_RESULT) - End If - End If - - - Dim DT_ENTITIES As DataTable = GetENTITIES() - Dim oSelectedIndex As Integer = 0 - - If DT_ENTITIES.Rows.Count = 0 Then - Exit Sub - End If - Dim oCount = 0 - For Each row As DataRow In DT_ENTITIES.Rows - Dim entity As New ClassEntity - entity.title = row.Item("FORM_TITLE") - entity.id = row.Item("FORM_ID") - cmbConstructorForms.Items.Add(entity) - If CURRENT_LINK_ENTITY_ID = entity.id Then - txtcurrSichtData.Text = entity.title - oSelectedIndex = oCount - End If - oCount += 1 - Next - If USER_LANGUAGE = "de-DE" Then - Me.Text = CURRENT_DT_SELECTED_FILES.Rows.Count.ToString & " Datei(en) mit Datensatz verknüpfen:" - Else - Me.Text = "Link " & CURRENT_DT_SELECTED_FILES.Rows.Count.ToString & " files with record:" - End If - ' Den index der aktuell geöffneten ConstructorForm setzen - cmbConstructorForms.SelectedIndex = oSelectedIndex - - Catch ex As Exception - ClassHelper.MSGBOX_Handler("ERROR", "Unexpected Error in frmDocRecordLink_Load", ex.Message, ex.StackTrace) - End Try - - Load_DocGrid_Layout() - bsiInfo.Caption = "Waiting for record-Selection....." - - - End If + ENTITY_LOAD_ACTIVE = True + ' Dateiinfo-Text setzen If myDocuments.Count > 0 Then - ENTITY_LOAD_ACTIVE = True - If myDocuments.Count = 1 Then - txtFileInfo.Text = myDocuments.First.DocPath - Else - txtFileInfo.Text = String.Format("{0} files selected for linking to record", myDocuments.Count) - End If - Try - If IsNothing(CURRENT_DT_ENTITY_RECORDS) Then - Me.Close() - End If - If CURRENT_LINK_ENTITY_ID = 0 Then - Refresh_Grid_Data(True, Nothing) - CURRENT_LINK_ENTITY_ID = CURRENT_ENTITY_ID - Else - Dim DT_RESULT As DataTable - If CURRENT_LINK_ENTITY_ID = CURRENT_ENTITY_ID Then - DT_RESULT = CURRENT_DT_ENTITY_RECORDS - Else - DT_RESULT = ReturnDataforEntity(CURRENT_LINK_ENTITY_ID) - End If - - If Not IsNothing(DT_RESULT) Then - Refresh_Grid_Data(False, DT_RESULT) - End If - End If - - - Dim DT_ENTITIES As DataTable = GetENTITIES() - Dim oSelectedIndex As Integer = 0 - - If DT_ENTITIES.Rows.Count = 0 Then - Exit Sub - End If - Dim oCount = 0 - For Each row As DataRow In DT_ENTITIES.Rows - Dim entity As New ClassEntity - entity.title = row.Item("FORM_TITLE") - entity.id = row.Item("FORM_ID") - cmbConstructorForms.Items.Add(entity) - If CURRENT_LINK_ENTITY_ID = entity.id Then - txtcurrSichtData.Text = entity.title - oSelectedIndex = oCount - End If - oCount += 1 - Next - If USER_LANGUAGE = "de-DE" Then - Me.Text = CURRENT_DT_SELECTED_FILES.Rows.Count.ToString & " Datei(en) mit Datensatz verknüpfen:" - Else - Me.Text = "Link " & CURRENT_DT_SELECTED_FILES.Rows.Count.ToString & " files with record:" - End If - ' Den index der aktuell geöffneten ConstructorForm setzen - cmbConstructorForms.SelectedIndex = oSelectedIndex - - Catch ex As Exception - ClassHelper.MSGBOX_Handler("ERROR", "Unexpected Error in frmDocRecordLink_Load", ex.Message, ex.StackTrace) - End Try - - Load_DocGrid_Layout() - bsiInfo.Caption = "Waiting for record-Selection....." - + txtFileInfo.Text = If(myDocuments.Count = 1, + myDocuments.First.DocPath, + String.Format("{0} files selected for linking to record", myDocuments.Count)) + Else + txtFileInfo.Text = If(ClassDocGrid.DT_RESULTFILES.Rows.Count = 1, + ClassDocGrid.DT_RESULTFILES.Rows(0).Item("DOC_PATH").ToString(), + String.Format("{0} files selected for linking to record", ClassDocGrid.DT_RESULTFILES.Rows.Count)) End If + Try + If myDocuments.Count > 0 AndAlso IsNothing(CURRENT_DT_ENTITY_RECORDS) Then + Me.Close() + Return + End If + + If CURRENT_LINK_ENTITY_ID = 0 Then + Refresh_Grid_Data(True, Nothing) + CURRENT_LINK_ENTITY_ID = CURRENT_ENTITY_ID + DT_ENTITYDATA = GET_CURRENT_ENTITY_DATA() + Else + Dim DT_RESULT As DataTable + If CURRENT_LINK_ENTITY_ID = CURRENT_ENTITY_ID Then + DT_RESULT = CURRENT_DT_ENTITY_RECORDS + Else + DT_RESULT = ReturnDataforEntity(CURRENT_LINK_ENTITY_ID) + End If + If Not IsNothing(DT_RESULT) Then + DT_ENTITYDATA = DT_RESULT + Refresh_Grid_Data(False, DT_RESULT) + End If + End If + + Dim DT_ENTITIES As DataTable = GetENTITIES() + If IsNothing(DT_ENTITIES) OrElse DT_ENTITIES.Rows.Count = 0 Then Exit Sub + + Dim oSelectedIndex As Integer = 0 + Dim oCount As Integer = 0 + For Each row As DataRow In DT_ENTITIES.Rows + Dim entity As New ClassEntity + entity.title = row.Item("FORM_TITLE") + entity.id = row.Item("FORM_ID") + cmbConstructorForms.Items.Add(entity) + If CURRENT_LINK_ENTITY_ID = entity.id Then + txtcurrSichtData.Text = entity.title + oSelectedIndex = oCount + End If + oCount += 1 + Next + + Me.Text = If(USER_LANGUAGE = "de-DE", + CURRENT_DT_SELECTED_FILES.Rows.Count.ToString & " Datei(en) mit Datensatz verknüpfen:", + "Link " & CURRENT_DT_SELECTED_FILES.Rows.Count.ToString & " files with record:") + + cmbConstructorForms.SelectedIndex = oSelectedIndex + + Catch ex As Exception + ClassHelper.MSGBOX_Handler("ERROR", "Unexpected Error in frmDocRecordLink_Load", ex.Message, ex.StackTrace) + End Try + + Load_DocGrid_Layout() + bsiInfo.Caption = "Waiting for record-Selection....." End Sub + Private Function GetENTITIES() As DataTable Try - Dim SQL As String = String.Format("SELECT DISTINCT FORM_ID,FORM_TITLE,SEQUENCE FROM VWPMO_CONSTRUCTOR_FORMS where CONSTRUCT_ID in " & -"(SELECT CONSTRUCT_ID FROM TBPMO_CONSTRUCTOR_USER WHERE USER_ID = {0}) ORDER BY SEQUENCE", USER_GUID) - Dim dt As DataTable = MYDB_ECM.GetDatatable(SQL) - Return dt + Dim SQL As String = String.Format("SELECT DISTINCT FORM_ID,FORM_TITLE,SEQUENCE FROM VWPMO_CONSTRUCTOR_FORMS " & + "where CONSTRUCT_ID in (SELECT CONSTRUCT_ID FROM TBPMO_CONSTRUCTOR_USER WHERE USER_ID = {0}) ORDER BY SEQUENCE", USER_GUID) + Return MYDB_ECM.GetDatatable(SQL) Catch ex As Exception MsgBox("Entities could not be loaded in LinkToRecord: " & vbNewLine & ex.Message) Return Nothing @@ -187,25 +132,23 @@ Public Class frmDocRecordLink Try If Not IsNothing(dgEntityRecords.DataSource) Then Dim RecordId As Integer = grvwGrid.GetFocusedRowCellValue(grvwGrid.Columns("Record-ID")) - bsiInfo.Caption = "Record (" & RecordId.ToString & ") selected!" End If Catch ex As Exception MsgBox("Could not get the RecordID: " & ex.Message, MsgBoxStyle.Exclamation) - End Try - End Sub + Sub Save_DocGrid_Layout() Try Dim XMLPath = Get_DocGrid_Layout_Filename() grvwGrid.SaveLayoutToXml(XMLPath) bsiInfo.Caption = "Grid-Layout saved - " + Now.ToLongTimeString - Catch ex As Exception ClassHelper.MSGBOX_Handler("ERROR", "Unexpected Error in Save_DocGrid_Layout", ex.Message, ex.StackTrace) End Try End Sub + Sub Load_DocGrid_Layout() Try Dim XMLPath = Get_DocGrid_Layout_Filename() @@ -213,16 +156,17 @@ Public Class frmDocRecordLink grvwGrid.RestoreLayoutFromXml(XMLPath) grvwGrid.GuessAutoFilterRowValuesFromFilter() bsiInfo.Caption = "Grid-Layout loaded - " + Now.ToLongTimeString - End If Catch ex As Exception ClassHelper.MSGBOX_Handler("ERROR", "Unexpected Error in Load_DocGrid_Layout", ex.Message, ex.StackTrace) End Try End Sub - Private Function Get_DocGrid_Layout_Filename() + + Private Function Get_DocGrid_Layout_Filename() As String Dim Filename As String = String.Format("GridViewDocRecordLink-{0}-UserLayout.xml", CURRENT_LINK_ENTITY_ID) Return System.IO.Path.Combine(Application.UserAppDataPath(), Filename) End Function + Private Sub frmDocRecordLink_FormClosing(sender As Object, e As FormClosingEventArgs) Handles MyBase.FormClosing If ENTITY_LOAD_ACTIVE = False Then Save_DocGrid_Layout() End Sub @@ -231,6 +175,7 @@ Public Class frmDocRecordLink Me.Cursor = Cursors.WaitCursor If cmbConstructorForms.SelectedIndex <> -1 Then Dim entity As ClassEntity = DirectCast(cmbConstructorForms.SelectedItem, ClassEntity) + LOGGER.Debug("Selected Entity: {0} (ID: {1})", entity.title, entity.id) ENTITY_LOAD_ACTIVE = True dgEntityRecords.DataSource = Nothing grvwGrid.Columns.Clear() @@ -240,23 +185,26 @@ Public Class frmDocRecordLink CURRENT_LINK_ENTITY_ID = entity.id txtcurrSichtData.Text = entity.title DT_ENTITYDATA = DT_RESULT + LOGGER.Debug("Data for Entity {0} loaded with {1} records", entity.title, DT_RESULT.Rows.Count) Refresh_Grid_Data(False, DT_RESULT) End If Load_DocGrid_Layout() Else - bsiInfo.Caption = "Bitte wöhlen Sie eine Sicht aus! " + Now.ToShortTimeString + bsiInfo.Caption = "Bitte wählen Sie eine Sicht aus! " + Now.ToShortTimeString End If + ' FIX Problem A: ENTITY_LOAD_ACTIVE nach abgeschlossenem Ladevorgang zurücksetzen + ENTITY_LOAD_ACTIVE = False Me.Cursor = Cursors.Default End Sub + Private Function ReturnDataforEntity(oEntityID As Integer) As DataTable Dim ResultSQL, ResultViewName As String LOGGER.Debug("GridType = Grid") ResultViewName = $"VWPMO_ENTITY_TABLE{oEntityID}" bsitmSource.Caption = $"Source: " + ResultViewName ResultSQL = $"SELECT T.* FROM {ResultViewName} T" - LOGGER.Debug("ResultSQL: " & ResultSQL) - + LOGGER.Debug("Executing SQL to load entity data: " & ResultSQL) Return MYDB_ECM.GetDatatable(ResultSQL) End Function @@ -269,15 +217,13 @@ Public Class frmDocRecordLink Dim selectedRows As Integer() = grvwGrid.GetSelectedRows() Dim oLinkCount As Integer = 0 LOGGER.Info("Start der Verknüpfung - Es wurden [{0}] Datensätze ausgewählt!", selectedRows.Count) + For Each rowhandle As Integer In selectedRows Dim oSelectedRecordID = grvwGrid.GetRowCellValue(rowhandle, "Record-ID") - If IsNothing(oSelectedRecordID) Then - Continue For - End If + If IsNothing(oSelectedRecordID) Then Continue For Try For Each oRow As DataRow In CURRENT_DT_SELECTED_FILES.Rows - Dim oDocID As Integer - oDocID = oRow.Item("DOC_ID") + Dim oDocID As Integer = oRow.Item("DOC_ID") LOGGER.Info("DocID {0} will be linked with Record {1} ", oDocID.ToString, oSelectedRecordID.ToString) Dim DOC_PATH = oRow.Item("FILEPATH") Dim _objecttype = oRow.Item("OBJECTTYPE") @@ -307,12 +253,13 @@ Public Class frmDocRecordLink ClassHelper.MSGBOX_Handler("ERROR", "Unexpected Error in Linking Record to file", ex.Message, ex.StackTrace) End Try Next - Dim omsg = $"[{oLinkCount}] Datensätze erfolgreich verknüpft! - {Now.ToShortTimeString}" - If USER_LANGUAGE <> "de-DE" Then - omsg = $"[{oLinkCount}] records successfully linked - {Now.ToShortTimeString}" - End If + + Dim omsg = If(USER_LANGUAGE = "de-DE", + $"[{oLinkCount}] Datensätze erfolgreich verknüpft! - {Now.ToShortTimeString}", + $"[{oLinkCount}] records successfully linked - {Now.ToShortTimeString}") MsgBox(omsg, MsgBoxStyle.Information, "orgFLOW") + DT_ENTITYDATA = ReturnDataforEntity(CURRENT_LINK_ENTITY_ID) Refresh_Grid_Data(False, DT_ENTITYDATA) Load_DocGrid_Layout() grvwGrid.ClearSelection() @@ -325,14 +272,14 @@ Public Class frmDocRecordLink Private Sub BarButtonItem3_ItemClick(sender As Object, e As DevExpress.XtraBars.ItemClickEventArgs) Handles bbtnitmresetlayout.ItemClick Reset_View_layout() End Sub + Sub Reset_View_layout() Me.Cursor = Cursors.WaitCursor Try Dim XMLPath = Get_DocGrid_Layout_Filename() If File.Exists(XMLPath) Then - File.Delete(XMLPath) - Refresh_Grid_Data(True, Nothing) + Refresh_Grid_Data(False, DT_ENTITYDATA) Else MsgBox("Resetting the layout was not successful - File not existing!", MsgBoxStyle.Information) End If diff --git a/app/DD-Record-Organizer/frmMain.vb b/app/DD-Record-Organizer/frmMain.vb index 74600dd..c8c75d9 100644 --- a/app/DD-Record-Organizer/frmMain.vb +++ b/app/DD-Record-Organizer/frmMain.vb @@ -1,4 +1,5 @@ -Imports System.Globalization +Imports System.ComponentModel +Imports System.Globalization Imports System.Net Imports System.Threading 'Imports DD_LIB_Standards' @@ -985,14 +986,14 @@ Public Class frmMain 'ClassProxy.MyPROXYConnectionString = oSqlcon_Proxy End If Dim sql = String.Format("UPDATE TBPMO_CLIENT_CONN_SWITCH_USER SET ACTIVE = 1 WHERE GUID = {0}", oINACTIVE_GUID) - MYDB_ECM.GetScalarValue(SQL) + MYDB_ECM.GetScalarValue(sql) If ClassInit.InitDatabase = True Then ClassInit.InitUserLogin() Load_Connection_Dep_Data() sql = String.Format("UPDATE TBPMO_CLIENT_CONN_SWITCH_USER SET ACTIVE = 1 WHERE UPPER(CONN_NAME) = UPPER('{0}') AND USER_ID = {1}", oSQLDescription, USER_GUID) Dim oSuccess As Boolean = False - If MYDB_ECM.ExecuteNonQuery(Sql) = True Then + If MYDB_ECM.ExecuteNonQuery(sql) = True Then oSuccess = True End If If oSuccess = True Then @@ -1029,4 +1030,19 @@ Public Class frmMain Private Sub ADDIBeendenToolStripMenuItem_Click(sender As Object, e As EventArgs) Handles ADDIBeendenToolStripMenuItem.Click Me.Close() End Sub + + Private Sub frmMain_Closing(sender As Object, e As CancelEventArgs) Handles Me.Closing + If Not IsNothing(WMMOD) Then + LOGGER.Debug("Closing frmMain - Now logging out...") + Try + WMMOD.Session.Logout() + LOGGER.Debug("WINDREAM_MOD Session logg ed out successfully.") + + Catch ex As Exception + LOGGER.Warn("Error while logging out WINDREAM_MOD Session: {0}", ex.Message) + LOGGER.Error(ex) + End Try + + End If + End Sub End Class diff --git a/app/DD-Record-Organizer/frmNodeNavigation.vb b/app/DD-Record-Organizer/frmNodeNavigation.vb index 96d51af..b2ba5ba 100644 --- a/app/DD-Record-Organizer/frmNodeNavigation.vb +++ b/app/DD-Record-Organizer/frmNodeNavigation.vb @@ -178,7 +178,7 @@ Public Class frmNodeNavigation ' "FROM VWPMO_CONSTRUCTOR_FORMS WHERE SCREEN_ID = {2} AND CONSTRUCT_ID = {3} ORDER BY SEQUENCE", USER_LANGUAGE, CURRENT_SCREEN_ID, CURRENT_SCREEN_ID, oConstructID) 'DT_VWPMO_CONSTRUCTOR_FORMS = MYDB_ECM.GetDatatable(Sql) - CURRENT_DT_TBPMO_ENTITY_RIGHT_CONTROLS = MYDB_ECM.GetDatatable(String.Format("SELECT T.* FROM TBPMO_ENTITY_RIGHT_CONTROLS T INNER JOIN VWPMO_CONSTRUCTOR_FORMS T1 ON T.ENTITY_ID = T1.FORM_ID where T1.CONSTRUCT_ID = {0}", CONSTRUCTORID)) + CURRENT_DT_TBPMO_ENTITY_RIGHT_CONTROLS = MYDB_ECM.GetDatatable(String.Format("SELECT T.* FROM TBPMO_ENTITY_RIGHT_CONTROLS T WITH (NOLOCK) INNER JOIN VWPMO_CONSTRUCTOR_FORMS T1 ON T.ENTITY_ID = T1.FORM_ID where T1.CONSTRUCT_ID = {0}", CONSTRUCTORID)) Try If DocumentViewer.Init(LOGCONFIG, MYGDPICTURE_LICENSE_KEY, New DigitalData.Controls.DocumentViewer.DocumentViewer.ToolbarSettings() With { .ShowPrintButton = True, @@ -214,8 +214,8 @@ Public Class frmNodeNavigation 'End If ClassWindowLocation.LoadFormLocationSize(Me, CONSTRUCTORID, CURRENT_SCREEN_ID, "NODE_NAVIGATION") Try - DT_CONSTRUCT_VIEW = MYDB_ECM.GetDatatable("SELECT * FROM TBPMO_FORM_CONSTRUCTOR WHERE GUID = " & CONSTRUCTORID) - Dim SEL1 = String.Format("SELECT * FROM TBPMO_FORM WHERE GUID IN (SELECT FORM_ID FROM VWPMO_CONSTRUCTOR_FORMS WHERE SCREEN_ID = {0} AND CONSTRUCT_ID = {1})", CURRENT_SCREEN_ID, CONSTRUCTORID) + DT_CONSTRUCT_VIEW = MYDB_ECM.GetDatatable("SELECT * FROM TBPMO_FORM_CONSTRUCTOR WITH (NOLOCK) WHERE GUID = " & CONSTRUCTORID) + Dim SEL1 = String.Format("SELECT * FROM TBPMO_FORM WITH (NOLOCK) WHERE GUID IN (SELECT FORM_ID FROM VWPMO_CONSTRUCTOR_FORMS WHERE SCREEN_ID = {0} AND CONSTRUCT_ID = {1})", CURRENT_SCREEN_ID, CONSTRUCTORID) DT_ENTITY_DATA = MYDB_ECM.GetDatatable(SEL1) SEL1 = String.Format("SELECT *, dbo.FNPMO_GET_CONTROL_CAPTION ('{0}', 1, CONTROL_ID) AS 'CAPTION' FROM VWPMO_CONTROL_SCREEN", USER_LANGUAGE) @@ -255,7 +255,7 @@ Public Class frmNodeNavigation Dim oTable = Await ClassNodeCommands.LoadNodes(CURRENT_ENTITY_ID) DT_STRUCTURE_NODES = oTable - Dim oNodeConfigSql = String.Format("select T.* from TBPMO_STRUCTURE_NODES_CONFIGURATION T INNER JOIN VWPMO_CONSTRUCTOR_FORMS T1 ON T.ENTITY_ID = T1.FORM_ID WHERE T.ENTITY_ID = {0}", CURRENT_ENTITY_ID) + Dim oNodeConfigSql = String.Format("select T.* from TBPMO_STRUCTURE_NODES_CONFIGURATION T WITH (NOLOCK) INNER JOIN VWPMO_CONSTRUCTOR_FORMS T1 ON T.ENTITY_ID = T1.FORM_ID WHERE T.ENTITY_ID = {0}", CURRENT_ENTITY_ID) Dim DT_TREEVIEW_CONFIGURATION = MYDB_ECM.GetDatatable(oNodeConfigSql) Dim imageInit = TryCast(ImageCollection1, System.ComponentModel.ISupportInitialize) @@ -375,9 +375,6 @@ Public Class frmNodeNavigation RPGNodes.Enabled = True Dim oNodeId = e.Node.Id - Console.Write($"Node ID: {oNodeId}") - - Dim oRowObject = TreeListDevexpress.GetRow(oNodeId) @@ -385,9 +382,7 @@ Public Class frmNodeNavigation Exit Sub End If - 'If oNodeId = 0 Then - ' Exit Sub - 'End If + NNLogger.Debug($"FocusedNodeChanged: NodeID={oNodeId}, NodeCaption='{e.Node.GetDisplayText("NODE_CAPTION")}', NodeConfigID={e.Node.GetValue("NODE_CONFIG_ID")}, RecordID={e.Node.GetValue("RECORD_ID")}") Dim oRowView As DataRowView = oRowObject Dim oRow As DataRow = oRowView.Row @@ -716,7 +711,7 @@ Public Class frmNodeNavigation End Sub Sub Load_Adding_users() Try - Dim oSql = String.Format("SELECT * FROM TBPMO_ENTITY_USERRIGHT_ADDING where ENTITY_ID IN (SELECT FORM_ID FROM VWPMO_CONSTRUCTOR_FORMS WHERE CONSTRUCT_ID = {0})", oConstructID) + Dim oSql = String.Format("SELECT * FROM TBPMO_ENTITY_USERRIGHT_ADDING WITH (NOLOCK) where ENTITY_ID IN (SELECT FORM_ID FROM VWPMO_CONSTRUCTOR_FORMS WHERE CONSTRUCT_ID = {0})", oConstructID) DT_ADDING_USERS = MYDB_ECM.GetDatatable(oSql) Catch ex As Exception NNLogger.Error(ex) @@ -726,7 +721,7 @@ Public Class frmNodeNavigation Private Sub Load_Configurable_Nodes() Try btnCreateNewNode.Visibility = DevExpress.XtraBars.BarItemVisibility.Never - Dim oSql = String.Format("SELECT * FROM TBPMO_STRUCTURE_NODES_CONFIGURATION where TYPE_NODE = 1000 AND ENTITY_ID IN (SELECT FORM_ID FROM VWPMO_CONSTRUCTOR_FORMS WHERE CONSTRUCT_ID = {0})", oConstructID) + Dim oSql = String.Format("SELECT * FROM TBPMO_STRUCTURE_NODES_CONFIGURATION WITH (NOLOCK) where TYPE_NODE = 1000 AND ENTITY_ID IN (SELECT FORM_ID FROM VWPMO_CONSTRUCTOR_FORMS WHERE CONSTRUCT_ID = {0})", oConstructID) DT_CONFIGURABLE_NODES = MYDB_ECM.GetDatatable(oSql) NNLogger.Info($"Load_Configurable_Nodes: ConstructID={oConstructID}, " & @@ -863,7 +858,7 @@ Public Class frmNodeNavigation ADD_RECORDS_CONSTR = True End Try If ENTITY_TYPE = "Personal file" Then - Dim oSQL = "SELECT CAT_STRING FROM TBDD_CATALOG WHERE CAT_TITLE = 'PA_NODE_GUID_STAMM'" + Dim oSQL = "SELECT CAT_STRING FROM TBDD_CATALOG WITH (NOLOCK) WHERE CAT_TITLE = 'PA_NODE_GUID_STAMM'" PA_NODE_GUID_STAMM = MYDB_ECM.GetScalarValue(oSQL) oSQL = "SELECT CAT_STRING FROM TBDD_CATALOG WHERE CAT_TITLE = 'PA_NODE_CONFIG_USER_STAMM'" PA_NODE_CONFIG_USER_STAMM = MYDB_ECM.GetScalarValue(oSQL) @@ -886,9 +881,9 @@ Public Class frmNodeNavigation 'sql = String.Format("select * from TBPMO_RIGHT_USER WHERE USER_ID = {0} AND oEntityID = {1}", USER_GUID, oEntityID) DT_RIGHTS_USER = ClassHelper.FILTER_DATATABLE(CURRENT_TBPMO_RIGHT_USER, "ENTITY_ID = " & _ENTITY_ID, "") expression = String.Format("") - sql = String.Format("SELECT DISTINCT EDIT_REC,ADD_REC,DELETE_REC,ADD_DOC,VIEW_DOC,DELETE_DOC FROM TBPMO_RIGHT_GROUP WHERE ENTITY_ID = {0} AND GROUP_ID IN (SELECT GROUP_ID FROM TBDD_GROUPS_USER WHERE USER_ID = {1})", _ENTITY_ID, USER_GUID) + sql = String.Format("SELECT DISTINCT EDIT_REC,ADD_REC,DELETE_REC,ADD_DOC,VIEW_DOC,DELETE_DOC FROM TBPMO_RIGHT_GROUP WITH (NOLOCK) WHERE ENTITY_ID = {0} AND GROUP_ID IN (SELECT GROUP_ID FROM TBDD_GROUPS_USER WITH (NOLOCK) WHERE USER_ID = {1})", _ENTITY_ID, USER_GUID) DT_RIGHTS_GROUP = MYDB_ECM.GetDatatable(sql) - sql = String.Format("SELECT VIEW_ID FROM TBPMO_USER_CONSTR_VIEW_TYPE WHERE CONSTRUCTOR_DETAIL_ID = {0} AND [ENTITY_ID] = {1} AND USER_ID = {2}", CURRENT_CONSTRUCTOR_DETAIL_ID, _ENTITY_ID, USER_GUID) + sql = String.Format("SELECT VIEW_ID FROM TBPMO_USER_CONSTR_VIEW_TYPE WITH (NOLOCK) WHERE CONSTRUCTOR_DETAIL_ID = {0} AND [ENTITY_ID] = {1} AND USER_ID = {2}", CURRENT_CONSTRUCTOR_DETAIL_ID, _ENTITY_ID, USER_GUID) _RECORD_ID = 0 @@ -935,7 +930,6 @@ Public Class frmNodeNavigation ClassHelper.MSGBOX_Handler("ERROR", "Unexpected Error", "Error in getting Entity-Data - Check logfile") Else CURRENT_DT_ENTITY_RECORDS.TableName = "VWPMO_ENTITY_TABLE" & _ENTITY_ID - ' Dim SQL_AutoValues = "SELECT GUID AS CONTROL_ID, CONNECTION_ID_1 AS CONNECTION_ID, SQL_COMMAND_1 AS SQL_COMMAND FROM TBPMO_CONTROL WHERE CONNECTION_ID_1 <> '' AND SQL_COMMAND_1 <> '' AND FORM_ID = " & oEntityID Dim DT_AUTOVALUES = ClassHelper.FILTER_DATATABLE(CURRENT_TBPMO_CONTROL, "CONNECTION_ID_1 > 0 AND SQL_COMMAND_1 <> '' AND FORM_ID = " & _ENTITY_ID, "") @@ -980,7 +974,7 @@ Public Class frmNodeNavigation CONVERT(VARCHAR(16),ADDED_WHEN,20) AS ADDED_WHEN, COALESCE(CHANGED_WHO,'') AS CHANGED_WHO, COALESCE(CONVERT(VARCHAR(16),CHANGED_WHEN,20),'') AS CHANGED_WHEN - FROM TBPMO_RECORD WHERE GUID = {RecordId}" + FROM TBPMO_RECORD WITH (NOLOCK) WHERE GUID = {RecordId}" Dim oTable As DataTable oTable = MYDB_ECM.GetDatatable(oSql) @@ -1032,64 +1026,48 @@ Public Class frmNodeNavigation Private Async Function Show_Selected_Record_Data(pRecordId As Integer, pLoadRecordData As Boolean) As Task Dim oHandle As IOverlaySplashScreenHandle = Nothing Try - ' ✅ 1. SPLASHSCREEN FÜR CRITICAL-PATH (Control-Loading) oHandle = SplashScreenManager.ShowOverlayForm(Me) + NNLogger.Debug("[OVERLAY] ShowOverlayForm called at {0}", Now.ToString("HH:mm:ss.fff")) - ' ✅ 2. DEBUG LOGGING (wie Original) NNLogger.Debug("Show_Selected_Record_Data_NonBlocking: RecordID={0}, LoadData={1}", pRecordId, pLoadRecordData) - ' ✅ 3. ENTITY-ROW laden (wie Original) Dim ENTITY_ROW = (From form In DT_ENTITY_DATA.AsEnumerable() Select form Where form.Item("GUID") = _ENTITY_ID).Single() NNLogger.Debug("RECORD ID: {0}", pRecordId) - ' ✅ 4. GLOBALE VARIABLEN setzen (wie Original) + CURRENT_PARENT_RECORD_ID = 0 RIGHT_CONTROL_CHANGED = False ENTITY_RELOAD_AFT_CONTROL_LOAD = False - ' ✅ 5. PANEL aktivieren + If pnlControls.Enabled = False Then pnlControls.Enabled = True - ' ✅ 6. CONTROL-LOADING (CRITICAL PATH - blockierend mit Splashscreen) + Dim sw As New SW("Show_Selected_Record_Data - Control Loading") If pLoadRecordData = True Then CtrlBuilder.WatchRecordChanges = False ClassControlValues.LoadControlValues(_RECORD_ID, 0, _ENTITY_ID, CtrlBuilder.AllControls, _ENTITY_ID) CtrlBuilder.WatchRecordChanges = True End If - sw.Done() - ' ✅ 7. RECORD_CHANGED zurücksetzen (wie Original) RECORD_CHANGED = False - - ' ✅ 8. RECORD-LABEL aktualisieren (synchron, schnell) Update_Record_Label(_RECORD_ID) - ' ✅ 9. SPLASHSCREEN SCHLIESSEN - Critical-Path abgeschlossen! - If oHandle IsNot Nothing Then - SplashScreenManager.CloseOverlayForm(oHandle) - oHandle = Nothing - End If + ' ── ControlLoading abgeschlossen, Overlay bleibt bis DocSearch fertig ── + NNLogger.Debug("[OVERLAY] Kept open - handing to RUN_DOCSEARCH at {0}", Now.ToString("HH:mm:ss.fff")) - ' ══════════════════════════════════════════════════════════════ - ' ✅ AB HIER: NON-BLOCKING BACKGROUND-TASKS - ' ══════════════════════════════════════════════════════════════ - - ' ✅ 10. UI-FEEDBACK: Zeige dass DocSearch läuft - Update_Document_Label(0) ' "Loading documents..." - Update_Notification_Label(True, "Loading documents in background...", "Blue") + Update_Document_Label(0) + Update_Notification_Label(True, "Loading documents...", "Blue") RibbonPageGroupDocResult.Enabled = False - ' ✅ 11. DOCSEARCH IM HINTERGRUND (ohne UI-Freeze) - NNLogger.Debug("Starting background DocSearch for RecordID={0}", pRecordId) - + NNLogger.Debug("[DOCSEARCH] RUN_DOCSEARCH START at {0}", Now.ToString("HH:mm:ss.fff")) Dim oDocumentsFound As Integer = 0 Try - ' DocSearch ohne Splashscreen ausführen - oDocumentsFound = Await RUN_DOCSEARCH(False) - - NNLogger.Debug("DocSearch completed: {0} documents found", oDocumentsFound) + ' ✅ FIX: oHandle wird übergeben – RUN_DOCSEARCH schließt es nach FillColumns + oDocumentsFound = Await RUN_DOCSEARCH(False, oHandle) + oHandle = Nothing ' ← Ownership übertragen, nicht nochmal schließen + NNLogger.Debug("[DOCSEARCH] RUN_DOCSEARCH END at {0} - {1} documents found", Now.ToString("HH:mm:ss.fff"), oDocumentsFound) Catch ex As Exception NNLogger.Error(ex, "Error in background DocSearch") @@ -1097,22 +1075,17 @@ Public Class frmNodeNavigation oDocumentsFound = 0 End Try - ' ✅ 12. UI-UPDATE NACH DOCSEARCH Update_Document_Label(oDocumentsFound) - Update_Notification_Label(False, "", "") ' Notification ausblenden + Update_Notification_Label(False, "", "") - ' ✅ 13. DOCVIEWER-HANDLING (wie Original) If DocViewInitialized Then If oDocumentsFound = 0 Then Close_Document_Viewer() RibbonPageGroupDocResult.Enabled = False SplitContainerDocView.Collapsed = True - NNLogger.Debug("No documents found - DocViewer collapsed") Else RibbonPageGroupDocResult.Enabled = True - - ' ✅ Original-Logik: Node_AfterSelect-Check If Node_AfterSelect = False Then UpdateDocViewCollapsedState() NNLogger.Debug("Documents found - DocView state updated") @@ -1120,9 +1093,6 @@ Public Class frmNodeNavigation SplitContainerDocView.Collapsed = True NNLogger.Debug("Node_AfterSelect=True - DocView collapsed") End If - - ' ✅ OPTIONAL: DocView im Hintergrund laden (falls aktiviert) - ' ✅ Direkt awaiten statt Task.Run – wir sind bereits im Async-Kontext If checkShowPreview.Checked AndAlso Not Node_AfterSelect Then NNLogger.Debug("Starting DocView loading") Await DocView_DisplaySelectedDoc(AfterNodeChange:=False) @@ -1135,11 +1105,11 @@ Public Class frmNodeNavigation Catch ex As Exception NNLogger.Error(ex, "Error in Show_Selected_Record_Data_NonBlocking") ClassHelper.MSGBOX_Handler("ERROR", "Unexpected Error", "Error in SelectedRecord_ShowData: ", ex.Message) - Finally - ' ✅ SICHERSTELLEN: Splashscreen wird IMMER geschlossen + ' ✅ Sicherheitsnetz: schließen falls RUN_DOCSEARCH es nicht übernommen hat If oHandle IsNot Nothing Then Try + NNLogger.Debug("[OVERLAY] CloseOverlayForm (Finally-Fallback) at {0}", Now.ToString("HH:mm:ss.fff")) SplashScreenManager.CloseOverlayForm(oHandle) Catch ex As Exception NNLogger.Warn(ex, "Could not close overlay form") @@ -1742,7 +1712,7 @@ Public Class frmNodeNavigation #End Region Private Sub Customer_Run_Procedures() Try - Dim DT As DataTable = MYDB_ECM.GetDatatable("SELECT * FROM TBPMO_RUN_PROCEDURES WHERE FORM_ID = " & _ENTITY_ID) + Dim DT As DataTable = MYDB_ECM.GetDatatable("SELECT * FROM TBPMO_RUN_PROCEDURES WITH (NOLOCK) WHERE FORM_ID = " & _ENTITY_ID) If Not DT Is Nothing Then For Each row As DataRow In DT.Rows Dim prsql As String = row.Item("EXECUTE_COMMAND") @@ -1757,17 +1727,19 @@ Public Class frmNodeNavigation ClassHelper.MSGBOX_Handler("ERROR", "Unexpected Error", "Error in Customer_Run_Procedures: ", ex.Message) End Try End Sub - Private Async Function RUN_DOCSEARCH(pShowSplashscreen As Boolean) As Task(Of Integer) - Dim oHandle As IOverlaySplashScreenHandle + Private Async Function RUN_DOCSEARCH(pShowSplashscreen As Boolean, + Optional pExternalHandle As IOverlaySplashScreenHandle = Nothing) As Task(Of Integer) + Dim oHandle As IOverlaySplashScreenHandle = pExternalHandle ' ← externer Handle übernommen + If pShowSplashscreen Then oHandle = SplashScreenManager.ShowOverlayForm(Me) + NNLogger.Debug("[OVERLAY] RUN_DOCSEARCH ShowOverlayForm at {0}", Now.ToString("HH:mm:ss.fff")) End If Dim sw As New SW("RUN_WDSEARCH_GRID") Dim oFilesFound As Integer = 0 Try - If _RECORD_ID = 0 Then GridControlDocSearch.DataSource = Nothing Return 0 @@ -1775,59 +1747,58 @@ Public Class frmNodeNavigation bsitmtInfoDoc.Visibility = DevExpress.XtraBars.BarItemVisibility.Always If CURRENT_SEARCH_TYPE = "NODE_DOWN" Then - Dim sql = String.Format("DECLARE @return_value int " & vbNewLine & "EXEC @return_value = [dbo].[PRPMO_NODES_GET_CHILD_RECORDS] @USER_ID = {0}, @NODE_ID = {1} " & vbNewLine & "SELECT 'Return Value' = @return_value", USER_GUID, _NODE_GUID) Dim DT_ASYNC As DataTable = Await MYDB_ECM.GetDatatableAsync(sql) - If Not IsNothing(DT_ASYNC) Then Dim result = DT_ASYNC.Rows(0).Item(0) If result <> 0 Then ClassHelper.MSGBOX_Handler("ERROR", "Unexpected Error", "Error in Getting SubNodes-Structure", "Check the logfile") End If End If - End If + + NNLogger.Debug("[DOCSEARCH] Get_DOC_RESULTTABLE START at {0}", Now.ToString("HH:mm:ss.fff")) Dim DT_RESULT As DataTable DT_RESULT = ClassDOC_SEARCH.Get_DOC_RESULTTABLE(DT_RESULTLIST_OPTIONS, DT_RESULTLIST_VARIABLE_VALUE, DT_COLUMNS_GRID_ENTITY, _ENTITY_ID, _RECORD_ID, True) + NNLogger.Debug("[DOCSEARCH] Get_DOC_RESULTTABLE END at {0} - Rows={1}", Now.ToString("HH:mm:ss.fff"), If(IsNothing(DT_RESULT), "Nothing", DT_RESULT.Rows.Count.ToString())) If IsNothing(DT_RESULT) Then - Dim msg = "wrong DocSearch-Configuration or unexpected Error in Get_DOC_RESULTTABLE - Check logfile and contact Digital Data" - GridViewDoc_Search.ViewCaption = msg + GridViewDoc_Search.ViewCaption = "wrong DocSearch-Configuration or unexpected Error in Get_DOC_RESULTTABLE - Check logfile and contact Digital Data" oFilesFound = 0 Else - If DT_RESULT.Rows.Count > 0 Then 'Es gibt Suchergebnisse - - If DT_RESULT.Rows.Count > 0 Then - If CURRENT_SEARCH_TYPE = "FULLTEXT" Then - GridViewDoc_Search.ShowFindPanel() - GridViewDoc_Search.FindFilterText = CURRENT_FULLTEXT_PATTERN - End If - If Not IsNothing(DT_DOCRESULT_DROPDOWN_ITEMS) Then - If DT_DOCRESULT_DROPDOWN_ITEMS.Rows.Count > 0 Then - NNLogger.Info($"RUN_WDSEARCH_GRID - DT_DOCRESULT_DROPDOWN_ITEMS [{DT_DOCRESULT_DROPDOWN_ITEMS.Rows.Count}]!") - End If - End If - - - ClassDocGrid.FillColumns( - GridViewDoc_Search, - DT_RESULT, - DT_COLUMNS_GRID_ENTITY, - DT_DOCRESULT_DROPDOWN_ITEMS, - AddressOf OnCBSelectedValueChanged, - AddressOf OnDateSelectedValueChanged, - AddressOf OnTextSelectedValueChanged, - AddressOf OnCheckboxValueChanged, - CURRENT_SEARCH_TYPE, _RECORD_ID) - + If DT_RESULT.Rows.Count > 0 Then + If CURRENT_SEARCH_TYPE = "FULLTEXT" Then + GridViewDoc_Search.ShowFindPanel() + GridViewDoc_Search.FindFilterText = CURRENT_FULLTEXT_PATTERN + End If + If Not IsNothing(DT_DOCRESULT_DROPDOWN_ITEMS) AndAlso DT_DOCRESULT_DROPDOWN_ITEMS.Rows.Count > 0 Then + NNLogger.Info($"RUN_WDSEARCH_GRID - DT_DOCRESULT_DROPDOWN_ITEMS [{DT_DOCRESULT_DROPDOWN_ITEMS.Rows.Count}]!") + End If + + NNLogger.Debug("[DOCSEARCH] FillColumns START at {0}", Now.ToString("HH:mm:ss.fff")) + ClassDocGrid.FillColumns( + GridViewDoc_Search, + DT_RESULT, + DT_COLUMNS_GRID_ENTITY, + DT_DOCRESULT_DROPDOWN_ITEMS, + AddressOf OnCBSelectedValueChanged, + AddressOf OnDateSelectedValueChanged, + AddressOf OnTextSelectedValueChanged, + AddressOf OnCheckboxValueChanged, + CURRENT_SEARCH_TYPE, _RECORD_ID) + NNLogger.Debug("[DOCSEARCH] FillColumns END at {0}", Now.ToString("HH:mm:ss.fff")) + + ' ✅ FIX: Overlay NACH FillColumns schließen + If oHandle IsNot Nothing Then + NNLogger.Debug("[OVERLAY] CloseOverlayForm after FillColumns at {0}", Now.ToString("HH:mm:ss.fff")) + SplashScreenManager.CloseOverlayForm(oHandle) + oHandle = Nothing End If - 'BbtnitmDocSearch.Enabled = TruefRe oFilesFound = DT_RESULT.Rows.Count Else - GridControlDocSearch.DataSource = Nothing oFilesFound = 0 End If @@ -1840,10 +1811,16 @@ Public Class frmNodeNavigation sw.Done() bsitmtInfoDoc.Visibility = DevExpress.XtraBars.BarItemVisibility.Never Update_Notification_Label(False, "", "") - If pShowSplashscreen Then + + ' ✅ Sicherheitsnetz: Handle schließen falls FillColumns-Pfad nicht erreicht wurde (0 Rows / Fehler) + If oHandle IsNot Nothing Then + NNLogger.Debug("[OVERLAY] CloseOverlayForm (RUN_DOCSEARCH Finally-Fallback) at {0}", Now.ToString("HH:mm:ss.fff")) SplashScreenManager.CloseOverlayForm(oHandle) End If + If pShowSplashscreen Then + NNLogger.Debug("[OVERLAY] RUN_DOCSEARCH own handle closed at {0}", Now.ToString("HH:mm:ss.fff")) + End If End Try Return oFilesFound @@ -1851,7 +1828,7 @@ Public Class frmNodeNavigation Private Sub RUN_ENTITY_DOC_SEARCH() Dim sw As New SW("RUN_ENTITY_DOC_SEARCH") Try - Dim oSQL = $"SELECT ENTITY_DOC_SEARCH FROM TBPMO_FORM WHERE GUID = {_ENTITY_ID}" + Dim oSQL = $"SELECT ENTITY_DOC_SEARCH FROM TBPMO_FORM WITH (NOLOCK) WHERE GUID = {_ENTITY_ID}" CURRENT_DOCSEARCH_SQL = MYDB_ECM.GetScalarValue(oSQL) If CURRENT_DOCSEARCH_SQL <> String.Empty Then Dim oText = $"Die sichtweite Suche wird im Hintergrund ausgeführt und in einem separaten Fenster angezeigt sobald sie fertig ist." @@ -2555,7 +2532,7 @@ Public Class frmNodeNavigation Dim oErrorCount As Integer = 0 For Each pDocId In pDocIds - Dim oSql = $"IF NOT EXISTS (SELECT 1 FROM TBPMO_DOC_RECORD_LINK WHERE DOC_ID = {pDocId} AND RECORD_ID = {_RECORD_ID}) " & + Dim oSql = $"IF NOT EXISTS (SELECT 1 FROM TBPMO_DOC_RECORD_LINK WITH (NOLOCK) WHERE DOC_ID = {pDocId} AND RECORD_ID = {_RECORD_ID}) " & $"INSERT INTO TBPMO_DOC_RECORD_LINK (DOC_ID, RECORD_ID, ADDED_WHO, ADDED_WHEN) " & $"VALUES ({pDocId}, {_RECORD_ID}, '{USER_USERNAME}', GETDATE())" @@ -2950,7 +2927,7 @@ Public Class frmNodeNavigation Dim oDocuments = Current_DocList.SelectedDocuments If oDocuments.Count = 1 Then Try - Dim oSQLDRList = $"Select COALESCE(IN_WORK_USER,'') IN_WORK_USER, COALESCE(IN_WORK_COMMENT,'') IN_WORK_COMMENT,IN_WORK FROM TBPMO_DOCRESULT_LIST where DocID = {oDocuments.First.DocId}" + Dim oSQLDRList = $"Select COALESCE(IN_WORK_USER,'') IN_WORK_USER, COALESCE(IN_WORK_COMMENT,'') IN_WORK_COMMENT,IN_WORK FROM TBPMO_DOCRESULT_LIST WITH (NOLOCK) where DocID = {oDocuments.First.DocId}" Dim oDT As DataTable = MYDB_ECM.GetDatatable(oSQLDRList) If Not IsNothing(oDT) Then If oDT.Rows.Count = 1 Then @@ -3261,6 +3238,7 @@ Public Class frmNodeNavigation ClassFileResult.DocID = oDocuments.First.DocId ClassFileResult.ParentID = oDocuments.First.ParentID ClassFileResult.FileName = oDocuments.First.Filename + ClassFileResult.DocumentPath = oDocuments.First.DocPath frmWM_CreateVersion.ShowDialog() Await RUN_DOCSEARCH(True) Else @@ -3783,7 +3761,7 @@ Public Class frmNodeNavigation Dim oDElWMFile As Boolean = False Dim oCountLinks As Integer If Not IsNothing(oDoc.DocId) Then - oCountLinks = MYDB_ECM.GetScalarValue("SELECT COUNT(GUID) FROM TBPMO_DOC_RECORD_LINK WHERE DOC_ID = " & oDoc.DocId) + oCountLinks = MYDB_ECM.GetScalarValue("SELECT COUNT(GUID) FROM TBPMO_DOC_RECORD_LINK WITH (NOLOCK) WHERE DOC_ID = " & oDoc.DocId) If oCountLinks > 1 And CURRENT_SEARCH_TYPE = "RECORD" Then msg = "Diese Datei ist noch mit anderen Datensätzen verknüpft! Wollen Sie diese Verknüpfungen ebenfalls löschen?" If USER_LANGUAGE <> "de-DE" Then @@ -3839,7 +3817,7 @@ Public Class frmNodeNavigation Private Sub TimerFileHandle_Tick(sender As Object, e As EventArgs) Handles TimerFileHandle.Tick Try - Dim oSql = $"SELECT GUID FROM TBPMO_DOC_USER_REFRESH_VIEW WHERE USER_ID IN ({USER_GUID},0) AND REFRESHED_WHEN IS NULL" + Dim oSql = $"SELECT GUID FROM TBPMO_DOC_USER_REFRESH_VIEW WITH (NOLOCK) WHERE USER_ID IN ({USER_GUID},0) AND REFRESHED_WHEN IS NULL" Dim oDTGUID As DataTable = MYDB_ECM.GetDatatable(oSql) If oDTGUID.Rows.Count >= 1 Then Dim omsg = "Attention: The DocID of one document changed or a document has been versioned! The DocSearch has been refreshed!" @@ -3984,7 +3962,7 @@ Public Class frmNodeNavigation If mySelectedDocs.Count = 1 Then Dim oDocId As Integer = mySelectedDocs.First.DocId Dim oJumpToDocSQL = String.Format("DECLARE @PID BIGINT - SELECT @PID = dwParentID FROM TBPMO_DOCRESULT_LIST WHERE DocID = {0} + SELECT @PID = dwParentID FROM TBPMO_DOCRESULT_LIST WITH (NOLOCK) WHERE DocID = {0} SELECT GUID FROM VWPMO_STRUCTURE_NODES WHERE ENTITY_ID = {1} AND ISNUMERIC(ID1) = 1 AND ID1 = @PID", oDocId, OF_FILESTORE_ENTITY) Dim ojumpID As Integer = MYDB_ECM.GetScalarValue(oJumpToDocSQL) If Not IsNothing(ojumpID) AndAlso ojumpID <> 0 Then diff --git a/app/DD-Record-Organizer/frmWM_CreateVersion.vb b/app/DD-Record-Organizer/frmWM_CreateVersion.vb index ffd4fe6..35a5775 100644 --- a/app/DD-Record-Organizer/frmWM_CreateVersion.vb +++ b/app/DD-Record-Organizer/frmWM_CreateVersion.vb @@ -13,11 +13,11 @@ Public Class frmWM_CreateVersion 'Dim odwVersionId = MYDB_ECM.GetScalarValue(oSql) 'Dim oInsert = $"INSERT INTO TBPMO_DOC_ID_CHANGED (USER_ID,PROCESS_ID,VERSION_ID,OLD_DOC_ID,DOC_PATH) VALUES ({USER_GUID},'{ProcID.ToString}',{odwVersionId},{BW_DocID},'{BW_DocPath}')" 'MYDB_ECM.ExecuteNonQuery(oInsert) - Dim sql = $"SELECT DocID from VWPMO_DOC_SYNC Where dwParentID = {ClassFileResult.ParentID} and Filename = '{ClassFileResult.FileName}'" - Dim VERSION = MYDB_ECM.GetScalarValue(sql) - If Not IsNothing(VERSION) Then - VERSION = VERSION + 1 - Dim upd = String.Format("UPDATE TBPMO_DOCRESULT_LIST SET Version = {0},Change_DateTime = GETDATE() WHERE DocID = {1}", VERSION, ClassFileResult.DocID) + Dim sql = $"SELECT Version from VWPMO_DOC_SYNC Where dwParentID = {ClassFileResult.ParentID} and Filename = '{ClassFileResult.FileName}'" + Dim oVERSION = MYDB_ECM.GetScalarValue(sql) + If Not IsNothing(oVERSION) Then + oVERSION = oVERSION + Dim upd = String.Format("UPDATE TBPMO_DOCRESULT_LIST SET Version = {0},Change_DateTime = GETDATE() WHERE DocID = {1}", oVERSION, ClassFileResult.DocID) MYDB_ECM.ExecuteNonQuery(upd) End If diff --git a/app/OrgFlow.sln b/app/OrgFlow.sln index f276311..6e32f78 100644 --- a/app/OrgFlow.sln +++ b/app/OrgFlow.sln @@ -9,8 +9,6 @@ Project("{F184B08F-C81C-45F6-A57F-5ABD9991F28F}") = "RecordOrganizer_RightManage EndProject Project("{930C7802-8A8C-48F9-8165-68863BCCD9DD}") = "Setup_NoUpdaterVS19", "Setup_NoUpdaterVS19\Setup_NoUpdaterVS19.wixproj", "{A7F7585A-C46A-4436-9F6E-17629325CE58}" EndProject -Project("{F184B08F-C81C-45F6-A57F-5ABD9991F28F}") = "Windream", "..\..\..\2_DLL Projekte\DDModules\Windream\Windream.vbproj", "{C602BA85-5E75-6E19-C485-79D912038170}" -EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution CD_ROM|Any CPU = CD_ROM|Any CPU @@ -143,46 +141,6 @@ Global {A7F7585A-C46A-4436-9F6E-17629325CE58}.SingleImage|x64.Build.0 = Release|x86 {A7F7585A-C46A-4436-9F6E-17629325CE58}.SingleImage|x86.ActiveCfg = Release|x86 {A7F7585A-C46A-4436-9F6E-17629325CE58}.SingleImage|x86.Build.0 = Release|x86 - {C602BA85-5E75-6E19-C485-79D912038170}.CD_ROM|Any CPU.ActiveCfg = Release|Any CPU - {C602BA85-5E75-6E19-C485-79D912038170}.CD_ROM|Any CPU.Build.0 = Release|Any CPU - {C602BA85-5E75-6E19-C485-79D912038170}.CD_ROM|Mixed Platforms.ActiveCfg = Release|Any CPU - {C602BA85-5E75-6E19-C485-79D912038170}.CD_ROM|Mixed Platforms.Build.0 = Release|Any CPU - {C602BA85-5E75-6E19-C485-79D912038170}.CD_ROM|x64.ActiveCfg = Release|Any CPU - {C602BA85-5E75-6E19-C485-79D912038170}.CD_ROM|x64.Build.0 = Release|Any CPU - {C602BA85-5E75-6E19-C485-79D912038170}.CD_ROM|x86.ActiveCfg = Release|Any CPU - {C602BA85-5E75-6E19-C485-79D912038170}.CD_ROM|x86.Build.0 = Release|Any CPU - {C602BA85-5E75-6E19-C485-79D912038170}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {C602BA85-5E75-6E19-C485-79D912038170}.Debug|Any CPU.Build.0 = Debug|Any CPU - {C602BA85-5E75-6E19-C485-79D912038170}.Debug|Mixed Platforms.ActiveCfg = Debug|Any CPU - {C602BA85-5E75-6E19-C485-79D912038170}.Debug|Mixed Platforms.Build.0 = Debug|Any CPU - {C602BA85-5E75-6E19-C485-79D912038170}.Debug|x64.ActiveCfg = Debug|Any CPU - {C602BA85-5E75-6E19-C485-79D912038170}.Debug|x64.Build.0 = Debug|Any CPU - {C602BA85-5E75-6E19-C485-79D912038170}.Debug|x86.ActiveCfg = Debug|Any CPU - {C602BA85-5E75-6E19-C485-79D912038170}.Debug|x86.Build.0 = Debug|Any CPU - {C602BA85-5E75-6E19-C485-79D912038170}.DVD-5|Any CPU.ActiveCfg = Release|Any CPU - {C602BA85-5E75-6E19-C485-79D912038170}.DVD-5|Any CPU.Build.0 = Release|Any CPU - {C602BA85-5E75-6E19-C485-79D912038170}.DVD-5|Mixed Platforms.ActiveCfg = Release|Any CPU - {C602BA85-5E75-6E19-C485-79D912038170}.DVD-5|Mixed Platforms.Build.0 = Release|Any CPU - {C602BA85-5E75-6E19-C485-79D912038170}.DVD-5|x64.ActiveCfg = Release|Any CPU - {C602BA85-5E75-6E19-C485-79D912038170}.DVD-5|x64.Build.0 = Release|Any CPU - {C602BA85-5E75-6E19-C485-79D912038170}.DVD-5|x86.ActiveCfg = Release|Any CPU - {C602BA85-5E75-6E19-C485-79D912038170}.DVD-5|x86.Build.0 = Release|Any CPU - {C602BA85-5E75-6E19-C485-79D912038170}.Release|Any CPU.ActiveCfg = Release|Any CPU - {C602BA85-5E75-6E19-C485-79D912038170}.Release|Any CPU.Build.0 = Release|Any CPU - {C602BA85-5E75-6E19-C485-79D912038170}.Release|Mixed Platforms.ActiveCfg = Release|Any CPU - {C602BA85-5E75-6E19-C485-79D912038170}.Release|Mixed Platforms.Build.0 = Release|Any CPU - {C602BA85-5E75-6E19-C485-79D912038170}.Release|x64.ActiveCfg = Release|Any CPU - {C602BA85-5E75-6E19-C485-79D912038170}.Release|x64.Build.0 = Release|Any CPU - {C602BA85-5E75-6E19-C485-79D912038170}.Release|x86.ActiveCfg = Release|Any CPU - {C602BA85-5E75-6E19-C485-79D912038170}.Release|x86.Build.0 = Release|Any CPU - {C602BA85-5E75-6E19-C485-79D912038170}.SingleImage|Any CPU.ActiveCfg = Release|Any CPU - {C602BA85-5E75-6E19-C485-79D912038170}.SingleImage|Any CPU.Build.0 = Release|Any CPU - {C602BA85-5E75-6E19-C485-79D912038170}.SingleImage|Mixed Platforms.ActiveCfg = Release|Any CPU - {C602BA85-5E75-6E19-C485-79D912038170}.SingleImage|Mixed Platforms.Build.0 = Release|Any CPU - {C602BA85-5E75-6E19-C485-79D912038170}.SingleImage|x64.ActiveCfg = Release|Any CPU - {C602BA85-5E75-6E19-C485-79D912038170}.SingleImage|x64.Build.0 = Release|Any CPU - {C602BA85-5E75-6E19-C485-79D912038170}.SingleImage|x86.ActiveCfg = Release|Any CPU - {C602BA85-5E75-6E19-C485-79D912038170}.SingleImage|x86.Build.0 = Release|Any CPU EndGlobalSection GlobalSection(SolutionProperties) = preSolution HideSolutionNode = FALSE