Probleme Paradox-Datenbank in Borland C++ Builder 5
-
Hallöchen,
ich arbeite zur Zeit an der Umsetzung einer CD-Datenbank. Als Grundlage für die Daten verwende ich Paradox-Tabellen, die ich im Borland über die entsprechenden Tables und DataSources, DBGrid usw einbinde. Leider bin ich da vollkommen unerfahren und komme an einigen Stellen nich weiter. Das Grundgerüst und den Großteil der Funktionen hab ich fertig, hier aber noch ein paar Probleme:
1. Hab eine Tabelle mit allen CDs drin. Jede CD hat ein Attribut Besitzer (short), wo die Kundennummer des Besitzers drin steht. Nun möchte ich in einem Panel anzeigen, ob die jeweilige CD verfügbar ist, sprich "Wenn Besitzer leer, dann zeige an Verfügbar". Konnte es nur nicht so richtig umsetzen.
Liegt es an dem Panel? Da kann man ja nicht direkt auf die Tabellen zugreifen. Habe daher auch noch eine andere Möglichkeit probiert: Ein weitere Attribut: Verleihbar (logical). Hier müsste ich es hinbekommen, dass Verleihbar immer true ist, wenn beim jeweiligen Datensatz nichts im Eintrag Besitzer steht. Dann könnte ich das Panel über eine if-Anweisung mit einer Checkbox starten, z.b:if (DBCheckBox1->State==0)
{
Panel2->Color=clRed;
Panel2->Caption="Bereits verliehen";
}
if (DBCheckBox1->State==1)
{
Panel2->Color=clLime;
Panel2->Caption="Verleihbar";
}2. Gibt es irgendeine Möglichkeit, die Einträge alphabetisch zu ordnen? Wenn ich die Tabelle im Database Desktop bearbeite, kann ich sie sortieren. Ich möchte aber, dass nach jedem neuen Eintrag (es wäre auch möglich, danach noch Refresh zu drücken) die Liste neu sortiert wird. Leider habe ich das auch nicht gepackt!

3. Hier noch eine Frage zum Refresh. Ich habe das ganze so gelöst, dass in einem DBGrid alle CDs stehen, die verfügbar sind (auch hier müsste ich den Filter so einstellen, dass es die nur anzeigt, wenn die Kundennummer leer ist).
In einem weiteren DBGrid erscheinen nach Eingabe der Kundennummer alle CDs, die er geliehen hat (der Filter war natürlich einfach). Jetzt soll der Mitarbeiter vom Verleih in die CD, die geliehen werden möchte, die Kundennummer an der Stelle Besitzer eintragen. Klappt auch, nur muss ich dann beide DBGrids refreshen, bis es wieder aktuell ist. Geht das auch irgendwie anders? Es würde schon reichen, wenn ich mit einem Button beide gleichzeitig refreshen könnte.So, jetz hab ich schon viel zu viel geschrieben!

Ich hoffe, ihr könnt mir da etwas helfen! Wär superlieb!
Lieben Dank und bis bald, eure Elli.
-
Hallo
1. Das kannst du auch aus dem normalen Feld herauslesen.
Dazu brauchst du den Event TDataSource::OnDataChange deiner zugrundeliegenden Datenquelle. Dort kannst du deine Überbrüfung auf den Feldwert (Table->FieldByName("Feldname")->IsNULL...) ausführen und entsprechend das Panel setzen.2. Zum Sortieren must du dann schon mit SQL-Anweisungen und TQuery arbeiten
SELECT * from cdtable ORDER BY field3. Wenn die Datenmengen nach einer Eingabe verändert wurden, must du auch alle Anzeigen aktualisieren.
Btw sind Paradox, BDE und TTable alle schon veraltet. Soltest du dich weiter damit beschätigen, ist ein Umstieg auf das externe und kostenlose Firebird anzuraten.
bis bald
akari
-
Danke, hab das erste gleich pobiert und es funktioniert. Werd gleich weiter machen!
Noch eine Frage, wie kann ich ne DBRadioGroup auf transparent setze? Hab ein Bild im Hintergrund eingebunden, da sieht das dumm aus so grau!
Danke dir für deine Hilfe

Elli
-
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.NameDu 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 öffnenif (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.