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?
Thema durchsuchen
Ansicht
Themen-Optionen

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 3  1 23      
BlueStarHH

Registriert seit: 28. Mär 2005
Ort: Hannover-Hainholz
801 Beiträge
 
Delphi 11 Alexandria
 
#1

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

  Alt 7. Nov 2014, 14:23
Datenbank: Firebird • Version: 2 • Zugriff über: IBDAC
Hallo,

ich habe eine Firebird-Tabelle mit Buchungen:

Code:
Konto   BuchungNr  Text           usw.
------  ---------  -------------
4600    1          Reise München
4600    2          Reise Berlin
4930    1          Büroklammern
Jedes Konto hat seine eigene Buchungsnummer von 1 bis n. Wie kann ich nun die nächste Buchungsnummer für ein bestimmtes Konto ermitteln? Die nächste BuchungNr für Konto 4600 wäre hier also die 3 und für Konto 4930 die 2.

Es soll in einer Client/Server Umgebung keine doppelten Nummern geben. Auf dem Client den Max-Wert der BuchungNr für ein bestimmtes Konto mit SQL holen scheidet wohl aus, da in der Zeit wo die Abfrage ausgeführt wird, ein anderer Client dazwischenfunken könnte. Ein Generator scheidet wohl auch aus, da ich nicht für jedes Konto einen eigenen Generator anlegen kann. Es sind hunderte von Konten. Ab und zu kommen neue dazu.

Was also tun?
  Mit Zitat antworten Zitat
HPB

Registriert seit: 2. Jun 2008
365 Beiträge
 
Delphi XE7 Professional
 
#2

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

  Alt 7. Nov 2014, 14:37
Guten Tag,
Wie wäre es mit
Delphi-Quellcode:
Select count(*) as AnzBuchungen from Table
where kontonr = :pKontoNr
Allerding hättest Du wieder doppelte Nummern wenn ein Datensatz für ein Konto gelöscht wird.
Dies kann aber übergangen werden, wenn Du in der Tabelle eine Spalte "geloescht = J/N' führst
Sollte eine Buchung gelöscht werden dann setzt Du den Wert auf "J".
Damit kannst Du ja die Daten so selektieren:
select * from table where geloescht = 'N' Für die nächste Nummer wäre so ein Konstrukt evtl hilfreich:
Delphi-Quellcode:
select count(*) as Anzahl from table where geloescht = 'N'
and KontoNr = :pKontoNr
Gruß HPB
  Mit Zitat antworten Zitat
BlueStarHH

Registriert seit: 28. Mär 2005
Ort: Hannover-Hainholz
801 Beiträge
 
Delphi 11 Alexandria
 
#3

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

  Alt 7. Nov 2014, 14:41
Guten Tag,
Wie wäre es mit
Delphi-Quellcode:
Select count(*) as AnzBuchungen from Table
where kontonr = :pKontoNr
Allerding hättest Du wieder doppelte Nummern wenn ein Datensatz für ein Konto gelöscht wird.
Dies kann aber übergangen werden, wenn Du in der Tabelle eine Spalte "geloescht = J/N' führst
Sollte eine Buchung gelöscht werden dann setzt Du den Wert auf "J".
Damit kannst Du ja die Daten so selektieren:
select * from table where geloescht = 'N' Für die nächste Nummer wäre so ein Konstrukt evtl hilfreich:
Delphi-Quellcode:
select count(*) as Anzahl from table where geloescht = 'N'
and KontoNr = :pKontoNr
Gruß HPB
Hi HPB,

danke, das geht aber nicht denn es gibt beim "count" das selbe Problem wie beim "max-Wert":

Zitat:
Auf dem Client den Max-Wert der BuchungNr für ein bestimmtes Konto mit SQL holen scheidet wohl aus, da in der Zeit wo die Abfrage ausgeführt wird, ein anderer Client dazwischenfunken könnte.
Ich versuche es nochmal deutlicher zu machen. Client A fragt per SQL den count/max-Wert ab. Bevor er den neuen Datensatz posten kann, haben die Clients B und C ebenfalls den count/max-Wert abgefrag. Alle 3 Clients haben dann den selben count/max-Wert und wollen den selben Wert posten. Wer dann zuerst posted hat gewonnen und bei den anderen beiden Clients gibt es eine Fehlermeldung der Art "Buchungsnummer nicht eindeutig"

Geändert von BlueStarHH ( 7. Nov 2014 um 14:43 Uhr)
  Mit Zitat antworten Zitat
Medium

Registriert seit: 23. Jan 2008
3.679 Beiträge
 
Delphi 2007 Enterprise
 
#4

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

  Alt 7. Nov 2014, 14:42
SELECT MAX(BuchungsNr) FROM Tabelle WHERE Konto = :GewünschtesKonto GROUP BY Konto gibt dir die derzeit höchste Buchunsnummer für ein bestimmts Konto. Lücken bei mitten drin gelöschten Datensätzen verbleiben dann. Wenn dies nicht gewünscht ist, dann bleibt nicht viel mehr als manuell alle Sätze sortiert durchzuiterieren bis eine nicht vergebene Nummer gefunden wurde.

Edit: Aha, jetzt erst das Timingproblem gesehen. Dann bleiben nur Serverseitige Ansätze. Vielleicht ließe sich da ein Trigger für bauen, da bin ich allerdings nicht fit genug drin hierfür. Sorry.
"When one person suffers from a delusion, it is called insanity. When a million people suffer from a delusion, it is called religion." (Richard Dawkins)
  Mit Zitat antworten Zitat
Lemmy

Registriert seit: 8. Jun 2002
Ort: Berglen
2.366 Beiträge
 
Delphi 10.3 Rio
 
#5

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

  Alt 7. Nov 2014, 14:47
Hi,

das Problem kannst Du nur über eine Tabellensperre lösen, d.h. einer schreibt, alle anderen dürfen nur noch lesen.

Je nachdem was Du mit den fortlaufenden Nummer machen willst, könnte dir da aber schon ein Generator helfen - aber kommt halt darauf an ob die nur der Ordnung dienen oder sonst noch eine Funktion übernehmen...

Grüße
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

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

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.
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
my Delphi wish list : BugReports/FeatureRequests
  Mit Zitat antworten Zitat
Benutzerbild von DeddyH
DeddyH

Registriert seit: 17. Sep 2006
Ort: Barchfeld
27.542 Beiträge
 
Delphi 11 Alexandria
 
#7

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.338 Beiträge
 
Delphi 11 Alexandria
 
#8

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.542 Beiträge
 
Delphi 11 Alexandria
 
#9

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
mjustin

Registriert seit: 14. Apr 2008
3.005 Beiträge
 
Delphi 2009 Professional
 
#10

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

  Alt 7. Nov 2014, 15:55
... dann könntest du dir auch mehrere "Generatoren" erstellen und je nach Konto den passenden/zugehörigen Generator verwenden.
Einzige Einschränkung:
immer wenn eine neue Nummer generiert, aber (weil ein Fehler auftritt) nicht beim INSERT verwendet wird, wird diese Nummer unbenutzt und es bleibt eine "Lücke". (Da Generatoren ihre Werte ausserhalb von Transaktionen erhalten, können diese nicht durch ein Rollback verhindert werden.)
Michael Justin

Geändert von mjustin ( 7. Nov 2014 um 15:59 Uhr)
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 3  1 23      


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 21:30 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