Daten in einem DBGrid sortieren



  • Hallo liebe C++ Gemeinde,

    1. Wie kann ich die Daten in einem DBGrid sortieren ? (via klick auf den Spaltennamen gehts irgentwie nicht)

    Tip: Das Builder Tutorial (http://bcb-tutorial.c-plusplus.net/Datenbanken1/index.html) kann ich nur jedem empfehlen der mit Datenbanken und dem CBuilder arbeiten möchte.

    Grüße
    TheGeek



  • Hallo,

    Das mit dem Klick auf den Spaltenkopf mußt du schon selber implementieren. Das Sortieren machst du bei der Datenbankabfrage. Falls du eine Query nutzt einfach mit dem zugehörigen SQL-Befehl ORDER BY
    Bei TTable geht das, glaube ich über IndexFields und DefaultIndex. Genau weiß ich das aber nicht.
    Du solltest sowieso TTable nicht verwenden sondern statt dessen lieber TQuery.



  • Du solltest sowieso TTable nicht verwenden sondern statt dessen lieber TQuery

    Warum das ?

    Hab grade mal mit TQuery herumgespielt ... aber leider werden irgentwie keine Daten angezeigt. oO
    Funkionieren die SQL befehle auch mit einer Paradox DB ?



  • Hallo

    Warum das ?

    Weil TTable alt, langsam und starr ist

    aber leider werden irgentwie keine Daten angezeigt

    Du must erst eine SQL-Anweisung zuweisen und ausführen lassen.

    Funkionieren die SQL befehle auch mit einer Paradox DB

    Ja

    bis bald
    akari



  • Hallo,

    ich bin an der gleichen Sache dran, möchte aber nicht mit TQuery arbeiten, weil das viel zu aufwendig für mein Vorhaben ist, wie kann ich denn genau über TTable die Werte sortieren.

    Hab mit IndexFieldsNames probiert, jedoch zeigt er dann überhaupt keine Daten mehr an, hab da einen zweiten Schlüssel angelegt, und erstelle eine Verknüpfung über dieses Feld zur anderen Tabelle. So verschwindet auch gleichzeitig mein Eintrag aus dem IndexName, sobald ich was in IndexFieldNames aufnehme....

    Gruss,
    chullain



  • TQuery ist kein bischen aufwendiger als TTable. Auch die Umstellung ist problemlos. Einfach nur ein TQuery-Objekt auf dein Formular ziehen, die Verknüpfung zur Datenbank und im DBGrid eintragen, dann noch den Select-Befehl in SQL der TQuery eintragen, fertig.



  • ok, aber wenn ich anfange, Daten neu aufzunehmen bzw. zu verändern, dann wird es schwierig, ich muss extra für Felder anlegen, die abgefragt werden müssen, um dann manuell ein SQL-Statement aufzusetzen, der mir diese Änderungen durchführt...

    Gruss,
    chullain



  • Hey chullain ich sag nur nimm TQuery. Mhh von wegen aufwändig ... nach 5-10 minuten rumspielen hab ichs rausbekommen (db abfragen, daten speichern, usw)

    Was mich auch gleich zu meiner frage bringt:

    Query1->Active = 0;
    Query1->SQL->Clear();
    
    Query1->SQL->Add("select Name,Vorname,Straße from Adressen Where ID = 1");
    
    for(int i=2;i<=<???>;i++)
    {
    Query1->SQL->Add("OR ID = "+IntToStr(i)+"");
    }
    
    Query1->ExecSQL();
    
    Query1->Active = 1;
    

    Hier seht man wie ich eine DB in einer Schleife abfrage ... Wie kann ich die gesammtzahl aller Records einer DB abfragen ? Mit Query1->RecordCount kann man zwar den Count abfragen aber es wird nur die nr ausgegeben die im Grid landet 😕

    Frage No.2:
    Wie kann ich den Namen der Spalte herausbekommen die ich im DBGrid angeklickt habe ? (um eine Sortierung via Sql befehle zu ermöglichen)

    Frage No.3:
    Kann man das verschieben der Spalten abschalten ? Habe zwar einen eintrag in den Eigenschaften des Grids gefunden doch der unterbindet leider auch das Editieren der Eintrage. -.-

    Danke
    TheGeek



  • zu 1:
    Am besten wohl in einem eigenen Select Statement. Dafür gibt es die SQL-Funktion COUNT.

    zu 2.
    Im Ereignis OnTitleClick des DBGrids wird die eine TColumn-Referenz übergeben. Den tatsächlichen Feldnamen kannst Du dann mit Column->FieldName ermitteln.

    zu 3.
    Schau Dir mal die Eigenschaft TDBGrid::Options an. Dort insbesondere dgColumnResize.

    Deinen Sourcecode lasse ich mal unkommentiert, aber der ist komplett falsch, egal was Du damit erreichen wolltest...
    Wenn Du die Anzahl der Datensätze herausfinden wolltest, sollte das wohl eher so aussehen:

    if (Query1->Active)
       Query1->Close();
    Query1->SQL->Text = "SELECT COUNT (*) AS AnzahlRecords FROM Adressen
    Query1->Open();
    


    Wenn dein Grid nicht alle Daten enthalten soll nimm eine Hilfsquery. D.h., leg ein zweites TQuery-Objekt auf dein Formular, welches du nicht mit dem Grid verbindest. Dann mach dort ein Select auf die gesamte Datenmenge
    "select * from Adressen"
    Dann kannst du RecordCount dieser Hilfsquery abfragen.
    2.
    Nimm OnCellClick. Da gibt es einen Parameter namens Column. Hier wiederum gibt es die membervariable FieldName
    3.
    Was hast du probiert? Ansich müßte das Abschalten von dgColumnResize bei Options im DBGrid funktionieren.

    [edit]Zu spät und 1. auch zu umständlich. Da ist deine methode besser Joe 🙂 [edit]



  • Deinen Sourcecode lasse ich mal unkommentiert, aber der ist komplett falsch, egal was Du damit erreichen wolltest...

    Ja okay ich geb zu das der code jetzt nicht super geistiges potential aufweißt ... ich hab den hier schnell aus dem kopf von arbeit aus ohne cbuilder getippt 😉

    Aber danke erstmal an Joe_M. & Braunstein für die netten antworten / hilfestellungen.

    Beste Grüße
    TheGeek



  • Das hat mit geistigem Potential nichts zu tun. Sieht für mich eher nach typischen Anfängerfehlern aus - und wir haben alle mal angefangen. Hauptsache, Du lernst etwas daraus. 😉



  • Ja hier im C++ Forum lernt man ja immer etwas !

    Soweit funkioniert auch das Sortieren ... aber mir ist aufgefallen das sobalt ich das "order by" statement verwende (egal ob via quelltext oder in der Sqlquery) ich die daten nicht mehr Bearbeiten kann 😢

    Wie kann ich das verhindern das nachdem ich die Daten Sortiert hab diese nicht mehr editierbar (zb über ein DBgrid) sind.

    Danke
    TheGeek



  • Hallo

    Hast du TQuery::RequestLive auf true?

    bis bald
    akari



  • ja RequestLive steht auf true
    (sry hat ich vergessen zu erwähnen)



  • Hallo

    BCB-Hilfe zu RequestLive schrieb:

    Der Wert true für RequestLive ist nur eine Anforderung auf eine aktualisierbare Ergebnismenge. Er garantiert nicht, daß die Datenbank tatsächlich eine aktualisierbare Ergebnismenge zurückgibt. In der Dokumentation zu Ihrem spezifischen Datenbanksystem finden Sie die Kriterien, die für eine aktualisierbare (live) Ergenismenge erforderlich sind.

    Wenn also nach dem OrderBy die Datenmenge selber nicht mehr bearbeitbar ist, kannst du nichts machen und must ein anderes Eingabekonzept aufbauen.

    bis bald
    akari



  • Mhh komisch ... hab hier eine kleine ParadoxDatenbank mit 5 Datensätzen (zum testen) die ich wie im tut erstellt habe.

    Sollte ich also nicht ein DBgrid verwenden um daten zu sortieren / zu bearbeiten ?
    Zu welchem Eingabekonzept könnt ihr mir raten ?



  • Hallo

    Sollte ich also nicht ein DBgrid verwenden um daten zu sortieren

    Doch

    Sollte ich also nicht ein DBgrid verwenden um daten zu bearbeiten

    Nein. Du hast ja gesehen das sortierte Datensätze nicht mehr bearbeitet werden können.

    Du must also zusätzlich zu der sortierten Anzeige noch eine extra Eingabemaske anbieten, wo jedes Feld extra in einem passenden Control zu bearbeiten ist. Entweder machst du das manuell mittels gewöhnlicher Standardcontrols und erledigst die Einfügeoperation mittels SQL-Kommando Insert, oder du verwendest ein zweites TTable/TDataSource-Konstrukt und die DB-Controls. Das erste ist dabei vorzuziehen.

    Die Verknüpfung zwischen Auswahl (DBGrid) und den Eingabecontrols machst du über den Event TDataSource::OnDataSource des Datasource, das mit der Anzeige-Abfrage verbunden ist.

    bis bald
    akari



  • Danke akari für die Ausführliche Antwort.


Log in to reply