Hallo Forum,
ich habe ein Problem mit einer TSQLQuery und der Anzeige der Daten in einem TDBGrid. Um die angezeigten Daten beim Klick auf den Spaltennamen sortieren zu können habe ich auf ein Beispiel zurückgegriffen, das ich im Netz gefunden habe, möglicherweise aus diesem Forum, ich weiß es nicht mehr genau. Das funktioniert auch soweit.
Das Problem ist folgendes: Wenn ich durch Klicken auf den Spaltentitel die Daten sortiere, wird der Query ein entsprechender Index hinzugefügt, die Daten werden sortiert angezeigt, alles ok. Schließe ich jetzt die Query, ändere die WHERE-Bedingung in der SQL-Anweisung und öffne die Query wieder um andere Daten zu lesen, so ist das DBGrid zumindest teilweise leer. Will ich die angezeigten Daten dann wieder durch Klicken auf den Spaltentitel sortieren, erhalte ich oft die Meldung "Projekt xxx hat Exception-Klasse "External: SIGSEGV" ausgelöst". Sortiere ich aber nicht, d.h. hat die Query keine IndexDefs, funktioniert alles bestens.
Ich habe versucht, Query.Updated = false zu setzen und mit Query.Update die Indexe neu aufzubauen aber das hilft nicht. Auch ein Query.IndexDefs.Clear vor dem Schließen bringt mich nicht weiter. Liegt das Problem vielleicht woanders? Irgendetwas in der Kette TSQLQuery - TDataset - TDBGrid stimmt wohl nicht.
Vielleicht weiß ja jemand von Euch wo das Problem liegt?
Die verwendete Lazarus-Version ist 1.0.14 (32-Bit), das OS Windows 7 (32-Bit).
Vielen Dank für Eure Hilfe!
Beste Grüße,
Ralf
Problem mit TSQLQuery und TDBGrid
-
- Beiträge: 152
- Registriert: Mo 3. Feb 2014, 14:07
- OS, Lazarus, FPC: Winux (L 0.9.xy FPC 2.2.z)
- CPU-Target: xxBit
Re: Problem mit TSQLQuery und TDBGrid
Interessant wäre der Quellcode, den du benutzt um umzusortieren.
.
Re: Problem mit TSQLQuery und TDBGrid
Hallo baumina,
hier ist der Code:
Grüße,
Ralf
hier ist der Code:
Code: Alles auswählen
procedure TfrmPersonList.grdPersonListTitleClick(Column: TColumn);
var
AscIndexName, DescIndexName: string;
begin
grdPersonList.Cursor := crHourGlass;
AscIndexName := 'ASC_' + Column.FieldName;
DescIndexName := 'DESC_' + Column.FieldName;
// indexes can't sort binary types such as ftmemo, ftblob
if (Column.Field.DataType in [ftBlob, ftMemo, ftWideMemo]) then
exit;
// check if an ascending index already exists for this column, if not create one
if qryPersonList.IndexDefs.IndexOf(AscIndexName) = -1 then
qryPersonList.AddIndex(AscIndexName, Column.FieldName, []);
// check if a descending index already exists for this column, if not create one
if qryPersonList.IndexDefs.IndexOf(DescIndexName) = -1 then
qryPersonList.AddIndex(DescIndexName, Column.FieldName, [ixDescending]);
// ensure index definitions are up to date
qryPersonList.IndexDefs.Updated := False; {<<<--This line is critical, IndexDefs.Update will not
update if already true, which will happen on the first column sorted.}
qryPersonList.IndexDefs.Update;
// use the column tag to toggle ASC/DESC
Column.Tag := not Column.Tag;
if boolean(Column.Tag) then
begin
Column.Title.ImageIndex := 0;
qryPersonList.IndexName := AscIndexName;
end
else
begin
Column.Title.ImageIndex := 1;
qryPersonList.IndexName := DescIndexName;
end;
//Remove the sort arrow from the previous column
if (FPrevColumn <> nil) and (FPrevColumn <> Column) then
FPrevColumn.Title.ImageIndex := -1;
FPrevColumn := Column;
grdPersonList.Cursor := crDefault;
end;
Ralf
Zuletzt geändert von Lori am So 9. Mär 2014, 16:37, insgesamt 1-mal geändert.
Grund: Highlighter
Grund: Highlighter