![]() |
Re: generator richtig verwenden
Bei mir gibts (zumindest vorerst) nur Generator + Trigger. 8) Alles andere wird unnötig zu kompliziert. @Lemmy: ich weiß von Deinen SPs, aber den Sinn sehe ich nicht recht ein. :P Die Tabelle wird angelegt und dann wird Generator/Trigger definiert im IBExpert und basta. Für jede Tabelle fast derselbe als BI-Trigger. Z.B. so :
SQL-Code:
Die Spezialitäten bei FIBplus liegen eher im Mehrplatzbetrieb. Bei einigen Tabellen steht WhenGetID im DataSet auf OnNewRecord und der Generatorname ist angegeben, bei anderen nicht. Sieht fast so aus, als ob es egal wäre. Auf jeden Fall geht es momentan immer problemlos.
/* Trigger: TABLE8_BI0 */
CREATE TRIGGER TABLE8_BI0 FOR TABLE8 ACTIVE BEFORE INSERT POSITION 0 AS begin IF (NEW.ID IS NULL) THEN NEW.ID = GEN_ID (GEN_TABLE8_ID,1); end ^ |
Re: generator richtig verwenden
Zitat:
Szenario: Rechkopf + Rechpositionen Rechpositionen brauchen ID vom Rechkopf. Wenn du den Rechkopf postest weist du aber nicht was dein trigger fuer ne ID vergeben hat. Und somit mußt du die ID des Rechkopfes erst ermitteln um sie anschschließend in den Rechpositionen einzutragen. |
Re: generator richtig verwenden
Gibt es in IB ein Äquvalent zu den Package-variablen in Oracle? Also eine Variable, deren Wert sich nur in der UGA befindet.
Keine Session kann den Wert einer anderen überschreiben. Dadurch könnte man unabhängig von parallen Transaktionen anderer Sessions herausfinden, welche ID der neue DS hat. Eine IMHO eklige Lösung, aber vielleicht funktioniert es. Wenn nicht, dann warte bis IB oder FB ein Gegenstück zu RETURNING hat. :wink:
SQL-Code:
OT:
CREATE TRIGGER TABLE8_BI0 FOR TABLE8
ACTIVE BEFORE INSERT POSITION 0 AS begin IF (NEW.ID IS NULL) THEN NEW.ID = GEN_ID (GEN_TABLE8_ID,1); Shema.Package.Variable := New.ID; end @Hansa Übrigens,du verhinderst nicht, dass der User beim Öffnen der Tabelle mit einem anderen Programm irgendeinen Mist reinschreibt. Bei einem INSERT sollte also immer die PK aus der Sequence beschrieben werden:
SQL-Code:
CREATE TRIGGER TABLE8_BI0 FOR TABLE8
ACTIVE BEFORE INSERT POSITION 0 AS begin NEW.ID = GEN_ID (GEN_TABLE8_ID,1); end |
Re: generator richtig verwenden
Für so was gibt es auch Before Update Trigger. Aber ich denke mal, zuerst soll hier das konkrete Problem gelöst werden.
|
Re: generator richtig verwenden
Hi,
Zitat:
@hansa: Wie willst denn Du an die ID des eben gespeicherten Datensatzes kommen? Da gibt es imho nur 3 Möglichkeiten: 1. Über ne Eigenschaft der Komponente (GeneratorField,...) 2. Über ne Stored Procedure (eine die den Insert erledigt) 3. Direkte Abfrage des Generators Andere Möglichkeiten gibts nicht! Nur bei bestimmten Tabellen wenn es noch weitere eindeutige Spalten in der Tabelle gibt, kannst Du nach dem Insert die ID mit ner Abfrage holen, aber wie oft kommt das vor? @Robert: Was ist die UGA? Mir ist aber auch nichts bekannt, dass es "globale" Variablen gibt. Grüße Lemmy |
Re: generator richtig verwenden
Zitat:
|
Re: generator richtig verwenden
UGA = User Global Area
SGA = Shared Global Area Package variablen in Oracle legen ihre Werte in der UGA ab, also kann die Variable für jede Session einen anderen Wert haben. Deshalb meine Frage, ob es ein Gegenstück davon in IB gibt. @Hansa Ein Trigger, der bei BEFORE UPDATE feuert, sollte eigentlich nur die :New.PK auf :Old.PK setzen. Ein Trigger, der die PK erzeugt sollte immer eine PK aus der Sequence (Generator oder wie das auch immer in IB heißt ;) ) ziehen. Nicht nur bei :New.PK is null . |
Re: generator richtig verwenden
Zitat:
Du legst ne neue Adresse an. Diese wird in der DB gespeichert. Jetzt musst Du aber noch in weiteren Referenztabellen Einträge mit der ID der Adresse einfügen! Oder was machst Du, wenn der User den eben eingefügten Datensatz in der Detailansicht sehen will. Dazu brauchst Du immer die ID der eben eingefügten Daten. Grüße Lemmy |
Re: generator richtig verwenden
Wenn das bei 100 Records pro Sek. funktioniert, ja Kruzifix, wo liegt denn da der Haken ? Ich habe jetzt folgendes gemacht : 1. neuen Artikel angelegt. 2. neue Warengruppe und diese gespeichert. 3. dem neuen Artikel diese Warengruppe (also die ID der Warengruppe) zugeordnet und gespeichert. Programm beendet und neu gestartet. Alles war wie gewollt. 8)
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 22:35 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz