UGrohne hat folgendes geschrieben: |
Erstmal die Frage: Wieso geht es nicht anders als per IBQuery. Versuch mal auf eine Stored Procedure umzustellen, könnte evtl. einfacher sein und Dein Problem vielleicht gleich mit lösen. |
Hallo zusammen,
prinzipiell wäre mir das auch lieber, aber da es eine Fremddatenbank ist, die ich von der Struktur nicht verändern kann bzw. soll, kann ich halt eben nur mit Abfragen den zur Zeit höchsten Wert ermitteln. Ob es dann unbedingt eine IBQuery sein muss ist euigentlich egal, ich könnte sicherlich genau so gut ein IBDataSet nehmen. Nur StoredProcedures und auch Generatoren scheiden aus.
Man muss sich die Tabelle etwa so vorstellen, neben vielen anderen Spalten gibt es eine Spalte für due Auftragsnummer und eine Spalte für die Positionsnummer innerhalb des Auftrages. Wenn nun nachträglich Positionen hinzugefügt werden sollen, muss ich ja für den Auftrag wissen, welche Positionsnummer zur Zeit maximal vergeben wurde. Aus diesem Grund habe ich mir folgende funktion geschrieben:
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12:
| function GetNewPos(Auftragsnummer: Integer): Integer; begin with DataModuleX.IBQueryFunktionen do begin SQL.Clear; SQL.Add('SELECT MAX(POSITION) AS MAXPOS FROM DOKUMENT ' + 'WHERE AUFTRAG = ' + IntToStr(Auftragsnummer)); Active := True; Result := FieldValues['MAXPOS'] + 1; Active := False; end; end; |
So weit so gut. Diese neue (korrekte) Nummer wird nun mit Hilfe einer anderen Funktion dann mit der Eintragung der neuen Postion verwendet. Am Anfang wird dabei die Transaction gestartet, die Kopieraktion bzw. Einfügeaktion durchgeführt und die Transaction commited.
Das klappt auch noch, ich kann diesen neuen Datensatz mit der Originalapplikation auch schon sehen und bearbeiten. Demnach sind die Daten wohl auch gespeichert.
Möchte ich nun aber die nächtse Postition einfüge, gibt es wieder die gleiche Positionsnummer zurück wie bei dem ersten Versuch. Beende ich aber zwischendurch das Programm, klappt alles einwandfrei.
Deinen Tipp, Uwe, werde ich aber gleich gerne mal ausprobieren, wenn ich die Einstellungen finde ...
Herzlichen Dank
Und noch ein Nachtrag: Ich habe das Problem zwar nicht lösen können, aber nach Studium der vorgegebenen Datenstruktur, zu der ich leider keine Doku habe, habe ich gefunden, dass der Maximalwert in einer der vielen Tabellen zwischengespeichert ist, also keine StoredProcedure, Trigger oder Generatoren.
Trotzdem Euch allen einen herzlichen Dank!