Ich programmiere grad ein Programm zur verwaltung einer Paradox-Datenbank und ich habe nun ein Problem. Ein Eintrag, der in die Datenbank soll, generiere ich automatisch und er steht im Moment unter DBText.Caption Von dort aus wird er aber nicht in die Datenbank übernommen, wenn ich Table1.Post ausführe.
Meine Frage ist nun:
In welche Eigenschaft von DBText muss ich diesen automatisch generierten String schreiben, damit das nicht passiert?
Programmieren - alles kontrollieren 4.941 Themen, 20.715 Beiträge
Noch ein kleiner Nachtrag:
Wenn ihr mir sagen könntet, wie Delphi6 sage, dass er nen SQL-Befehl auführen soll, wäre das ebenfalls sehr hilfreich.
MfG
Kai
Alle Datenmanipulationen werden mit der Funktion TQuery.ExecSQL() ausgeführt.
Das andere Problem sehe ich mir morgen noch mal an, jetzt ist mir das zu spät.
CU Borlander
TDBText ist eigentlich nichts anderes als ein Label das ein Datenbankfeld anzeigt, ein Schhreiben auf in die Datenbank ist deshalb nicht vorgesehen.
Ändere stattdesse den Wert des Datenbankfeld, über die Eigenschaft
TTable.FieldValues[FieldName: String],
die Cpation von TDBText müsste dann eigentlich automatisch aktualisiert werden.
CU Borlander
Dieser Tip war schonmal super! Den anderen probier ich jetzt mal aus!
Nun habe ich das Problem, dass ich jetzt bei der Verwendung dieses Befehls eine Exception bekomme. Ich will die Datenbank sortieren und nun krieg ich beim zweiten (!) Tausch die Exception, dass der Editiermodus bzw. der Einfügemodus nicht aktiviert sei. Das ist allerdings unabhängig davon ob ich TTable.Edit an den Anfang des Algorithmus stelle oder nicht. So wie mein Delphi-Buch mir das sagt aktiviert doch TTable.Edit den Editiermodus oder?
TTable.ReadOnly ist übrigens auf false!!
Welcher Befehl?
ich will die Datenbank sortieren
Mit TTable oder TQuery?
eim zweiten (!) Tausch die Exception
Was meinst Du mit Tausch und von welchem Typ ist die Exception?
Beschreibe mal genau welche Componenten Du verwendest für den Datenbankzugriff und Poste den Codeabschnitt in dem es kracht (also die Fehlermlungen raus gehen). Am besten beschreib auch noch mal etwas genauer was Du machen willst und in welcher Reihenfolge.
CU Borlander
Also die Fehlermeldung heißt exakt:"Im Projekt Project1.exe ist iene Exception der Klasse EDatabaseError aufgetreten. Meldung: 'Table1: Datenmenge weder im Editier- noch im Einfügemodus'. Prozess wurde angehalten. Mit einzelne Anweisung oder Start fortsetzen."
Die Prozedur ist relativ lang aber egal:
procedure TForm2.BtnSortClick(Sender: TObject); //Bubblesort
var
maxPK, x, y : LongInt;
Name1, Name2, Vorname1, Vorname2, Tutor1, Tutor2, Jahrgang1, Jahrgang2 : ShortString;
Pos1, Pos2 : TBookmark;
begin
Table1.Edit;
Table1.Last;
maxPK := StrToInt(DBText1.Caption); // höchsten PK herausfinden
Table1.First;
Pos1 := Table1.GetBookmark;
for x := maxPK - 1 downto 1 do
for y := 1 to maxPK do
begin
Table1.GotoBookmark(Pos1); // Die zu vergleichenden Feldwerte herausziehen
Name1 := Table1.FieldValues['Nachname'];
Vorname1 := Table1.FieldValues['Vorname'];
Tutor1 := Table1.FieldValues['Tutor'];
Jahrgang1 := Table1.FieldValues['Klasse'];
Table1.Next;
Pos2 := Table1.GetBookmark;
Name2 := Table1.FieldValues['Nachname'];
Vorname2 := Table1.FieldValues['Vorname'];
Tutor2 := Table1.FieldValues['Tutor'];
Jahrgang2 := Table1.FieldValues['Klasse'];
if concat(Name1,Vorname1) > concat(Name2,Vorname2) then //Vergleichen
begin
Table1.GotoBookmark(Pos1); // Tauschvorgang
Table1.FieldValues['Nachname'] := Name2;
Table1.FieldValues['Vorname'] := Vorname2; //Auftreten der Exception
Table1.FieldValues['Tutor'] := Tutor2;
Table1.FieldValues['Jahrgang'] := Jahrgang2;
Table1.GotoBookmark(Pos2);
Table1.FieldValues['Nachname'] := Name1;
Table1.FieldValues['Vorname'] := Vorname1;
Table1.FieldValues['Tutor'] := Tutor1;
Table1.FieldValues['Jahrgang'] := Jahrgang1;
end;
if concat(Name1,Vorname1) = concat(Name2,Vorname2) then // für den Fall komplett gleicher Namen
if concat(Name1,Vorname1,Tutor1) > concat(Name2,Vorname2,Tutor2) then
begin
Table1.GotoBookmark(Pos1); // Tauschvorgang
Table1.FieldValues['Nachname'] := Name2;
Table1.FieldValues['Vorname'] := Vorname2;
Table1.FieldValues['Tutor'] := Tutor2;
Table1.FieldValues['Jahrgang'] := Jahrgang2;
Table1.GotoBookmark(Pos2);
Table1.FieldValues['Nachname'] := Name1;
Table1.FieldValues['Vorname'] := Vorname1;
Table1.FieldValues['Tutor'] := Tutor1;
Table1.FieldValues['Jahrgang'] := Jahrgang1;
end;
Pos1 := Pos2; // Positionstausch, damit der Algorithmus wirklich hochzählt
end;
end;
Ich hoffe mal, daraus ist alles ersichtlich.
So long
Kai
Habe das jetzt erst mal nur kurz überflogen.
Bubblesort
Vestehe ich das richtig, dass Du versuchst die Datenbank per Bubblesort zu sortieren?
Da wäre mit eine SQL-Anweisung nämlich wesentich sinnvollen!
In welcher Zeile kracht es eigentlich?
CU Borlander
Dort wo "//Auftreten der Exception steht"
Wie könnte man das denn per SQL sinnvoller lösen?
Hast du da irgendwie ne Seite, damit du dir nicht die Finger wund schreibst?
Schreibe ich da etwa automatisch den gesamten Datensatz um?
Mit einer einfachen SELECT Anweisung...
Schreib mal nach was Du genau sortieren willst. Dann schreib ich Dir Die Anweisung. Eine spezielle Seite dazu habe ich nicht.
Schreibe ich da etwa automatisch den gesamten Datensatz um
Nein an den Datensätzen wird dabei nichts geändert, nur die die Ausgabe. Wenn man für jede Sortierung die koplette DB sortieren müsste, bräcuhte man keine DB...
CU Borlander
Durch diese Sortierung wollte ich aber unter anderem das Problem, dass wenn der erste Datensatz gelöscht wurde und ich nun einen neuen hinzufüge er nicht auf eins hinzugefügt wird sondern auf zwei. Ausserdem, wenn ich bei jedem Aufruf die DB sortieren müsste, wär das doch nun auch irgendwo schwachsinnig, ist doch viel effektiver die DB einmal zu sortieren und dann den Aufruf in der sofort in der richtigen Reihenfolge zu haben. Den Trick mit der Select-Anweisung kenne ich, will ich aber aus obig genanntem Grund nicht verwenden.
Kannst du mir was zu der Exception sagen?
Ich kann daraus nicht wirklich verstehen, was Du meinst?!
Ich kann darin auch kein wirkliches Probem erkennen. Sollte die Reihenfolge irgendwie wichtig sein, kann man evtl. ein Zusätzliches DB Feld zu diesem Zweck einbauen.
Ausserdem, wenn ich bei jedem Aufruf die DB sortieren müsste, wär das doch nun auch irgendwo schwachsinnig
Für diesen Zweck verwendet man Indizes, die von der Datanbenk verwaltet werden. Dafür wird zusätzlich zur Datenbank ein sortierter Index abgelegt (im Allgemeinen in B-Bäumen) der Zeiger auf die Datensätze enthält. Beim Einfügen neuer Datensätze werden diese gleich in den Sortierung mit eingefügt, erneutes sortieren ist nicht notwendig. Ein erneutes sortieren bei jedem Zugriff ist also nicht notwendig, wenn die Tabelle anständig angelegt wurde.
Mal abgesehen davon muss man sich bei lokalen Datenbeständen von =
Wie viele Datensätze hast Du eigentlich überhaupt?
CU Borlander
Genau das mit dem = Irgendwie habe ich das Gefühl, dass wir aneinander vorbeireden...
Dann würde ich von ein einer lokalen Datenbank wie Paradox (über die BDE) absehen, sowas lässt sich später schlecht erweitern (z.B. die Suche im Datenbestand über weitere PCs). Nimm lieber ein Datenbanksystem wie MySQL, das kannst Du auch auf dem Arbeits PC unter Windows laufen lassen, kommen weitere Rechner hinzu kannst Du das Programm problemlos auch auf diesen laufen lassen, und über Netzwerk auf die DB zugreifen.
Mit entsprechenden Komponenten (gibt es auch als Freeware) kannst Du mit Delphi problemlos auf die DB Zugreifen und sogar die Standard-Komponenten zur Datenei/Ausgabe verwenden.
pro Ausleihe wird ein neues Datenbakfeld
Ich vermute mal Du meinst ein Datensatz?!
Für jede Ausleihe ein neues DB-Feld anzulegen wäre grosser Schwachsinn!
Sagt Dir der Begriff RDMS etwas?
Du braucht für solche Vorhaben mehrere Tabllen, die zur Abfrage untereinander Verknüpft werden...
und irgendwann ist dann die Dantenbank ausgeschöpft
Sollte mit einem DB-Server wie MySQL nicht so schnell passieren. Nickles.de läuft z.B. auch mit MySQL und hier findest Du über 100.000 angemeldete User und mindestens 3 mal soviele Postings - das müsste also wirklich ausreichen.
Ich kann mir vorstellen, dass das relativ schnell der Fall sein könnte wenn ich nicht erneut auf Feld 1 schreiben kann, was er leider nicht automatisch macht.
Spielst Du damit auf den frei werdenen Speicherplatz nach dem Löschen von Datensätzen an? Um das Problem zu umgehen kann man die Datenbank regelmäßig Reorganisieren (teilweise auch unter anderen Bezeichnungen zu finden)
das primäre Problem ist, dass irgendwann der LongInt als Primary Key verbraucht ist und wenn fleißig ausgeliehen
Ich schließe aus dieser Aussage, dass Du ein AutoInc Feld als PrimärSchlüssel (AusleihID?) verwendest. Wenn Du bedenken hast das der Wertebereich nicht ausreicht, nimm einfach einen Feldtyp mit größerem Werte - LongInt (32Bit) sollte mit 2Milliarden Ausleihvorgängen allerdings mehr als ausreichen, damit kann jedes der 15.000 Bücher 280.000 mal ausgeliehen werden. Werde alle Bücher jeden Tag lang für die Dauer eines Tages verliehen reicht das immer noch für über 700 Jahre.
was ich mit einer Sortierung verbinden will
Also IHMO wäre es bei den Ausleihvorgängen am Sinvollsten nach Datum zu sortieren. Der Primärschlüssel (AusleihID) wird eigentlich nur zur eindeutigen Identifikation der Datensätze benötigt.
Irgendwie habe ich das Gefühl, dass wir aneinander vorbeireden...
Das Gefühl hatte ich auch schon...
Achtung, nicht beleidigt sein:
Irgendwie beschleicht mich allerdings auch der Verdacht das Du Dich nicht sher intensiv mit Datenbanken beschäftig hast. Das ist nicht schlimm, denn Datenbanken sind ein recht komplexes Thema, in diesem Fall solltest Du nachfragen, wenn Dir irgendwas nicht ganz klar ist. Werde Dir auch gerne weiterhin mit Rat und Tat zur Seite stehen.
Ich soll ein Programm [...] schreiben
Hört sich nicht besonders freiwillig an. Will auch nicht neugierig sein, aber ich habe die Vermutung, dass Du bei einer öffentlich Einrichtung arbeitest?
CU Borlander
1. Paradox ist als System vorgegeben, damit steht MySQL nicht zur Frage.
2. Ja ich meinte Datansatz
3. Ich habe auch mehrere Tabellen
4. Öffentliche Einrichtung ist nicht schlecht, bin Schüler
5. Alles ganz schön und gut, ich komm aber trotzdem nicht um das sortieren herum
MfG
Kai
Ups, da hab ich glatt was vergessen..
Ja es ist Bubblesort, soll aber im Laufe der Entwicklung noch zu Quick- oder Shakersort verändert werden, nicht dass ich jetzt nen Rüffel krieg, weil Bubblesort nicht sonderlich schnell ist...
Soll das System auch im Produktionsbetrieb eingesetzt werden, oder ist das nur eine umfangreichere Unterrichtsaufgabe?
Sollte das System ernsthaft benutzt werden ist eine Desktopdatenbank schwachsinnig, weil man das ganze nicht skalieren kann.
Sollen später zusätzlich zum VerwaltungsPC noch weitere für die Bücherei genutzt werden (z.B. für die Suche nach Büchern im Bestand - da würden sich der/die Bibleothekar/in und alle Büchereibesucher sicher drüber freueen) dann steht man mit einer DesktopDB sehr schlecht da. Letztenendes muss das gesammte System geändert werden, womit unnötige Arbeit anfällt.
Ich kann in diesem Fall keinen guten Grund erkennen nicht MySQL zu verwenden, da man das ganze ohne weiteres auf einem PC zusammen mit dem Verwaltungsprogramm laufen lassen kann.
Warum ist Paradox vorgegeben? Weil Dein Informatik Lehrer nichts anderes kennt?
Kleiner Tipp: Wenn Du das "freiwillig" machst solltest Du sowas selbst entscheiden können, soweit ralisierbar.
2. Ja ich meinte Datansatz
OK
3. Ich habe auch mehrere Tabellen
OK, hoffentlich auch schön per BuchID/BenutzerID verknüpft...
4. Öffentliche Einrichtung ist nicht schlecht, bin Schüler
Lag ich also richtig ;-)
siehe Punkt 1
5. Alles ganz schön und gut, ich komm aber trotzdem nicht um das sortieren herum
Ja, aber überlass das dem Datenbanksystem, das ist für sowas optimiert und leg die entsprechenden Indizes an...
CU Borlander
Zu 1:
Nein ich mach das ja nicht freiwillig, das ist die Aufgabe für den gesamten Kurs.
Ich vermute mal der Grund warum wir Paradox verwenden ist, weil er nichts anderes kennt und weil ich das stumpfe Gefühl habe, dass er M$-Fan ist.
Zu 2:
Ja, die Verknüpfungen sind alle, zwar noch nicht hundertprozentig eingearbeitet, aber trotzdem, vorhanden.
Zu 5:
Hmm...gut hast mich überzeugt, dann frag ich mich nur noch, warum mein Info-Lehrer unbedingt Sortierung von uns eingearbeitet haben möchte und Sortieralgorithmen ( nochmal ) behandelt hat. Meinte er damit etwa, dass ich Paradox sortieren lassen soll? Wäre etwas zu einfach...Nun ja muss ich ihn nochmal fragen...Kann aber gut sein, wenn man bedenkt, dass im Kurs Standardmäßig der DBNavigator zur Navigation verwendet wird *g*.
Danke für die Bemühungen
Die Befürchtung habe ich auch. Wenn der mehr Ahnung hätte, wäre er vermutlich nicht Lehrer geworden...
und weil ich das stumpfe Gefühl habe, dass er M$-Fan ist.
Warum nehmt Ihr dann nicht gleich VB + Access?
Sowohl Delphi als auch Paradox sind Produkte von Borland.
wenn man bedenkt, dass im Kurs Standardmäßig der DBNavigator zur Navigation verwendet wird
Ist doch auf die Schnelle gar nicht, schlecht. Sieht nur nicht so super aus. Mach das ganze bei größeren Projecten allerings lieber über die ActionList.
zu 1)
Soll das Programm jetzt zum Einsatz kommen oder ist das nur ne Spielerei und was sagt Dein Lehrer zur späteren (Nicht-)Erweiterbarkeit der ganzen Geschichte?
CU Borlander
Das ganze wird zum Einsatz kommen, auf die Erweiterbarkeit habe ich ihn nicht angesprochen, ist aber auch nicht sinnvoll jetzt alles nochmal neu zu strukturieren. Irgendwie wird das schon klappen...;)
P.S.: Dachte Paradox wäre von M§