DBGrid Spalte sortieren, Spaltenname mit Leerzeichen
-
Hi,
ich möcht in der OnTitleClick-Methode meine DBGrids die Daten nach der angeklickten Spalte sortieren. Das klappt auch, außer der Spaltenname enthält ein Leerzeichen. Dann bekomme ich eine Exception. Folgender Code:
void __fastcall TFrame1::DBGrid1TitleClick(TColumn *Column) { this->ADOQuery1->Sort = "Column Name"; }
ADOQuery liegt dem DBGrid zugrunde. Das ganze kommt zu Stande, weil in der SQL-Syntax vom Query steht:
SELECT ColName AS 'Column Name'
Anführungszeichen helfen leider nix, eckige Klammern oder der ursprüngliche Spaltenname auch nicht. Sonst hab ich nix zu dem Thema gefunden.
-
Hallo
Das sollten sicher Doppelte Hochkommas sein :
SELECT ColName AS "Column Name"
bis bald
akari
-
Nein, sollten es nicht. Und auch wenn, das Problem bleibt das alte...
-
Funktioniert das denn, wenn Du das AS 'Column Name' wegläßt? Falls ja, könnte man den Anzeigenamen doch über die Eigenschaft DisplayName des Feldes anpassen.
Oder funktioniert es, wenn Du in der SELECT-Anweisung ORDER BY ColName ASC anhängst (mal mit und ohne AS 'ColumnName' probieren)?
-
dann versuchs doch anders (ungetestet):
void __fastcall TFrame1::DBGrid1TitleClick(TColumn *Column) { ADOQuery1->Sort = Column->FieldName; }
-
Es funktioniert immer dann, wenn der Name kein Leerzeichen enthält. Also in den folgenden Fällen:
SELECT ColName ... SELECT ColName AS 'ColName' ... SELECT ColName AS 'Col-Name' ...
ORDER BY funktioniert natürlich auch, aber ich möchte ja den geladenen Datensatz umsortieren und ihn nicht jedesmal neu laden.
Linnea schrieb:
dann versuchs doch anders (ungetestet):
void __fastcall TFrame1::DBGrid1TitleClick(TColumn *Column) { ADOQuery1->Sort = Column->FieldName; }
Darauf soll es ja später hinaus laufen bzw. das war mein ursprünglicher Versuch, den ich dann soweit zwerlegt hab, bis ich zur Ursache für die Exception kam
-
es funktioniert so:
ADOQuery1->Sort = "["+Column->FieldName+"]";
und im SQL:
SELECT ColName AS [Column Name] ... SELECT ColName AS 'Column Name' ...
-
Sehr merkwürdig. Trage ich den Namen in eckicgen Klammern direkt dort ein, funktioniert es nicht. Verwende ich deine Schreibweise mit dem Column->FielName, klappts. Weiß nicht warum, aber danke.
-
Ok, da hatte sich noch ein Leerzeichen eingeschlichen. Darum nimmt er meine Handeingabe nicht *ggrrr*
-
Hi Heimelchen,
Tipp von mir: Tu Dir selbst bitte einen Gefallen und lass Leerzeichen und alle Sonderzeichen in Feldnamen weg. Dafür gibts den Unterstrich (ebenso natürlich alle resevierten Worte von SQL).
Wenn Du nur die Buchstaben a-z, den Unterstich und ab der zweiten Stelle die Ziffern 0-9 verwendest umgehst Du einen großen Teil möglicher Stolpersteine.
Die Spaltenüberschriften kannst Du ja trotzdem unabhängig davon anders benennen.Gruß Mümmel
-
Ich verwende Leerzeichen nur, wenn der Anwender was sieht. Hier beispielsweise bei SELECT ColName AS "Column Name". Und ich der Berechnung von "Column Name" wurden versehentlich zwei Leerzeichen in der Mitte eingefügt. Und zum Sortieren muss man leider den Alias verwenden...
-
Auch das ist unnötig, schließlich gibt es bei den Datenfeldern die Eigenschaft DisplayName, respektive DisplayLabel.
-
Joe_M hat recht, das ist viel eleganter!
Im Feldereditor der ADOQuery kannst du die Felder für die Spalten im Grid angeben und dort über DisplayLabel den Anzeigenamen ändern. Hier kannst du auch angeben, welche Spalten gezeigt und welche nicht gezeigt werden
Edit: Ach übrigends immer Size auf die richtige Größe stellen, sonst sieht man nix (manchmal wird da einfach bei Neuerstellung eines Feldes Size auf 0 gesetzt)!
-
Mal abgesehen davon, dass sich die Feldauswahl erst zur Laufzeit entscheidet und damit der Feldeditor flach fällt, ja...
-
den Displayname der einzelnen Spalten kann man auch zu Laufzeit setzen, genau wie die Breite der Spalte
-
er meint die Feldauswahl, denke ich.
aber auch hier kannst du die ausgewählten Felder bei Visible auf true setzen und alle anderen auf false. ich habe das gleiche auch in einem meiner projekte gemacht
-
Um das mal abzuschließen: ja, man kann ja so ziehmlich alles zur Laufzeit tun, das habe ich ja auch gar nicht geleugnet.
Was ich vielmehr meinte ist, dass es für mich vom Aufwand her einfacher ist, einfach die Feldnamen schon in den Query zu schreiben. Dann hab ich alles in einem Abwasch und muss nicht im zweiten Schritt nochmal ran. Mal abgesehen davon, dass in der Abfrage mehrere Spalten den gleichen Namen haben und ich ohnehin die Spalten umbenennen muss, um sie eindeutig zu kennzeichnen.
-
Das sind 15 Minuten Tipparbeit. Wie lange hast Du doch gleich nach dem Fehler gesucht?