Trigger-Fehler im Insert

oberh

Neuer Benutzer
Beiträge
3
Guten Morgen!

Irgendwie finde ich den Fehler im Insert nicht ... bin hier aber auch absoluter Laie ...

CREATE TRIGGER TR_PK_Hoehenpunkt_before_insert
BEFORE INSERT ON PK_Hoehenpunkt
BEGIN
INSERT INTO PK_Hoehenpunkt(EDatum, Aktenzeichen) VALUES(strftime('%d.%m.%Y','now'), (SELECT Aktenzeichen FROM Aktenzeichen_662));
END

Bevor ein neuer Datensatz in der Tabelle PK_Hoehenpunkt eingefügt wird, sollen zwei Dinge passieren:
1. Das aktuelle Datum soll in das Feld EDatum geschrieben werden und ...
2. aus der Tabelle Aktenzeichen_662 soll das Feld Aktenzeichen ausgelesen werden und in das Feld Aktenzeichen in PK_Hoehenpunkt geschrieben werden.

Der Trigger wird im DBBrowser akzeptiert, doch in der Software Geograf, wenn ich einen neuen Punkt erstelle, wird mir die Fehlermeldung:

Code=80004005 Unbekannter Fehler Insert
Source=
Description=

ausgegeben.

Könnt Ihr mir hier bitte weiter helfen?

LG
Olaf
 
Werbung:
SELECT Aktenzeichen FROM Aktenzeichen_662

Das liefert die Werte von "Aktenzeichen" aller Datensätze aus der Tabelle. Das können also hunderte oder tausende Werte sein. An der Stelle ist aber nur genau ein Wert zulässig. Du benötigst also eine WHERE Bedingung die das auf genau einen Datensatz einschränkt.
 
Vielen Dank!

Wie würdest Du dies denn lösen?

Habe mal ein weiteres Feld in Aktenzeichen_662 erzeugt und dort einen Wert hineingeschriegen für die Where-Klausel. Doch selbst ein SELECT DISTINCT könnte ja theoretisch wieder Datensatzanzahl > 1 hergeben. Der Fehler bleibt also der Gleiche ...

In Aktenzeichen_662 soll immer nur ein DS stehen.
 
Ich weiß nicht genau, wie SQLite das umsetzt aber vermutlich gibt es eine Tabelle new die du innerhalb des Triggers abfragen kannst. In der steht der Datensatz und nur der Datensatz, der zuletzt neu angelegt oder verändert wurde. Daher solltest du dich unbedingt auf diese System-Tabelle beziehen, nicht auf die Orginal-Tabelle.

Wenn der Wert nicht in der Tabelle "PK_Hoehenpunkt" steht, dann musst du die Quell-Tabelle "Aktenzeichen_662" mit "PK_Hoehenpunkt" joinen. Beide Tabellennamen lassen aber böses erahnen, was dein Datenmodell angeht...

Wenn in einem Update-Statement mehr als ein Datensatz verändert wird kann das zu ungewollten Problemen führen. Erstmal steht dann in new (oder in der gejointen Tabelle) eventuell mehr als ein Aktenzeichen, du müsstest also mehrere Aktenzeichen einfügen oder bekommst den selben Fehler wieder. Eventuell willst du auch mehrere Aktenzeichen loggen. Dafür gibt es dann z.B. FOR EACH ROW
Kann aber auch sein, das es anders geht. In MSSQL, was ich gut kenne, gibt es das FOR EACH ROW nämlich nicht...
 
Guten Morgen und vielen Dank!

Bevor ich Eure Anregungen teste, hier erst einmal die Erläuterung, was geplant ist.
Wir haben ein CAD, dessen Zeichnungselemente mit Sachdaten in einer db3 verknüpft sind. Bei allen geht es dabei um ein Aktenzeichen und das Erfassungsdatum. Bei Bäumen z.B. wird dann noch erfasst Stammumfang, Kronendurchmesser, Anzahl Stämme etc.
Damit überhaupt jedes Zeichnungselement Sachdaten erhält, gibt es im CAD einen Schalter, der es erlaubt, beim Anlegen des Zeichnungselementes einen Datensatz in der entsprechenden Tabelle anzulegen. Dies löst dann den Trigger aus, den ich hier als Beispiel gebracht habe.
Dabei soll das aktuelle Datum eingetragen werden und ein Aktenzeichen, welches der User nur einmalig vor Beginn der Arbeiten in Aktenzeichen_662 einträgt.
Unnabhängig davon: verwendest Du für jeden "Code" (=662) eine eigene Tabelle mit genau einem Datensatz? Das wäre ein sehr schlechtes Datenmodell.
Unabhängig davon: verwendest Du für jeden "Code" (=662) eine eigene Tabelle mit genau einem Datensatz? Das wäre ein sehr schlechtes Datenmodell.
Nein, für alle Zeichnungselemente mit ihren Tabellen (ca. 100) nutze ich nur eine Tabelle Aktenzeichen_662!

Die Benamsung der Tabellen rührt her aus einem GIS, welches ich selbst nicht erzeugt habe. Letztlich ist sie aber egal ...
Habe früher Datenbanken in Access programmiert ... doch lang, lang ist´s her mit dem SQL ... ca. 15 Jahre ...
 
Werbung:
Eigentlich ist das drum herum egal wenn es wirklich nur eine Tabelle betrifft, auch wenn die einen merkwürdigen Namen trägt. Das, was du suchst, ist ja eigentlich nur ein Trigger der jedes neue Aktenzeichen in der Tabelle Aktenzeichen_662 und einen Zeitstempel dazu loggt oder ggf. irgendwo hin schreibt. Dazu schau dir einfach mal einen kleinen Guide an:
Auch wenn eventuell immer nur ein Datensatz gleichzeitig in Aktenzeichen_662 geschrieben wird, so sollte man, wie ich finde, immer einen sauberen Trigger schreiben. Der würde dann die Systemtabelle "new" abfragen, welche Aktenzeichen alle neu sind. Und darauf basierend dann neue Datensätze in eine andere Tabelle schreiben.
 
Zurück
Oben