AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Datenbanken Delphi Letzte Rechnungsnummer um 1 hochzählen
Thema durchsuchen
Ansicht
Themen-Optionen

Letzte Rechnungsnummer um 1 hochzählen

Ein Thema von LOMBI · begonnen am 1. Aug 2006 · letzter Beitrag vom 5. Aug 2006
Antwort Antwort
Seite 1 von 3  1 23      
LOMBI
(Gast)

n/a Beiträge
 
#1

Letzte Rechnungsnummer um 1 hochzählen

  Alt 1. Aug 2006, 21:07
Datenbank: Paradox • Version: 7 • Zugriff über: TQuery, TDataSource
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
  Mit Zitat antworten Zitat
Benutzerbild von Cyberbob
Cyberbob

Registriert seit: 24. Jan 2005
Ort: Karben
626 Beiträge
 
Delphi XE7 Architect
 
#2

Re: Letzte Rechnungsnummer um 1 hochzählen

  Alt 1. Aug 2006, 22:12
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!
Christian
  Mit Zitat antworten Zitat
marabu

Registriert seit: 6. Apr 2005
10.109 Beiträge
 
#3

Re: Letzte Rechnungsnummer um 1 hochzählen

  Alt 1. Aug 2006, 22:19
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
  Mit Zitat antworten Zitat
hoika

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

Re: Letzte Rechnungsnummer um 1 hochzählen

  Alt 2. Aug 2006, 08:26
Hallo,

Guten Morgen,

da fehlt dann noch irgendwo ein +1.


Heiko
Heiko
  Mit Zitat antworten Zitat
Benutzerbild von sakura
sakura

Registriert seit: 10. Jun 2002
Ort: Unterhaching
11.412 Beiträge
 
Delphi 12 Athens
 
#5

Re: Letzte Rechnungsnummer um 1 hochzählen

  Alt 2. Aug 2006, 08:30
Zitat von hoika:
da fehlt dann noch irgendwo ein +1.
Ist doch daSucc(Fields[0].AsInteger); Succ holt den Successor, also den Nachfolger (+1).

......
Daniel Lizbeth
Ich bin nicht zurück, ich tue nur so
  Mit Zitat antworten Zitat
hoika

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

Re: Letzte Rechnungsnummer um 1 hochzählen

  Alt 2. Aug 2006, 08:53
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
Heiko
  Mit Zitat antworten Zitat
Peinhard

Registriert seit: 8. Jul 2006
152 Beiträge
 
#7

Re: Letzte Rechnungsnummer um 1 hochzählen

  Alt 2. Aug 2006, 09:12
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.
  Mit Zitat antworten Zitat
XChris

Registriert seit: 2. Jun 2006
Ort: Softwaresklave
19 Beiträge
 
#8

Re: Letzte Rechnungsnummer um 1 hochzählen

  Alt 2. Aug 2006, 09:56
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
  Mit Zitat antworten Zitat
Benutzerbild von mschaefer
mschaefer

Registriert seit: 4. Feb 2003
Ort: Hannover
2.032 Beiträge
 
Delphi 12 Athens
 
#9

Re: Letzte Rechnungsnummer um 1 hochzählen

  Alt 2. Aug 2006, 10:13
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
Martin Schaefer
  Mit Zitat antworten Zitat
Peinhard

Registriert seit: 8. Jul 2006
152 Beiträge
 
#10

Re: Letzte Rechnungsnummer um 1 hochzählen

  Alt 2. Aug 2006, 11:15
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 von XChris:
Außerdem sollte die Rechnungsnummer auch NIE dem Datenbank PK entsprechen.
Das hat aber auch niemand ernsthaft vorgeschlagen, gei odr?
  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 17:24 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