AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Datenbanken Wie eindeutige Rechnungsnummer in DB erstellen und speichern?
Thema durchsuchen
Ansicht
Themen-Optionen

Wie eindeutige Rechnungsnummer in DB erstellen und speichern?

Ein Thema von DCoderHH · begonnen am 5. Dez 2016 · letzter Beitrag vom 8. Dez 2016
Antwort Antwort
Seite 3 von 5     123 45      
rokli

Registriert seit: 21. Mär 2009
Ort: Rödinghausen
297 Beiträge
 
Delphi 10.4 Sydney
 
#21

AW: Wie eindeutige Rechnungsnummer in DB erstellen und speichern?

  Alt 6. Dez 2016, 07:25
Hier noch mal die Ansicht der Daten in der DB als Bild; das ist da oben nicht wirklich gut zu erkennen!

Und alles natürlich in TSQL ...
Miniaturansicht angehängter Grafiken
nummernkreise.png  
Rolf
wenn nicht anders angegeben, schreibe ich zu D7, XE2 und MS SQL - ansonsten fragen Sie ihren Administrator oder einen Operator. Update 06/2020: Delphi 10.4 Sydney
  Mit Zitat antworten Zitat
jobo

Registriert seit: 29. Nov 2010
3.072 Beiträge
 
Delphi 2010 Enterprise
 
#22

AW: Wie eindeutige Rechnungsnummer in DB erstellen und speichern?

  Alt 6. Dez 2016, 08:05
Ich habe hier mal einen Versuch gemacht mit einer autarken SP ohne separates Reset des Generators. Da ich wenig Praxis mit FB habe, bitte gut testen. Vielleicht schaut ja auch einer der FB Kenner hier mal drüber.

SQL-Code:
-- create daily cyclic sequence number / expression

-- table storing last used date
-- drop table rndatebuffer;
create table rndatebuffer (
  isRestricted char(1) Default 'Xunique, --force one record only
  lastDate date not null ,
  constraint forceOneRow check (restricted='X')); --force one record only
  
-- insert into rndatebuffer (lastdate) values(CURRENT_DATE-1);
-- select * from rndatebuffer;

-- sequence
CREATE GENERATOR gen_rn;
SET GENERATOR gen_rn TO 0;


--drop procedure getrn;
--procedure to fetch new "number"
SET TERM ^ ;
CREATE Procedure GetRN RETURNS (prn varchar(20)) as
  declare aDif integer;
BEGIN

  select CURRENT_DATE-lastdate from rndatebuffer into :aDif; -- detect date border
  if (aDif is null) then -- init
  begin
    insert into rndatebuffer (lastdate) values(CURRENT_DATE);
    execute statement 'set generator gen_rn to 0';
  end

  If (aDif <> 0) then -- date border reached
  begin
    update rndatebuffer set lastdate=CURRENT_DATE; -- reset date buffer
    execute statement 'set generator gen_rn to 0'; -- reset generator
  end

  for
    select -- build Rechnungsnummer
      CAST(Extract(year FROM cast('NOWas date))*10000 +
      Extract(month FROM cast('NOWas date))*100 +
      Extract(day FROM cast('NOWas date)) AS VARCHAR(8))||
      LPAD (gen_id(gen_rn,1), 6, '0')
    from RDB$DATABASE into :prn
  do begin
    suspend;
  end
END
^

SET TERM ; ^

P.S.: der Aufruf wäre dann einfach
Code:
select * from GetRN;
Gruß, Jo

Geändert von mkinzler ( 6. Dez 2016 um 08:33 Uhr) Grund: Code-Tag präzisiert
  Mit Zitat antworten Zitat
DCoderHH

Registriert seit: 4. Feb 2015
Ort: Hamburg
84 Beiträge
 
Delphi 10 Seattle Professional
 
#23

AW: Wie eindeutige Rechnungsnummer in DB erstellen und speichern?

  Alt 6. Dez 2016, 08:19
@jobo: Deine StoredProcedure GetRN aus Post #22 eignet sich auch für Multiuser-Zugriff? Was ist wenn 2 Clients die StoredProcedure gleichzeitig aufrufen? Ist das berücksichtigt?
  Mit Zitat antworten Zitat
DCoderHH

Registriert seit: 4. Feb 2015
Ort: Hamburg
84 Beiträge
 
Delphi 10 Seattle Professional
 
#24

AW: Wie eindeutige Rechnungsnummer in DB erstellen und speichern?

  Alt 6. Dez 2016, 08:22
es gibt auch die Möglichkeit, eine Tabelle anzulegen, in der die Nummern verwaltet werden
Wie würde man die Tabelle in einer Multiuser-Umgebung abfragen und setzen so dass es keine doppelten Nummern gibt? Ein einfaches select und update würde ja nicht funktionieren...
  Mit Zitat antworten Zitat
mkinzler
(Moderator)

Registriert seit: 9. Dez 2005
Ort: Heilbronn
39.851 Beiträge
 
Delphi 11 Alexandria
 
#25

AW: Wie eindeutige Rechnungsnummer in DB erstellen und speichern?

  Alt 6. Dez 2016, 08:35
@jobo: Deine StoredProcedure GetRN aus Post #22 eignet sich auch für Multiuser-Zugriff? Was ist wenn 2 Clients die StoredProcedure gleichzeitig aufrufen? Ist das berücksichtigt?
Ja, dafür sorgt die Semaphoren-Funktion gen_id()
Markus Kinzler
  Mit Zitat antworten Zitat
mkinzler
(Moderator)

Registriert seit: 9. Dez 2005
Ort: Heilbronn
39.851 Beiträge
 
Delphi 11 Alexandria
 
#26

AW: Wie eindeutige Rechnungsnummer in DB erstellen und speichern?

  Alt 6. Dez 2016, 08:36
es gibt auch die Möglichkeit, eine Tabelle anzulegen, in der die Nummern verwaltet werden
Wie würde man die Tabelle in einer Multiuser-Umgebung abfragen und setzen so dass es keine doppelten Nummern gibt? Ein einfaches select und update würde ja nicht funktionieren...
Man könnte ein select for update verwenden.
Markus Kinzler
  Mit Zitat antworten Zitat
Lemmy

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

AW: Wie eindeutige Rechnungsnummer in DB erstellen und speichern?

  Alt 6. Dez 2016, 08:45
@jobo: Deine StoredProcedure GetRN aus Post #22 eignet sich auch für Multiuser-Zugriff? Was ist wenn 2 Clients die StoredProcedure gleichzeitig aufrufen? Ist das berücksichtigt?
Ja, dafür sorgt die Semaphoren-Funktion gen_id()
-gelöscht-

Ich würde das anders umsetzen und wenn möglich einen "Buchungsschluss" laufen lassen, der den Zugriff auf die DB blockiert und der dann letztlich den Rechnungsnummerngenerator initialisiert. Aber ganz sicher nicht in der SP in der neue Rechnungsnummern generiert werden

Geändert von Lemmy ( 6. Dez 2016 um 08:46 Uhr) Grund: falsch gelesen
  Mit Zitat antworten Zitat
Benutzerbild von p80286
p80286

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

AW: Wie eindeutige Rechnungsnummer in DB erstellen und speichern?

  Alt 6. Dez 2016, 08:55
Ich möchte nochmal anmerken, daß diese datumsabhängige Generierung nur für einen geografisch begrenzten Raum durchführbar ist. Egal ob LocalTime oder eine zentrale Zeit (Greenich) irgendwann ist eine Datumsgrenze erreicht, die mit einem "Datumsgefühl" kollidiert. Alleine in den USA gibt es eine Zeitdifferenz von 3 Stunden, Die Westküste hat einen Abstand von 9 Stunden zu Deutschland, wenn dort die erste Rechnung generiert wird, ist bei uns die letzte im System. Aber für solche Szenarien wurde die Datenbank nicht entworfen, und das Jahr 2000 war in weiter Zukunft.

Gruß
K-H
Programme gehorchen nicht Deinen Absichten sondern Deinen Anweisungen
R.E.D retired error detector
  Mit Zitat antworten Zitat
jobo

Registriert seit: 29. Nov 2010
3.072 Beiträge
 
Delphi 2010 Enterprise
 
#29

AW: Wie eindeutige Rechnungsnummer in DB erstellen und speichern?

  Alt 6. Dez 2016, 09:16
es gibt auch die Möglichkeit, eine Tabelle anzulegen, in der die Nummern verwaltet werden
Wie würde man die Tabelle in einer Multiuser-Umgebung abfragen und setzen so dass es keine doppelten Nummern gibt? Ein einfaches select und update würde ja nicht funktionieren...
Man könnte ein select for update verwenden.
Nach meinem Verständnis läuft das automatisch in einer Transaktion ab und würde keine Probleme bereiten. Dafür ist ja der Generator und Transaktionsicherheit da.

Notfalls mal ausprobieren und ein paar Consolen öffnen die in einer Loop Werte anfordern. Dazwischen manuel das Datum zurücksetzen. Dabei sollte nur eine einzige Sitzung einen Sequenzreset "erleben" und natürlich alle Sitzungen in Summe eindeutige Nummern liefern.

@Datumsgrenzen: Die sind natürlich international unterschiedlich. Das ist aber kein technisches Problem, sondern muss per Konvention vereinabrt werden, welche Datumsgrenze gewählt werden soll.

Ich selbst habe bei meinem Vorschlag eigentlich ein anderes Problem. Nämlich das Sequenzreset selbst. Ich bin mir nicht ganz sicher, wie das zu werten ist, aber es scheint als DML Befehl zu laufen und ich kenne es von anderen Systemen so, dass DML implizit commited. Das wäre aus meiner Sicht nicht wünschenswert.
Gruß, Jo
  Mit Zitat antworten Zitat
Ghostwalker

Registriert seit: 16. Jun 2003
Ort: Schönwald
1.299 Beiträge
 
Delphi 10.3 Rio
 
#30

AW: Wie eindeutige Rechnungsnummer in DB erstellen und speichern?

  Alt 6. Dez 2016, 09:29
Ich möchte nochmal anmerken, daß diese datumsabhängige Generierung nur für einen geografisch begrenzten Raum durchführbar ist. Egal ob LocalTime oder eine zentrale Zeit (Greenich) irgendwann ist eine Datumsgrenze erreicht, die mit einem "Datumsgefühl" kollidiert. Alleine in den USA gibt es eine Zeitdifferenz von 3 Stunden, Die Westküste hat einen Abstand von 9 Stunden zu Deutschland, wenn dort die erste Rechnung generiert wird, ist bei uns die letzte im System. Aber für solche Szenarien wurde die Datenbank nicht entworfen, und das Jahr 2000 war in weiter Zukunft.

Gruß
K-H
Da hast du definitiv recht. Aber das Problem hast du generel mit Datumswerten, egal ob das nun in der
Rechnungsnummer oder sonstwo in der DB ist. Deshalb sollte man sich hier (Programmintern) auf eine Art einigen (i.d.R. GMT).
Uwe
e=mc² or energy = milk * coffee²
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 3 von 5     123 45      


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 08:05 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