Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Datenbanken (https://www.delphipraxis.net/15-datenbanken/)
-   -   Delphi Wert von LastAutoinc kann nicht ausgelesen werden (https://www.delphipraxis.net/157999-wert-von-lastautoinc-kann-nicht-ausgelesen-werden.html)

Sinspin 1. Feb 2011 21:20

Datenbank: ADS • Version: 10.1 • Zugriff über: SQL

Wert von LastAutoinc kann nicht ausgelesen werden
 
Hallo,

ich stehe malwieder vor einem kleinen Rätsel.
Fügt man in eine Tabelle via INSERT INTO einen neuen Datensatz ein bekommt man ja leider von dem Aufruf nicht mitgeteilt wie der Wert des Autoinc Feldes in der Tabelle lautet. Ich kann also nach dem einfügen den Datensatz nicht anfassen und ihn bearbeiten.
Um doch an die Id (AutoInc) des Datensatzes zu kommen gibt es theoretisch die Scalare Funktion "LastAutoinc" die man direkt nach dem Insert aufruft und die Id geliefert bekommt.
Theoretisch deshalb, weil ich bisher keine Möglichkeit gefunden habe den Wert in eine Variable zu bekommen mit der ich dann munter weiter arbeiten kann.

Was funktioniert:
Im ARC in einem Query Editor (SQL Utility) :
SQL-Code:
SELECT LastAutoInc(Statement) FROM system.iota
Schön dabei ist, das man als Tabelle angeben kann welche man auch immer lustig ist, man bekommt immer den zuletzt geänderten AutoInc Wert geliefert.
Als Result sieht man unten die Tabelle mit dem Wert. Aber dann ist es leider auch schon vorbei mit Schön.

Will ich den Wert nun in einem Script verwenden oder gleich damit einen Datensatz ansaugen mag mich ADS nicht mehr. (und ich es sachte auch nicht mehr)
Varianten die ich in einer Stored Procedure schon durchprobiert habe, immer mit dem Ergebnis das NULL geliefert wird:
(Falls ich hier eine Variante vergessen haben sollte, liegt das daran dass ich mehrmals meinen Rechner aus dem Fenster geschmissen habe und dann immer alles neu schreiben musste)
SQL-Code:
CREATE PROCEDURE GetLastId
//ALTER PROCEDURE GetLastId
(
  LastId Integer OUTPUT
)
BEGIN
  DECLARE LAI Cursor;
  DECLARE LastId integer;

  INSERT INTO Toepfe (TopfType) VALUES ('Large');

  OPEN LAI AS SELECT LastAutoinc(Statement) AS LId FROM system.iota;
  FETCH LAI;
  INSERT INTO __OUTPUT VALUES (LAI.LId); // NULL
  LastId = LAI.LId; NULL
  LastId = (SELECT LastAutoinc(Statement) AS Mid FROM system.iota); // NULL
  LastId = LastAutoinc(Statement); // NULL
  // alles mit Toepfe anstatt system.iota // <-- NULL

  CLOSE LAI;
END;
Egal wie oft ich das Spielchen Spiele, ausführen im Query Editor geht. SP ausführen oder Einzelschritt Durchlauf geht nicht (liefert NULL).

Ich denke mal das ich auf genau die eine, richtige Variante, nicht gekommen bin und hoffe daher mal das sich jemand findet der mir meine Nase darauf drückt.

Vielen Dank im Vorraus.

€: - Nachtrag -
Dies funktioniert und liefert mir den eingefügten Datensatz.
SQL-Code:
SELECT * FROM Toepfe WHERE Id = LastAutoinc(Statement);
Es bleibt aber weiterhin die Frage bestehen warum es nicht möglich ist den Wert von LastAutoinc in eine Integer Variable zu schreiben um damit weiter arbeiten zu können.
€2: CODE durch CODE=SQL Tags ersetzt und was gelernt.

joachimd 2. Feb 2011 10:02

AW: Wert von LastAutoinc kann nicht ausgelesen werden
 
SQL-Code:
CREATE PROCEDURE GetLastId
//ALTER PROCEDURE GetLastId
(
  LId Integer OUTPUT
)
BEGIN
  DECLARE LAI Cursor;
  DECLARE LastId integer;

  INSERT INTO mytable (s) VALUES ('Large');

  OPEN LAI AS SELECT LastAutoinc(Statement) AS LId FROM system.iota;
  FETCH LAI;
  INSERT INTO __OUTPUT VALUES (LAI.LId); // NULL
  LastId = LAI.LId;
  INSERT INTO __OUTPUT VALUES (LastId); // NULL
  LastId = (SELECT LastAutoInc(Statement) AS Mid FROM system.iota); // NULL
  INSERT INTO __OUTPUT VALUES (LastId); // NULL
  SELECT * FROM mytable WHERE Id = LastAutoInc(Statement); // NULL
  LastId = LastAutoInc(Statement); // NULL
  INSERT INTO __OUTPUT VALUES (LastId); // NULL
  // alles mit Toepfe anstatt system.iota // <-- NULL
  CLOSE LAI;
END;
Meine Tabelle heisst mytable und ich musste den LastId Parameter umbenennen, da es eine Variable mit demselben Namen im Script gibt. Bei mir (ARc 10.10.0.0 mit ADS 10.10.0.0) funktioniert das obige hervorragend!?

Sinspin 2. Feb 2011 19:34

AW: Wert von LastAutoinc kann nicht ausgelesen werden
 
Hallo Joachim,

Danke für Deine Antwort. Es ist wie immer, man sollte sich nicht auf das verlassen was man glaubt, sondern auf das was man geprüft hat. Neuer ARC, neuer Server und nocheinmal die gleichen Tests, die wie es so oft ist, auch erst gehen wenn einem der Kollege über die Schulter schaut.

Nunja, also bin ich jetzt real bei 10.10.0.0 angekommen, und schon sind die Probleme erstmal weg und auch der ARC benimmt sich nicht mehr ganz so abartig.

Nochmal Tausend Dank für Dein Mühe.


Alle Zeitangaben in WEZ +1. Es ist jetzt 12:31 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz