Delphi-PRAXiS
Seite 1 von 3  1 23      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Datenbanken (https://www.delphipraxis.net/15-datenbanken/)
-   -   Delphi Letzte Rechnungsnummer um 1 hochzählen (https://www.delphipraxis.net/74353-letzte-rechnungsnummer-um-1-hochzaehlen.html)

LOMBI 1. Aug 2006 20:07

Datenbank: Paradox • Version: 7 • Zugriff über: TQuery, TDataSource

Letzte Rechnungsnummer um 1 hochzählen
 
Guten Abend,

benötige bitte Hilfe bei folgender Lösung:

Delphi-Quellcode:
TFormRechnungen.QueryRechnungenBeforeInsert(DataSet: TDataSet);
var
  letzte_nummer: Integer;
  QueryRNr: TQuery;
begin
  letzte_nummer := 0;
  QueryRNr := TQuery.Create(nil);
try
  QueryRNr.SQL.Clear;
  QueryRNr.DatabaseName := QueryRechnungen.DatabaseName;
  QueryRNr.SQL.Add('SELECT LAST(RNr) FROM Rechnungen');
  QueryRNr.Open;
  letzte_nummer : QueryRNr.Fields[0].AsInteger;
finally
  QueryRNr.Close;
  QueryRNr.Free;
  inc(letzte_nummer); // Rechnungsnummer um 1 erhöhen
  EditRNr.Text := Format('%.10d',[letzte_nummer]);
Ich möchte gerne erreichen, dass die Hochzählung generell bei der
zuletzt eingetragenen oder geänderten Rechnungsnummer startet.
Wie bitte kriege ich das hin?

Gruß
Lombi

Cyberbob 1. Aug 2006 21:12

Re: Letzte Rechnungsnummer um 1 hochzählen
 
Machs doch direjt über sql.

Ich hab in meiner SQL-Datenbank im Feld "gid" unter extras "auto_increment" stehen. Also wird bei jedem neuanlegen der wert um 1 erhöht.


Ich hoffe, ich konnte dir Helfen!

marabu 1. Aug 2006 21:19

Re: Letzte Rechnungsnummer um 1 hochzählen
 
Hallo Lombi,

dir scheinen die von Paradox mitgebrachten AutoInc-Felder nicht zu gefallen. Getippt und nicht getestet:

Delphi-Quellcode:
function NextKey(tblName, fldName: String): Integer;
begin
  with TQuery.Create(nil) do
  begin
    DatabaseName := Global.DatabaseName;
    SQL.Text := Format('SELECT MAX(%s) FROM %s', [fldName, tblName]);
    Open;
    Result := Succ(Fields[0].AsInteger);
    Close;
  end;
end;

procedure TFormRechnungen.QueryRechnungenBeforeInsert(DataSet: TDataSet);
begin
  DataSet.FieldByName('RNR').AsInteger := NextKey('RNR', 'Rechnungen');
end;
Gute Nacht

marabu

hoika 2. Aug 2006 07:26

Re: Letzte Rechnungsnummer um 1 hochzählen
 
Hallo,

Guten Morgen,

da fehlt dann noch irgendwo ein +1.


Heiko

sakura 2. Aug 2006 07:30

Re: Letzte Rechnungsnummer um 1 hochzählen
 
Zitat:

Zitat von hoika
da fehlt dann noch irgendwo ein +1.

Ist doch da
Delphi-Quellcode:
Succ(Fields[0].AsInteger);
Succ holt den Successor, also den Nachfolger (+1).

...:cat:...

hoika 2. Aug 2006 07:53

Re: Letzte Rechnungsnummer um 1 hochzählen
 
Oh ;)

*Brille putz*

Stimmt ;)

Ein prinzipielles Problem ist baer:
Was passiert aber, wenn jetzt zwei Nutzer quasi gleichzeitig
eine Rechnung erstellen.

Dann würde die Nummer doppelt eingetragen.

Hier hilft dann nur ein unique index
oder man benutzt eine Extra-Tabelle mit dem Feld "LetzteRechnzungsNr",
auf die nur einer gleichzeitig Zugriff hat.

Das Feld könnte man auch verwenden, um z.B. am Ende des Jahres
den Wert zurückzustellen.


Heiko

Peinhard 2. Aug 2006 08:12

Re: Letzte Rechnungsnummer um 1 hochzählen
 
Zitat:

Zitat von hoika
... oder man benutzt eine Extra-Tabelle mit dem Feld "LetzteRechnzungsNr",
auf die nur einer gleichzeitig Zugriff hat.

Rischtisch. 'Exclusiv' öffnen und die hochgezählte Nummer im gleichen 'Zugriffszug' auch gleich wieder eintragen. Für den Zugriff mehrere Versuche mit jeweils ein bisschen sleep() dazwischen.

XChris 2. Aug 2006 08:56

Re: Letzte Rechnungsnummer um 1 hochzählen
 
Die "Lösung" hier ist schlecht. Warum keine Transaktion? So schreibt man doch ins Blaue ...

Außerdem sollte die Rechnungsnummer auch NIE dem Datenbank PK entsprechen.

Chris

mschaefer 2. Aug 2006 09:13

Re: Letzte Rechnungsnummer um 1 hochzählen
 
Paradox hat keine Transaktionen! Spannend wird es auch noch wenn beim Ausdruck der Rechnung zufälllig der Drucker das Papier frist, Toner alle ist oder jemand die besagte Rechnungsnummer per Hand vergeben hat. Tja wie ihr seht bin ich Optimist.

//Grüße // Martin

Peinhard 2. Aug 2006 10:15

Re: Letzte Rechnungsnummer um 1 hochzählen
 
Zitat:

Zitat von XChris
Die "Lösung" hier ist schlecht. Warum keine Transaktion? So schreibt man doch ins Blaue ...

Das exklusive Öffnen simuliert gewissermaßen eine Transaktion. Während des Auslesens des letzen Wertes, des Hochzählens und des anschließenden Wiedereintrags der hochgezählten Nummer kann niemand 'dazwischenfunken', die Konsistenz der Werte ist also sichergestellt.

Zitat:

Zitat von XChris
Außerdem sollte die Rechnungsnummer auch NIE dem Datenbank PK entsprechen.

Das hat aber auch niemand ernsthaft vorgeschlagen, gei odr?


Alle Zeitangaben in WEZ +1. Es ist jetzt 22:46 Uhr.
Seite 1 von 3  1 23      

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