Probleme Paradox-Datenbank in Borland C++ Builder 5



  • Hab noch ein Problem mit dem SQL:

    Hab Query1 eingerichtet, DataSource auf DataSource1 gesetzt und in SQL geschrieben:

    SELECT * from kunde.db ORDER BY Name

    Also er soll nach dem Nachnamen ordnen. Aber bei mir erscheint dann wenn ich das Query auf active setzen will der Fehler:

    Field in order must be in result set.

    Was mach ich falsch? Sorry, aber SQl hab ich noch nie gemacht! 😞

    Danke, Elli.



  • Die Fehlermeldung bedeutet in diesem Fall, dass es kein Feld mit dem Namen 'Name' in der Tabelle gibt.
    Du mußt in der ORDER BY Klausel den Feldnamen genau so angeben, wie er in der Tabelle heißt.



  • Hallo

    Dedn Hintergrund des Controls könntest du allenfals dann tranparent machen, indem du von DBRadioGroup ableitest und dort die Paint-Methode komplett selber schreibst.

    Die SQL-Fehlermeldung besagt das sortierte Felder auch in der Ergebnismenge vorhanden sein müßen. Ich vermute mal du must das Feld auch noch einordnen :

    SELECT * from kunde.db ORDER BY kunde.db.Name
    

    Du weißt aber schon, das der Name 'Kunde' für eine Datenbank und der Name db für eine Tabelle ungünstig gewählt sind?
    Logisch wäre genau umgedrehte Bezeichnungen (die natürlich dann auch so in der reallen Datenbank so sein müßen).

    bis bald
    akari



  • Okay, die Fehlermeldung ist jetz weg. Wenn ich das Query nun aber auf active setze und starte, wird nicht sortiert, es bleibt alles beim alten, auch bei Refresh nicht. Muss ich meine DBEdits vielleicht an das Query anbinden oder irgendwas zusätzliches einstellen? Oder kann ich vielleicht im Database-Desktop auch ne Sortierung einstellen? Ich habe ja bis jetzt nur das Query eingefügt, DataSource eingestellt, SQL eingegeben die eine Zeile und active auf true.

    Lieben Dank, Elli.



  • Ich würde eher sagaen, dass kunde.db nur der Tabellenname ist. Bei der BDE kann über die Endung angegeben werden, welcher Trieber verwendet werden soll. db für Paradox, dbf für dBase.



  • Ja genau, so ist das ja auch richtig, oder?



  • Ja. Du kannst das .db auch einfach weglassen. Macht keinen Unterschied.



  • Elli(Gast) schrieb:

    ... aber auf active setze und starte, wird nicht sortiert, es bleibt alles beim alten, ...
    Lieben Dank, Elli.

    Das Query, in dem Du sortierst, muss (über die DataSource) natürlich an das DBGrid gebunden werden. Wie zeigst Du die Daten denn an?
    Übrigens solltest Du nicht direkt Active auf true setzen, sondern die Methoden Open() und Close() verwenden. Die setzen dann intern Active auf den entsprechenden Wert.



  • Also die Kundendaten zeige ich jeweils einzeln in einem DBEdit an, sozusagen z.B. eins für Vorname, eins für Nachname usw. Die Steuerung erfolgt über DBNavigator und ich zeige alle Daten aus der Tabelle an (alle Spalten)

    Die CD-Daten zeige ich im DBGrid an, aber nur 3 ausgewählt (Interpret, Titel, Plattenfirma). Hier erfolgt die Steuerung einfach über Pfeiltasten bzw. über die Funktion suchen, mit der ich nach Titel oder Interpret suchen kann.

    Nebenbei, ich hab grad etwas gefunden, um zumindest einige Refreshs zu umgehen. Und zwar nutze ich für die einzelnen Seiten ein Tabbed Notebook. Öffne ich nun eine Kartei davon, so setze ich die darin enthaltene Tabelle auf inaktiv und gleich danach wieder auf aktiv, so ist sie ohne Refresh aktualisiert. Sicher kein guter Programmierstil, aber es funktioniert 😉

    Ja, das Active in Open() und Close() habe ich für die Tabellen auch so gemacht, hab nur wegen dem test gleich auf true gesetzt 🙂



  • Aber die DBEdits und das DBGrid sind mit der gleichen DataSource verbunden, wie das Query, in dem Du die Sortierung durchführst?



  • Ja, da war ich mir schon sicher, dass ich das so einstellen muss. Aber die Sortierung funktioniert trotzdem nicht. 😞

    Reicht dafür wirklich die eine Zeile Quellcode oder muss es vielleicht mehr sein?



  • Hallo

    Du solltest dir die mitgelieferten Beispiele unter <BCB-Path>\Examples\DBTasks anschauen, insbesondere Filter.

    bis bald
    akari



  • Die komplette Vorgehensweise wäre:
    Query schließen
    SQL ändern
    Query öffnen

    if (Query1->Active)
       Query1->Close();
    Query1->SQL->Text = "SELECT * FROM kunde ORDER BY Name ASC";
    Query1->Open();
    

    @akari: Mit den Filtern ist das so eine Sache. Hab schon erlebt, dass komlexere Filterungen nicht machbar waren und ich zwangsläufig auf reines SQL ausweichen mußte. Kann natürlich auch sein, dass ich mich ein bißchen blöd angestellt hab... 😉



  • Mh, es will einfach nicht funktionieren. 😞

    Sag mal, wenn ich den SQl-Code eingebe, dann auf active setze und dann das Query Doppelklicke, erscheinen zwar die Buttons, mit denen ich nach links und rechts usw. schalten kann, aber kein Eintrag. Liegt dort vielleicht der Fehler?



  • In dem zugeordeneten DBGrid (oder den DBEdits) sollten die Daten angezeigt werden.
    Nochmal: Ist das DBGrid und das Query ein und der selben DataSource zugeordnet?



  • Ja, ist beides DataSource2



  • Okay, über AddFields habe ich die Felder jetzt auch dabe, trotzdem funktioniert es nicht! 😞



  • Okay, ich bin's nochmal und zwar habe ich jetzt rausgefunden, dass es doch funktioniert. Wenn ich auf das Query rechts klicke und Explore wähle, komme ich in den Database Explorer. Dort kann ich unter DefaultDD Tables anwählen und dort wieder meine CDs.db. Wenn ich die öffne und bei "Enter SQL" den Text eingebe und laufen lasse, funktioniert alles. Nur irgendwie im Formular dann nicht? Hab ich die falsch eingebunden? Die Datei cds.db, die ich wie beschrieben testen kann, ist nämlich auch in einem ganz anderen Pfad (...\Borland Shared\SampleDictionary). Wie kann ich den Pfad ändern oder die Datei dann richtig einbinden?

    Nochmal vielen Dank und sorry wenn ich nerve

    Elli.



  • Am einfachsten legst Du in der BDE einen Alias an und verbindest Deine Komponenten über diesen Alias.


Anmelden zum Antworten