AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Datenbanken Delphi AutoInc primary key Feld wird immer auf 0 gesetzt
Thema durchsuchen
Ansicht
Themen-Optionen

AutoInc primary key Feld wird immer auf 0 gesetzt

Ein Thema von TurboMagic · begonnen am 25. Apr 2025 · letzter Beitrag vom 29. Apr 2025
Antwort Antwort
Seite 1 von 2  1 2      
TurboMagic

Registriert seit: 28. Feb 2016
Ort: Nordost Baden-Württemberg
3.048 Beiträge
 
Delphi 12 Athens
 
#1

AutoInc primary key Feld wird immer auf 0 gesetzt

  Alt 25. Apr 2025, 20:54
Datenbank: Firebird • Version: 5.0 • Zugriff über: FireDAC
Hallo,

ich habe eine DB Tabelle mit einem AutoInc Integer Feld Namens ID.
Das nutzt in Firebird einen Generator, dessen Wert ich eigentlich mittels
SQL Manager auf 4 gesetzt habe, da ich damit schon 4 Einträge in die Tabelle
gemacht hatte.

Nur wenn ich mit unten stehender Methode meinen neuen Text reinschreiben will
knallt es, weil er ID auf 0 statt 4 oder 5 setzen will.

Eigentlich hab' ich den Code analog zu Code für andere Tabellen der DB geschrieben
die auch AutoID Primärschlüssel haben und definitiv funktionieren. Hat jemand eine
Idee warum es da nicht klappt? Bzw. was kann ich noch testen?

Delphi-Quellcode:
procedure TMyTexts.SaveAddedText(Item: TMyText);
begin
  if not Assigned(FInsertQuery) then
  begin
    FInsertQuery := FDataSetFactory.GetDataSet(true);
    // Relevant, damit FireDAC beim Append später nicht wegen dem noch leeren
    // Primärschlüssel meckert.
    FInsertQuery.UpdateOptions.AutoIncFields := 'ID';
  end;

  FInsertQuery.Open('select ID, TEXT from MY_TEXTS');
  FInsertQuery.Append;
  FInsertQuery.FieldByName('TEXT').AsString := Item.Text;
  FInsertQuery.Post;

  Item.ID := FInsertQuery.FieldByName('ID').AsInteger;
end;
Grüße
TurboMagic
  Mit Zitat antworten Zitat
DaCoda

Registriert seit: 21. Jul 2006
Ort: Hamburg
171 Beiträge
 
Delphi 12 Athens
 
#2

AW: AutoInc primary key Feld wird immer auf 0 gesetzt

  Alt 26. Apr 2025, 19:46
Also wenn dein Feld "ID" ein AutoIncrement - Feld ist und ich das nicht falsch verstanden habe, dann sollte das so reichen:


Code:
procedure TMyTexts.SaveAddedText(Item: TMyText);
begin
  FInsertQuery.Open('SELECT TEXT FROM MY_TEXTS');
  FInsertQuery.Insert;
  FInsertQuery.FieldByName('TEXT').AsString := Item.Text;
  FInsertQuery.Post;
  FInsertQuery.Close;
end;
Debuggers don’t remove bugs, they only show them in slow-motion.

Geändert von DaCoda (26. Apr 2025 um 19:49 Uhr)
  Mit Zitat antworten Zitat
TurboMagic

Registriert seit: 28. Feb 2016
Ort: Nordost Baden-Württemberg
3.048 Beiträge
 
Delphi 12 Athens
 
#3

AW: AutoInc primary key Feld wird immer auf 0 gesetzt

  Alt 26. Apr 2025, 19:50
Danke für die Info!
Werde das baldmöglichst testen.
Du benutzt also statt Append Insert wenn ich das richtig sehe und lässt diese
AutoInc Felddefinition weg.
Grüße
TurboMagic
  Mit Zitat antworten Zitat
DaCoda

Registriert seit: 21. Jul 2006
Ort: Hamburg
171 Beiträge
 
Delphi 12 Athens
 
#4

AW: AutoInc primary key Feld wird immer auf 0 gesetzt

  Alt 26. Apr 2025, 20:02
Das Insert ist einfach "gewohnheit", dein Insert geht genau so.

Der Unterschied besteht darin , dass Du mit append einfach einen neuen Eintrag am Ende der Liste hinzufügst. Mit insert(position, eintrag) kannst Du einen neuen Eintrag genau an der gewünschten Position erstellen. Ohne Positionsangabe ist ein insert praktisch ein append

Entscheidend bei meinem vorherigen Posting ist einfach das du ein AutoInc-Feld nicht ausfüllen musst, das macht die Datenbank alleine.
Debuggers don’t remove bugs, they only show them in slow-motion.
  Mit Zitat antworten Zitat
TurboMagic

Registriert seit: 28. Feb 2016
Ort: Nordost Baden-Württemberg
3.048 Beiträge
 
Delphi 12 Athens
 
#5

AW: AutoInc primary key Feld wird immer auf 0 gesetzt

  Alt 26. Apr 2025, 20:19
Das Insert ist einfach "gewohnheit", dein Insert geht genau so.

Der Unterschied besteht darin , dass Du mit append einfach einen neuen Eintrag am Ende der Liste hinzufügst. Mit insert(position, eintrag) kannst Du einen neuen Eintrag genau an der gewünschten Position erstellen. Ohne Positionsangabe ist ein insert praktisch ein append

Entscheidend bei meinem vorherigen Posting ist einfach das du ein AutoInc-Feld nicht ausfüllen musst, das macht die Datenbank alleine.
Nach meinem Test glaube ich dir das nur leider nicht mehr.
Ich bekomme eine EDatabaseError exception:
Im Projekt MyTest.exe ist eine Exception der Klasse EDatabaseError mit der Meldung 'Feld 'ID' muss einen Wert haben' aufgetreten.

Grüße
TurboMagic
  Mit Zitat antworten Zitat
fred42

Registriert seit: 1. Jan 2025
9 Beiträge
 
#6

AW: AutoInc primary key Feld wird immer auf 0 gesetzt

  Alt 26. Apr 2025, 21:19
Hallo,

in den Datenzugriffskomponenten (FDQuery bzw. FDTable) bei 'UpdateOptions' die entsprechenden
Eigenschaften angeben.

GeneratorName
Keyfields

sollte funktionieren.
Gruß
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.378 Beiträge
 
Delphi 12 Athens
 
#7

AW: AutoInc primary key Feld wird immer auf 0 gesetzt

  Alt 26. Apr 2025, 20:05
Normal sollte doch FireDAC auch nur ein INSERT-Statement mit den gefüllten Feldern generieren?
Felder, welche nicht im Statement drin stehen, werden serverseitig via Default/AutoInc gefüllt.

Im Grunde halte ich es eigentlich für einen gewaltigen Bug, dass bei Default/AutoInc-Feldern das Required im TField gesetzt wird, denn es ist eben nicht "wirklich" required (clientseitig).

Bei FireDAC kann man bestimmt auch deaktivieren, dass Required gesetzt wird.
Required prüft lokal, im BeforePost, aber es wird ja eh nochtmal serverseitig geprüft.

Keine Ahnung, was AutoIncFields überhaupt macht.
Wir nutzen eine abgeleitete pgDAC-Klasse, wo im AfterInsert über ein SELECT vom Server die Default/AutoInc-Werte geholt und in die Fields kopiert werden.
* einmal knallt es so bei Required-Check nicht
* und außerdem sieht man bereits vor dem Post (im Edit/Grid), was überall drin steht (auch das, was eigentlich erst beim Post in der DB gefüllt würde, abgesehn von BeforeInsertTriggern)

(das Einzige, womit man klarkommen muß, wird dann doch nicht gepostet, sondern verworfen, dann entstehen Lücken)
Ein Therapeut entspricht 1024 Gigapeut.

Geändert von himitsu (26. Apr 2025 um 20:07 Uhr)
  Mit Zitat antworten Zitat
Frickler

Registriert seit: 6. Mär 2007
Ort: Osnabrück
627 Beiträge
 
Delphi XE6 Enterprise
 
#8

AW: AutoInc primary key Feld wird immer auf 0 gesetzt

  Alt Heute, 08:40
(das Einzige, womit man klarkommen muß, wird dann doch nicht gepostet, sondern verworfen, dann entstehen Lücken)
Wenn man das unbedingt vermeiden will, kann man fürs Speichern auch einen zweiten Nummernkreis von "temporären Nummern" verwenden. Die werden dann nach dem Speichern von einem "After Insert" Trigger durch die richtigen Nummern ersetzt. (Dazu vielleicht noch eine Meldung an den Bediener "Die vergebene Nummer war XY")
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.378 Beiträge
 
Delphi 12 Athens
 
#9

AW: AutoInc primary key Feld wird immer auf 0 gesetzt

  Alt Heute, 12:56
Wir haben auch spezielle Nummernkreise, für einige Dinge.
z.B. wenn die Nummer zwar fortlaufend sein soll, aber es zeitlich egal ist.
Dort wird eine vorübergehend gezogene Nummer markiert/gespeichert, mit Zeitpunkt,
und wenn nach einigen Stunden immernoch nicht verwendet, dann wird sie nächstes Mal erneut gezogen.
Ein Therapeut entspricht 1024 Gigapeut.
  Mit Zitat antworten Zitat
Benutzerbild von Olli73
Olli73

Registriert seit: 25. Apr 2008
Ort: Neunkirchen
782 Beiträge
 
#10

AW: AutoInc primary key Feld wird immer auf 0 gesetzt

  Alt 27. Apr 2025, 10:35
Hallo,

ich habe eine DB Tabelle mit einem AutoInc Integer Feld Namens ID.
Das nutzt in Firebird einen Generator, dessen Wert ich eigentlich mittels
SQL Manager auf 4 gesetzt habe, da ich damit schon 4 Einträge in die Tabelle
gemacht hatte.

Nur wenn ich mit unten stehender Methode meinen neuen Text reinschreiben will
knallt es, weil er ID auf 0 statt 4 oder 5 setzen will.

Eigentlich hab' ich den Code analog zu Code für andere Tabellen der DB geschrieben
die auch AutoID Primärschlüssel haben und definitiv funktionieren. Hat jemand eine
Idee warum es da nicht klappt? Bzw. was kann ich noch testen?

Delphi-Quellcode:
procedure TMyTexts.SaveAddedText(Item: TMyText);
begin
  if not Assigned(FInsertQuery) then
  begin
    FInsertQuery := FDataSetFactory.GetDataSet(true);
    // Relevant, damit FireDAC beim Append später nicht wegen dem noch leeren
    // Primärschlüssel meckert.
    FInsertQuery.UpdateOptions.AutoIncFields := 'ID';
  end;

  FInsertQuery.Open('select ID, TEXT from MY_TEXTS');
  FInsertQuery.Append;
  FInsertQuery.FieldByName('TEXT').AsString := Item.Text;
  FInsertQuery.Post;

  Item.ID := FInsertQuery.FieldByName('ID').AsInteger;
end;
Eigentlich fehlt hier nur ein RefreshRecord nach dem Post bzw. die Einstellung, dass das automatisch/immer gemacht wird:

https://docwiki.embarcadero.com/Libr...ns.RefreshMode
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 2  1 2      


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 22:07 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