So, das Problem läßt sich am besten folgendermaßen lösen. Eine Stored Procedure ist in diesem Fall besser geeignet (ein Trigger ist zu eifrig) :
SQL-Code:
CREATE PROCEDURE RECNRSP
RETURNS (
RECNR INTEGER)
AS
BEGIN
EXIT;
END^
SET TERM ^ ;
ALTER PROCEDURE RECNRSP
RETURNS (
RECNR INTEGER)
AS
DECLARE VARIABLE NEUERECNR INTEGER;
begin
NEUERECNR = -1;
SELECT NR FROM RECNR INTO :NEUERECNR;
IF (NEUERECNR < 0) THEN BEGIN
INSERT INTO RECNR (NR) VALUES (1);
RECNR = 1;
END
ELSE BEGIN
UPDATE RECNR SET NR = NR + 1;
RECNR = NEUERECNR + 1;
END
suspend;
end
In Delphi habe ich nun noch diese Funktion, die die Rechn.Nr. zurückgibt:
Delphi-Quellcode:
function SucheNr : integer;
begin
EingMod.RecNrSP.ExecProc;
SucheNr := EingMod.RecNrSP.FieldByName ['RECNR'].AsInteger;
end;
Die Table RECNR enthält wirklich nur ein einziges integer Feld NR ! Kein Primary Key, sonst nichts. Mit obiger Konstruktion wird sie auch immer nur ein Feld beinhalten. Der Trick ist nicht schlecht. So kann man nämlich eine Unterscheidung, ob INSERT / UPDATE notwendig ist auf die Datenbank verlagern. Das Verfahren mit der lokalen Variablen läßt sich so auf alle Tabellen übertragen