Index: /trunk/import/alkis-functions.sql
===================================================================
--- /trunk/import/alkis-functions.sql	(revision 420)
+++ /trunk/import/alkis-functions.sql	(revision 421)
@@ -32,4 +32,8 @@
 -- 2014-09-23  FJ: Korrektur "delete_feature_kill()":
 --             Die neue Hist-Version vereinfachen (endet nicht benÃ¶tigt) und zum LÃ¶schen umbauen.
+
+-- 2019-07-26  FJ: "delete_feature_kill" ÃŒberarbeitet.
+--             Der Sonderfall "ModellschwÃ€che ausgleichen" im ibR-ALKIS wird behandelt: replace fÃŒr bereits vorhandene Objekte ignorieren.
+--             16stellig Feature-IDs werden nicht mehr erwartet.
 
 -- Table/View/Sequence lÃ¶schen, wenn vorhanden
@@ -548,48 +552,35 @@
 
 
--- Version ab 2014-09-23 (PostNAS 0.8)
--- Abwandlung der Hist-Version als Kill-Version.
--- Die "gml_id" muss in der Datenbank das Format character(16) haben.
--- Dies kann auch Abgabeart 3100 verarbeiten. Historische Objekte werden aber sofort entfernt.
+-- "Kill-Trigger"
+-- Historische Objekte werden sofort entfernt und nicht auf "endet" gesetzt.
+-- Dies kann auch Abgabeart 3100 verarbeiten. 
 CREATE OR REPLACE FUNCTION delete_feature_kill() RETURNS TRIGGER AS $$
 DECLARE
 	n INTEGER;
-	vbeginnt TEXT;
-	replgml TEXT;
-	featgml TEXT;
+	featgml TEXT;  -- vorderer Teil von featureid: gml_id ohne Zeit
+	vbeginnt TEXT; -- hinterer Teil von featureid: beginnt-Zeit
 	s TEXT;
 BEGIN
-	-- Version 2014-09-23, replace fÃŒhrt auch zum LÃ¶schen des VorgÃ€ngerobjektes
+	-- Trigger-Version 2019-07-22 kompatibel zu "NBA-ModellschwÃ€che ausgleichen" (ibR)
 	NEW.context := coalesce(lower(NEW.context),'delete');
 
 	IF NEW.anlass IS NULL THEN
-		NEW.anlass := '';
-	END IF;
-	featgml := substr(NEW.featureid, 1, 16); -- gml_id ohne Timestamp
-
-	IF length(NEW.featureid)=32 THEN
-		-- beginnt-Zeit der zu lÃ¶schenden Vorgaenger-Version des Objektes
-		vbeginnt := substr(NEW.featureid, 17, 4) || '-'
-			|| substr(NEW.featureid, 21, 2) || '-'
-			|| substr(NEW.featureid, 23, 2) || 'T'
-			|| substr(NEW.featureid, 26, 2) || ':'
-			|| substr(NEW.featureid, 28, 2) || ':'
-			|| substr(NEW.featureid, 30, 2) || 'Z' ;
-	ELSIF length(NEW.featureid)=16 THEN
-		-- Ãltestes nicht gelÃ¶schtes Objekt
-		EXECUTE 'SELECT min(beginnt) FROM ' || NEW.typename
-			|| ' WHERE gml_id=''' || featgml || '''' || ' AND endet IS NULL'
-			INTO vbeginnt;
-
-		IF vbeginnt IS NULL THEN
-			RAISE EXCEPTION '%: Keinen Kandidaten zum LÃ¶schen gefunden.', NEW.featureid;
-		END IF;
-	ELSE
-		RAISE EXCEPTION '%: Identifikator gescheitert.', NEW.featureid;
-	END IF;
-
-	IF NEW.context='delete' THEN
-	ELSIF NEW.context='update' THEN
-	ELSIF NEW.context='replace' THEN
+		NEW.anlass := ARRAY[]::varchar[];
+	END IF;
+	IF length(NEW.featureid)<>32 THEN
+		RAISE EXCEPTION '%: Identifikator gescheitert. Falsche Laenge.', NEW.featureid;
+	END IF;
+
+	featgml := substr(NEW.featureid, 1, 16);
+
+	-- beginnt-Zeit der zu lÃ¶schenden VorgÃ€nger-Version des Objektes
+	vbeginnt := substr(NEW.featureid, 17, 4) || '-'
+	|| substr(NEW.featureid, 21, 2) || '-'
+	|| substr(NEW.featureid, 23, 2) || 'T'
+	|| substr(NEW.featureid, 26, 2) || ':'
+	|| substr(NEW.featureid, 28, 2) || ':'
+	|| substr(NEW.featureid, 30, 2) || 'Z';
+
+	IF NEW.context='replace' THEN
 		NEW.safetoignore := lower(NEW.safetoignore);
 		IF NEW.safetoignore IS NULL THEN
@@ -598,19 +589,41 @@
 			RAISE EXCEPTION '%: safeToIgnore ''%'' ungÃŒltig (''true'' oder ''false'' erwartet).', NEW.featureid, NEW.safetoignore;
 		END IF;
+
+		IF NEW.replacedby=NEW.featureid THEN
+		--	RAISE NOTICE '%: Replace fuer identisches Objekt ausgelassen. Sonderfall Modellschwaeche.', NEW.featureid;
+			NEW.ignored := true;
+		--	1. Fall: Die NBA-ModellschwÃ€che wurde erfolgreich ausgeglichen. Dies Objekt fehlte bisher, es gibt daher keinen VorgÃ€nger. 
+		--	2. Fall: Der Insert wurde zuvor von der Datenbank abgelehnt (Unique-Constraint: gml_id, beginnt). Der Delete wÃŒrde daher die EINZIGE Version lÃ¶schen, nicht den VorgÃ€nger.
+		--	safetoignore ist false, trotzdem ignorieren
+		ELSE
+			-- VorgÃ€nger-ALKIS-Objekt lÃ¶schen
+			s := 'DELETE FROM ' || NEW.typename || ' WHERE gml_id=''' || featgml || ''' AND beginnt=''' || vbeginnt || '''' ;
+			EXECUTE s;
+			GET DIAGNOSTICS n = ROW_COUNT;
+			IF n=1 THEN
+				NEW.ignored := false;
+			ELSE
+				RAISE NOTICE '%: % schlug fehl ignoriert [%]', NEW.featureid, NEW.context, n;
+				NEW.ignored := true;
+			END IF;
+		END IF;
+
+	ELSIF NEW.context IN ('delete', 'update') THEN
+
+		-- VorgÃ€nger-ALKIS-Objekt lÃ¶schen
+		s := 'DELETE FROM ' || NEW.typename || ' WHERE gml_id=''' || featgml || ''' AND beginnt=''' || vbeginnt || '''' ;
+		EXECUTE s;
+		GET DIAGNOSTICS n = ROW_COUNT;
+		IF n=1 THEN
+			NEW.ignored := false;
+		ELSE
+			RAISE NOTICE '%: % schlug fehl ignoriert [%]', NEW.featureid, NEW.context, n;
+			NEW.ignored := true;
+		END IF;
+
 	ELSE
 		RAISE EXCEPTION '%: UngÃŒltiger Kontext % (''delete'', ''replace'' oder ''update'' erwartet).', NEW.featureid, NEW.context;
 	END IF;
 
-	-- Vorgaenger ALKIS-Objekt Loeschen
-	s := 'DELETE FROM ' || NEW.typename || ' WHERE gml_id=''' || featgml || ''' AND beginnt=''' || vbeginnt || '''' ;
-	EXECUTE s;
-	GET DIAGNOSTICS n = ROW_COUNT;
-	-- RAISE NOTICE 'SQL[%]:%', n, s;
-	IF n<>1 THEN
-		RAISE EXCEPTION '%: % schlug fehl [%]', NEW.featureid, NEW.context, n;
-		-- dieser Satz kommt nicht in die delete-Tabelle?
-	END IF;
-
-	NEW.ignored := false;
 	RETURN NEW;
 END;
