Autor Beitrag
MisterBum
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 107



BeitragVerfasst: Fr 05.08.05 15:25 
Hallo,
ich habe einen unerklärlichen Fehler. Mit dem unteren Code wird ein DBGrid durch anklicken der entsprechenden Spalte sortiert. Beim ersten Click klappt alles wunderbar, beim zweiten Mal ist der Wert in Column.FieldName noch OK in erster Zeile, geht aber dann plötzlich bei if Column.FieldName<>... verloren, das heisst es steht nix mehr drin und es kommen Zugriffsverletzungen

ausblenden volle Höhe Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
33:
34:
35:
36:
37:
38:
39:
40:
41:
42:
43:
44:
45:
46:
47:
48:
49:
50:
51:
52:
53:
54:
55:
56:
57:
58:
59:
60:
procedure TFormMain.DBGrid1TitleClick(Column: TColumn);
var Tabelle: string;
  i: integer;
begin
  //sonst kommen unschöne Meldungen
  if Column.FieldName = '' then  //hier Wert noch OK
    exit;

  Datenbank.ADOQueryKASuchen.SQL.Clear;

  if Column.FieldName <> sSortColumn then  //hier ist der Wert plötzlich weg
  begin
    sSortColumn := Column.FieldName;
  end
  else
  begin
    bSortOrder := not bSortOrder;
  end;

  if ComboBox2.ItemIndex = 0 then
  begin
    Tabelle := 'Kunden';
    Datenbank.ADOQueryKASuchen.Datasource := Datenbank.DatasourceKunden;
  end;
  if ComboBox2.ItemIndex = 1 then
  begin
    Tabelle := 'Artikel';
    Datenbank.ADOQueryKASuchen.Datasource := Datenbank.DatasourceArtikel;
  end;
  if ComboBox2.ItemIndex = 2 then
  begin
    Tabelle := 'PLZ';
    Datenbank.ADOQueryKASuchen.Datasource := Datenbank.DatasourcePLZ;
  end;
  if ComboBox2.ItemIndex = 3 then
  begin
    Tabelle := 'BLZ';
    Datenbank.ADOQueryKASuchen.Datasource := Datenbank.DatasourceBLZ;
  end;

  Datenbank.ADOQueryKASuchen.Close;

  if bSortOrder then
  begin
    Datenbank.ADOQueryKASuchen.SQL.Add('SELECT * FROM ' + Tabelle + ' ORDER BY ' + sSortColumn);
  end
  else
  begin
    Datenbank.ADOQueryKASuchen.SQL.Add('SELECT * FROM ' + Tabelle + ' ORDER BY ' + sSortColumn + ' DESC');
  end;

  Datenbank.ADOQueryKASuchen.Open;
  DBGrid1.DataSource := Datenbank.DataSourceKASuchen;
  SetGridColumnWidths(DBGrid1);

  //Farbe noch setzen
  for i := 0 to DBGrid1.Columns.Count - 1 do
    DBGrid1.Columns.Items[i].Color := clwhite;
  //Column.Color := claqua;
end;



Ich bitte um eure Hilfe!!!

Gruß und Dank

MisterBum
MisterBum Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 107



BeitragVerfasst: Fr 05.08.05 15:33 
Wenn ich mir den Variableninhalt anzeigen lassen über die Ausdrücke im DebugModus, dann steht da: Auf Variable Column kann wegen Optimierung nicht zugegriffen werden

Was heist das???
AndyB
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 1173
Erhaltene Danke: 14


RAD Studio XE2
BeitragVerfasst: Fr 05.08.05 16:16 
Zitat:
ausblenden Delphi-Quelltext
1:
Datenbank.ADOQueryKASuchen.SQL.Clear;					

Damit wird automatisch die Query geschlossen/geleert wodurch das DBGrid aktualisiert wird und somit nichts mehr enthält.

_________________
Ist Zeit wirklich Geld?
MisterBum Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 107



BeitragVerfasst: Fr 05.08.05 16:33 
In einer anderen Unit funzt es mit folgendem Code: Warum?

ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
inherited;
  Datenbank.ADOQueryAuftraegeSuchen.SQL.Clear;
  if Column.FieldName <> sSortColumn then
  begin
    sSortColumn := Column.FieldName;
  end
  else
  begin
    bSortOrder := not bSortOrder;
  end;
  Datenbank.ADOQueryAuftraegeSuchen.Close;
  if bSortOrder then
  begin
    Datenbank.ADOQueryAuftraegeSuchen.SQL.Add('SELECT * FROM AUFTRAEGE ORDER BY ' + sSortColumn);
  end
  else
  begin
    Datenbank.ADOQueryAuftraegeSuchen.SQL.Add('SELECT * FROM AUFTRAEGE ORDER BY ' + sSortColumn + ' DESC');
  end;
  DBGrid1.DataSource := Datenbank.DataSourceAuftraegeSuchen;
  DBNavigator1.DataSource := DBGrid1.DataSource;
  Datenbank.ADOQueryAuftraegeSuchen.Open;
  SetGridColumnWidths(DBGrid1);

  for i := 0 to DBGrid1.Columns.Count - 1 do
    DBGrid1.Columns.Items[i].Color := clwhite;
  Column.Color := claqua;
AndyB
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 1173
Erhaltene Danke: 14


RAD Studio XE2
BeitragVerfasst: Fr 05.08.05 17:10 
Vielleicht ist das Grid ja mit einem anderen Query oder Table verbunden, oder vielleicht wird da irgendwo mittels PostMessage die Änderung weitergegeben.
Jedenfalls schließt das ADOQuery beim Ändern der SQL-Eigenschaft automatisch die Query.

ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
procedure TADOQuery.QueryChanged(Sender: TObject);
begin
  if not (csLoading in ComponentState) then
    Close;
...
end;


Die einfachste Methode wäre sich den FieldName vor dem Ändern in eine lokale Variable zu retten.

_________________
Ist Zeit wirklich Geld?
MisterBum Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 107



BeitragVerfasst: Fr 05.08.05 19:50 
Das hatte ich auch schon versucht.

z.B:

ausblenden Delphi-Quelltext
1:
2:
3:
var Merker: TColumn;

Merker:= Column;


aber auch dabei wird Merker gelöscht!

Alles sehr merkwürdig! Wie bekäme ich die den in String als Datentyp???
LigH
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 239

Win98SE, Win2000SP4
D7
BeitragVerfasst: Fr 05.08.05 19:58 
Du solst dir ja auch nur den Namen merken, nicht den Verweis auf die gesamte Spalte!

ausblenden Delphi-Quelltext
1:
2:
3:
var Merker: String;   

Merker := Column.Name;

__

Oder noch 'ne ganz andere Idee:

Ist es ihnaltlich wirklich notwendig, die SQL-Query so früh schon zu leeren? Kann es nicht auch erst später passieren, kurz vor dem Close vielleicht?
AndyB
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 1173
Erhaltene Danke: 14


RAD Studio XE2
BeitragVerfasst: Fr 05.08.05 20:27 
Also ich persönlich nutze immer SQL.Text statt SQL.Clear und dann SQL.Add. Das ist zum einen viel Handlicher und und zum anderen erschlägt es das Clear und Add auf einmal.

_________________
Ist Zeit wirklich Geld?
LigH
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 239

Win98SE, Win2000SP4
D7
BeitragVerfasst: Fr 05.08.05 20:56 
Das mag bei einfachen Anfragen auch effizienter sein.

Wenn ich mir aber eine Anfrage aus Einzelteilen zusammenbasteln muss (z.B. eine Such-Query, in der man nach mehreren Feldern nach Belieben suchen darf), also Teile der Anfrage nur unter bestimmten Bedingungen eingefügt werden, dann kann das "SQL.Add" sinnvoller sein. Gerade wenn man auch noch fein ordentlich mit :Parametern arbeitet.

Immer je nach Bedarf...
MisterBum Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 107



BeitragVerfasst: Mo 08.08.05 14:43 
Danke, funzt jetzt!!!

Hier meine Lösung:

ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
var Merker: integer;
Merker := Column.Index;
//hier weiterer Code
for i := 0 to DBGrid1.Columns.Count - 1 do
    DBGrid1.Columns.Items[i].Color := clwhite;
  DBGrid1.Columns[Merker].Color := claqua;