AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Datenbanken Wie fortlaufende Nr. in DB-Taballe erzeugen? Generator nicht möglich?

Wie fortlaufende Nr. in DB-Taballe erzeugen? Generator nicht möglich?

Ein Thema von BlueStarHH · begonnen am 7. Nov 2014 · letzter Beitrag vom 8. Nov 2014
Antwort Antwort
Seite 1 von 2  1 2   
Benutzerbild von himitsu
himitsu

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

AW: Wie fortlaufende Nr. in DB-Taballe erzeugen? Generator nicht möglich?

  Alt 7. Nov 2014, 14:50
Wenn man nicht ständig suchen will, auch gelöschte Datensätze keine doppelte ID erzeugen sollen, dann könntest du dir auch mehrere "Generatoren" erstellen und je nach Konto den passenden/zugehörigen Generator verwenden.
Bzw. das halt in einer eigenen kleinen Tabelle (Konto, LastNumber) verwalten, oder gibt es schon eine Tabelle mit den Konten?

Selbst wenn man nun alles löscht, blieben due Nummern eindeutig.
Ein Therapeut entspricht 1024 Gigapeut.
  Mit Zitat antworten Zitat
Benutzerbild von DeddyH
DeddyH

Registriert seit: 17. Sep 2006
Ort: Barchfeld
27.675 Beiträge
 
Delphi 12 Athens
 
#2

AW: Wie fortlaufende Nr. in DB-Taballe erzeugen? Generator nicht möglich?

  Alt 7. Nov 2014, 15:06
Wenn man nicht ständig suchen will, auch gelöschte Datensätze keine doppelte ID erzeugen sollen, dann könntest du dir auch mehrere "Generatoren" erstellen und je nach Konto den passenden/zugehörigen Generator verwenden.
Wenn das jemand hinbekommt, würde mich die Umsetzung interessieren.
Detlef
"Ich habe Angst vor dem Tag, an dem die Technologie unsere menschlichen Interaktionen übertrumpft. Die Welt wird eine Generation von Idioten bekommen." (Albert Einstein)
Dieser Tag ist längst gekommen
  Mit Zitat antworten Zitat
Benutzerbild von Jasocul
Jasocul

Registriert seit: 22. Sep 2004
Ort: Delmenhorst
1.378 Beiträge
 
Delphi 11 Alexandria
 
#3

AW: Wie fortlaufende Nr. in DB-Taballe erzeugen? Generator nicht möglich?

  Alt 7. Nov 2014, 15:18
Da sehe ich jetzt nicht so das Problem.
Generatoren kann man auch zur Laufzeit erzeugen. Also beim Anlegen eines Kontos einen Generator mit einem passenden Namen anlegen und diesen dann bei den Buchungen entsprechend benutzen.
Generatoren in Firebird erzeugen
Peter
  Mit Zitat antworten Zitat
Benutzerbild von DeddyH
DeddyH

Registriert seit: 17. Sep 2006
Ort: Barchfeld
27.675 Beiträge
 
Delphi 12 Athens
 
#4

AW: Wie fortlaufende Nr. in DB-Taballe erzeugen? Generator nicht möglich?

  Alt 7. Nov 2014, 15:50
Wenn man das aber nicht dem Frontend überlassen will, wird es etwas komplizierter. Sofern mein Gedankengang richtig ist, bräuchte man 2 SPs: eine für das Erzeugen eines neuen Kontos (legt den Generator an) und eine für das Erzeugen einer neuen Buchung (holt sich den aktuellen Generatorwert und trägt ihn ein). Dann müsste man nur noch sicherstellen, dass das Einfügen von Datensätzen nicht mehr direkt, sondern nur noch über diese SPs möglich ist. So könnte es funktionieren, wenn ich mich nicht irre.
Detlef
"Ich habe Angst vor dem Tag, an dem die Technologie unsere menschlichen Interaktionen übertrumpft. Die Welt wird eine Generation von Idioten bekommen." (Albert Einstein)
Dieser Tag ist längst gekommen
  Mit Zitat antworten Zitat
mm1256

Registriert seit: 10. Feb 2014
Ort: Wackersdorf, Bayern
642 Beiträge
 
Delphi 10.1 Berlin Professional
 
#5

AW: Wie fortlaufende Nr. in DB-Taballe erzeugen? Generator nicht möglich?

  Alt 7. Nov 2014, 16:25
Hallo,

sorry, den Gedanken mit den Generatoren kann man vergessen, wenn ich die FB-Einschränkungen hinsichtlich der maximal möglichen Generatoren lese. Das wird also nichts. Ein Standard-SKR-03 umfasst schon mal über 1000 Konten. Auch wenn die i.d.R. nicht alle bebucht werden, die Maximal-Grenze der Generatoren kann bei diesem Ansatz trotzdem schnell erreicht werden.

Ich bin kein FB-Spezialist, und darum weiß ich nicht wie man das mit FB löst. Die einzige praktikable Lösung die ich kenne und auch schon über Jahrzehnte in diesem Zusammenhang (z.B. eindeutige Belegnummern-Erstellung mit mehreren Nummernkreisen) einsetze ist eine Hilfstabelle mit den entsprechenden Nummern(-Kreisen) wo sich der Server vor dem "Post" automatisch die nächste Nummer holt und die zuletzt vergebene Nummer wieder zurückschreibt. Der Client darf bzw. sollte bei einer automatischen Nummernvergabe gar nicht involviert sein.
Gruss Otto PS: Sorry wenn ich manchmal banale Fragen stelle. Ich bin Hobby-Programmierer und nicht zu faul die SuFu zu benutzen
  Mit Zitat antworten Zitat
Dejan Vu
(Gast)

n/a Beiträge
 
#6

AW: Wie fortlaufende Nr. in DB-Taballe erzeugen? Generator nicht möglich?

  Alt 8. Nov 2014, 08:11
...Die einzige praktikable Lösung die ich kenne... ist eine Hilfstabelle mit den entsprechenden Nummern(-Kreisen) wo sich der Server vor dem "Post" automatisch die nächste Nummer holt und die zuletzt vergebene Nummer wieder zurückschreibt.
Ist doch fein.
Code:
UPDATE NummernKreise
   SET Nummer = Nummer + 1 
 WHERE NummernKreisPK = :MyNummernKreis

RETURNING Nummer INTO :NeueNummer
Geht das so?
  Mit Zitat antworten Zitat
Benutzerbild von Sir Rufo
Sir Rufo

Registriert seit: 5. Jan 2005
Ort: Stadthagen
9.454 Beiträge
 
Delphi 10 Seattle Enterprise
 
#7

AW: Wie fortlaufende Nr. in DB-Taballe erzeugen? Generator nicht möglich?

  Alt 8. Nov 2014, 08:23
...Die einzige praktikable Lösung die ich kenne... ist eine Hilfstabelle mit den entsprechenden Nummern(-Kreisen) wo sich der Server vor dem "Post" automatisch die nächste Nummer holt und die zuletzt vergebene Nummer wieder zurückschreibt.
Ist doch fein.
Code:
UPDATE NummernKreise
   SET Nummer = Nummer + 1 
 WHERE NummernKreisPK = :MyNummernKreis

RETURNING Nummer INTO :NeueNummer
Geht das so?
Und wenn man diese Zeile entsprechend innerhalb der Transaktion lockt, dann reißt es bei einem Rollback auch keine Löcher in den Käse die Folge.

Aufpassen muss man allerdings, wenn man (beim Buchen nicht ungewöhnlich) innerhalb einer Transaktion jeweils für zwei Konten eine fortlaufende Zahl benötigt. Dann muss man dass in einem Rutsch anfordern (oder wenigstens den Lock anfordern), sonst kann es in dieser Situation zu einem Deadlock kommen.
Kaum macht man's richtig - schon funktioniert's
Zertifikat: Sir Rufo (Fingerprint: ‎ea 0a 4c 14 0d b6 3a a4 c1 c5 b9 dc 90 9d f0 e9 de 13 da 60)
  Mit Zitat antworten Zitat
Jumpy

Registriert seit: 9. Dez 2010
Ort: Mönchengladbach
1.740 Beiträge
 
Delphi 6 Enterprise
 
#8

AW: Wie fortlaufende Nr. in DB-Taballe erzeugen? Generator nicht möglich?

  Alt 7. Nov 2014, 15:57
Wenn man die angelegte ID nicht direkt wieder braucht, wäre es über ein Insert-Statement doch einfach möglich, oder geht sowas (Subselect in insert) nicht?

SQL-Code:
insert into tabelle (Konto,Buchungsnummer,Text)
Select
  '4600as Konto,
  (Select Max(BuchungNr)+1 From Tabelle Where Konto='4600'),
  'Irgendein Text'
From
  InOracleWürdeIchHier"DUAL"nehmen
Evtl. kann man sowas in eine SP packen, die dann die ID noch zurück liefert?
Ralph
  Mit Zitat antworten Zitat
hoika

Registriert seit: 5. Jul 2006
Ort: Magdeburg
8.277 Beiträge
 
Delphi 10.4 Sydney
 
#9

AW: Wie fortlaufende Nr. in DB-Taballe erzeugen? Generator nicht möglich?

  Alt 7. Nov 2014, 16:26
Hallo,

ich würde auch eine eigene Tabelle oder ein Feld in der Kontentabelle benutzen.
Das Select Max() ist soweit OK, solange ein Unique Index auf den sntsprechenden Felder ist.
Kommt es zu einer key-Exception (duplicate value), muss ich mir nochmal den neuen Wert holen, solange, bis es klappt.

FB kann etwa 32.000 (32758) Generatoren haben (http://www.firebirdsql.org/pdfmanual...ator-Guide.pdf), aber ich würde das nicht ausreizen,
vielleicht werden es ja mal doch mehr Konten und dann müßte der Code komplett umgebaut werden.


Heiko
Heiko

Geändert von hoika ( 7. Nov 2014 um 16:31 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von p80286
p80286

Registriert seit: 28. Apr 2008
Ort: Stolberg (Rhl)
6.659 Beiträge
 
FreePascal / Lazarus
 
#10

AW: Wie fortlaufende Nr. in DB-Taballe erzeugen? Generator nicht möglich?

  Alt 7. Nov 2014, 17:43
Und warum nicht ein Generator für alle Konten?
Dann ist jede Buchung eindeutig
und bei einem insert wir das so gemacht
insert into my table (id,...) values((SELECT NEXT VALUE FOR MyGeneratior FROM RDB$DATABASE),....) Gruß
K-H
Programme gehorchen nicht Deinen Absichten sondern Deinen Anweisungen
R.E.D retired error detector
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 2  1 2   

Themen-Optionen Thema durchsuchen
Thema durchsuchen:

Erweiterte Suche
Ansicht

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:02 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