Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Datenbanken (https://www.delphipraxis.net/15-datenbanken/)
-   -   Delphi Rechnungsnummer generieren? (https://www.delphipraxis.net/14582-rechnungsnummer-generieren.html)

schniede 11. Jan 2004 21:25


Rechnungsnummer generieren?
 
Hallo!

Also ich such nen praktischen Weg ne Rechnungsnummer zu generieren (soll fortlaufend sein).

Meine Überlegung.-- 9 stellige zahl die ersten beiden die Jahreszahl und den Rest von 0 aufwärtzzählen.

Beispiel 04xxxxxxx .

ich würde dann die letzten 7 stellen in einer INI speichern und je Rechnung um eins erhöhen und wieder neu speichern ,als letzte vergebene Nummer.

So nun find ich das nicht gerade Elegant und denk, da gibt es doch bestimmt ne bessere Lösung.



mfg schniede

scp 11. Jan 2004 22:02

Re: Rechnungsnummer generieren?
 
Was könnte da eleganter sein?
Die einzigen Alternativen, die mir dazu einfallen, wäre, den Wert in der Registry zu speichern und evtl. noch ein alphanumerisches Zahlensystem zu verwenden (z.B. Hexadezimal).
Durch letzteres hast du einen Grösseren Nummerierungsbereich mit der gleichen Anzahl Ziffern (in dem Fall statt 1 bis 9.999.999 ein Bereich von 1 bis 268.435.455 = FFFFFFF in Hex).

schniede 11. Jan 2004 22:13

Re: Rechnungsnummer generieren?
 
Danke scp !

Das mit den hex lass ich lieber, ca. 27000 verschiedene Nummern pro Tag im Jahr sollten reichen.
geht ja 2005 mit 05xxxxxxx weiter :-)

Registry , hm Vorteile??

Ini ist für mich leichter zu händeln.

thx schniede

Robert_G 11. Jan 2004 22:18

Re: Rechnungsnummer generieren?
 
Moin Schniede.
Dann lass es doch bei der INI. Du musst wegen einem Wert nicht gleich was in die Registry schreiben.

merlin17 12. Jan 2004 08:06

Re: Rechnungsnummer generieren?
 
hi,
ich würde die rechnungsnummer weder in ini-files noch in der registry
speichern. was machst du wenn zwei user auf das programm zugreifen
und beide gleichzeitig eine rechnung erfassen ? am besten in der
datenbank (wird es ja bei einem rechnungsprogramm geben) speichern
und hochzählen lassen (je nach datenbank gibt es ja verschiedenen
möglichkeiten zur unterstützung, bei interbase/firebird generatoren,
bei oracle sequenzen, bei m$ und paradox die AutoInc-felder, etc.)

:wink: thomas

Phoenix 12. Jan 2004 08:12

Re: Rechnungsnummer generieren?
 
Du kannst alternativ auch einfach Jahr + Monat + Tag + anzahl Sekunden des aktuellen Tages nehmen. Das sind 5 Stellen von 0 bis 86400 pro Tag.

Macht z.B. 040112 33180

Und man kann anhand der Rechnungsnummer auch gleich das Datum nachvollziehen.

BiBi 13. Jan 2004 17:24

Re: Rechnungsnummer generieren?
 
Hallo schniede,

am besten in der Tabelle nach der letzten Rechnung suchen.

Tabelle.LAST

Tabelle.RECHNUM := Tabelle.RECHNUM + 1

So habe ich es gemacht. Wenn du willst schicke ich Dir einen Auszug mit dem erhöhen
der Rechnungsnummer.

Gruß

BiBi 13. Jan 2004 17:54

Re: Rechnungsnummer generieren?
 
Hallo nochmal,

habe auf die schnelle den Prog-Teil gefunden.



Delphi-Quellcode:
  // Rechnungsnummer um 1 erhöhen
  DataModule1.T_Rechnungen.Last;

  LetzteRechNummer :=
       DataModule1.T_Rechnungen.FieldByName('Rechnungsnummer').AsString;

  iLetzteRechNummer := StrToInt(LetzteRechNummer);
  iNeueRechNummer := iLetzteRechNummer + 1;

  NeueRechNummer := IntToStr(iNeueRechNummer);

Ich habe die Rechnungsnummer als String gespeichert, weil ich "RE" davor schreibe. Ich hoffe ich konnte Dir damit etwas helfen.

Gruß

[edit=Admin]Delphi-Tags eingefügt. Bitte künftig selber amchen. ;-) Mfg, Daniel[/edit]

mschaefer 13. Jan 2004 18:01

Re: Rechnungsnummer generieren?
 
Moin. moin,

da war doch noch das Finazamt. Die möchten ab diesem Jahr abfogende Rechnugnsnummern auch wenn
verschedene Rechner an diesem Procedre beteiligt sind. Deshalb entscheide zunächst ob Du ein reines
Einzelplatzsystem hast und es auch nicht auf mehrer Rechner erweitern möchtest.

Einzelplatzsystem: :bouncing4:
Hier geht das mit der Ini bestens

Mehrplaztsystem :duck:
Verwende einen Datenbankgenerator (Hansa hatte mal ein schönes Beispiel)
Das hängt natürlich vom Datenbanksystem ab, welches Du verwendest.

Grüße // Martin

merlin17 13. Jan 2004 18:02

Re: Rechnungsnummer generieren?
 
BiBi,

Problem könnte bei deinem codeschnipsel nur sein, dass in einem netzwerk zwei user
gleichezeitig eine rechnung holen und damit jeweils die gleiche iLetzteRechNummer
erhalten....
wenn würde ich gleich nach dem holen der zahl ein update auf das datenfeld durchführen.
vermindert die wahrscheinlich etwas.
Code:
iLetzteRechNummer := StrToInt(LetzteRechNummer);
iNeueRechNummer := inc(iLetzteRechNummer);
executeQuery : "update t_rechnungen set Rechnungsnummer = INeueRechNummer where ...."

NeueRechNummer := IntToStr(iNeueRechNummer);
......
gruss



:-) thomas

BiBi 13. Jan 2004 20:08

Re: Rechnungsnummer generieren?
 
merlin17,

ist richtig, doch habe ich das Prog nur für mich und als Einzelplatzlösung erstellt.

Trotzdem Danke für den Tip.

Gruß

schniede 14. Jan 2004 17:40

Re: Rechnungsnummer generieren?
 
Hy !!

Ich danke euch allen,war unterwegs und werd später genau lesen.

Auf alle Fälle viel guter Ideen.

thx schniede

DelphiDeveloper 2. Feb 2004 22:44

Re: Rechnungsnummer generieren?
 
Ich nehme mal an,
das deine Rechnungsnummern folgende Kriterien erfüllen müssen:

1. fortlaufend
2. lückenlos
3. unique im laufenden jahr
4. evtl will der anwender bei jahreswechsel wieder von n loslegen
5. der anwender will noch nicht verschickte rechnungen einfach verwerfen können
und nicht sofort eine storno oder gutschrift erstellen

ich würde folgenden ansatz verfolgen

a) rechnr niemals PK
b) rechnr über generator holen
c) wenn generierte rechnr geloescht wird -> nummer zurück in einen nummernpool

zu b) bevor der generator erhoeht wird, erstmal schauen ob noch was im nummernpool liegt, hier muss man sich dann im mehrplatzsytem was einfallen lassen, das nicht etwa 2 user zur selben zeit sich im pool bedienen können. Kriegt man aber über pessimistisches Locking hin (zumindest mit IBObjects).
Eleganterweise wird das nummern holen dann mit einer SP gelöst.
Bleibt das chronologische Problem. rechnr versus Rechdatum. (nur über Organisation in
dem Betrieb möglich)

wer Interesse an dem geschilderten ansatz hat, dem kann ich eine ausführlichere Interbase/IBO Lösung zukommen lassen.

mfg
delphideveloper

jlanger 3. Feb 2004 15:58

Re: Rechnungsnummer generieren?
 
Zitat:

Zitat von BiBi
Hallo nochmal,

habe auf die schnelle den Prog-Teil gefunden.



Delphi-Quellcode:
  // Rechnungsnummer um 1 erhöhen
  DataModule1.T_Rechnungen.Last;

  LetzteRechNummer :=
       DataModule1.T_Rechnungen.FieldByName('Rechnungsnummer').AsString;

  iLetzteRechNummer := StrToInt(LetzteRechNummer);
  iNeueRechNummer := iLetzteRechNummer + 1;

  NeueRechNummer := IntToStr(iNeueRechNummer);

Ich habe die Rechnungsnummer als String gespeichert, weil ich "RE" davor schreibe. Ich hoffe ich konnte Dir damit etwas helfen.

Warum der ganze Quatsch? Nimm doch ein Autoinc-Feld oder ein Generator-Feld, das zählt automatisch hoch, den Startwert kannst du auch setzen. Und schon wars das.
Und das Argument mit dem RE davor ist doch völliger Käse. Warum soll das RE in der Datenbank stehen? Wozu braucht du es? Auf der Rechnung? Dann lass es beim Schreiben der Rechnung davor schreiben (berechnetes Feld). Selbst auf irgendwelchen Masken macht man das so. Schliesslich hat das "RE" KEINERLEI Infogehalt in der Datenbank. Oder benutzt du für Währungen auch ein Stringfeld, damit du das € (oder früher DM) dahinter schreiben kannst? In der Datenbank ist bei einem Währungsfeld nur die Zahl gespeichert, nicht aber das €.


Alle Zeitangaben in WEZ +1. Es ist jetzt 17:59 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