Neuigkeiten:

Ist euer Problem gelöst, dann bitte den Knopf "Thema gelöst" drücken!

Mobiles Hauptmenü

Autorensuche

Begonnen von Golfi, Mai 02, 2017, 10:10:25

⏪ vorheriges - nächstes ⏩

Golfi

Hallo erstmal,
ich darf mich erstmal vorstellen.
Mein Name ist Günther, mein Alter ist 68Jahre und ich wohne in Hessen, nähe Limburg.
Ich bin Rentner und habe tatsächlich etwas Zeit übrig. Aus bestimmten Gründen möchte ich mich etwas mit Access (access2016) beschäftigen. Ich habe mir das Handbuch für Access 2016 zugelegt, aber das erzählt einem auch nicht alles.
Jetzt mal zu meinem Problem:
Ich habe, unter Anderem, eine Tabelle "tabBücher" erstellt.
Diese Tabelle enthält "BuchNr"; "Titel"; "Autor". Die BuchNr ist gegliedert in Autor und laufende Nummer.
Ich möchte jetzt, in einem Formular-Feld einen bestimmen Autor mit der dazugehörigen BuchNr suchen.
Ich habe mal (Versuchsweise)  in einem Textfeld "AutorSuche" folgende Ereignisprozedur eingegeben:

Private Sub AutorText_Click()
Dim rcsAutor As Recordset
Dim rcsBuchNr As Recordset
Const cstrKriterium = "Autor Like 'Janosch'"
Set rcsAutor = CurrentDb.OpenRecordset("tabBücher", dbOpenDynaset)
Set rcsBuchNr = CurrentDb.OpenRecordset("tabBücher", dbOpenDynaset)
rcsAutor.FindLast cstrKriterium
rcsBuchNr.FindLast cstrKriterium
Do Until rcsAutor.NoMatch 'Keins mehr Gefunden'
Me.AutorText = rcsAutor.Fields("Autor") & " " & rcsAutor.Fields("BuchNr").Value
rcsAutor.FindNext cstrKriterium
Loop
End Sub

Das funktioniert auch soweit. Beim anklicken gibt er mir in den Feld auch den Autor nebst letzter BuchNr an.
Ich hätte es aber ganz gerne, wenn ich im Formular, in einem weiteren Feld, welchen Autor ich suche.
So gibt er mir ja nur den bestimmten Autor an, der in der Zeile - Const cstrKriterium = "Autor Like 'Janosch'" - steht.
Ich komme einfach nicht dahinter, was ich an der Stelle eingeben muss.

Vielleicht kann mir ja jemand helfen.

mfG Günther

MzKlMu

Hallo,
was machst Du wenn ein Buch mehrere Autoren hat ?
Der Autor hat in der Tabelle für die Bücher nichts zu suchen. Der Autor muss in eine extra Tabelle mit einem Fremdschlüssel zum Buch. Auch für die Autoren (alle) ist eine Tabelle erforderlich. In Deiner Tabelle für die Bücher vermisse ich auch ein Feld für den Primärschlüssel.
Es ist auch völlig überflüssig eine solche Suche per Schleife zu programmieren.
Das macht man ganz einfach mit einer Abfrage.

Willst Du hier mit Deiner DB Access lernen ?

Zeige bitte mal ein Bild des Beziehungsfensters.
Gruß Klaus

Golfi

#2
Hallo MzKlMu,
eigentlich ist es egal, wieviele Autoren ein Buch hat. Aufgeführt wird der erste.
Es geht im Prinzip nur ums einsortieren und vor allem um dieses eine Problem, welches ich nicht lösen kann.
Wenn du mit der Frage, ob ich Access hier lernen will meinst, das ich es zur Perfektion bringen will, dann muss ich das verneinen. Dazu ist mein Kopf auch nicht mehr aufnahmefähig genug.
Ich möchte mich gerne damit beschäftigen und benutze dazu eine bestehende Datenbank in Exel.
Diese funktioniert zwar, ist aber nicht so komfortabel.

Golfi

Sorry, mit den Bildern ist mir ein Fehler unterlaufen.
Sollte eigentlich nur einmal erscheinen. :-[

DF6GL

Hallo,

das Alter spielt keine Rolle....  ;)   (Wir, Klaus und ich bewegen sich mit Dir im annähernd gleichen Zeitrahmen.)

Grundsätzlich gilt:   Access ist etwas ganz Anderes als Excel und db-technisch nicht miteinander zu vergleichen...

Der Tabellenaufbau ist in erster Näherung (je nachdem, was man denn aus der DB herauslesen will) und als "Grundkonzeption" (abgesehen der genannten Autoren-Geschichte ) brauchbar.


Der Aufwand, den Du treibst, um einen Autor zu finden, ist jedoch übertrieben, weil Access für solche Vorgänge elegantere Lösungen bietet.

Zu deiner Lösung. (Ich nehme das Feld "AutorText" jetzt als ungebundenes Textfeld an, in das der zu suchende Autorenname eingegeben wird.):

Suchen eines Datensatzes (vollständige Eingabe des Autorennamens) mit der Findfirst-Methode (Minimal-Version):

Private Sub AutorText_Click()
Me.Recordset.Findfirst "Autor ='" & Me!AutorText & "'"
End Sub



Suchen bei jeder Eingabe eines Zeichens:

Private Sub AutorText_Change()
Me!Filter = "Autor Like '" & Me!AutorText.Text & "*'"
Me.FilterOn =true
End Sub

Suchen mit Auswahl aus einem Kombifeld ("cmbAutorenName"):

Datensatzherkunft:  Select Autor From tblBücher Order by Autor
Spaltenanzahl: 1
Spaltenbreiten:  6cm

Im Form:


Sub cmbAutorenName_Afterupdate()
Me.Filter = "Autor = '" & Me!cmbAutorenName & "'"
Me.FilterOn
End Sub


Das sind nur aber Beispiele.  Es gibt noch andere Filtermöglichkeiten, z. B. Zuweisen eines SQL-Strings mit einer Where-Condition an die Datenherkunft des Forms.

Außerdem benutzt man "normalerweise, bei einer (sinnvoll) vollständigen Normalisierung der Tabellen) zur Suche (oder "Kennzeichnung") von Datensätzen die entspr. Primärschlüsselfelder(-werte).



Viele Grüße vom Bodensee
Franz, DF6GL

Hilfestellung:  http://www.access-o-mania.de/forum/index.php?topic=6969.msg118738#msg118738

Links und Tipps:
1.   http://v.hdm-stuttgart.de/~riekert/lehre/db-kelz/
1a. http://www.tinohempel.de/info/info/datenbank/normalisierung.htm
1b. https://support.office.com/de-de/article/Grundlagen-des-Datenbankentwurfs-eb2159cf-1e30-401a-8084-bd4f9c9ca1f5#bmterms
2.   http://www.donkarl.com
3.   https://web.archive.org/web/20201201233522/http://www.dbwiki.net/
4.   http://www.access-tutorial.de/
5.   http://www.tty1.net/smart-questions_de.htm
6.   http://access.joposol.com/accept

Last but not least:   < F1 > für Hilfe
;) Learning by doing not by spoon-feed ;)

Tipp: Find and Replace for Access

Golfi

Erstmal Danke für die schnellen Antworten.
Die Suche mit einem Kombinationsfeld war auch mein erster Gedanke und auch Versuch.
Das Problem liegt aber an folgendem:
Wenn man ein neues Buch eingeben will, kenne ich zwar den Autor aber nicht die erforderliche neue Nummer.
Muss also nachschauen, ob es den neuen Autor schon gibt und welche Nummer er bekommt.
Wenn er er noch nicht erfasst ist, bekommt er eine neue Nummer mit dem Anhang -01
Wenn er schon erfasst ist, dann bekommt er seine bestehende Nummer (z.B. 0020-xx für Astried Lindgren)
Ich muss also die letzte Gesamtnummer ermitteln um eine Neue, fortlaufende einzugeben.
Das einfachste wäre natürlich, ich schaue einfach in der Tabelle nach und wenn es Ihn schon gibt, dann schaue ich noch nach der letzten Nummer.
Ist aber nicht sehr elegant.
Darum auch Die Schleife, um die letzte Nummer zu ermitteln.
Diese Buchnummern wurden irgendwann mal festgelegt und dienen hauptsächlich der Einordnung in Regale.
Das  ist auch nicht die Alexandrinische Bibliothek, sondern nur eine Grundschule-Bücherei.
Wie gesagt, das ganze wird im Moment mit Exel gehändelt. Ich versuche das Ganze nur etwas komfortabler zu gestalten und etwas dazu zu lernen.

Ich habe mal einen Auszug aus der Büchertabelle hier eingestellt.

Ich hoffe, ich gehe euch nicht auf den Geist.

BuchNr   Buchtitel                                   Autor
0282-01   Komm nach Hause Minka           Arold
0282-02   Pferdegeschichten                   Arold
0282-03   Gefahr für den kleinen Delfin   Arold
0184-01   Die Indianer                           arsedition
0020-01   Ronja Räubertochter                   Astrid Lindgren
0020-02   Ronja Räubertochter                   Astrid Lindgren
0020-03   Ronja Räubertochter                   Astrid Lindgren
0020-04   Ronja Räubertochter                   Astrid Lindgren
0020-05   Ferien auf Saltkrokan                   Astrid Lindgren
0020-06   Ferien auf Saltkrokan                   Astrid Lindgren
0020-07   Die Kinder aus Bullerbü           Astrid Lindgren
0020-08   Die Kinder aus Bullerbü           Astrid Lindgren
0020-09   Kalle Blomquist                           Astrid Lindgren
0020-10   Kalle Blomquist                           Astrid Lindgren
0020-11   Madita                                   Astrid Lindgren

MzKlMu

#6
Hallo,
wenn Du etwas lernen willst, so solltest Du um einen normalisierten Aufbau nicht herum kommen.
Den Aufbau halte ich in dieser Form für unbrauchbar. Die Buchnummer zusammengesetzt aus 2 Werten ist auch keinesfalls als Primärschlüssel geeignet.

Die Autoren sollten in eine eigene Tabelle mit einem Autowert als Primärschlüssel. Dieser Autowert zählt auch automatisch hoch.
Auch die Buchtabelle sollte einen Autowert als Primärschlüssel bekommen.
Dann wird in einer Abfrage der PS aus der Buchtabelle und der PS aus der Autorentabelle zur BuchNr zusammengesetzt. Die BuchNr wird nicht in der Tabelle gespeichert. Bis hierher geht das alles vollkommen automatisch ohne einen Buchstaben programmieren zu müssen.

Liegen die Nummern für Autor und Buch schon fest, oder ist das noch alles frei ?
Wenn die schon alle festliegen, kannst Du auf die Autowerte verzichten und eine Zahl (Longinteger) als Primärschlüssel verwenden in der Du die bisherigen Nummern einträgst.
0282-01   Komm nach Hause Minka           Arold

Das Buch erhält dann die LfdNr 1 und der Autor die LfdNr. 282, als Zahl, also ohne die führende 0. Erst in einer Abfrage wird die bisherige Buch-Nr erzeugt.
Eine Schleife zur Ermittlung der letzten Nr ist in jedem Fall ersatzlos überflüssig, weil man mit DMax() jederzeit den höchsten Wert ermitteln kann und 1 addieren.

Das ganze Konzept ist wie gesagt für eine Datenbank untauglich muss gründlich überarbeitet werden.

Was willst Du mit der DB überhaupt erreichen ?

PS:
Ich bin noch deutlich älter als Du.  ;D
Gruß Klaus

DF6GL

Hallo,



so läuft das nicht.   Wie schon gesagt, vergiss Excel...


Eine Buchnummer ist eine Buchnummer und keine Identifikation für den Autor , bzw. falls ich es richtig interpretiere, allenfalls für ein Buch-Exemplar.


ZitatDas  ist auch nicht die Alexandrinische Bibliothek, sondern nur eine Grundschule-Bücherei.

Es ist egal...  Selbst wenn nur 5 Bücher mit je zwei oder mehr Exemplaren verwaltet werden sollen. müssen db-technische Grundregeln (eine grundlegende davon ist die Normalisierung) unbedingt beachtet werden, sofern Du das ernsthaft betreiben willst. Das ist in Deiner Konstellation aber nicht der Fall.

Zitat
Das einfachste wäre natürlich, ich schaue einfach in der Tabelle nach und wenn es Ihn schon gibt, dann schaue ich noch nach der letzten Nummer.
Ist aber nicht sehr elegant

Allgemein:  Doch, das IST elegant.   Schleifen dazu verwenden, ist es NICHT !



Erklär doch erst mal, was genau Du mit der DB anfangen willst und wie der "Bücherbestand" sich darstellt. (Unterscheidung von nur Büchern, oder Bücher-Exemplare (Kopien von Büchern) , mehrere verschiedene Autoren pro Buch,  Buch-Ausgabe,  Verleih (Ausleihe) von Exemplaren, usw...)
Viele Grüße vom Bodensee
Franz, DF6GL

Hilfestellung:  http://www.access-o-mania.de/forum/index.php?topic=6969.msg118738#msg118738

Links und Tipps:
1.   http://v.hdm-stuttgart.de/~riekert/lehre/db-kelz/
1a. http://www.tinohempel.de/info/info/datenbank/normalisierung.htm
1b. https://support.office.com/de-de/article/Grundlagen-des-Datenbankentwurfs-eb2159cf-1e30-401a-8084-bd4f9c9ca1f5#bmterms
2.   http://www.donkarl.com
3.   https://web.archive.org/web/20201201233522/http://www.dbwiki.net/
4.   http://www.access-tutorial.de/
5.   http://www.tty1.net/smart-questions_de.htm
6.   http://access.joposol.com/accept

Last but not least:   < F1 > für Hilfe
;) Learning by doing not by spoon-feed ;)

Tipp: Find and Replace for Access

Golfi

Ok, ihr habt mich überzeugt, das es so nicht geht. Ich versuche einen anderen Weg zu finden.
Die Grundschulen-Bibliothek besteht schon etwas länger und wurde bis vor einem Jahr noch mit Karteikarten betrieben.
Die Bücher sind alle etikettiert und logischerweise auch eingeordnet.
Man hat damals die Buchnummer halt so festgelegt.
Die ersten vier Ziffern als Autorennummer (mit Nullen als Platzhalter) und die letzten zwei Ziffern (nach einem Bindestrich) als laufende Buchnummer des jeweiligen Autors.
Das ist also nicht auf meinem Mist gewachsen. Seit etwa einem Jahr wird alles mit Exel betrieben.
In die Regale einsortiert sind die Bücher alphabetisch nach Autoren und danach nach laufender Nummer.
Wenn jetzt ein "neues" Buch reinkommt, schaut man erstmal mühsam nach, ob es den Autor schon gibt.
Wenn das Positiv ist, muss man noch nachschauen, wie viel Bücher dieses Autors schon eingetragen sind, um ihm eine neue laufende Nummer zu geben.
Aber gut, ich versuche einen anderen Weg zu finden um dieses System zu behalten.
Wahrscheinlich ist auch keiner bereit ca. 800 Bücher neu zu etikettieren.
Als erstes werde ich der Tabelle Bücher mal eine eigene ID mit Primärschlüssel zu geben. Dann sehe ich mal weiter.

An euch vielen Dank für die Mühe aber ich denke, das war nicht das letzte Mal, das ich mich an euch wende.



MzKlMu

Hallo,
niemand hat gesagt, dass Du diese BuchNr nicht behalten kannst. Das geht auch mit Umstrkturierung sehr einfach.
Schaue in die angehängte DB. Erst die Tabellen ansehen, dann die Beziehungen, dann die Abfrage. In der Abfrage siehst Du die Buchnr wie gehabt. Das hatte ich oben auch geschrieben:
ZitatDas Buch erhält dann die LfdNr 1 und der Autor die LfdNr. 282, als Zahl, also ohne die führende 0. Erst in einer Abfrage wird die bisherige Buch-Nr erzeugt.
Die LfdNr der Tabelle "Bücher" lässt sich vollkommen automatisch in Abhängigkeit des Autors hochzählen, das kann die DB von ganz alleine in einem Formular mit einem Einzeiler als VBA Code. Habe ich jetzt aber nicht eingebaut, ich wollte Dir nur das Prinzip zeigen für die BuchNr.
Gruß Klaus

Golfi

Hallo,
ich bin jetzt erst mal einen anderen Weg gegangen.
Es ist zwar nicht der Weisheit letzter Schluss aber ich kann damit leben.
Wie auf dem Bild zu sehen ist, Habe ich in das Eigabeformular Die Buchtabelle als Unterformular eingefügt.
Diese ist nach BuchNr sortiert und springt "beim öffnen" des Formulars  immer auf den neuen Datensatz.
Die Autorensuche bewältige ich mit einem Kombi-Feld. Dieses ist erst nach Autoren und dann nach BuchNr sortiert.
Wenn ich also ein neues Buch bekomme, gebe ich den Autor in das Kombi-Feld ein.
Erscheint der Autor nicht, weis ich, das er noch nicht in der Tabelle existent ist.
Also, bekommt das Buch eine neue Autorennummer und der Autor und der Titel werden eingetragen.
Nach dem Bild wäre das "0407-1  .....   ....."

Erscheint der Autor, bekommt er seine Nummer mit dem nächsten laufenden Anhang.
Nach dem Bild  "0018-08 ...... Kästner"
Da nicht jeden Tag ein neues Buch aufgenommen wird, kann ich erstmal damit leben.
Jedenfalls ist es leichter als "händisch" die ganze Tabelle zu durchforsten.
Natürlich werde ich mich bemühen, das noch weiter zu automatisieren.
Danke nochmals für die Hilfe. Aber so wie es aussieht werdet ihr mich so schnell nicht wider los.

Gruß Günther

MzKlMu

Hallo,
und ich dachte, Du wolltest was lernen zu Access.  :P
Gruß Klaus

Golfi

Hallo Klaus,
ich habe was gelernt, nämlich das man manchmal, vorerst mal einen Kompromiss eingehen muss. ::)
Ich bin ja mit der DB noch lange nicht am Ende. Sogar Microsoft hat über 20 Jahre gebraucht, um ein einigermaßen funktionierendes Betriebssystem auf den Markt zu bringen.  ;D

Gruß Günther

MzKlMu

Hallo,
je mehr Kompromisse man bei eine Datenbank eingeht ums schwieriger und aufwendiger  wird der Umbau in ein normalisiertes Datenmodell.
Gruß Klaus