Problem mit TSQLQuery und TDBGrid

Für Themen zu Datenbanken und Zugriff auf diese. Auch für Datenbankkomponenten.
Antworten
dl5eu
Beiträge: 33
Registriert: Do 12. Sep 2013, 12:40

Problem mit TSQLQuery und TDBGrid

Beitrag von dl5eu »

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

baumina
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

Beitrag von baumina »

Interessant wäre der Quellcode, den du benutzt um umzusortieren.
.

dl5eu
Beiträge: 33
Registriert: Do 12. Sep 2013, 12:40

Re: Problem mit TSQLQuery und TDBGrid

Beitrag von dl5eu »

Hallo baumina,

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;
Grüße,

Ralf
Zuletzt geändert von Lori am So 9. Mär 2014, 16:37, insgesamt 1-mal geändert.
Grund: Highlighter

Antworten