Index: trunk/import/sichten.sql
===================================================================
--- trunk/import/sichten.sql	(revision 337)
+++ trunk/import/sichten.sql	(revision 338)
@@ -1069,7 +1069,8 @@
 -- Abgabeart 3100, Trigger "delete_feature_hist()".
 -- NICHT anzuwenden bei Abgabeart 1000
+-- Siehe auch: FUNCTION "alkis_hist_check()" in Datei "alkis-functions.sql"
 
 -- Erst mal die betroffenen Objekte identifizieren
-CREATE OR REPLACE VIEW fehlersuche_hist_mehrere_vorgaenger_fs
+CREATE OR REPLACE VIEW hist_mehrere_vorgaenger_fs
 AS 
   SELECT substring(gml_id,1,16) AS gml, count(beginnt) AS anzahl -- 16stellige kurze ID, oder Substring
@@ -1081,5 +1082,5 @@
 -- bis zu 7 Versionen je FS gefunden
 
-COMMENT ON VIEW fehlersuche_hist_mehrere_vorgaenger_fs
+COMMENT ON VIEW hist_mehrere_vorgaenger_fs
  IS 'ALKIS-FlurstÃŒcke suchen, zu denen es inzwischen mehrere Versionen gibt, 
 also mehrere inzwischen beendete (historische) VorgÃ€nger-Versionen';
@@ -1093,5 +1094,5 @@
   SELECT substring(gml_id,1,16) AS gml, ogc_fid, beginnt, endet
   FROM ax_flurstueck f
-  JOIN fehlersuche_hist_mehrere_vorgaenger_fs v -- der vorhergehende View als Filter
+  JOIN hist_mehrere_vorgaenger_fs v -- der vorhergehende View als Filter
     ON substring(f.gml_id,1,16) = v.gml
   ORDER BY substring(gml_id,1,16), ogc_fid;
Index: trunk/import/von_hist_nach_kill.sql
===================================================================
--- trunk/import/von_hist_nach_kill.sql	(revision 338)
+++ trunk/import/von_hist_nach_kill.sql	(revision 338)
@@ -0,0 +1,31 @@
+
+-- ALKIS PostNAS 0.8
+
+-- Eine Datenbank
+-- .. wurde bisher mit HIST-Trigger geladen.
+-- Historische Objekte werden aber gar nicht benötigt.
+-- Darum umwandeln auf Kill-Trigger für die weiteren Konvertierungen.
+-- Umgekehrt geht das nicht!
+
+-- Stand 
+--  2014-09-23 PostNAS 0.8
+
+
+-- Historische Objekte aus allen Objekt-Tabellen entfernen
+
+   SELECT alkis_delete_all_endet();
+
+
+-- Trigger umschalten
+-- Die Trigger-Function "delete_feature_kill()" sollte in "alkis-functions.sql" angelegt worden sein,
+-- wurde aber bisher nicht benutzt.
+
+DROP TRIGGER delete_feature_trigger;
+
+CREATE TRIGGER delete_feature_trigger
+	BEFORE INSERT ON delete
+	FOR EACH ROW
+	EXECUTE PROCEDURE delete_feature_kill();
+
+
+-- Jetzt Ausführen von Vacuum sinnvoll
Index: trunk/import/alkis-functions.sql
===================================================================
--- trunk/import/alkis-functions.sql	(revision 337)
+++ trunk/import/alkis-functions.sql	(revision 338)
@@ -30,4 +30,6 @@
 --             mehrerer VorgÃ€nger- und Nachfolger-Objekte mit und ohne "endet IS NULL" geben.
 
+-- 2014-09-23  FJ: Korrektur "delete_feature_kill()":
+--             Die neue Hist-Version vereinfachen (endet nicht benÃ¶tigt) und zum LÃ¶schen umbauen.
 
 -- Table/View/Sequence lÃ¶schen, wenn vorhanden
@@ -380,4 +382,5 @@
 -- context='replace'       => "endet" des ersetzten auf "beginnt" des neuen Objekts setzen
 -- context='update'        => "endet" auf ÃŒbergebene Zeit setzen und "anlass" festhalten
+-- Die "gml_id" muss in der Datenbank das Format character(16) haben.
 CREATE OR REPLACE FUNCTION delete_feature_hist() RETURNS TRIGGER AS $$
 DECLARE
@@ -503,12 +506,13 @@
 
 
--- 2014-09-04: Version 0.8 ohne "alkis_beziehungen"-Tabelle
+-- Version PostNAS 0.8 ohne "alkis_beziehungen"-Tabelle
 -- Unterschied von "delete_feature_kill" zur Version "delete_feature_hist":
---  Historisch gewordene Objekte werden nicht auf "endet" gesetzt sondern ganz aus der Datenbank gelÃ¶scht.
--- Achtung: Wenn diese Funktion mit dem "delete_feature_trigger" der Tabelle "delete" verknÃŒpft ist,
--- dann dÃŒrfen nur NAS-NBA-Daten verarbeitet werden, die mit der Abgabeart 1000 erzeugt wurden.
--- Wenn Daten der Abgabeart 3100 verarbeitet werden kommen update-Anweisungen in den Daten vor, 
--- die dieser Trigger nicht verarbeiten kann.
-CREATE OR REPLACE FUNCTION delete_feature_kill() RETURNS TRIGGER AS $$
+--  Historisch gewordene Objekte werden nicht auf "endet" gesetzt sondern sofort aus der Datenbank gelÃ¶scht.
+
+-- Version von 2014-09-04 bis 2014-09-23
+-- Ohne Tabelle "alkis_beziehungen".
+-- Die gml_id kann in der Datenbenk das Format "character varying" haben (angehÃ€ngte Beginn-Zeit).
+-- Diese Version kennt den NAS-Kontext "update" nicht und kann daher nur die Abgabeart 1000 verarbeiten.
+CREATE OR REPLACE FUNCTION delete_feature_kill_abg1000() RETURNS TRIGGER AS $$
 DECLARE
 	begsql TEXT;
@@ -516,4 +520,5 @@
 	gml_id TEXT;
 BEGIN
+	-- Alte Version, die nur die Abgabeart 1000 (ohne replace) verarbeiten kann.
 	NEW.typename := lower(NEW.typename); -- Objektart=Tabellen-Name
 	NEW.context := lower(NEW.context);   -- Operation 'delete'/'replace'/'update'
@@ -524,5 +529,4 @@
 	END IF;
 	IF NEW.context='delete' THEN -- LÃ¶schen des Objektes
-          -- In der Objekt-Tabelle
 		EXECUTE 'DELETE FROM ' || NEW.typename || ' WHERE gml_id like ''' || gml_id || '%''';
 		--RAISE NOTICE 'LÃ¶sche gml_id % in %', gml_id, NEW.typename;
@@ -530,4 +534,5 @@
 
 		-- beginnt-Wert des aktuellen Objektes ermitteln
+		-- besser ?   WHERE substring(gml_id,1,16) = ''' || gml_id || '''
 		begsql := 'SELECT max(beginnt) FROM ' || NEW.typename || ' WHERE gml_id like ''' || substr(NEW.replacedBy, 1, 16) || '%'' AND endet IS NULL';
 		EXECUTE begsql INTO aktbeg;
@@ -535,5 +540,74 @@
 		-- Alte Objekte entfernen
 		EXECUTE 'DELETE FROM ' || NEW.typename || ' WHERE gml_id like ''' || gml_id || '%'' AND beginnt < ''' || aktbeg || '''';
-
+	END IF;
+
+	NEW.ignored := false;
+	RETURN NEW;
+END;
+$$ LANGUAGE plpgsql;
+
+
+-- 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.
+CREATE OR REPLACE FUNCTION delete_feature_kill() RETURNS TRIGGER AS $$
+DECLARE
+	n INTEGER;
+	vbeginnt TEXT;
+	replgml TEXT;
+	featgml TEXT;
+	s TEXT;
+BEGIN
+	-- Version 2014-09-23, replace fÃŒhrt auch zum LÃ¶schen des VorgÃ€ngerobjektes
+	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.safetoignore := lower(NEW.safetoignore);
+		IF NEW.safetoignore IS NULL THEN
+			RAISE EXCEPTION '%: safeToIgnore nicht gesetzt.', NEW.featureid;
+		ELSIF NEW.safetoignore<>'true' AND NEW.safetoignore<>'false' THEN
+			RAISE EXCEPTION '%: safeToIgnore ''%'' ungÃŒltig (''true'' oder ''false'' erwartet).', NEW.featureid, NEW.safetoignore;
+		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;
 
@@ -591,2 +665,42 @@
 END;
 $$ LANGUAGE plpgsql;
+
+
+-- 2014-09-22 Kopie aus Norbit-Github
+-- Funktioniert nicht wenn SchlÃŒsseltabellen mit "ax_" beginnen wie die Objekt-Tabellen.
+-- Darin wird dann z.B. die Splate "endet" gesucht.
+-- ToDo: besseres Namens-Schema fÃŒr Tabellen.
+--   z.B. Umbenennen "ax_buchungsstelle_buchungsart" -> "v_bs_buchungsart"
+CREATE OR REPLACE FUNCTION alkis_hist_check() RETURNS varchar AS $$
+DECLARE
+	c RECORD;
+	n INTEGER;
+	r VARCHAR;
+BEGIN
+	FOR c IN SELECT table_name FROM information_schema.tables WHERE table_schema='public' AND substr(table_name,1,3) IN ('ax_','ap_','ks_') AND table_type='BASE TABLE'
+	LOOP
+		EXECUTE 'SELECT count(*) FROM ' || c.table_name || ' WHERE endet IS NULL GROUP BY gml_id HAVING count(*)>1' INTO n;
+		IF n>1 THEN
+			r := coalesce(r||E'\n','') || c.table_name || ': ' || n || ' Objekte, die in mehreren Versionen nicht beendet sind.';
+		END IF;
+
+		EXECUTE 'SELECT count(*) FROM ' || c.table_name || ' WHERE beginnt>=endet' INTO n;
+		IF n>1 THEN
+			r := coalesce(r||E'\n','') || c.table_name || ': ' || n || ' Objekte mit ungÃŒltiger Lebensdauer.';
+		END IF;
+
+		EXECUTE 'SELECT count(*)'
+			|| ' FROM ' || c.table_name || ' a'
+			|| ' JOIN ' || c.table_name || ' b ON a.gml_id=b.gml_id AND a.ogc_fid<>b.ogc_fid AND a.beginnt<b.endet AND a.endet>b.beginnt'
+			INTO n;
+		IF n>0 THEN
+			r := coalesce(r||E'\n','') || c.table_name || ': ' || n || ' LebensdauerÃŒberschneidungen.';
+		END IF;
+	END LOOP;
+
+	RETURN r;
+END;
+$$ LANGUAGE plpgsql;
+
+-- Aufruf: SELECT alkis_hist_check();
+
Index: trunk/import/alkis_PostNAS_keytables.sql
===================================================================
--- trunk/import/alkis_PostNAS_keytables.sql	(revision 337)
+++ trunk/import/alkis_PostNAS_keytables.sql	(revision 338)
@@ -24,6 +24,9 @@
 --                   ax_sonstigesrecht_artdf, ax_anderefestlegungnachwasserrecht_artdf
 --  2013-04-17  F.J. Kurzbezeichnungen der BodenschÃ€ttung fÃŒr die Kartendarstellung
-
---	2014-01-24	F.J. "Eigentuemerart" entschchlÃŒsseln
+--  2014-01-24	 F.J. "Eigentuemerart" entschchlÃŒsseln
+
+-- ToDo: Der Prefix "ax_" sollte Objekt-Tabellen des ALKIS-Namenschemas vorbehalten sein.
+--   Diese Hilfstabellen fÃŒr VerschlÃŒsselungen sollten dagegen einen anderen Prefix bekommen.
+--   Dadurch kÃ¶nnen Functions die Objekttabellen am Namen erkennen.
 
   SET client_encoding = 'UTF8';
Index: trunk/import/konv_batch.sh
===================================================================
--- trunk/import/konv_batch.sh	(revision 337)
+++ trunk/import/konv_batch.sh	(revision 338)
@@ -40,4 +40,9 @@
 ##   2014-09-11 F.J. krz: Eintrag in import-Tabelle repariert.
 ##                   Keine Abfrage des Symlinks auf kill/hist. Enstscheidend ist die aktuelle DB, nicht der Symlink
+##   2014-09-23 F.J. krz: ZÃ€hlung der Funktionen in delete, dies in import-Tabelle eintragen (Metadaten)
+
+## ToDo: 
+## - Unterscheidung e/a noch sinnvoll? Immer "a" = Aktualisierung = -update ?
+## - PostProcessing: Aufruf Script, sonst redundant zu pflegen
 
 POSTNAS_HOME=$(dirname $0)
@@ -131,6 +136,6 @@
   psql $con -c 'TRUNCATE table "delete";'
 
-  echo "Bisherige Konvertierungen (Import-Tabelle):"
-  psql $con -c "SELECT * FROM import;"
+  #echo "Bisherige Konvertierungen (Import-Tabelle):"
+  #psql $con -c "SELECT * FROM import ORDER by id;"
 
 # Import Eintrag erzeugen
@@ -173,4 +178,21 @@
   echo "** Ende Konvertierung Ordner ${ORDNER}"
 
+  # Durch EinfÃŒgen in Tabelle 'delete' werden LÃ¶schungen und Aktualisierungen anderer Tabellen getriggert
+  echo "** Die delete-Tabelle enthaelt so viele Zeilen:"
+  psql $con -c 'SELECT COUNT(featureid) AS delete_zeilen FROM "delete";'
+
+  echo "** aufgeteilt auf diese Funktionen:"
+  psql $con -c 'SELECT context, COUNT(featureid) AS anzahl FROM "delete" GROUP BY context ORDER BY context;' 
+
+  # Kontext-Funktionen zÃ€hlen und dei Anzahl als Metadaten zum aktuellen Konvertierungslauf speichern
+  psql $con -c "
+   UPDATE import SET anz_delete=(SELECT count(*) FROM \"delete\" WHERE context='delete') 
+   WHERE id=(SELECT max(id) FROM import) AND verzeichnis='${ORDNER}' AND anz_delete IS NULL;
+   UPDATE import SET anz_update=(SELECT count(*) FROM \"delete\" WHERE context='update') 
+   WHERE id=(SELECT max(id) FROM import) AND verzeichnis='${ORDNER}' AND anz_update IS NULL;
+   UPDATE import SET anz_replace=(SELECT count(*) FROM \"delete\" WHERE context='replace') 
+   WHERE id=(SELECT max(id) FROM import) AND verzeichnis='${ORDNER}' AND anz_replace IS NULL;" 
+   # ignored = true auswerten, ggf. warnen ?
+
 #
 # Post-Processing / Nacharbeiten
@@ -183,5 +205,4 @@
 
   else
-
     echo "** Post-Processing (Nacharbeiten zur Konvertierung)"
 
@@ -189,6 +210,4 @@
     (cd $POSTNAS_HOME; psql $con -f nutzungsart_laden.sql)
  
-    echo "-----------" 
- 
     echo "** - Fluren, Gemarkungen, Gemeinden und StraÃen-Namen neu Laden (Script pp_laden.sql):"
     (cd $POSTNAS_HOME; psql $con -f pp_laden.sql)
@@ -196,14 +215,11 @@
   fi
 
-  # Durch EinfÃŒgen in Tabelle 'delete' werden LÃ¶schungen und Aktualisierungen anderer Tabellen getriggert
-  echo "** Die delete-Tabelle enthaelt:"
-  psql $con -c 'SELECT COUNT(featureid) AS delete_zeilen FROM "delete";'
-
-  #echo "   delete-Tabelle loeschen:"
-  #psql $con -c 'TRUNCATE table "delete";'
-
-  # AufrÃ€umen der historischen Objekte -- besser voirher als nachher. Analyse fÃŒr Trigger-Entwicklung
-#  echo "** geendete Objekte entfernen:"
-#  psql $con -c "SELECT alkis_delete_all_endet();"
+  # AufrÃ€umen der historischen Objekte -- besser vorher als nachher. Analyse fÃŒr Trigger-Entwicklung
+
+ #echo "   delete-Tabelle loeschen:"
+ #psql $con -c 'TRUNCATE table "delete";'
+
+ #echo "** geendete Objekte entfernen:"
+ #psql $con -c "SELECT alkis_delete_all_endet();"
 
   echo "Das Fehler-Protokoll wurde ausgegeben in die Datei $errprot"
Index: trunk/import/alkis_PostNAS_schema.sql
===================================================================
--- trunk/import/alkis_PostNAS_schema.sql	(revision 337)
+++ trunk/import/alkis_PostNAS_schema.sql	(revision 338)
@@ -58,4 +58,6 @@
 --               Aktuell: "gml_id character(16) NOT NULL"
 
+-- 2014-09-23 FJ ZÃ€hlfelder fÃŒr Kontext-Funktionen in der import-Tabelle
+
 --  Dies Schema kann NICHT mehr mit der gdal-Version 1.9 verwendet werden.
 
@@ -92,6 +94,10 @@
 
 -- Importtabelle fÃŒr Verarbeitungs-ZÃ€hler.
--- Wird benÃ¶tigt fÃŒr den Trigger zur Pflege der "alkis_beziehungen" (Version "Unna").
--- Kann mit "alkis_beziehungen" entfallen, wenn alle Views und Programm umgestellt sind auf interne Relationen.
+-- Wurde ursprÃŒnglich eingefÃŒhrt fÃŒr den Trigger zur Pflege der "alkis_beziehungen".
+-- Ist seit Version PostNAS 0.8 nur noch eine Metadaten-Tabelle zum Aktualisierungs-Verlauf einer Datenbank.
+-- FÃŒr die Funktion von Konverter oder Auskunft-Programmen ist diese Tabelle nicht notwendig.
+-- Das Script "konv_batch.sh" aktualisiert diese Tabelle.
+-- Wenn dies Script verwendet wird, ist die import-Tabelle nÃŒtzlich um nachzuschauen,
+-- wann welcher Ordner mit Daten in diese Datenbank konvertiert wurde.
 CREATE TABLE import (
   id serial NOT NULL,
@@ -99,4 +105,7 @@
   verzeichnis text,
   importart text,
+  anz_delete integer,
+  anz_update integer,
+  anz_replace integer,
   CONSTRAINT import_pk PRIMARY KEY (id)
 );
@@ -109,4 +118,9 @@
 COMMENT ON COLUMN import.verzeichnis IS 'Ort von dem die NAS-Dateien verarbeitet wurden.';
 COMMENT ON COLUMN import.importart   IS 'Modus des Konverter-Laufes: e="Erstladen" oder a="NBA-Aktualisierung"';
+
+COMMENT ON COLUMN import.anz_delete  IS 'Anzahl von delete-Funktionen in der delete-Tabelle nach Ende eines Konvertierungs-Laufes';
+COMMENT ON COLUMN import.anz_update  IS 'Anzahl von update-Funktionen in der delete-Tabelle nach Ende eines Konvertierungs-Laufes';
+COMMENT ON COLUMN import.anz_replace IS 'Anzahl von replace-Funktionen in der delete-Tabelle nach Ende eines Konvertierungs-Laufes';
+
 
 -- Tabelle "delete" fÃŒr LÃ¶sch- und FortfÃŒhrungsdatensÃ€tze.
