Autor Beitrag
Truskawka
Hält's aus hier
Beiträge: 7

Win XP, Win 2003 Server
Delphi 7 Ent.
BeitragVerfasst: Do 01.12.05 01:13 
Hallo zusammen,

ich suche nun schon seit einiger Zeit den Fehler in meinem Code, kann ihn aber nicht finden. Eventuelkl liegt es ja an der Uhrzeit ;-((

Die Sache ist folgende

Ich hole mir für eine Positionsnummer zu einem Auftrag die nächste freie Positionsnummer per IBQuery, da es hier mit Hilfe eines Generators nicht geht.
Anschließend Kopieren ich einen Datensatz mit IBSQL und verändere beim Kopieren einige Einträge in den Spalten.
Nun wird auch ein COMMIT aufgerufen
Hole ich mir nun wieder eine neue Positionsnummer wie oben, bekomme ich auch die gleiche Nummer wie oben. Was ja nicht sein kann.

Woran kann es noch liegen?

Im Moment sehe ich den Wald vor lauter Bäumen nicht mehr.

Gruß
Truskawka


Zuletzt bearbeitet von Truskawka am Do 01.12.05 09:49, insgesamt 1-mal bearbeitet
UGrohne
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Veteran
Beiträge: 5502
Erhaltene Danke: 220

Windows 8 , Server 2012
D7 Pro, VS.NET 2012 (C#)
BeitragVerfasst: Do 01.12.05 02:09 
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.

Weiterhin: Wahrscheinlich stimmen bei Dir die Transaktionseinstellungen nicht so ganz. Wenn Du einen Commit machst und dann trotzdem noch alte Daten bekommst, solltest Du die Transaktion auf Committed lesen einstellen, dann könnte sich dein Problem evtl. lösen.
hansa
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 3079
Erhaltene Danke: 9



BeitragVerfasst: Do 01.12.05 02:17 
user profile iconTruskawka hat folgendes geschrieben:
Ich hole mir für eine Positionsnummer zu einem Auftrag die nächste freie Positionsnummer per IBQuery, da es hier mit Hilfe eines Generators nicht geht.
Anschließend Kopieren ich einen Datensatz mit IBSQL und verändere beim Kopieren einige Einträge in den Spalten.
Nun wird auch ein COMMIT aufgerufen


Der Generator macht schon mal gar nichts, was soll der denn machen ? Der kann nichts, außer eine Zahl zu speichern. 8) Was wird wozu von wo nach wo kopiert ? Warum ein IBQuery statt eines allgemein üblichen DataSets ? Fragen über Fragen. Mit Commit hat das nicht viel zu tun. Ich vermute, daß das lediglich gar nix macht. :mrgreen:

[Edit] Ihr müßt euch auch mal einen roten Kasten zulegen. :lol: Das mit stored Procedure ist ein guter Tip, aber von der Transaktionssteuerung würde ich vorerst die Finger weg lassen. Das liegt sicherlich nicht daran.

_________________
Gruß
Hansa
UGrohne
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Veteran
Beiträge: 5502
Erhaltene Danke: 220

Windows 8 , Server 2012
D7 Pro, VS.NET 2012 (C#)
BeitragVerfasst: Do 01.12.05 04:22 
user profile iconhansa hat folgendes geschrieben:
[Edit] Ihr müßt euch auch mal einen roten Kasten zulegen. :lol: Das mit stored Procedure ist ein guter Tip, aber von der Transaktionssteuerung würde ich vorerst die Finger weg lassen. Das liegt sicherlich nicht daran.

Da wäre ich mir nicht so sicher. Denn wenn er für jedes Query eine eigene Transaktion verwendet, dann sind die bei der Standard-Einstellung unabhängig voneinander. Du hast dann also einen Schnappschuss und liest nicht read committed.

Aber um das zu sagen, haben wir hier zu wenig Code (*winkmitdemzaunpfahl*)
hansa
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 3079
Erhaltene Danke: 9



BeitragVerfasst: Do 01.12.05 05:12 
user profile iconUGrohne hat folgendes geschrieben:
Denn wenn er für jedes Query eine eigene Transaktion verwendet, dann sind die bei der Standard-Einstellung unabhängig voneinander...


Oh je, dann bräuchte ich hier mind. 80 Transactions, sofern mit Query ein Dataset gemeint ist. :shock: Würde ich sowieso zuerst mal umstellen. Und das ist nicht im Sinne des Efinders ! Transactions heißt alles oder nichts. Nur wo landet man bei 80 verschiedenen ? Was ist wo alles und was wo nichts ? Im Endeffekt wird dadurch das komplette Transactions-System ausgehebelt. Mehr als 2 Transactions (also für Lesen und Schreiben) ist unnötig und das macht auch keiner. Wenn so was gemacht wird, dann tauchen solche Effekte auf.

Der Fehler liegt ganz woanders. Und der Generator koann ohne Trigger so nicht gehen. Ja schon richtig : (*winkAUCHmitdemzaunpfahl*)

_________________
Gruß
Hansa
UGrohne
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Veteran
Beiträge: 5502
Erhaltene Danke: 220

Windows 8 , Server 2012
D7 Pro, VS.NET 2012 (C#)
BeitragVerfasst: Do 01.12.05 05:30 
user profile iconhansa hat folgendes geschrieben:
Oh je, dann bräuchte ich hier mind. 80 Transactions, sofern mit Query ein Dataset gemeint ist. :shock: Würde ich sowieso zuerst mal umstellen. Und das ist nicht im Sinne des Efinders ! Transactions heißt alles oder nichts. Nur wo landet man bei 80 verschiedenen ? Was ist wo alles und was wo nichts ? Im Endeffekt wird dadurch das komplette Transactions-System ausgehebelt. Mehr als 2 Transactions (also für Lesen und Schreiben) ist unnötig und das macht auch keiner. Wenn so was gemacht wird, dann tauchen solche Effekte auf.

Es gibt Gründe für mehrere Transaktionen, nicht nur Lesen und Schreiben, also sag nicht, dass das keiner machen würde. Man kann genausogut sagen: Mehr als 12 Datasets/Queries machen keinen Sinn, schließlich habe ich in meiner Anwendung auch nicht mehr und klein ist die auch nicht wirklich ... :roll: ... und btw: Ich hab auch mehr als 2 Transactions ...
Je nach Aufbau der Anwendung könnten mehrere parallele Stränge laufen (das muss nicht heißen, dass es mehrere Threads gibt!). WIr kennen den Aufbau und die Funktion seiner Anwendung überhaupt nicht, daher sage ich ja: Ein wenig Beschreibung und Code müssen her.

user profile iconhansa hat folgendes geschrieben:
Der Fehler liegt ganz woanders. Und der Generator koann ohne Trigger so nicht gehen. Ja schon richtig : (*winkAUCHmitdemzaunpfahl*)

Wir kennen ja den Grund nicht, warum er Generatoren nicht verwenden kann ... oder meint nicht verwenden zu können ...
Lemmy
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 792
Erhaltene Danke: 49

Windows 7 / 10; CentOS 7; LinuxMint
Delphi 7-XE10.1, VS 2015
BeitragVerfasst: Do 01.12.05 08:03 
Hi,

Transaktionen hin oder her, wie wird denn die nächste ID ermittelt, wenn hier kein Generator verwendet wird?

Übrigends: Generatoren sind in FB/IB transaktionsunabhängig, sonst würden sie keine eindeutigen IDs zurückliefern können...

Lemmy

P.S.: Wenn Du die ID über

ausblenden SQL-Anweisung
1:
Select max (ID) from Irgendwas					


holst, sollte Dir klar sein, dass das irgendwann zu Problemen führt.
Truskawka Threadstarter
Hält's aus hier
Beiträge: 7

Win XP, Win 2003 Server
Delphi 7 Ent.
BeitragVerfasst: Do 01.12.05 10:44 
user profile iconUGrohne 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:
ausblenden 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!
Lemmy
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 792
Erhaltene Danke: 49

Windows 7 / 10; CentOS 7; LinuxMint
Delphi 7-XE10.1, VS 2015
BeitragVerfasst: Do 01.12.05 13:36 
Hi,

erst mal mein Beileid!


Ein kleiner Tipp: Hat die QUery/DataSet mit dem Du den Datensatz einfügst, die selbe Transaction-Komponente zugewiesen wie die Query/DataSet mit der Du die Nummer abfrägst? Wenn nicht, dann kann das nur dann funktionieren, wenn nach dem Einfügen beide Transaktionen beendet und neu gestartet wurden!

Lemmy
UGrohne
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Veteran
Beiträge: 5502
Erhaltene Danke: 220

Windows 8 , Server 2012
D7 Pro, VS.NET 2012 (C#)
BeitragVerfasst: Fr 02.12.05 03:37 
user profile iconLemmy hat folgendes geschrieben:
Ein kleiner Tipp: Hat die QUery/DataSet mit dem Du den Datensatz einfügst, die selbe Transaction-Komponente zugewiesen wie die Query/DataSet mit der Du die Nummer abfrägst? Wenn nicht, dann kann das nur dann funktionieren, wenn nach dem Einfügen beide Transaktionen beendet und neu gestartet wurden!

Oder wie oben gesagt entsprechende Transaktionseinstellungen vorgenommen wurden.