Delphi-PRAXiS
Seite 2 von 3     12 3      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Datenbanken (https://www.delphipraxis.net/15-datenbanken/)
-   -   Delphi Auto-Insertwert abfragen (https://www.delphipraxis.net/121619-auto-insertwert-abfragen.html)

emsländer 1. Okt 2008 13:53

Re: Auto-Insertwert abfragen
 
Zitat:

Zitat von DeddyH
Und wenn Du in der Funktion eine eigene lokale Query erzeugst?

Wie meinst Du das?

Gruss

EL

DeddyH 1. Okt 2008 13:55

Re: Auto-Insertwert abfragen
 
Delphi-Quellcode:
function LastIdentity : integer;
begin
    with TADOQuery.Create do begin //hier
        connection := mus_Service.ADOConnMUS;
        try
           sql.Text := 'Select Scope_Identity() as id';
           open;
           if not(FielByName('id').IsNull) then
              result := FieldByName('id').asInteger;
           else
              result := 0;
           Close;          
        finally
          Free;
       end;
    end;
end ;

emsländer 1. Okt 2008 14:01

Re: Auto-Insertwert abfragen
 
Zitat:

Zitat von DeddyH
Delphi-Quellcode:
function LastIdentity : integer;
          if not(FieldByName('id').IsNull) then  
              result := FieldByName('id').asInteger;
           else
              result := 0;  <====== Bedingung landet immer hier


DeddyH 1. Okt 2008 14:04

Re: Auto-Insertwert abfragen
 
Und mit @@IDENTITY statt Scope_Identity()? Aber ich möchte Jelly nicht in den Rücken fallen.

emsländer 1. Okt 2008 14:19

Re: Auto-Insertwert abfragen
 
Zitat:

Zitat von DeddyH
Und mit @@IDENTITY statt Scope_Identity()? Aber ich möchte Jelly nicht in den Rücken fallen.

Gibts denn nichts, was die ganze ADO-Automatik da vorgibt?

Gruss

EL

nahpets 1. Okt 2008 14:22

Re: Auto-Insertwert abfragen
 
Hallo,
SQL-Code:
Select Scope_Identity() as id
scheint erst dann einen Wert ungleich Null zu liefern, wenn mindestens ein Datensatz in der Tabelle ist. Liegt da eventuell das Problem?

Stephan

emsländer 1. Okt 2008 14:24

Re: Auto-Insertwert abfragen
 
Zitat:

Zitat von nahpets
Hallo,
SQL-Code:
Select Scope_Identity() as id
scheint erst dann einen Wert ungleich Null zu liefern, wenn mindestens ein Datensatz in der Tabelle ist. Liegt da eventuell das Problem?

Stephan


nein - auch bei mehreren (im Moment 12 in der Testumgebung) Datensätzen immer 0

Gruss

EL

nahpets 1. Okt 2008 14:31

Re: Auto-Insertwert abfragen
 
Hallo,

Frage: Auch wenn Du die Abfrage im Management Studio machst?
Wenn da ein anderes Ergebnis kommt, als im Programm, geht Dir "unterwegs" der Scope verloren, was ich nicht ausschließen möchte.

Was liefert Dir denn
SQL-Code:
select IDENT_CURRENT('Akten') as ID
der holt wohl den höchsten vergebenen Wert zur ID-Spalte, der als Parameter übergebenen Tabelle.

Stephan

emsländer 1. Okt 2008 14:51

Re: Auto-Insertwert abfragen
 
Zitat:

Zitat von nahpets
Hallo,

Frage: Auch wenn Du die Abfrage im Management Studio machst?
Wenn da ein anderes Ergebnis kommt, als im Programm, geht Dir "unterwegs" der Scope verloren, was ich nicht ausschließen möchte.

Was liefert Dir denn
SQL-Code:
select IDENT_CURRENT('Akten') as ID
der holt wohl den höchsten vergebenen Wert zur ID-Spalte, der als Parameter übergebenen Tabelle.

Stephan

ich habe mir jetzt einen Workaround gebaut:


zunächst habe ich der Table ein Feld "neu" mit automatischen Inhalt 1 (nur 1, kein Increment) hinzugefügt. Obenauf einen Index drauf, damit die Suche ggfs. schneller geht.
Somit hat immer genau der neue Datensatz neu=1.
hier die Abfrage mit sofortiger Änderung neu=0;
Delphi-Quellcode:
function getaktennr : integer;
  var _stmp : string;
  _query : Tadoquery;
begin
  _stmp := 'select neu, Aktennr from Akten where neu=1';
  _query := Tadoquery.Create(nil);
  with _query do begin
    connection := mus_Service.ADOConnMUS;
    _query.sql.Text := _stmp;
    _query.open;   open;
    if (not eof) then begin
      result := FieldByName('Aktennr').asinteger;
      edit;
      FieldValues['neu'] := 0;
      post;
    end else result := 0;
  end;
end;
Danke an alle, die geholfen haben :shock: - Mit diesem Workaround kann ich gut leben. Zumal dieses die einzige Stelle ist, an der der Datenbank neue Datensätze hinzugefügt werden.

Gruss

EL

Jelly 1. Okt 2008 15:44

Re: Auto-Insertwert abfragen
 
Deine Lösung ist unschön wegen dem Extrafeld.

Lass doch mal in meinem Code dir Prüfung auf IsNull weg und versuche einfach den mit AsInteger zurückzugeben. Mit dem Scope_Identity() hatte ich noch nie Probleme, aber auch wohl deshalb vielleicht weil ich das so in der Form gar nicht mehr nutze.

Ich plädiere definitiv zu der Lösung mit der Sequence Tabelle und der Stored Procedure aus #6. Damit bist du einfach viel flexibler, und du hast die nötige Id schon bevor du überhaupt den Insert losschickst. Dafür müsstest du allerdings die Identity Eigenschaft der DB-Spalte wieder kicken.


Alle Zeitangaben in WEZ +1. Es ist jetzt 11:45 Uhr.
Seite 2 von 3     12 3      

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