8
0

Serverumzug

This commit is contained in:
2026-04-13 12:08:30 +02:00
parent 3096e432aa
commit 82609f5fc1
48 changed files with 5489 additions and 618 deletions

View File

@@ -0,0 +1,169 @@
USE [DD_ECM_REF]
GO
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
-- PRMOT_MON_GET_TREEVIEW_RESULTS (Value: STRING)
-- =================================================================
-- Haupteinstiegspunkt in die Monitor-Suche
--
-- Returns: Tabelle
-- =================================================================
-- Copyright (c) 2026 by Digital Data GmbH
--
-- Digital Data GmbH • Ludwig-Rinn-Strasse 16 • D-35452 Heuchelheim
-- Tel.: 0641/202360 • E-Mail: info-flow@digitaldata.works
-- =================================================================
-- History:
-- 10.03.2026 / MP - Prozedur erstellt.
-- 13.03.2026 / MP - Prozedur für MOT-Tabellen angepasst
CREATE OR ALTER PROCEDURE [dbo].[PRMOT_MON_GET_TREEVIEW_RESULTS]
@SEARCH_VALUE NVARCHAR(100), -- Belegnummer. Muss länger als n Zeichen sein
@USR_ID INTEGER -- UserID aus Monitor
AS
BEGIN
-- Optimierungen
SET NOCOUNT ON;
SET ARITHABORT ON;
DECLARE @MIN_SEARCH_LEN INT, @BATCH_SIZE INT;
SET @MIN_SEARCH_LEN = 5; -- Mindestlänge der Belegnummer
SET @BATCH_SIZE = 10; -- Max. Belege, für die Daten gesucht werden.
DECLARE @ID INTEGER, @PID INTEGER, @PID_OFFSET INTEGER, @EMAILMSGID VARCHAR(200), @GLOB_COUNTER INTEGER,
@ERG_COUNTER INTEGER, @STRING VARCHAR(50), @ADDED_WHEN DATETIME, @EXPANDED_SWITCH SMALLINT;
DECLARE @tt1 TABLE (GUID INT); -- temp Tabelle für GUIDs
SET @ID = 0;
SET @PID = 1;
SET @PID_OFFSET = 0;
SET @EXPANDED_SWITCH = 1;
-- ### CLEAR former Results ##
DELETE FROM [DD_ECM_REF].dbo.MOTB_MON_TREEVIEW_RESULTS WITH (SNAPSHOT) WHERE USR_ID = @USR_ID;
----------------------------------------------------------------------------------------------------------------
-- Such-Parameter bearbeiten
----------------------------------------------------------------------------------------------------------------
IF LEN(@SEARCH_VALUE) < @MIN_SEARCH_LEN
BEGIN
EXEC [DD_ECM_REF].dbo.PRMOT_MON_TREEVIEW_ADD_ROW @USR_ID, NULL, 1, 0, NULL, NULL, 'Belegnummer zu kurz!', NULL, NULL, 0;
SELECT * FROM [DD_ECM_REF].dbo.MOTB_MON_TREEVIEW_RESULTS WITH (SNAPSHOT) WHERE USR_ID = @USR_ID ORDER BY GUID;
RETURN;
END
---- führende 00er entfernen
DECLARE @SEARCH_VALUE2 VARCHAR(50);
SELECT @SEARCH_VALUE2 = SUBSTRING(Spalte, PATINDEX('%[^0]%', Spalte + ' '), LEN(Spalte))
FROM (SELECT @SEARCH_VALUE AS Spalte) AS t;
----------------------------------------------------------------------------------------------------------------
-- Such-Menge (MessageIDs) eingrenzen
----------------------------------------------------------------------------------------------------------------
DECLARE @tbl TABLE (EMAILMSGID VARCHAR(200));
DELETE FROM @tbl;
---- XML-Daten zuerst
INSERT INTO @tbl
SELECT DISTINCT REFERENCE_GUID
FROM DD_ECM.DBO.TBEDMI_ITEM_VALUE WITH (NOLOCK)
WHERE SPEC_NAME = 'INVOICE_NUMBER' AND ITEM_VALUE = @SEARCH_VALUE;
---- sonstige E-Mail-Eingänge, der letzten 6 Monate, ohne führende 00er
INSERT INTO @tbl
SELECT EMAIL_MSGID
FROM DD_ECM.dbo.TBEMLP_HISTORY WITH (NOLOCK)
WHERE EMAIL_SUBJECT LIKE '%' + TRIM(@SEARCH_VALUE2) + '%'
AND datediff(month, EMAIL_DATE, getdate()) <= 6
AND EMAIL_FROM <> 'donotreply@wisag.de'
AND EMAIL_MSGID NOT IN (SELECT EMAILMSGID from @tbl);
----------------------------------------------------------------------------------------------------------------
-- CURSOR über gefundene MessageIDs
----------------------------------------------------------------------------------------------------------------
SELECT @GLOB_COUNTER = count(*) FROM @tbl;
IF @GLOB_COUNTER >= 1
BEGIN
SET @ERG_COUNTER = @GLOB_COUNTER
DECLARE main_msgid_cursor CURSOR LOCAL FAST_FORWARD FOR
SELECT TOP (@BATCH_SIZE) EMAILMSGID FROM @tbl;
OPEN main_msgid_cursor;
FETCH NEXT FROM main_msgid_cursor INTO @EMAILMSGID;
WHILE @@FETCH_STATUS = 0
BEGIN
--PRINT 'PRDD_MONITORING_GET_TREEVIEW_RESULT 3'
-- ## Ermittele die Start ID ##
SET @ID = (SELECT coalesce(max(GUID),0) FROM [DD_ECM_REF].dbo.MOTB_MON_TREEVIEW_RESULTS WITH (SNAPSHOT) WHERE USR_ID = @USR_ID);
-- ## Ermittele die Start PID ##
IF @GLOB_COUNTER = 1
SET @PID = 0;
ELSE
BEGIN
SET @ID +=1;
SET @STRING = 'Ergebnis '+ CONVERT(varchar, @ERG_COUNTER);
IF @GLOB_COUNTER = @ERG_COUNTER
SET @EXPANDED_SWITCH = 1;
ELSE
SET @EXPANDED_SWITCH = 0;
SELECT @ADDED_WHEN = MIN(CREATEDWHEN) FROM DD_ECM.dbo.TBEDMI_ITEM_VALUE WHERE REFERENCE_GUID = @EMAILMSGID;
EXEC [DD_ECM_REF].dbo.PRMOT_MON_TREEVIEW_ADD_ROW @USR_ID, NULL, @ID, 0, @ADDED_WHEN, @STRING, NULL, NULL, NULL, @EXPANDED_SWITCH;
SET @ERG_COUNTER -= 1;
SET @PID = @ID;
END
--PRINT 'PRDD_MONITORING_GET_TREEVIEW_RESULT 4'
EXEC [DD_ECM_REF].dbo.[PRMOT_MON_GET_TREEVIEW_RESULTS_PER_MESSAGEID] @EMAILMSGID, @USR_ID, @ID, @PID;
--PRINT 'PRDD_MONITORING_GET_TREEVIEW_RESULT 5'
FETCH NEXT FROM main_msgid_cursor INTO @EMAILMSGID
END
CLOSE main_msgid_cursor
DEALLOCATE main_msgid_cursor
END
ELSE
BEGIN
-- DIESE ABFRAGE IST TEUER!!!!
--PRINT 'SEARCH @EMAILMSGID IN TBEMLP_EMAIL_OUT'
DECLARE @E_SUBJ VARCHAR(256)
SET @E_SUBJ = '% '+ @SEARCH_VALUE2 +' %';
SELECT @EMAILMSGID = REFERENCE_STRING FROM DD_ECM.dbo.TBEMLP_EMAIL_OUT WHERE EMAIL_SUBJ like @E_SUBJ;
IF LEN(@EMAILMSGID) = 0 OR @EMAILMSGID IS NULL
BEGIN
-- Ohne EMail-MessageID werden keine weiteren DAten gefunden
--PRINT 'NO @EMAILMSGID FOUND'
EXEC [DD_ECM_REF].dbo.PRMOT_MON_TREEVIEW_ADD_ROW @USR_ID,NULL,@ID,@PID,NULL,'Fehlende Belegdaten ','Es wurden keine Belegdaten gefunden!','HIGHLIGHT';
RETURN
END
ELSE
BEGIN
--PRINT 'PRDD_MONITORING_GET_TREEVIEW_RESULT 6'
EXEC [DD_ECM_REF].[dbo].[PRMOT_MON_GET_TREEVIEW_RESULTS_PER_MESSAGEID] @EMAILMSGID, @USR_ID, 0, 0;
--PRINT 'PRDD_MONITORING_GET_TREEVIEW_RESULT 7'
END
END
--PRINT 'PRDD_MONITORING_GET_TREEVIEW_RESULT 8'
-- ### LAST STEP - Get all results ###
SELECT * FROM [DD_ECM_REF].dbo.MOTB_MON_TREEVIEW_RESULTS WITH (SNAPSHOT) WHERE USR_ID = @USR_ID ORDER BY GUID;
END
GO

View File

@@ -0,0 +1,174 @@
USE [DD_ECM_REF]
GO
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
-- PRMOT_MON_GET_TREEVIEW_RESULTS (Value: STRING)
-- =================================================================
-- Haupteinstiegspunkt in die Monitor-Suche
--
-- Returns: Tabelle
-- =================================================================
-- Copyright (c) 2026 by Digital Data GmbH
--
-- Digital Data GmbH • Ludwig-Rinn-Strasse 16 • D-35452 Heuchelheim
-- Tel.: 0641/202360 • E-Mail: info-flow@digitaldata.works
-- =================================================================
-- History:
-- 10.03.2026 / MP - Prozedur erstellt.
-- 13.03.2026 / MP - Prozedur für MOT-Tabellen angepasst
CREATE OR ALTER PROCEDURE [dbo].[PRMOT_MON_GET_TREEVIEW_RESULTS]
@SEARCH_VALUE NVARCHAR(100), -- Belegnummer. Muss länger als n Zeichen sein
@USR_ID INTEGER -- UserID aus Monitor
AS
BEGIN
-- Optimierungen
SET NOCOUNT ON;
SET ARITHABORT ON;
DECLARE @MIN_SEARCH_LEN INT, @BATCH_SIZE INT;
SET @MIN_SEARCH_LEN = 5; -- Mindestlänge der Belegnummer
SET @BATCH_SIZE = 10; -- Max. Belege, für die Daten gesucht werden.
DECLARE @ID INTEGER, @PID INTEGER, @PID_OFFSET INTEGER, @EMAILMSGID VARCHAR(200), @GLOB_COUNTER INTEGER,
@ERG_COUNTER INTEGER, @STRING VARCHAR(50), @ADDED_WHEN DATETIME, @EXPANDED_SWITCH SMALLINT;
DECLARE @tt1 TABLE (GUID INT); -- temp Tabelle für GUIDs
SET @ID = 0;
SET @PID = 1;
SET @PID_OFFSET = 0;
SET @EXPANDED_SWITCH = 1;
-- ### CLEAR former Results ##
DELETE FROM [DD_ECM_REF].dbo.MOTB_MON_TREEVIEW_RESULTS WITH (SNAPSHOT) WHERE USR_ID = @USR_ID;
----------------------------------------------------------------------------------------------------------------
-- Such-Parameter bearbeiten
----------------------------------------------------------------------------------------------------------------
IF LEN(@SEARCH_VALUE) < @MIN_SEARCH_LEN
BEGIN
EXEC [DD_ECM_REF].dbo.PRMOT_MON_TREEVIEW_ADD_ROW @USR_ID, NULL, 1, 0, NULL, NULL, 'Belegnummer zu kurz!', NULL, NULL, 0;
SELECT * FROM [DD_ECM_REF].dbo.MOTB_MON_TREEVIEW_RESULTS WITH (SNAPSHOT) WHERE USR_ID = @USR_ID ORDER BY GUID;
RETURN;
END
---- führende 00er entfernen
DECLARE @SEARCH_VALUE2 VARCHAR(50);
SELECT @SEARCH_VALUE2 = SUBSTRING(Spalte, PATINDEX('%[^0]%', Spalte + ' '), LEN(Spalte))
FROM (SELECT @SEARCH_VALUE AS Spalte) AS t;
----------------------------------------------------------------------------------------------------------------
-- Such-Menge (MessageIDs) eingrenzen
----------------------------------------------------------------------------------------------------------------
DECLARE @tbl TABLE (EMAILMSGID VARCHAR(200));
DELETE FROM @tbl;
---- XML-Daten zuerst
INSERT INTO @tbl
SELECT DISTINCT REFERENCE_GUID
FROM DD_ECM.DBO.TBEDMI_ITEM_VALUE WITH (NOLOCK)
WHERE SPEC_NAME = 'INVOICE_NUMBER' AND ITEM_VALUE = @SEARCH_VALUE;
---- sonstige E-Mail-Eingänge, der letzten 6 Monate, ohne führende 00er
INSERT INTO @tbl
SELECT EMAIL_MSGID
FROM DD_ECM.dbo.TBEMLP_HISTORY WITH (NOLOCK)
WHERE EMAIL_SUBJECT LIKE '%' + TRIM(@SEARCH_VALUE2) + '%'
AND datediff(month, EMAIL_DATE, getdate()) <= 6
AND EMAIL_FROM <> 'donotreply@wisag.de'
AND EMAIL_MSGID NOT IN (SELECT EMAILMSGID from @tbl);
----------------------------------------------------------------------------------------------------------------
-- CURSOR über gefundene MessageIDs
----------------------------------------------------------------------------------------------------------------
SELECT @GLOB_COUNTER = count(*) FROM @tbl;
IF @GLOB_COUNTER >= 1
BEGIN
SET @ERG_COUNTER = @GLOB_COUNTER
DECLARE main_msgid_cursor CURSOR LOCAL FAST_FORWARD FOR
SELECT TOP (@BATCH_SIZE) EMAILMSGID FROM @tbl;
OPEN main_msgid_cursor;
FETCH NEXT FROM main_msgid_cursor INTO @EMAILMSGID;
WHILE @@FETCH_STATUS = 0
BEGIN
--PRINT 'PRDD_MONITORING_GET_TREEVIEW_RESULT 3'
-- ## Ermittele die Start ID ##
DELETE FROM @tt1;
INSERT INTO @tt1
SELECT coalesce(max(GUID),0)
FROM [DD_ECM_REF].dbo.MOTB_MON_TREEVIEW_RESULTS WITH (SNAPSHOT)
WHERE USR_ID = @USR_ID;
SELECT @ID = GUID from @tt1;
-- ## Ermittele die Start PID ##
IF @GLOB_COUNTER = 1
SET @PID = 0;
ELSE
BEGIN
SET @ID +=1;
SET @STRING = 'Ergebnis '+ CONVERT(varchar, @ERG_COUNTER);
IF @GLOB_COUNTER = @ERG_COUNTER
SET @EXPANDED_SWITCH = 1;
ELSE
SET @EXPANDED_SWITCH = 0;
SELECT @ADDED_WHEN = MIN(CREATEDWHEN) FROM DD_ECM.dbo.TBEDMI_ITEM_VALUE WHERE REFERENCE_GUID = @EMAILMSGID;
EXEC [DD_ECM_REF].dbo.PRMOT_MON_TREEVIEW_ADD_ROW @USR_ID, NULL, @ID, 0, @ADDED_WHEN, @STRING, NULL, NULL, NULL, @EXPANDED_SWITCH;
SET @ERG_COUNTER -= 1;
SET @PID = @ID;
END
--PRINT 'PRDD_MONITORING_GET_TREEVIEW_RESULT 4'
EXEC [DD_ECM_REF].dbo.[PRMOT_MON_GET_TREEVIEW_RESULTS_PER_MESSAGEID] @EMAILMSGID, @USR_ID, @ID, @PID;
--PRINT 'PRDD_MONITORING_GET_TREEVIEW_RESULT 5'
FETCH NEXT FROM main_msgid_cursor INTO @EMAILMSGID
END
CLOSE main_msgid_cursor
DEALLOCATE main_msgid_cursor
END
ELSE
BEGIN
-- DIESE ABFRAGE IST TEUER!!!!
--PRINT 'SEARCH @EMAILMSGID IN TBEMLP_EMAIL_OUT'
DECLARE @E_SUBJ VARCHAR(256)
SET @E_SUBJ = '% '+ @SEARCH_VALUE2 +' %';
SELECT @EMAILMSGID = REFERENCE_STRING FROM DD_ECM.dbo.TBEMLP_EMAIL_OUT WHERE EMAIL_SUBJ like @E_SUBJ;
IF LEN(@EMAILMSGID) = 0 OR @EMAILMSGID IS NULL
BEGIN
-- Ohne EMail-MessageID werden keine weiteren DAten gefunden
--PRINT 'NO @EMAILMSGID FOUND'
EXEC [DD_ECM_REF].dbo.PRMOT_MON_TREEVIEW_ADD_ROW @USR_ID,NULL,@ID,@PID,NULL,'Fehlende Belegdaten ','Es wurden keine Belegdaten gefunden!','HIGHLIGHT';
RETURN
END
ELSE
BEGIN
--PRINT 'PRDD_MONITORING_GET_TREEVIEW_RESULT 6'
EXEC [DD_ECM_REF].[dbo].[PRMOT_MON_GET_TREEVIEW_RESULTS_PER_MESSAGEID] @EMAILMSGID, @USR_ID, 0, 0;
--PRINT 'PRDD_MONITORING_GET_TREEVIEW_RESULT 7'
END
END
--PRINT 'PRDD_MONITORING_GET_TREEVIEW_RESULT 8'
-- ### LAST STEP - Get all results ###
SELECT * FROM [DD_ECM_REF].dbo.MOTB_MON_TREEVIEW_RESULTS WITH (SNAPSHOT) WHERE USR_ID = @USR_ID ORDER BY GUID;
END
GO

View File

@@ -0,0 +1,249 @@
USE [DD_ECM_REF]
GO
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
-- PRMOT_MON_GET_TREEVIEW_RESULTS_SAFE (Value: STRING)
-- =================================================================
-- Msg 41317-safe Variante:
-- - wird in DD_ECM_REF erstellt/ausgefuehrt
-- - liest aus DD_ECM (nur READ)
-- - nutzt nur lokale Tabellenvariablen fuer Ergebnisaufbau
-- - kein Zugriff auf memory-optimized MOTB_MON_TREEVIEW_RESULTS
-- =================================================================
-- Copyright (c) 2026 by Digital Data GmbH
CREATE OR ALTER PROCEDURE [dbo].[PRMOT_MON_GET_TREEVIEW_RESULTS_SAFE]
@SEARCH_VALUE NVARCHAR(100),
@USR_ID INT
AS
BEGIN
SET NOCOUNT ON;
SET ARITHABORT ON;
DECLARE @MIN_SEARCH_LEN INT = 5;
DECLARE @BATCH_SIZE INT = 10;
DECLARE @ID INT = 0;
DECLARE @PID INT = 1;
DECLARE @EMAILMSGID VARCHAR(200);
DECLARE @GLOB_COUNTER INT = 0;
DECLARE @ERG_COUNTER INT = 0;
DECLARE @STRING VARCHAR(50);
DECLARE @ADDED_WHEN DATETIME;
DECLARE @EXPANDED_SWITCH SMALLINT = 1;
IF LEN(ISNULL(@SEARCH_VALUE, N'')) < @MIN_SEARCH_LEN
BEGIN
SELECT
@USR_ID AS USR_ID,
CAST(1 AS INT) AS GUID,
CAST(0 AS INT) AS PID,
CAST(NULL AS DATETIME) AS ADDED_WHEN,
CAST('Belegnummer zu kurz!' AS VARCHAR(255)) AS TITLE,
CAST(NULL AS VARCHAR(500)) AS DETAILS,
CAST(NULL AS VARCHAR(50)) AS STYLE,
CAST(0 AS SMALLINT) AS EXPANDED,
CAST(NULL AS VARCHAR(200)) AS EMAILMSGID;
RETURN;
END
DECLARE @SEARCH_VALUE2 VARCHAR(50);
SELECT @SEARCH_VALUE2 = SUBSTRING(Spalte, PATINDEX('%[^0]%', Spalte + ' '), LEN(Spalte))
FROM (SELECT CONVERT(VARCHAR(50), @SEARCH_VALUE) AS Spalte) AS t;
DECLARE @tbl TABLE
(
EMAILMSGID VARCHAR(200) NOT NULL PRIMARY KEY
);
INSERT INTO @tbl (EMAILMSGID)
SELECT DISTINCT REFERENCE_GUID
FROM DD_ECM.dbo.TBEDMI_ITEM_VALUE WITH (NOLOCK)
WHERE SPEC_NAME = 'INVOICE_NUMBER'
AND ITEM_VALUE = @SEARCH_VALUE;
INSERT INTO @tbl (EMAILMSGID)
SELECT DISTINCT h.EMAIL_MSGID
FROM DD_ECM.dbo.TBEMLP_HISTORY AS h WITH (NOLOCK)
WHERE h.EMAIL_SUBJECT LIKE '%' + TRIM(@SEARCH_VALUE2) + '%'
AND DATEDIFF(MONTH, h.EMAIL_DATE, GETDATE()) <= 6
AND h.EMAIL_FROM <> 'donotreply@wisag.de'
AND NOT EXISTS
(
SELECT 1
FROM @tbl AS t
WHERE t.EMAILMSGID = h.EMAIL_MSGID
);
DECLARE @results TABLE
(
USR_ID INT NOT NULL,
GUID INT NOT NULL,
PID INT NOT NULL,
ADDED_WHEN DATETIME NULL,
TITLE VARCHAR(255) NULL,
DETAILS VARCHAR(500) NULL,
STYLE VARCHAR(50) NULL,
EXPANDED SMALLINT NOT NULL,
EMAILMSGID VARCHAR(200) NULL
);
SELECT @GLOB_COUNTER = COUNT(*) FROM @tbl;
IF @GLOB_COUNTER >= 1
BEGIN
SET @ERG_COUNTER = @GLOB_COUNTER;
DECLARE main_msgid_cursor CURSOR LOCAL FAST_FORWARD FOR
SELECT TOP (@BATCH_SIZE) EMAILMSGID
FROM @tbl
ORDER BY EMAILMSGID;
OPEN main_msgid_cursor;
FETCH NEXT FROM main_msgid_cursor INTO @EMAILMSGID;
WHILE @@FETCH_STATUS = 0
BEGIN
SET @ID += 1;
IF @GLOB_COUNTER = 1
BEGIN
SET @PID = 0;
SET @STRING = 'Ergebnis 1';
SET @EXPANDED_SWITCH = 1;
END
ELSE
BEGIN
SET @PID = @ID;
SET @STRING = 'Ergebnis ' + CONVERT(VARCHAR(10), @ERG_COUNTER);
IF @GLOB_COUNTER = @ERG_COUNTER
SET @EXPANDED_SWITCH = 1;
ELSE
SET @EXPANDED_SWITCH = 0;
END
SELECT @ADDED_WHEN = MIN(CREATEDWHEN)
FROM DD_ECM.dbo.TBEDMI_ITEM_VALUE WITH (NOLOCK)
WHERE REFERENCE_GUID = @EMAILMSGID;
INSERT INTO @results
(
USR_ID,
GUID,
PID,
ADDED_WHEN,
TITLE,
DETAILS,
STYLE,
EXPANDED,
EMAILMSGID
)
VALUES
(
@USR_ID,
@ID,
@PID,
@ADDED_WHEN,
@STRING,
NULL,
NULL,
@EXPANDED_SWITCH,
@EMAILMSGID
);
SET @ERG_COUNTER -= 1;
FETCH NEXT FROM main_msgid_cursor INTO @EMAILMSGID;
END
CLOSE main_msgid_cursor;
DEALLOCATE main_msgid_cursor;
END
ELSE
BEGIN
DECLARE @E_SUBJ VARCHAR(256);
SET @E_SUBJ = '% ' + @SEARCH_VALUE2 + ' %';
SELECT TOP (1) @EMAILMSGID = REFERENCE_STRING
FROM DD_ECM.dbo.TBEMLP_EMAIL_OUT WITH (NOLOCK)
WHERE EMAIL_SUBJ LIKE @E_SUBJ
ORDER BY REFERENCE_STRING;
IF @EMAILMSGID IS NULL OR LEN(@EMAILMSGID) = 0
BEGIN
INSERT INTO @results
(
USR_ID,
GUID,
PID,
ADDED_WHEN,
TITLE,
DETAILS,
STYLE,
EXPANDED,
EMAILMSGID
)
VALUES
(
@USR_ID,
1,
0,
NULL,
'Fehlende Belegdaten',
'Es wurden keine Belegdaten gefunden!',
'HIGHLIGHT',
0,
NULL
);
END
ELSE
BEGIN
SELECT @ADDED_WHEN = MIN(CREATEDWHEN)
FROM DD_ECM.dbo.TBEDMI_ITEM_VALUE WITH (NOLOCK)
WHERE REFERENCE_GUID = @EMAILMSGID;
INSERT INTO @results
(
USR_ID,
GUID,
PID,
ADDED_WHEN,
TITLE,
DETAILS,
STYLE,
EXPANDED,
EMAILMSGID
)
VALUES
(
@USR_ID,
1,
0,
@ADDED_WHEN,
'Ergebnis 1',
NULL,
NULL,
1,
@EMAILMSGID
);
END
END
SELECT
USR_ID,
GUID,
PID,
ADDED_WHEN,
TITLE,
DETAILS,
STYLE,
EXPANDED,
EMAILMSGID
FROM @results
ORDER BY GUID;
END
GO

View File

@@ -0,0 +1,39 @@
## Plan: Neue transaktionssichere Treeview-Prozedur
Die neue Prozedur wird in DD_ECM_REF erstellt und ausgeführt, liest zuerst aus DD_ECM, verarbeitet die Daten vollständig lokal in temporären/klassischen Tabellen und vermeidet jede Schreiboperation auf memory-optimized Tabellen innerhalb desselben Aufrufs. Dadurch bleibt sie auch bei offener äußerer User-Transaktion lauffähig und umgeht Msg 41317. Die Ausgabe erfolgt als Resultset direkt aus lokaler Arbeitsmenge statt aus MOTB_MON_TREEVIEW_RESULTS.
**Steps**
1. Phase 1: Ist-Logik in DD_ECM_READ-Teil und REF_WRITE-Teil zerlegen, inklusive aller Stellen mit Cross-DB-Read und MOT-Zugriff. Grundlage sind die Zugriffe in [PRMOT_MON_GET_TREEVIEW_RESULTS]_ok.sql.
2. Phase 1: Neue Zielprozedur in DD_ECM_REF entwerfen, die Eingaben SEARCH_VALUE und USR_ID beibehält und die Ergebnisstruktur zur bisherigen Ausgabe kompatibel liefert. Diese Prozedur verwendet nur lokale #Temp-Tabellen für den Aufbau der Baumdaten.
3. Phase 2: Cross-DB-Vorstufe implementieren: DD_ECM-Reads ausschließlich in lokale #Temp-Tabellen laden (MessageIDs, AddedWhen und ggf. weitere Felder), bevor irgendeine weitere Verarbeitung stattfindet. Diese Phase ist nur lesend gegenüber DD_ECM.
4. Phase 2: Bestehende Cursor-/Loop-Logik auf lokale #Temp-Tabellen umstellen; Aufrufe von PRMOT_MON_TREEVIEW_ADD_ROW durch direkte Inserts in lokale Ergebnistabelle ersetzen. Abhängigkeit: Schritt 3.
5. Phase 2: Aufruf von PRMOT_MON_GET_TREEVIEW_RESULTS_PER_MESSAGEID entkoppeln. Falls diese Prozedur auf MOT schreibt, wird eine neue lokale Hilfsvariante erstellt, die nur in #Temp-Ergebnistabellen schreibt. Abhängigkeit: Schritt 4.
6. Phase 3: Finale Ausgabe ausschließlich per SELECT aus lokaler Ergebnistabelle zurückgeben, sortiert wie bisher nach GUID. Kein Zugriff auf MOTB_MON_TREEVIEW_RESULTS in der neuen Prozedur.
7. Phase 3: Vorhandene Prozedur unverändert lassen und neue Prozedur mit neuem Namen bereitstellen (zuerst Parallelbetrieb), damit Rückfallpfad vorhanden bleibt.
**Relevant files**
- [PRMOT_MON_GET_TREEVIEW_RESULTS]_ok.sql([PRMOT_MON_GET_TREEVIEW_RESULTS]_ok.sql) — Referenz für bestehende Suchlogik, Cursorfluss und Ausgabeverhalten.
- [PRMOT_MON_GET_TREEVIEW_RESULTS]_ok.sql([PRMOT_MON_GET_TREEVIEW_RESULTS]_ok.sql#L48) — aktueller MOT-DELETE-Zugriff, in neuer Prozedur zu vermeiden.
- [PRMOT_MON_GET_TREEVIEW_RESULTS]_ok.sql([PRMOT_MON_GET_TREEVIEW_RESULTS]_ok.sql#L70) — DD_ECM-Read INVOICE_NUMBER.
- [PRMOT_MON_GET_TREEVIEW_RESULTS]_ok.sql([PRMOT_MON_GET_TREEVIEW_RESULTS]_ok.sql#L74) — DD_ECM-Read HISTORY.
- [PRMOT_MON_GET_TREEVIEW_RESULTS]_ok.sql([PRMOT_MON_GET_TREEVIEW_RESULTS]_ok.sql#L125) — DD_ECM-Read CREATEDWHEN.
- [PRMOT_MON_GET_TREEVIEW_RESULTS]_ok.sql([PRMOT_MON_GET_TREEVIEW_RESULTS]_ok.sql#L135) — Abhängigkeit zu PER_MESSAGEID.
- [PRMOT_MON_GET_TREEVIEW_RESULTS]_ok.sql([PRMOT_MON_GET_TREEVIEW_RESULTS]_ok.sql#L173) — bisherige Endausgabe aus MOT-Tabelle.
**Verification**
1. Technischer Negativtest: Ausführung der neuen Prozedur innerhalb BEGIN TRAN/COMMIT bei offenem Transaktionskontext; erwartetes Ergebnis: kein Msg 41317.
2. Funktionaler Vergleichstest: identische Suchwerte mit alter und neuer Prozedur ausführen, Ergebnisanzahl und Sortierung vergleichen (mindestens 10 reale Belegnummern).
3. Randfalltest: Suche mit zu kurzer Belegnummer, keine Treffer, Treffer > BATCH_SIZE, führende Nullen in SEARCH_VALUE.
4. Parallelitätstest: gleichzeitige Aufrufe mit unterschiedlichen USR_ID; erwartetes Ergebnis: keine gegenseitige Beeinflussung.
5. Performance-Schnelltest: Laufzeitvergleich alt/neu für typische und teure Suchfälle (LIKE mit Wildcards).
**Decisions**
- Muss auch bei offener äußerer User-Transaktion laufen.
- Darf weiterhin aus DD_ECM lesen.
- Neue Prozedur wird in DD_ECM_REF gespeichert und ausgeführt.
- Zur Behebung von Msg 41317 werden MOT-Schreib-/Lesezugriffe in der neuen Prozedur vollständig vermieden.
**Further Considerations**
1. Kompatibilitätsentscheidung: Soll die alte MOTB_MON_TREEVIEW_RESULTS als Persistenzziel künftig entfallen, oder braucht ihr zusätzlich eine optionale Nachschreib-Prozedur außerhalb der offenen Transaktion?
2. Abhängigkeitsentscheidung: Falls PER_MESSAGEID zwingend benötigt wird und MOT-Zugriffe enthält, sollte eine zweite, temp-table-basierte Variante mit gleicher Fachlogik erstellt werden.
3. Betriebsentscheidung: Für den Produktivschnitt kann ein Feature-Flag sinnvoll sein, um schrittweise von alt auf neu umzuschalten.

View File

@@ -0,0 +1,116 @@
USE [DD_SYS]
GO
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
-- [PRDD_GET_DATABASE_DEADLOCK]
-- =================================================================
-- Gets db deadlock victims
-- Minimum requirement: MS SQL Server 2016
--
-- Returns: table
-- =================================================================
-- Copyright (c) 2025 by Digital Data GmbH
--
-- Digital Data GmbH • Ludwig-Rinn-Strasse 16 • D-35452 Heuchelheim
-- Tel.: 0641/202360 • E-Mail: info-flow@digitaldata.works
-- =================================================================
-- Creation Date / Author: 26.03.2025 / MK
-- Version Date / Editor: 26.03.2025 / MK
-- Version Number: 1.0.0.0
-- =================================================================
-- History:
-- 26.03.2025 / MK - First Version
CREATE OR ALTER PROCEDURE [dbo].[PRDD_GET_DATABASE_DEADLOCK](
@pKILL_DEADLOCK_SESSIONS BIT = NULL
)
AS
BEGIN
SET NOCOUNT ON;
-- declare new vars because of parameter sniffing
DECLARE @KILL_DEADLOCK_SESSIONS BIT = ISNULL(@pKILL_DEADLOCK_SESSIONS,0);
DECLARE @DEADLOCK_SESSIONS TABLE ([GUID] [INT] IDENTITY(1,1) NOT NULL,
[SessionID] [INT]) NOT NULL,
[blocking_session_id] [INT] NOT NULL,
[database_id] [INT] NOT NULL,
[blocking_statement] [NVARCHAR](MAX) NULL,
[blocked_statement] [NVARCHAR](MAX) NULL);
-- declare runtime vars
DECLARE @MyProcedureName NVARCHAR(128) = OBJECT_NAME(@@PROCID);
DECLARE @GUID BIGINT,
@SessionID INT,
@blocking_session_id INT,
@database_id INT,
@blocking_statement NVARCHAR(MAX),
@blocked_statement NVARCHAR(MAX),
@return_status NVARCHAR(50) = 0,
@return_status_text NVARCHAR(MAX) = 'START ' + @MyProcedureName + ' @ ' + CONVERT(varchar(50),GETDATE(),120);
PRINT '==============================='
PRINT 'PROCEDURE - ' + @return_status_text;
PRINT 'PARAMETER01 - @KILL_DEADLOCK_SESSIONS: ' + CONVERT(VARCHAR(1),@KILL_DEADLOCK_SESSIONS);
INSERT INTO @DEADLOCK_SESSIONS([SessionID],[blocking_session_id],[database_id],[blocking_statement],[blocked_statement])
WITH XMLNAMESPACES ('http://schemas.microsoft.com/sqlserver/2004/07/showplan' AS sp)
SELECT
[requests].[session_id],
[requests].[blocking_session_id],
[requests].[database_id],
[sql_text1].[text] AS blocking_statement,
[sql_text2].[text] AS blocked_statement
FROM [master].[sys].[dm_exec_requests] as [requests]
CROSS APPLY [master].[sys].[dm_exec_sql_text]([requests].[sql_handle]) [sql_text1]
JOIN [master].[sys].[dm_exec_connections] as [connections] ON [requests].[blocking_session_id] = [connections].[session_id]
CROSS APPLY [master].[sys].[dm_exec_sql_text]([connections].[most_recent_sql_handle]) [sql_text2]
ORDER BY [requests].[database_id] ASC;
SELECT * FROM @DEADLOCK_SESSIONS ORDER BY [SessionID];
SELECT
[database_id],
CONVERT(NVARCHAR(5), [session_id]) as 'SessionID',
CONVERT(NVARCHAR(50), [login_name]) as 'LoginName',
CONVERT(NVARCHAR(50), [host_name]) as 'HostName'
FROM [master].[sys].[dm_exec_sessions] (NOLOCK)
WHERE [is_user_process] = 1
AND [database_id] IN (SELECT DISTINCT [SessionID] FROM @DEADLOCK_SESSIONS ORDER BY [SessionID]);
--==========================================-- Create the main loop (cursor) --============================================--
IF (SELECT COUNT(*) FROM @DEADLOCK_SESSIONS > 0) AND (@KILL_DEADLOCK_SESSIONS = 1) BEGIN
DECLARE CURSOR_KILL_SESSIONS CURSOR STATIC LOCAL FOR
SELECT [SessionID] FROM @DEADLOCK_SESSIONS;
OPEN CURSOR_KILL_SESSIONS
FETCH NEXT FROM CURSOR_KILL_SESSIONS INTO @SessionID
WHILE @@FETCH_STATUS = 0 BEGIN
BEGIN
PRINT ' ';
PRINT '-------------------------------';
PRINT 'Now processing: ' + CONVERT(varchar(100),@SessionID);
KILL @SessionID
-----------------------------------------------------------------------------------------------------------------------------
END;
FETCH NEXT FROM CURSOR_KILL_SESSIONS INTO @SessionID;
END;
CLOSE CURSOR_KILL_SESSIONS;
DEALLOCATE CURSOR_KILL_SESSIONS;
END; ELSE BEGIN
PRINT '';
PRINT 'There are no deadlocks, or deadlock kill is disabled!';
END;

View File

@@ -0,0 +1,47 @@
use [DD_ECM]
go
create view [VWCUST_WINLINE_EMAIL_OUT_DD_CWLDATEN_DDVP]
as
SELECT
--[mesokey]
--,[c000]
--,[c001]
--,[c002]
--,[c003]
--,[c004]
--,[c005]
--,[c006]
--,[c007]
--,[c008]
--,[c009]
'invoice-flow@digitaldata.works' as 'E-Mail-From'
,[c010] as 'E-Mail-To'
,SUBSTRING(convert(VARCHAR(100),[c010]),(charindex('<',convert(VARCHAR(100),[c010]),0)+1),(charindex('>',convert(VARCHAR(100),[c010]),0)-(charindex('<',convert(VARCHAR(100),[c010]),0)+1))) as 'E-Mail-To_clean'
,RTRIM(LTRIM([c016])) as 'E-Mail-Subject'
,convert(date,[c012]) as 'E-Mail-Date'
--,[c013]
--,[c014]
--,[c015]
--,[c017]
--,[c018]
--,[c019]
--,[c020]
--,[c021]
--,[c022]
--,[c023]
--,[c024]
--,[c025]
--,[c026]
--,[c027]
--,[c028]
--,[c029]
--,[c030]
--,[c031]
--,[c032]
--,[c033]
--,[mesobin]
--,[mesocomp]
--,[mesoyear]
--,[ts]
FROM [DD_CWLDATEN_DDVP].[dbo].[T190]