Hi.
Guck Dir das mal an, wie ich es löse. Ich verwende zwar ADS, aber mit
Paradox sollte es auch gehen.
Zunächst brauchst Du zwei Funktionen (das vereinfacht es später, den Aufruf woanders zu wiederholen).
Die erste kapselt einfach nur den Aufruf des SQLs.
"AsInteger" gibt immer einen Wert zurück, auch wenn noch kein Datensatz existiert, also hast Du automatisch die aktuelle Positionsnummer (im ersten Fall NULL --> 0 --> +1 = 1).
Die "GlobaleQry" (bei Dir also eine TQuery) muss mit dem Database verbunden werden. Sie dient mir in vielerlei Hinsicht. Dies ist eins davon.
Delphi-Quellcode:
function TDataModul.NaechsteNummerErmitteln(SQLString, FeldName: String): Integer;
begin
GlobaleQry.Close;
GlobaleQry.SQL.Clear;
GlobaleQry.SQL.Add(SQLString);
GlobaleQry.Open;
Result := GlobaleQry.FieldByName(FeldName).AsInteger + 1;
GlobaleQry.Close;
end;
In dieser Funktion wird der
SQL zusammengebaut.
Delphi-Quellcode:
function TDataModul.NaechsteNummerErmitteln(Tabelle, FeldName, BedingungsFeld, BedingungsWert: String; BedingungsFeldIsString: Boolean = False): Integer;
begin
if BedingungsFeldIsString then
Bedingungswert := '''' + Bedingungswert + '''';
result := NaechsteNummerErmitteln('Select max(' + FeldName + ') NUMM from ' + Tabelle
+ ' where ' + BedingungsFeld + ' = ' + BedingungsWert,
'NUMM');
end;
Somit kannst Du nun anfangen, die Nummern zu ermitteln.
Delphi-Quellcode:
procedure TFormIrgendo.RechnungTblAfterInsert....
begin
...
DataModul.RechnungTblPositionsnummer.AsInteger :=
NaechsteNummerErmitteln('Rechnung', 'Positionsnummer', 'Rechnungsnummer', RechnungTblRechnungsnummer.AsInteger);
...
end;
Mittlerweile bin ich bei fünf Funktionen, die sich mit der Ermittlung der nächsten fortlaufenden Nummer und der Ermittlung von Lücken befassen.
Ist also quasi ausgereift.