Datenbank will nicht sortieren



  • Ich benutze den Code

    m_pSet->m_pDatabase->ExecuteSQL("SELECT * FROM Tabelle ORDER BY Name");
    	m_pSet->Requery();
    

    Die Name solle alphabetisch von A bis Z geordnet werden. Leider funktioniert das nicht ganz und manche Datensaätze werden überschrieben. Bei m_strSort ist es genau das selbe Problem.
    Ich hoffe ihr habt irgendwie Code der mir hilft!!!
    MFG



  • ist das mit den MFC-Datenbanken? lol da hast du was missverstanden^^

    CDatabase::ExecuteSQL setzt einfach ein SQL-Statement ab. Es gibt keine Ergebnisauswertung(bei Fehler wird "nur" ne Exception geschmissen).

    Du musst das Statement in dein CRecordset-objekt jagen mit CRecordset::Open.
    Wenn du ein schon offenes Objekt hast, dass du wieder benutzen willst, dann schließe das am besten und öffne es dann mit deinem neuen SELECT-Befehl.



  • Wie in mein CRecordset::open? Ich versteh das nicht ganz wie du das meinst. Wäre nett wenn du das ein bisschen genauer erklären könntest.
    MFG



  • Ok habs nun in die Open Funktion mit reingenommen. Aber irgendwie werden immer noch einige Datensätze überschrieben. Ich hab denn einen Datensatz 2 mal in einer Datenbank.
    Wer kann helfen?
    MFG



  • zeige mal etwas mehr Code! Weil da wird der Fehler irgendwo liegen. Die beiden MFC-Klassen funzen.



  • m_pSet->Close();
    m_pSet->Open(CRecordset::dynaset, "SELECT * FROM Tabelle ORDER BY Name", CRecordset::none);

    Der Code wird von mir benutzt, wenn ich die Datenbank aus meinem Programm her raus von A nach Z sortieren will.



  • Das SELECT verändert keine Daten! Dann passiert das auch irgendwo vorher.
    Was benutzt du den für ein DBMS?



  • Ich benutze eine MS Access DB und muss die nur irgendwie alphabetisch sortieren und hab gedacht das könnte ich mit so nem SQL Statement machen. WEnn du ne andere Möglichkeit hast denn nehm ich auch gerne die!!!
    MFG



  • Stopp mal: willst du das Ergebnis sortiert in deinem Programm auswerten oder willst du das direkt die Access-DB sortiert wird? Weil das geht mit SQL nicht. Da hast du keinen Einfluss drauf. Zumindest nicht direkt. Da müsstest du ein SELEC machenm was geordnet wird und das dann wieder als Tabelle schreiben.



  • Ob die DB sortiert will, ist mir eigentlich egal. Ich möchte nur eine geordnete Ausgabe in meinem Programm haben. Das es so aussieht, als wenn die DB geordnet wäre.
    Die DB muss nicht direkt geordnet werden. Nur die Ausgabe hatl. Das ist das wichtige.



  • Du kannst die Tabelle doch in Access direkt sortieren (zumindest optisch). Mach das mal und vergleiche, ob sich Abweichungen zur Ausgabe in Deinem Programm ergeben. Ich vermute fast, dass die Daten tatsächlich so in der Tabelle stehen, wie sie in Deinem Programm angezeigt werden. Also inklusive der doppelten Datensätze.

    Wenn die Tabelle in Ordnung ist, aber die Anzeige in Deinem Programm nicht, kannst Du mal überprüfen, wie der Datenbank-Cursor gesetzt ist. Für Access muß der (so weit ich weiß) auf Server-seitig stehen. Allerding beeinflußt das (so weit ich weiß) nur die Performance, aber man weiß ja nie... Und da ich selbst keine Access verwende...



  • Also ich hab jetzt mal die Datensätze in Access sortiert und in meinem Programm werden sie immer noch genau wie vorher angezeigt. Und wo ich den Datenbankcursor ändere weiß ich leider nicht.
    Wäre nett wenn du mir das mal sagst wie ich das mache 🙂
    MFG



  • CDatabase dBase;
    dBase.OpenEx(connStr,CDatabase::noOdbcDialog);
    CRecordset rs(dBase);
    
    rs.Open(AFX_DB_USE_DEFAULT_TYPE,
            "SELECT * FROM Tabelle ORDER BY Name");
    
    while(!rs.IsEOF())
    {
    	this->getColumn(rs);	
    	rs.MoveNext();
    }
    
    rs.Close();
    

    So in der Art müsste das aussehen. Stör dich nicht an dem in der While-Schleife. Habe das grad nur aus einem meiner Projekte kopiert. Anstatt getColumn kommt dann deine eigene Auswertung der aktuellen Zeile



  • Desert Storm schrieb:

    ...Und wo ich den Datenbankcursor ändere weiß ich leider nicht.
    Wäre nett wenn du mir das mal sagst wie ich das mache 🙂

    Sorry, da muß einer der MS-Spezis helfen. Ich könnte es dir nur für den BCB sagen...



  • Ok ich hab den Code jetzt mal n bisschen getestet und mir ist aufgefallen, das der Datensatz, bei dem ich gerade bin, immer an erster Stelle platziert wird, wenn ich den Button drücke, damit die Datensätze sortiert werden.
    Alle anderen Datensätze werden perfekt sortiert nur halt der eine Datensatz ist denn doppelt drin. Einmal ganz am Anfang und einmal da, wo er eigentlich sein muss.
    Und der Datensatz der dann an erster Stelle eigentlich sein sollte, wurde überschrieben.
    Also muss ich immer zum Datensatz gehen, der eigentlich an erster Stelle stehn muss und dann kann ich erst die Befehle ausführen.
    Hat jemand eine Idee, wie man das umgehen kann?

    //Datenbank schließen
    m_pSet->Close();
    //Datenbank mit dem SQL Statement zum sortieren öffnen
    m_pSet->Open(CRecordset::dynaset, "SELECT * FROM Buchdaten ORDER BY Name", CRecordset::none);
    


  • Probier doch mal aus was passiert, wenn du direkt nach deinem Open-Befehl sowas machst:

    while(!m_pSet->IsEOF())
    {
    	AfxMessageBox(m_pSet->m_Name);
    	m_pSet->MoveNext();
    }
    

    Wenn die MessageBoxen dann die Namen sortiert ausgeben, hast du den Fehler ganz woanders. UpdateData() falsch gesetzt oder sowas.



  • OK Hab das ausprobiert und gemerkt das ich ein UpdateData() falsch gesetzt habe. Danke für den Tipp und das ihr so geduldig mit mir wart!!!!!
    😃
    MFG Desert Storm


Anmelden zum Antworten