Autor Beitrag
Steamboat Willi
Hält's aus hier
Beiträge: 11



BeitragVerfasst: Fr 29.12.17 15:11 
Nachdem es mir endlich gelungen war, den Trigger ohne Fehlermeldung zu implementieren, stellt sich jetzte das Problem, das geänderte Feld in die Tabelle zu überführen. In einem Delphi-Buch, das schon etwas älter ist, wurde die Query-Komponente angewandt. Ich müßte ev. die TIB-Komponente verwenden. Wenn ja, wie lautet die Abfrage? Kann mir da jemand helfen bzw. Lektüre nennen? Der Trigger lautet:
ausblenden SQL-Anweisung
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
SET TERM ; ;
CREATE TRIGGER SET_NUMMER
FOR BASISDATEN
ACTIVE
BEFORE INSERT
POSITION 0
AS
BEGIN
  IF (NEW.NUMMER is NULLTHEN NEW.NUMMER = GEN_ID(GEN_NUMMER, 1);
END
SET TERM ; ;


Moderiert von user profile iconChristian S.: SQL-Tags hinzugefügt
Christian S.
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Chefentwickler
Beiträge: 20416
Erhaltene Danke: 2233

Win 10
C# (VS 2017)
BeitragVerfasst: Fr 29.12.17 15:18 
Hallo und :welcome:!

user profile iconSteamboat Willi hat folgendes geschrieben Zum zitierten Posting springen:
Nachdem es mir endlich gelungen war, den Trigger ohne Fehlermeldung zu implementieren, stellt sich jetzte das Problem, das geänderte Feld in die Tabelle zu überführen.
Das liest sich so, als müssten wir wissen, worum es geht. Tun wir aber nicht :D Erkläre doch erst einmal, was überhaupt gemacht werden soll :zwinker:

Grüße
Christian

_________________
Zwei Worte werden Dir im Leben viele Türen öffnen - "ziehen" und "drücken".
Steamboat Willi Threadstarter
Hält's aus hier
Beiträge: 11



BeitragVerfasst: Fr 29.12.17 16:35 
Ich suche nach einer Möglichkeit, das zu inkrementierende Feld auf auf der Delphi-Oberfläche anzeigen und weiterverarbeiten kann.
mandras
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 403
Erhaltene Danke: 97

Win 7
D6 Prof, XE2 Prof
BeitragVerfasst: So 31.12.17 02:48 
user profile iconSteamboat Willi hat folgendes geschrieben Zum zitierten Posting springen:
Ich suche nach einer Möglichkeit, das zu inkrementierende Feld auf auf der Delphi-Oberfläche anzeigen und weiterverarbeiten kann.


Dies ist eine ungenaue Beschreibung unter der ich mir nichts sinnvolles vorstellen kann.

Den Wert den der Trigger in die DB schreibt wirst Du erst sehen können wenn Du den Datensatz nachträglich neu abrufst.

Um gleich damit arbeiten zu können (also quasi bevor der neue Datensatz geschrieben wird) schaue einmal nach
(ich weiß ja nicht welche Komponenten Du nutzt - IBX, FireDac oder was sonst?)
unter der Property "Generator" einer Table bzw. Query.
Das läuft dann nämlich so, daß Delphi bei Interbase bei der Anlage eines neuen Datensatzes nach einem
neuen Genarator-Wert nachfragt und den dann in das betr. Feld einträgt, so daß
Du dann diesen Wert problemlos nutzen kannst.
Steamboat Willi Threadstarter
Hält's aus hier
Beiträge: 11



BeitragVerfasst: Di 02.01.18 14:41 
Ich benutze die Komponenten IBDataBase, IBTransaction, IBDataSet, DataSource und DBGrid. Das Programm läuft damit. Nur der Trigger läuft noch nicht. Da ich mit IB so gut wie keine Erfahrung habe, benötige ich folgende Informationen:
-Reichen die angeführten Komponenten und müssen sie nur entsprechend konfiguriert werden und wenn ja, wie?
-Oder muß noch eine weitere Komponente hinzugefügt werden, und wenn ja, wie muß sie konfiguriert werden?
Die entsprechenden SQL-Scripts (Tabelle, Generator und Trigger) existieren bereits.
mandras
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 403
Erhaltene Danke: 97

Win 7
D6 Prof, XE2 Prof
BeitragVerfasst: Di 02.01.18 22:10 
Es gibt ja mehrere Möglichkeiten mit den Generatoren zu arbeiten nur leider keine ideale.

Bei Dir besteht folgendes Problem:
Der Trigger weist einen Autoinc zu sobald der DB-Client (hier also Dein Delphi-Programm) einen neuen Satz anlegt.
Dieser Wert wird in die DB-Tabelle geschrieben aber nicht automatisch an das Delphi-Programm übermittelt.

Du müßtest also nach dem "POST" den Datensatz nochmal abrufen was aber ja schwierig ist da Du dessen Nummer nicht kennst - die willst Du ja ermitteln.

Ich keine Deine speziellen Anforderungen nicht,
am einfachsten dürfte aber folgendes sein:

Laß alles wie es ist aber stelle in Deinem IBDataSet folgendes ein:

Property GeneratorField definieren indem Du auf die drei Punkte rechts dort klickst, dann
bei "Generator" den GEN_NUMMER auswählen (wenn Du den nicht zur Auswahl hast wei ggf. die IDE gerade die IBDatabase noch nicht verbunden hat
gib den Generatornamen einfach von Hand ins Feld ein.
Danach in "Feld" das DB-Feld "Nummer" wählen und bei "Erhöhen um" den Wert 1, das ganze soll aktiv sein bei "On New Record".

Das bewirkt folgendes:
Wenn Du im Delphi-Programm einen neuen Record anlegst holt Delphi selbst sich einen neuen Generatorwert, bevor überhaupt der Trigger anspringt.

Diesen Generatorwert merkt es sich, !zeigt den dann aber auch an! und schreibt ihn dann beim Post auch in den Record.
Wenn dann der Datensatz an die DB geschickt wird (beim POST des Datensatzess) wird zwar der Trigger noch aufgerufen,
der merkt aber daß da schon ein Wert in "Nummer" steht und deshalb erzeugt er selber keinen neuen Wert.

So hast Du einerseits einen Wert für das Feld "Nummer" im Delphi-Programm,
andererseits hast Du ja auch noch Deinen Trigger der dann immer einspringt wenn zB anderweitig ein Insert in die Tabelle erfolgt
ohne daß das Client-Programm einen Feldwert vorgibt.
Steamboat Willi Threadstarter
Hält's aus hier
Beiträge: 11



BeitragVerfasst: Mi 03.01.18 18:36 
Kaum macht man's richtig, schon geht's.

vielen Dank! ...bis zur nächsten Frage
Steamboat Willi Threadstarter
Hält's aus hier
Beiträge: 11



BeitragVerfasst: Mi 03.01.18 22:22 
Ich muß nochmal nachhaken wegen Interbase. Aufgrund eines Schreibfehlers mußte ich die Datenbank neu erzeugen. Es taucht wieder der gleiche Fehler auf: Das Database-Tool nimmt den Trigger nicht an und reagiert mit der Fehlermeldung "unexpected end of command". Ich verwende zur Zeit Database Tour Version 9.03.51. Kann mir jemand ein anderes Tool nennen?
mandras
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 403
Erhaltene Danke: 97

Win 7
D6 Prof, XE2 Prof
BeitragVerfasst: Fr 05.01.18 00:23 
versuch es mal am Anfang mit

SET TERM ^ ;

und am Ende mit

END^

SET TERM ; ^

Warum verwendest Du nicht die IBConsole - die ist ja für Interbase gedacht, Interbase gibt es als testlizenz bei der das volle IBConsole dabei ist.
Ansonsten - eher für Firebird gedacht - nimm Flamerobin.