Einzelnen Beitrag anzeigen

Benutzerbild von dataspider
dataspider
Online

Registriert seit: 9. Nov 2003
Ort: 04539 Groitzsch
1.351 Beiträge
 
Delphi 11 Alexandria
 
#25

AW: Wie fortlaufende Nr. in DB-Taballe erzeugen? Generator nicht möglich?

  Alt 8. Nov 2014, 12:38
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
Frank Reim
  Mit Zitat antworten Zitat