Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Datenbanken (https://www.delphipraxis.net/15-datenbanken/)
-   -   Delphi SchuBi (https://www.delphipraxis.net/1958-schubi.html)

Kuckuckskind 1. Jan 2003 03:25


SchuBi
 
Hallo,

nun geht es wieder an die Arbeit:

Und es stellt sich mir ein ganz grundsätzliches Problem:

Zunächst einmal eine Beschreibung des Projekts, an dem ich gerade arbeite:
Und zwar haben wir im Informatik-Unterricht die Aufgabe bekommen, eine Bibliotheks-Softwar ein Delphi (Paradox) zu schreiben.
Dazu habe ich die Tabellen buecher, schueler, autoren, autorenschaft und ausleihe.
Die Tabelle ausleihe spielt bei meiner Frage keine Rolle, deshalb gehe ich nicht weiter auf sie ein. In der Tabelle buecher werden alle Angaben zu dem jeweilgen Buch gespeichert außer dem Autor (Datenfelder sind u.a. Titel, Verlag, ISBN, InventarNr, der PK ist BuchNr). In der Tabelle autoren werden der Nach- und Vorname der jeweiligen Autoren gespeichert, sowie ein Kürzel festgelegt. In der Tabelle autorenschaft wird die BuchNr mit dem Autorenkürzel verknüpft, so dass eine n:m-Beziehung entsteht, weil ein Buch von mehreren Autoren geschrieben sein kann oder ein Autor mehrere Bücher geschrieben haben kann.
Im Rahmen der Autoreneingabe und auch der Ausgabe, hat sich mir die Frage gestellt, ob ich es nicht umgehen kann, dass ich den Vor- und Nachnamen getrennt abspeichere, also einfach nur ein Edit-Feld benötige, in das ich den Autorennamen eingeben lasse. Diese Variante würde ich auch sofort wählen, wenn da nicht die Sache mit der Suche wäre: Sucht man nun nur nach dem Nachnamen eines Autors, kann dieser nicht gefunden werden. Gibt es eine einfache Lösung für dieses Problem?

Dann habe ich mir noch weitere Gedanken über die Vereinfachung der Eingabe neuer Bücher gemacht: Immer, wenn ein neues Buch eingegeben wird, muss gleichzeitig überprüft werden, ob der Autor bzw. die Autoren des Buches schon ein Kürzel zugewiesen bekommen hat, dieses Kürzel gesucht werden und schließlich eine Verknüpfung zwischen Buchnr und Kürzel angelegt werden. Dieses Verfahren halte ich aber für keineswegs Benutzerfreundlich, schon gar nicht, wenn man ganze Biliotheksbestände aufnehmen will, was dieses Programm leisten soll.
Ich habe mir überlegt, dass man in die Maske, in der man die Buchdaten eingibt, auch ein Feld für den Autorennamen anlegen sollte. Wenn man nun auf "speichern" klickt, soll überprüft werden, ob dieser Autor schon in der Tabelle autoren vorhanden ist oder vielleicht ein Autor vorhanden ist, der ähnlich geschrieben wird. Ist dies nicht der Fall, soll auf Bestätigung dieser Autor hinzugefügt werden. (Ich halte die Wahl eines Autorenkürzels nicht für besonders sinnvoll, da dies unter Umständen nicht eindeutig ist und zur Eindeutigkeitsprüfung eine weitere Abfrage nötig wäre. Am besten wäre ist vielleicht, wenn ich im Rahmen der Automatisierung einen Zähler einsetze.) Und natürlich eine Verknüpfung zwischen Autor und Buch hergestellt werden. Aber wie realisiere ich dies programmiertechnisch?


Frohes neues Jahr! :) :party:


P.S.: An dieser Stelle viele Grüße an meinen Informatik-Lehrer :coder:

[edit=Daniel B]Wähle bitte den Titel das nächste mal etwas passender aus. Vielen Dank. MfG Daniel B.[/edit]

MrSpock 1. Jan 2003 13:07

Hallo Kuckuckskind,

die Suche bei einem zusammengesetzten Namen könntest du prinzipiell über über den LIKE Operator erledigen, der auch bei lokal SQL leider nicht unterstützt wird. Es bliebe also nur die manuelle Suche über eine Schleife, die aber auch recht einfach ist:

Delphi-Quellcode:
Autor.First;
gefunden := False;

while (Not Autor.EOF) and (Not gefunden) do
begin
  if Pos(edSuch.Text, AutorName.AsString) > 0 then
     gefunden := True;
end;
Du solltest eventuell noch Groß-/Kleinschreibung berücksichtigen.

Das mit dem Kürzel darfst du natürlich nicht dem Nutzer aufbürden. Du musst bei Eingabe eines Autors überprüfen, ob schon ein Kürzel besteht und entsprechend darauf reagieren.

Kuckuckskind 2. Jan 2003 01:22

Hallo,

Zitat:

Zitat von MrSpock
die Suche bei einem zusammengesetzten Namen könntest du prinzipiell über über den LIKE Operator erledigen, der auch bei lokal SQL leider nicht unterstützt wird.

Doch, wird.

Zitat:

Zitat von MrSpock
Das mit dem Kürzel darfst du natürlich nicht dem Nutzer aufbürden. Du musst bei Eingabe eines Autors überprüfen, ob schon ein Kürzel besteht und entsprechend darauf reagieren.

Ich will ja nicht undankbar erscheinen, aber genau das ist es, was ich nicht weiß, wie ich es umsetzen soll:

Also, meine Probleme bestehen darin, dass ich nicht weiß, wie ich den Text aus einem DBEdit auslesen kann (ist ja nötig, um zu überprüfen, ob es den eingegebenen Autor schon in der Tabelle gibt) und wie ich verhindern kann, dass der Autor nochmals gespeichert wird, wenn er schon existiert. Weiter geht es dann damit, dass ich auch keine konkrete Vorstellung davon habe, wie ich die Verknüpfung erstellen soll, die in der Tabelle autorenschaft vorgenommen werden muss... jaja...

DKamps 2. Jan 2003 10:30

Tipp
 
Um zu verhindern, dass ein Schlüsselfeld in einer Tabelle doppelt vorhanden ist, sollte man zunächst einen Primär-Index verwenden. Dann muss man natürlich auf der Anwendungsseite entweder auf die mögliche Fehlermeldung bei DataSet.Post reagieren oder bereits vorher in der Tabelle nach dem Datensatz suchen.
Das DBEdit hat das Property Text oder auch Field.Value, welches Du verwenden kannst. (Außerdem gibt es in Delphi so eine lustige Taste namens F1: damit erfährst Du alles über Properties und Methoden einer bestimmten Klasse)

MrSpock 2. Jan 2003 14:38

Hallo Kuckuckskind,

wie DKamps schon erwähnt hat, sind Schlüssel eine Möglichkeit. Du solltest dir erst überlegen, was das Haupt Such- und Sortierkriterium in der Tabelle Autor sein soll. Dieses Feld (oder diese Felder) machst du zum Primärschlüssel. Das Kürzel, sofern es nicht der Primärschlüssel ist, kann dann z.B. Sekundärschlüssel sein. Nun kannst du z.B. eine zweite Instanz der Tabelle Autor unter dem Namen AuthorSuch öffnen, die nach dem Schlüssel "Kürzel" sortiert ist, dann kannst du mit:

Delphi-Quellcode:
{ Edit1. Text enthält im folgenden Beispiel das gewünschte Kürzel }
if AutorSuch.FindKey(Edit1.Text) then
begin
  { Kürzel existiert, ist denn auch der Autor gleich ?)
  { Edit2.Text zeigt den Namen des Autors }
  if AutorSuch.FieldByName('Autor').AsString <> Edit2.Text then
  begin
     MessageDlg('Das Kürzel '+Edit1.Text+ ' wird bereits für den Autor '+
                AutorSuch.FieldByName('Autor').AsString +' benutzt.',
                mtInformation, [mbOK], 0);
     ActiveControl := Edit1.Text;
  end;
end;
verhindern, dass dasselbe Kürzel noch einmal verwendet wird.


Alle Zeitangaben in WEZ +1. Es ist jetzt 01:41 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz