Hallo zusammen,
ich habe mal wieder ein Problem, von dem ich absolut nicht verstehe, wo es herkommt bzw. wie ich es umgehen kann.
Ich greife mit Delphi 7 über die
BDE auf eine Datenbank auf einem
MSSQL-Server 2019 (v15.0.4326.1) zu.
Der Zugriff erfolgt über den MS
ODBC-Treiber v18.3 und über die
BDE 5.2.0.2
Im Treiber und am Datebank-Eintrag sind bereits "BLOBS TO CACHE" auf 512 und "BLOB SIZE" auf 256 gestellt.
Ich habe eine Form, auf der Datenbankinhalte einer Master-Tabelle (Angebotsdaten) angezeigt und editiert werden können.
Auf dieser Maske ist auch ein DBGrid, in dem Datensätze aus der Detail-Tabelle (Angebotspositionen) angezeigt und teilw. editiert werden können.
In der Detail-Tabelle sind neben den üblichen Preisinformationen (Einzelpreis, Anzahl, Rabatt etc.) und der Positionsnummer auch der Positionstext enthalten.
Dieser ist ein VARCHAR mit 2048 Zeichen.
Damit dieser potentiell lange Text nicht in der Tabelle angezeigt und editiert werden muss, selektiere ich für die Tabelle die ersten 254 Zeichen - das habe ich sowohl als Datenbank-View als auch direkt als
SQL-Statement
Code:
CONVERT( VARCHAR(254), LEFT([Text], 254), 0 ) AS [Text_kurz]
im Code versucht.
Die entsprechende Grid-Spalte ist dann als TStringField definiert und auf ReadOnly gesetzt.
Auf der Maske selber ist für die Editierung der Spalte dann noch ein TDBMemo-Feld mit Bezug zu der vollständigen "[Text]"-Spalte...
Beim Öffnen eines Angebots wird zuerst die Mastertabelle über ein TQuery ("Head") mit der angeg. Angebots-ID geöffnet und dann die Detail-Datensätze (ebenfalls ein TQuery "Tail") ebenfalls mit der Angebots-ID geöffnet; dann wird auf die letzte Position positioniert ("Tail.Last()").
Soweit funktioniert alles und sowohl im Grid als auch auf der Maske wird der Text / der verkürzte Text angezeigt.
Beide Queries sind auf
Code:
AutoCalcFields=false, CachedUpdates=True, RequestLive=False, UpdateMode=upWhereKeyOnly
eingestellt; beide haben ein UpdateObject gesetzt, in deren
SQL-Statements die Pseudo-Spalte [Text_kurz] nicht verwendet wird.
Da auf der Maske (und im Masterdatensatz) die Gesamtpreise zu sehen sind, muss ich bei jeder Änderung einer Position oder beim Hinzufügen einer neuen Position die Preise neu zusammenrechnen.
Hierzu ist beim Tail-Datensatz eine Event-Methode bei
hinterlegt.
Diese wird aufgerufen und soll dann über eine Schleife die Positionsdatensätze mit
Delphi-Quellcode:
Tail.DisableControls();
Tail.First();
while ( NOT Tail.EOF ) do begin
...
Tail.Next();
end;
Tai.EnableControls();
durchlaufen und die Preise zusammenrechnen.
Sobald ich im Grid anfange zu editieren und dann das Grid verlassen wird, wird auch die Methode aufgerufen.
Blöderweise kommt schon in der o.a. Zeile "Tail.First()" die
Exception "Invalid BLOB
handle in record buffer" - und zwar auch dann, wenn am Text überhaupt nichts verändert wurde!
Aber warum? Beim Einlesen der Datensätze funktioniert doch auch alles?
Warum kommt diese Meldung dann nach dem Editieren?
Und was kann ich dagegen machen?
Oder: kann ich vielleicht die Preise direkt aus den entsprechenden Grid-Spalten auslesen ohne über das TQuery zu wandern?
Ich bin etwas ratlos gerade...
Übrigens: in meinen Test-Positionen (100 Stück) ist die Text-Länge zw. 130 und 142 Zeichen lang - also weit davon entfernt, abgeschnitten zu werden...