Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Datenbanken (https://www.delphipraxis.net/15-datenbanken/)
-   -   Delphi nächste Auftragsnummer ermitteln? (https://www.delphipraxis.net/137056-naechste-auftragsnummer-ermitteln.html)

PASST 13. Jul 2009 13:25

Datenbank: ADS • Version: 9.10 • Zugriff über: ADO

nächste Auftragsnummer ermitteln?
 
Hallo allerseits,

ich möchte mit Delphi eine Schnittstelle zu einem Clipper/xBase-Programm schreiben. Diese Schnittstelle soll neue Aufträge zu den bestehenden Aufträgen erzeugen.

Beim Erzeugen einer neuen Auftragsnummer komme ich in einen Konflikt mit dem bisherigen Auftragsprogramm. Das Alt-Programm hat eine eigene Tabelle, in der die nächste zur Verfügung stehende Auftragsnummer gespeichert ist. Wenn das Alt-Programm einen neuen Auftrag schreibt, so sperrt es diesen Datensatz, liest das Feld 'Auftragsnummer', erhöht den Wert für Auftragsnr um +1, speichert den Datensatz und gibt ihn wieder frei.

Wie kann ich dies aber mit SQL abbilden, wenn ich vermeiden will, dass parallel das Alt-Programm auf diese Daten schreibt?

Dies sind zwei Arbeitsschritte, in denen das Alt-Programm genau dazwischen funken kann.
SQL-Code:
Select [auftragsnr] From Basis_Tabelle
// und //
Update Basis_Tabelle
Set [auftragsnr] = [auftragsnr] + 1
Hat jemand eine Idee?

Gruß,
Peter

jfheins 13. Jul 2009 13:39

Re: nächste Auftragsnummer ermitteln?
 
Es könnte helfen, wenn du die beiden Queries in eine Transaction packst :gruebel:

hoika 13. Jul 2009 13:53

Re: nächste Auftragsnummer ermitteln?
 
Hallo,

das Clipper/XBase benutzt ja wohl eine DBF-Tabelle (grusel ;) ).

So schlimm es ist,
nimm den gleichen Algorithmus wie das Alt-Programm.

Table: TTable (oder TDBFTable, du schreibst nichts über Zugriff auf das Alt-Programm)

Delphi-Quellcode:
with Table do
begin
 // Datensatz suchen
  SetKey;
  FieldByName('XX').AsInteger:= xx;
  if GotoKey then
  begin
    try
      Edit; // hier wird auf Satzebene im Dateisystem gesperrt

      iNextNo:= FieldByName('NextNo').AsInteger;
      FieldByName('NextNo').AsInteger:= iNextNo+1;
     
      Post; // Speichern
   
      FlushBuffers(Handle); // "richtig" speichern
    except
     // Sperrung fehlgeschlagen
      Exit;
    end;
  end;

Heiko

PASST 13. Jul 2009 14:05

Re: nächste Auftragsnummer ermitteln?
 
@hoika
Auf die Idee hätte ich auch kommen können...


Alle Zeitangaben in WEZ +1. Es ist jetzt 09:16 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