Neuigkeiten:

Wenn ihr euch für eine gute Antwort bedanken möchtet, im entsprechenden Posting einfach den Knopf "sag Danke" drücken!

Mobiles Hauptmenü

Suchmaske zur Buchverwaltung

Begonnen von gromax, Juni 05, 2016, 21:31:23

⏪ vorheriges - nächstes ⏩

gromax

Hallo, liebe Access-Profis,

in meiner DB zur Bücherverwaltung versuche ich eine Suchmaske nach Titel, Kategorie und Autor zu basteln; leider habe ich keinen Plan!
Eigentlich wollte ich ein Formular entwerfen (vgl. frmMedienAuswahl), in dessen Formularkopf drei entsprechende Kombinationsfelder untergebracht sind und dem folgend sollte im Detailbereich die gefilterte Liste erscheinen.
Aber war mal wieder nichts! Die Detaildaten werden gar nicht gefiltert.

Vorab vielen Dank für Geduld und Unterstützung!

Viele Grüße
gromax

Beaker s.a.

Hallo gromax,
1. http://www.donkarl.com?FAQ4.36 kennst du?
2. Verrate uns die Datensatzherkunft der zu filternden Liste,
und vielleicht auch die DSh der Kombis.

gruss ekkehard
Alles, was geschieht, geschieht. - Alles, was während seines Geschehens etwas anderes geschehen lässt, lässt etwas anderes geschehen. - Alles, was sich selbst im Zuge seines Geschehens erneut geschehen lässt, geschieht erneut. - Allerdings tut es das nicht unbedingt in chronologischer Reihenfolge.
(Douglas Adams, Mostly Harmless)

gromax

Hallo Ekkehard,

den Verweis auf Donkarls Seite habe ich umgesetzt; für eine Kontrolle (Bsp: Unter Kategorie "Landeskunde" eingeben, dann siehst Du die abhängigen Folgedaten unter "Titel" und "Autoren") wäre ich dankbar.
Die Kombifelder werden nach dem Aktualisieren des Kombi-Feldes 'cbm_Kategorie' ebenfalls wieder frisch ("Requery") befüllt (?Warum ist die erste Zeile bei den Autoren leer=weiß?), so dass die Filter untereinander kommunizieren.

Jetzt habe ich aber noch keine Idee, wie die unten angezeigte Liste entsprechend der Filter im oberen Bereich gefiltert angezeigt werden? Und das sollte eigentlich mein Ziel sein. Die diesen Daten zugrunde liegende Abfrage qry_Suche habe ich im unsichtbaren Feld [KAT_Name] mit dem Kriterium >>Wie "*" & [Formulare]![frm_MedienSuche]![cbm_Kategorie] & "*"<< zu filtern versucht, aber das funktioniert nicht.

Für weitere Unterstützung sage ich jetzt schon 'Danke'.

Viele Grüße
gromax

Beaker s.a.

Hallo gromax,
Anbei überarbeitete DB. Hätte sie gerne auch als .mdb dazu gepackt,
geht aber nicht wegen irgendwelcher neuen Features im Formular.
Folgende Änderungen habe ich gemacht:
1. In der Zuordnungstabelle das Feld "BUC_AutFS" in "BUC_FS" umbenannt (ist verständlicher).
2. In qry_Suche (heisst jetzt "qry_Suche_ed") die Gruppierung und den
Formularbezug entfernt, sowie zwei Felder ("AUT_PS" und "KAT_PS")
drangehängt; - werden zum Filtern des Formulars gebraucht.
3. Die Datenherkunft der Kombis "cbm_Titel" und "cbm_Autor" werden
jetzt per VBA gesetzt. Da steht jetzt in der 1. Spalte der PS drin.
(I.Ü. auch in "cbm_Kategorie"). Ausserdem ist das jetzt die 1. Spalte
die gebundene. Da gibt es dann auch kein "Wie * ..." mehr.
4. Ebenso der Filter auf das Formular. Dies beginnt schon bei Auswahl
einer Kategorie, dann des Titels und des Autors.
Beim "cbm_Autor" habe ich dir drei Möglichkeiten angelegt (schau dir
die Ereignisprozedur zum AfterUpdate an); - sind kommentiert.

Falls du das noch flexibler haben möchtest; - z.B. das nach Auswahl der
Kategorie auch schon die Autoren angezeigt werden sollen, und nicht
erst nach Auswahl des Titels, sollte es mit der Vorlage kein Problem sein,
das zu ergänzen bzw. zu ändern.

gruss ekkehard
Alles, was geschieht, geschieht. - Alles, was während seines Geschehens etwas anderes geschehen lässt, lässt etwas anderes geschehen. - Alles, was sich selbst im Zuge seines Geschehens erneut geschehen lässt, geschieht erneut. - Allerdings tut es das nicht unbedingt in chronologischer Reihenfolge.
(Douglas Adams, Mostly Harmless)

gromax

Hallo Ekkehard,

Du bist klasse! Vielen Dank! Ich werde am Wochenende intensiver einsteigen und mich ggf. nochmals melden!
Auf den ersten Blick funktioniert alles genauso, wie ich es mir vorstelle! Klasse!

Viele Grüße
gromax

gromax

Liebe Access-Profis, lieber Ekkehard,

Deine Tipps habe ich nun in meine DB eingebaut und ich habe Dein Angebot der drei Optionen zur Aktualisierung von 'cbm_Titel' per VBA wie folgt erweitert:
Private Sub cbm_Autor_AfterUpdate()
   
    'zeigt das ausgewählte (cbm_Titel) Buch des Autors
   If Not IsNull(cbm_Kategorie) And Not IsNull(cbm_Titel) Then
    Me.Filter = "AUT_PS = " & Me!cbm_Autor.Value & " AND BUC_PS = " & Me.cbm_Titel.Value
   End If
   
    'zeigt alle Bücher des Autors in der ausgewählten Kategorie
   If Not IsNull(cbm_Kategorie) And IsNull(cbm_Titel) Then
    Me.Filter = "AUT_PS = " & Me!cbm_Autor.Value & " AND KAT_PS = " & Me.cbm_Kategorie.Value
   End If
   
    'zeigt alle Bücher des Autors
   If IsNull(cbm_Kategorie) And IsNull(cbm_Titel) Then
    Me.Filter = "AUT_PS = " & Me!cbm_Autor.Value
   End If
   
    Me.FilterOn = True

End Sub

Es scheint zu funktionieren?!

Ein anderes Problem existiert aber nach wie vor:

Ich habe die Bücher [tblBuecher] in einer m:n-Beziehung [tblAutoren2Buecher] mit den Autoren [tblAutoren] verbunden, so dass ich zu einem Buch ggf. auch mehrere Autoren eingeben kann. Entgegen dem Rat der Verwendung von Mehrwert-Feldern habe ich diese Konstruktion eingebaut, doch erhalte ich jetzt für ein Buch mit drei Autoren drei Datensätze = 3 Bücher mit demselben Titel, aber jeweils einem anderen Autoren.
Kann ich dieses denn ähnlich einem Mehrwert-Feld auf einen Datensatz reduzieren und ggf. im Feld Autor den Eintrag >>Probe, Peter u.a.<< generieren?
Oder gibt es einen anderen Weg, bei mehreren Autoren trotzdem das Buch nur einmal anzuzeigen?

Viele Grüße
gromax

Beaker s.a.

Hallo gromax,
Schau ich mir morgen an.
gruss ekkehard
Alles, was geschieht, geschieht. - Alles, was während seines Geschehens etwas anderes geschehen lässt, lässt etwas anderes geschehen. - Alles, was sich selbst im Zuge seines Geschehens erneut geschehen lässt, geschieht erneut. - Allerdings tut es das nicht unbedingt in chronologischer Reihenfolge.
(Douglas Adams, Mostly Harmless)

Beaker s.a.

Hallo gromax,
So, da bin ich.
Deine Bedingungen treffen manchmal alle drei nicht zu, so dass dann
nicht gefiltert wird.
Ich habe es jetzt folgendermassen geändert:
Private Sub cbm_Autor_AfterUpdate()

    'zeigt alle Bücher des Autors
    If IsNull(Me!cbm_Kategorie) And IsNull(Me!cbm_Titel) Then
        Me.Filter = "AUT_PS = " & Me!cbm_Autor.Value
    End If
   
    'zeigt das ausgewählte (cbm_Titel) Buch des Autors
    If Not IsNull(Me!cbm_Titel) Then
        Me.Filter = "AUT_PS = " & Me!cbm_Autor.Value & " AND BUC_PS = " & Me!cbm_Titel.Value
    End If

    'zeigt alle Bücher des Autors in der ausgewählten Kategorie
    If Not IsNull(Me!cbm_Kategorie) And IsNull(Me!cbm_Titel) Then
        Me.Filter = "AUT_PS = " & Me!cbm_Autor.Value & " AND KAT_PS = " & Me!cbm_Kategorie.Value
    End If

    Me.FilterOn = True

End Sub

Desweiteren habe ich noch folgende Änderungen vorgenommen:
1. "cdmFilterLöschen" umbenannt in "cdmFilterLoeschen"; - Umlaute sind
nicht so gut in Objektnamen.
2. die zugehörige Prozedur korrigiert; - da muss natürlich nicht
die RowSource zurückgesetzt werden, sondern nur der Inhalt
des Feldes.
3. Nach Auswahl einer Katagorie wird jetzt auch schon das Autor-Kombi
gefiltert.

Bezüglich Mehrfachanzeige der Titel mit mehreren Autoren bin ich noch nicht
weitergekommen. Diese Frage muss ich mal weiterreichen. In anliegender
Datei ist jetzt deshalb auch eine .mdb damit uns die SQL-Spezialisten hier dabei
weiterhelfen können.

@all
Im Prinzip muss ja nur diese
        SELECT B.BUC_PS,
             K.KAT_Name,
             B.BUC_Titel,
             A.AUT_NameGesamt,
             B.BUC_Kategorie,
             B.BUC_Untertitel,
             B.BUC_Auflage,
             B.BUC_Jahr,
             B.BUC_Inkludiert,
             B.BUC_MedienNummer,
             B.BUC_Mediennummer2,
             A.AUT_PS,
             K.KAT_PS
        FROM tblKategorien AS K
            INNER JOIN (tblBuecher AS B
                    LEFT JOIN (tblAutoren AS A
                            RIGHT JOIN tblAutoren2Buecher AS AB
                            ON A.AUT_PS = AB.AUT_FS)
                    ON B.BUC_PS = AB.BUC_FS)
            ON K.KAT_PS = B.KAT_FS
        ORDER BY B.BUC_Titel

Abfrage auf die BuchID (BUC_PS bzw. BUC_FS) gruppiert werden.
Folgendes habe ich dazu versucht:
        SELECT B.BUC_PS,
             K.KAT_Name,
             B.BUC_Titel,
             A.AUT_NameGesamt,
             B.BUC_Kategorie,
             B.BUC_Untertitel,
             B.BUC_Auflage,
             B.BUC_Jahr,
             B.BUC_Inkludiert,
             B.BUC_MedienNummer,
             B.BUC_Mediennummer2,
             A.AUT_PS,
             K.KAT_PS
        FROM tblKategorien AS K
            INNER JOIN (tblBuecher AS B
                    LEFT JOIN (tblAutoren AS A
                        RIGHT JOIN (
                            SELECT ABG.BUC_FS, First(ABG.AUT_FS) AS Autor
                            FROM tblAutoren2Buecher AS ABG
                            GROUP BY ABG.BUC_FS) AS AB
                        ON A.AUT_PS = AB.AUT_FS)
                    ON B.BUC_PS = AB.BUC_FS)
            ON K.KAT_PS = B.KAT_FS
        ORDER BY B.BUC_Titel

Will ich diese anzeigen kommt eine Parameterabfrage nach "AB.AUT_FS".
Verwende ich "ABG.AUT_FS" heisst es "Syntaxfehler in JOIN-Operation".

Ist wahrscheinlich relativ simpel, aber ich komm' nicht drauf.

gruss ekkehard
Alles, was geschieht, geschieht. - Alles, was während seines Geschehens etwas anderes geschehen lässt, lässt etwas anderes geschehen. - Alles, was sich selbst im Zuge seines Geschehens erneut geschehen lässt, geschieht erneut. - Allerdings tut es das nicht unbedingt in chronologischer Reihenfolge.
(Douglas Adams, Mostly Harmless)

MaggieMay

Hallo,

die neue Abfrage hat kein Datenfeld namens AB.AUT_FS, du hast doch diese Spalte mit der First-Funktion zum Autor gemacht.
Ob es Sinn macht, darüber zu joinen, kann ich nicht beurteilen, da ich nicht alles gelesen habe.
Freundliche Grüße
MaggieMay

Beaker s.a.

Hallo Maggie,
Klar, wenn man einen Alias vergibt muss man den dann auch verwenden, - danke.
Da hätte ich auch selber drauf kommen können  >:(
.
.
& "RIGHT JOIN (" _
                            & "SELECT ABG.BUC_FS, First(ABG.AUT_FS) [color=red]AS Autor[/color] " _
                            & "FROM tblAutoren2Buecher AS ABG " _
                            & "GROUP BY ABG.BUC_FS) AS AB " _
                    & "ON A.AUT_PS [color=red]= AB.Autor[/color]) " _
.
.

Macht auch das was sie soll, nämlich alle Titel auch mit mehreren Autoren
nur einmal anzuzeigen.
Allerdings werden diese Titel dann auf dem Formular nach Autorenauswahl
nicht mehr angezeigt (ausser beim ersten natürlich), was sich mir auch
logisch erschließt.
Wie muss ich das denn umstricken, dass die Titel gruppiert sind, aber
trotzdem alle Autoren angezeigt bzw. wählbar sind? Muss ich die Autoren
aus dieser Abfrage ganz rauslassen und sie in einer zweiten Abfrage
dazu joinen?
Für einen kleiner Hinweis in welche Richtung ich hier denken muss wäre
ich dankbar.

gruss ekkehard
Alles, was geschieht, geschieht. - Alles, was während seines Geschehens etwas anderes geschehen lässt, lässt etwas anderes geschehen. - Alles, was sich selbst im Zuge seines Geschehens erneut geschehen lässt, geschieht erneut. - Allerdings tut es das nicht unbedingt in chronologischer Reihenfolge.
(Douglas Adams, Mostly Harmless)

gromax

Hallo Ekkehard, hallo MaggieMay,

leider habe ich erst heute Eure umfangreichen Bemühungen und Anregungen einsehen können, ich hatte diese Woche keine Zeit.
Ich werde die Vorschläge und Anregungen übernehmen und muss mich sicherlich nochmals melden.

Vielen Dank vorab!

Viele Grüße
gromax

gromax

Hallo Ekkehard,

nicht wissend, ob Du noch die Muse findest, mir bei meinem Problem weiter unter die Arme zu greifen, habe ich versucht, Deine letzten Vorgaben in einer Abfrage per SQL einzubringen

         SELECT B.BUC_PS, K.KAT_Name, B.BUC_Titel, A.AUT_NameGesamt, B.BUC_Kategorie, B.BUC_Untertitel, B.BUC_Auflage, B.BUC_Jahr, B.BUC_Inkludiert, B.BUC_MedienNummer, B.BUC_Mediennummer2, A.AUT_PS, K.KAT_PS
FROM tblKategorien AS K INNER JOIN (tblBuecher AS B LEFT JOIN (tblAutoren AS A RIGHT JOIN (SELECT ABG.BUC_FS, First(ABG.AUT_FS) AS Autor
                            FROM tblAutoren2Buecher AS ABG
                            GROUP BY ABG.BUC_FS)  AS AB ON A.AUT_PS = AB.Autor) ON B.BUC_PS = AB.BUC_FS) ON K.KAT_PS = B.KAT_FS
ORDER BY B.BUC_Titel;


und die Abfrage funktioniert.
Wie kann ich denn mit meinem Problem weiterkommen? Es wird jetzt jedes Buch einmal - mit Nennung nur eines Autoren, auch wenn es mehrere Autoren hat - dargestellt; da sind wir ja schon einen Schritt weiter! Wie bekomme ich denn die anderen Autoren noch in dieses Feld?

Wenn Du oder andere Cracks Zeit und Ideen haben...?

Vielen Dank vorab
gromax

MaggieMay

Hallo,
ZitatWie bekomme ich denn die anderen Autoren noch in dieses Feld?
das klingt für mich mal wieder ganz nach einer Einsatzmöglichkeit des Beispiels "Liste per SQL erstellen" aus dem dbWiki.
Freundliche Grüße
MaggieMay

Beaker s.a.

Moin,
Ja, das könnte gehen. Ich werde das mal versuchen einzubauen.
Melde mich mit Ergebnissen  :) oder Fragen  :-[
gruss ekkehard
Alles, was geschieht, geschieht. - Alles, was während seines Geschehens etwas anderes geschehen lässt, lässt etwas anderes geschehen. - Alles, was sich selbst im Zuge seines Geschehens erneut geschehen lässt, geschieht erneut. - Allerdings tut es das nicht unbedingt in chronologischer Reihenfolge.
(Douglas Adams, Mostly Harmless)

Beaker s.a.

#14
Hallo,

@Maggie
Danke noch mal für den Hinweis, ist aber gar nicht nötig.
Alles viel einfacher.
Hatte mich vielleicht nicht deutlich ausgedrückt. Also die Anzeige der
Autoren im Kombi funzte schon, ist ja auch unabhängig von der Daten-
basis des Forms. Durch die Gruppierung derselben kann aber, logisch,
nur der Autor ausgewählt werden, der da als "First" ausgegeben wird.
Die Lösung: die gleiche Abfrage ungruppiert vorhalten, und diese der
RecordSource des Forms bei Auswahl im Kombi zuweisen.
Macht eine zusätzliche Abfrage und zwei Zeilen Code.
Private Sub cbm_Autor_AfterUpdate()

    Me.RecordSource = "qry_Suche_Alle"
.
.
End Sub

Private Sub cdmFilterLoeschen_Click()

    Me.RecordSource = "qry_Suche_Grup"
.
.

Hätte ich auch gleich drauf kommen können, - manchmal denkt man
einfach viel zu kompliziert  ;)

Angepasste DBs anbei.

gruss ekkehard

Edit:
Wegen Anhang bitte nächsten Post beachten!!
Alles, was geschieht, geschieht. - Alles, was während seines Geschehens etwas anderes geschehen lässt, lässt etwas anderes geschehen. - Alles, was sich selbst im Zuge seines Geschehens erneut geschehen lässt, geschieht erneut. - Allerdings tut es das nicht unbedingt in chronologischer Reihenfolge.
(Douglas Adams, Mostly Harmless)