Hi,
für die Buchungsnummern würde ich eine eigene Tabelle erzeugen.
Man könnte die Nummer zwar auch im Konto speichern, aber wenn man später die Vergabe z.B. abhängig vom Jahr machen will, baut man wieder um.
Also eine Tabelle Buchungsnummer mit den Feldern KONTO, JAHR, NUMMER.
Im Projekt vor dem Post eine PROCEDURE aufrufen, welche mit den Parametern KONTO, JAHR die Nummer zurück liefert.
Diese Procedure legt auch die Datensätze in BUCHUNGSNUMMER an bzw. zählt die Nummer hoch.
Im Code dann eine Methode GetBuchungsnummer in etwa so (Ist jetzt IBO und Barcode, aber kann man ja anpassen):
Delphi-Quellcode:
function TdmMain.NaechsteBarcodeNummer(ZaehlerId: Variant): string;
Var
I: Integer;
begin
Result := '';
if not spBarcodeNummer.Prepared then
spBarcodeNummer.Prepare;
spBarcodeNummer.Params[0].Value := ZaehlerId;
try
for I := 1 to 10 do
begin
Sleep(500);
try
spBarcodeNummer.ExecProc;
result := spBarcodeNummer.Fields[0].AsString;
spBarcodeNummer.IB_Transaction.Commit;
spBarcodeNummer.Unprepare;
Break;
except
spBarcodeNummer.IB_Transaction.Rollback;
end;
end;
finally
if spBarcodeNummer.Prepared then
spBarcodeNummer.Unprepare;
end;
end;
Bei Lock Konflikt wird eine
Exception ausgelöst und es wird insgesamt 10 mal ausgeführt.
Ich habe das getestet in einee MINI - Anwendung, die nur Nummer geholt hat und habe das mehrmals auf meinem PC gestartet.
Ich habe mehrere 1000 Nummern erzeugt und in einer Liste gespeichert.
Der eine Prozess hatte dann 100, 101, 103, der andere 99, 102, 104.
Ich werde sicher kritisiert wegen der Lösung mit eine stillen
Exception.
Ich hatte es vorher mit einer Transaktion mit LOCK_WAIT getestet, da hatte aber IBO Probleme.
Wichtig, die PROCEDURE muss eine eigene Transaction bekommen und wenn es mit LOCK_WAIT funktioniert, braucht man die Schleife nicht.
Frank