Index: trunk/data/konvert/postnas_0.7/alkis-functions.sql
===================================================================
--- trunk/data/konvert/postnas_0.7/alkis-functions.sql	(revision 209)
+++ trunk/data/konvert/postnas_0.7/alkis-functions.sql	(revision 210)
@@ -273,14 +273,45 @@
 CREATE OR REPLACE FUNCTION delete_feature_hist() RETURNS TRIGGER AS $$
 DECLARE
-	sql TEXT;
-	gml_id TEXT;
+	s TEXT;
+	alt_id TEXT;
+	neu_id TEXT;
+	beginnt TEXT;
 	endete TEXT;
 	n INTEGER;
 BEGIN
 	NEW.context := lower(NEW.context);
-	gml_id      := substr(NEW.featureid, 1, 16);
-
 	IF NEW.context IS NULL THEN
 		NEW.context := 'delete';
+	END IF;
+
+	-- TIMESTAMP weder in gml_id noch identifier verlÃ€Ãlich.
+	-- also ggf. aus Datenbank holen
+
+	IF length(NEW.featureid)=32 THEN
+		alt_id  := substr(NEW.featureid, 1, 16);
+
+		IF NEW.featureid<>NEW.replacedBy THEN
+			-- Beginnt-Datum aus Timestamp
+			beginnt := 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'
+				;
+		END IF;
+	ELSIF length(NEW.featureid)=16 THEN
+		alt_id  := NEW.featureid;
+	ELSE
+		RAISE EXCEPTION '%: LÃ€nge 16 oder 32 statt % erwartet.', NEW.featureid, length(NEW.featureid);
+	END IF;
+
+	IF beginnt IS NULL THEN
+		-- Beginnt-Datum des Ã€ltesten Eintrag, der nicht untergegangen ist
+		-- => der Satz dessen 'endet' gesetzt werden muÃ
+		EXECUTE 'SELECT min(beginnt) FROM ' || NEW.typename
+			|| ' WHERE gml_id=''' || alt_id || ''''
+			|| ' AND endet IS NULL'
+			INTO beginnt;
 	END IF;
 
@@ -297,40 +328,31 @@
 		END IF;
 
-		IF NEW.replacedBy IS NULL OR length(NEW.replacedBy)<16 THEN
-			IF NEW.safetoignore = 'true' THEN
-				RAISE NOTICE '%: Nachfolger ''%'' nicht richtig gesetzt - ignoriert', NEW.featureid, NEW.replacedBy;
-				NEW.ignored := true;
-				RETURN NEW;
-			ELSE
-				RAISE EXCEPTION '%: Nachfolger ''%'' nicht richtig gesetzt - Abbruch', NEW.featureid, NEW.replacedBy;
+		IF length(NEW.replacedBy)=32 THEN
+			-- Beginnt-Datum aus Timestamp
+			neu_id := substr(NEW.replacedBy, 1, 16);
+
+			IF NEW.featureid<>NEW.replacedBy THEN
+				endete  := substr(NEW.replacedBy, 17, 4) || '-'
+					|| substr(NEW.replacedBy, 21, 2) || '-'
+					|| substr(NEW.replacedBy, 23, 2) || 'T'
+					|| substr(NEW.replacedBy, 26, 2) || ':'
+					|| substr(NEW.replacedBy, 28, 2) || ':'
+					|| substr(NEW.replacedBy, 30, 2) || 'Z'
+					;
 			END IF;
-		END IF;
-
-		IF length(NEW.replacedBy)=16 THEN
-			EXECUTE 'SELECT beginnt FROM ' || NEW.typename ||
-			        ' WHERE gml_id=''' || NEW.replacedBy || ''' AND endet IS NULL' ||
-				' ORDER BY beginnt DESC LIMIT 1'
-                           INTO endete;
-		ELSE
-			-- replaceBy mit Timestamp
-			EXECUTE 'SELECT beginnt FROM ' || NEW.typename ||
-			        ' WHERE identifier=''urn:adv:oid:' || NEW.replacedBy || ''''
-			   INTO endete;
-			IF endete IS NULL THEN
-				EXECUTE 'SELECT beginnt FROM ' || NEW.typename ||
-					' WHERE gml_id=''' || substr(NEW.replacedBy,1,16) || ''' AND endet IS NULL' ||
-					' ORDER BY beginnt DESC LIMIT 1'
-				   INTO endete;
-			END IF;
+		ELSIF length(NEW.replacedBy)=16 THEN
+			neu_id  := NEW.replacedBy;
+		ELSIF length(NEW.replacedBy)<>16 THEN
+			RAISE EXCEPTION '%: LÃ€nge 16 oder 32 statt % erwartet.', NEW.replacedBy, length(NEW.replacedBy);
 		END IF;
 
 		IF endete IS NULL THEN
-			IF NEW.safetoignore = 'true' THEN
-				RAISE NOTICE '%: Nachfolger % nicht gefunden - ignoriert', NEW.featureid, NEW.replacedBy;
-				NEW.ignored := true;
-				RETURN NEW;
-			ELSE
-				RAISE EXCEPTION '%: Nachfolger % nicht gefunden', NEW.featureid, NEW.replacedBy;
-			END IF;
+			-- Beginnt-Datum des neuesten Eintrag, der nicht untergegangen ist
+			-- => Enddatum fÃŒr vorherigen Satz
+			EXECUTE 'SELECT max(beginnt) FROM ' || NEW.typename
+				|| ' WHERE gml_id=''' || neu_id || ''''
+				|| ' AND beginnt>''' || beginnt || ''''
+				|| ' AND endet IS NULL'
+				INTO endete;
 		END IF;
 	ELSE
@@ -338,20 +360,49 @@
 	END IF;
 
-	sql	:= 'UPDATE ' || NEW.typename
-		|| ' SET endet=''' || endete || ''''
-		|| ' WHERE gml_id=''' || gml_id || ''''
-		|| ' AND endet IS NULL'
-		|| ' AND beginnt<''' || endete || '''';
-	-- RAISE NOTICE 'SQL: %', sql;
-	EXECUTE sql;
+	IF alt_id<>neu_id THEN
+		RAISE NOTICE 'Objekt % wird durch Objekt % ersetzt.', alt_id, neu_id;
+	END IF;
+
+	IF beginnt IS NULL THEN
+		RAISE NOTICE 'Kein Beginndatum fuer Objekt % gefunden.', alt_id;
+	END IF;
+
+	IF endete IS NULL THEN
+		RAISE NOTICE 'Kein Beginndatum fuer Objekt % gefunden.', neu_id;
+	END IF;
+
+	IF beginnt IS NULL OR endete IS NULL OR beginnt=endete THEN
+		RAISE EXCEPTION 'Objekt % wird durch Objekt % ersetzt (leere Lebensdauer?).', alt_id, neu_id;
+	END IF;
+
+	s   := 'UPDATE ' || NEW.typename
+	    || ' SET endet=''' || endete || ''''
+	    || ' WHERE gml_id=''' || alt_id || ''''
+	    || ' AND beginnt=''' || beginnt || ''''
+	    || ' AND endet IS NULL';
+	EXECUTE s;
 	GET DIAGNOSTICS n = ROW_COUNT;
 	IF n<>1 THEN
-		RAISE NOTICE 'SQL: %', sql;
+		RAISE NOTICE 'SQL: %', s;
 		IF NEW.context = 'delete' OR NEW.safetoignore = 'true' THEN
-			RAISE NOTICE '%: Untergangsdatum von % Objekten statt nur einem auf % gesetzt - ignoriert', NEW.featureid, n, endete;
+			RAISE NOTICE '%: Untergangsdatum von % Objekten statt einem auf % gesetzt - ignoriert', NEW.featureid, n, endete;
+			NEW.ignored := true;
+			RETURN NEW;
+		ELSIF n=0 THEN
+			EXECUTE 'SELECT endet FROM ' || NEW.typename ||
+				' WHERE gml_id=''' || alt_id || '''' ||
+				' AND beginnt=''' || beginnt || ''''
+				INTO endete;
+
+			IF NOT endete IS NULL THEN
+				RAISE NOTICE '%: Objekte bereits % ungegegangen - ignoriert', NEW.featureid, endete;
+			ELSE
+				RAISE NOTICE '%: Objekt nicht gefunden - ignoriert', NEW.featureid;
+			END IF;
+
 			NEW.ignored := true;
 			RETURN NEW;
 		ELSE
-			RAISE EXCEPTION '%: Untergangsdatum von % Objekten statt nur einem auf % gesetzt - Abbruch', NEW.featureid, n, endete;
+			RAISE EXCEPTION '%: Untergangsdatum von % Objekten statt einem auf % gesetzt - Abbruch', NEW.featureid, n, endete;
 		END IF;
 	END IF;
Index: trunk/data/konvert/postnas_0.7/alkis-trigger-hist.sql
===================================================================
--- trunk/data/konvert/postnas_0.7/alkis-trigger-hist.sql	(revision 209)
+++ trunk/data/konvert/postnas_0.7/alkis-trigger-hist.sql	(revision 210)
@@ -5,5 +5,5 @@
 
 CREATE TRIGGER insert_beziehung_trigger
-        AFTER INSERT ON alkis_beziehungen
-        FOR EACH ROW
-        EXECUTE PROCEDURE alkis_beziehung_inserted();
+	AFTER INSERT ON alkis_beziehungen
+	FOR EACH ROW
+	EXECUTE PROCEDURE alkis_beziehung_inserted();
Index: trunk/data/konvert/postnas_0.7/alkis-trigger-hist-oracle.sql
===================================================================
--- trunk/data/konvert/postnas_0.7/alkis-trigger-hist-oracle.sql	(revision 209)
+++ trunk/data/konvert/postnas_0.7/alkis-trigger-hist-oracle.sql	(revision 210)
@@ -47,5 +47,7 @@
 DECLARE
 	s varchar2(2047);
-	gml_id varchar2(13);
+	alt_id varchar2(16);
+	neu_id varchar2(16);
+	beginnt varchar2(20);
 	endete varchar2(20);
 	n INTEGER;
@@ -53,12 +55,41 @@
 	:NEW.typename := upper(substr(:NEW.typename, 1, 30));
 	:NEW.context  := lower(:NEW.context);
-	gml_id        := substr(:NEW.featureid, 1, 16);
-
 	IF :NEW.context IS NULL THEN
 		:NEW.context := 'delete';
 	END IF;
 
+	-- TIMESTAMP weder in gml_id noch identifier verlÃ€Ãlich.
+	-- also ggf. aus Datenbank holen
+
+	IF length(:NEW.featureid)=32 THEN
+		alt_id  := substr(:NEW.featureid, 1, 16);
+
+		IF :NEW.featureid<>:NEW.replacedBy THEN
+			-- Beginnt-Datum aus Timestamp
+			beginnt := 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'
+				;
+		END IF;
+	ELSIF length(:NEW.featureid)=16 THEN
+		alt_id := :NEW.featureid;
+	ELSE
+		raise_application_error(-20100, :NEW.featureid || ': LÃ€nge 16 oder 32 statt ' || length(:NEW.featureid) || ' erwartet.');
+	END IF;
+
+	IF beginnt IS NULL THEN
+		-- Beginnt-Datum des Ã€ltesten Eintrag, der nicht untergegangen ist
+		-- => der Satz dessen 'endet' gesetzt werden muÃ
+		EXECUTE IMMEDIATE 'SELECT min(beginnt) FROM ' || :NEW.typename
+			|| ' WHERE gml_id=''' || alt_id || ''''
+			|| ' AND endet IS NULL'
+			INTO beginnt;
+	END IF;
+
 	IF :NEW.context='delete' THEN
-		SELECT to_char(sysdate, 'UTC','YYYY-MM-DD"T"HH24:MI:SS"Z"') INTO endete FROM dual;
+		SELECT to_char(sysdate, 'YYYY-MM-DD"T"HH24:MI:SS"Z"') INTO endete FROM dual;
 
 	ELSIF :NEW.context='replace' THEN
@@ -71,38 +102,31 @@
 		END IF;
 
-		IF :NEW.replacedBy IS NULL OR length(:NEW.replacedBy)<16 THEN
-			IF :NEW.safetoignore = 'true' THEN
-				dbms_output.put_line( :NEW.featureid || ': Nachfolger ''' || :NEW.replacedBy || ''' nicht richtig gesetzt - ignoriert' );
-				:NEW.ignored := 'true';
-				RETURN;
-			ELSE
-				raise_application_error(-20100, :NEW.featureid || ': Nachfolger ''' || :NEW.replacedBy || ''' nicht richtig gesetzt - Abbruch');
+		IF length(:NEW.replacedBy)=32 THEN
+			-- Beginnt-Datum aus Timestamp
+			neu_id := substr(:NEW.replacedBy, 1, 16);
+
+			IF :NEW.featureid<>:NEW.replacedBy THEN
+				endete  := substr(:NEW.replacedBy, 17, 4) || '-'
+					|| substr(:NEW.replacedBy, 21, 2) || '-'
+					|| substr(:NEW.replacedBy, 23, 2) || 'T'
+					|| substr(:NEW.replacedBy, 26, 2) || ':'
+					|| substr(:NEW.replacedBy, 28, 2) || ':'
+					|| substr(:NEW.replacedBy, 30, 2) || 'Z'
+					;
 			END IF;
-		END IF;
-
-		IF length(:NEW.replacedBy)=16 THEN
-			EXECUTE IMMEDIATE 'SELECT MAX(beginnt) FROM ' || :NEW.typename ||
-			        ' WHERE gml_id=''' || :NEW.replacedBy || ''' AND endet IS NULL'
-                           INTO endete;
-		ELSE
-			-- replaceBy mit Timestamp
-			EXECUTE IMMEDIATE 'SELECT beginnt FROM ' || :NEW.typename ||
-			        ' WHERE identifier=''urn:adv:oid:' || :NEW.replacedBy || ''''
-			   INTO endete;
-			IF endete IS NULL THEN
-				EXECUTE IMMEDIATE 'SELECT MAX(beginnt) FROM ' || :NEW.typename ||
-					' WHERE gml_id=''' || substr(:NEW.replacedBy,1,16) || ''' AND endet IS NULL'
-				   INTO endete;
-                       END IF;
+		ELSIF length(:NEW.replacedBy)=16 THEN
+			neu_id  := :NEW.replacedBy;
+		ELSIF length(:NEW.replacedBy)<>16 THEN
+			raise_application_error(-20100, :NEW.replacedBy || ': LÃ€nge 16 oder 32 statt ' || length(:NEW.replacedBy) || ' erwartet.');
 		END IF;
 
 		IF endete IS NULL THEN
-			IF :NEW.safetoignore = 'true' THEN
-				dbms_output.put_line(:NEW.featureid || ': Nachfolger ''' || :NEW.replacedBy || ''' nicht gefunden - ignoriert');
-				:NEW.ignored := 'true';
-				RETURN;
-			ELSE
-				raise_application_error(-20100, :NEW.featureid || ': Nachfolger ''' || :NEW.replacedBy || ''' nicht gefunden - Abbruch');
-			END IF;
+			-- Beginnt-Datum des neuesten Eintrag, der nicht untergegangen ist
+			-- => Enddatum fÃŒr vorherigen Satz
+			EXECUTE IMMEDIATE 'SELECT max(beginnt) FROM ' || :NEW.typename
+				|| ' WHERE gml_id=''' || neu_id || ''''
+				|| ' AND beginnt>''' || beginnt || ''''
+				|| ' AND endet IS NULL'
+				INTO endete;
 		END IF;
 	ELSE
@@ -110,9 +134,25 @@
 	END IF;
 
-	s	:= 'UPDATE ' || :NEW.typename
-		|| ' SET endet=''' || endete || ''''
-		|| ' WHERE gml_id=''' || gml_id || ''''
-		|| ' AND endet IS NULL'
-		|| ' AND beginnt<''' || endete || '''';
+	IF alt_id<>neu_id THEN
+		dbms_output.put_line('Objekt ' || alt_id || ' wird durch Objekt ' || neu_id || ' ersetzt.');
+	END IF;
+
+	IF beginnt IS NULL THEN
+		dbms_output.put_line('Kein Beginndatum fuer Objekt ' || alt_id || '.');
+	END IF;
+
+	IF endete IS NULL THEN
+		dbms_output.put_line('Kein Beginndatum fuer Objekt ' || neu_id || '.');
+	END IF;
+
+	IF beginnt IS NULL OR endete IS NULL OR beginnt=endete THEN
+		raise_application_error(-20100, 'Objekt ' || alt_id || ' wird durch Objekt ' || neu_id || ' ersetzt (leere Lebensdauer?).');
+	END IF;
+
+	s   := 'UPDATE ' || :NEW.typename
+	    || ' SET endet=''' || endete || ''''
+	    || ' WHERE gml_id=''' || alt_id || ''''
+	    || ' AND beginnt=''' || beginnt || ''''
+	    || ' AND endet IS NULL';
 	EXECUTE IMMEDIATE s;
 	n := SQL%ROWCOUNT;
Index: trunk/data/konvert/postnas_0.7/alkis_PostNAS_0.7_schema.sql
===================================================================
--- trunk/data/konvert/postnas_0.7/alkis_PostNAS_0.7_schema.sql	(revision 209)
+++ trunk/data/konvert/postnas_0.7/alkis_PostNAS_0.7_schema.sql	(revision 210)
@@ -4418,9 +4418,4 @@
 -- Digitales Gelaendemodell50  = DGM50
 
-
--- wenn schon, dann auch alle Tabellen mit Kommentaren versehen:
-COMMENT ON TABLE geometry_columns IS 'Metatabelle der Geometrie-Tabellen, Tabellen ohne Geometrie bekommen Dummy-Eintrag fÃŒr PostNAS-Konverter (GDAL/OGR)';
-COMMENT ON TABLE spatial_ref_sys  IS 'Koordinatensysteme und ihre Projektionssparameter';
-
 -- Schema aktualisieren (setzt auch die Indizes neu)
 -- SELECT alkis_update_schema();
