Opgelost Filteren boekenbestand op auteur in formulier

Dit topic is als opgelost gemarkeerd

JacobCats

Gebruiker
Lid geworden
13 jun 2014
Berichten
135
Vraagje,
Voorheen lukte het mij om een werkend filter aan te brengen op een formulier.
Ik probeer dit nu ook in mijn boekenbestand aan te brengen maar wat ik ook doe het lukt mij voor geen meter.
Waar zit de fout en hoe kan ik dit herstellen

Ik werk met windows 11
 

Bijlagen

Ik heb er even naar gekeken, en er zat een foutje in de keuzelijst. Eigenlijk een simpele: je probeert te filteren op een veld dat niet in het formulier zit. En dat gaat natuurlijk niet. Dus dan zijn er twee oplossingen:
1. Voeg het ontbrekende veld toe aan de onderliggende query
2. Filter op een ander veld uit de keuzelijst, de auteursnaam
Optie twee behoeft een kleine aanpassing aan de code van de keuzelijst.

Code:
Private Sub cboFilteren_Click()
    With Me
        If Not .cboFilteren.Value = "" Then
            .Filter = "[Auteur] = """ & Me.cboFilteren.Column(1) & """"
''            .Filter = "[AuteurID] = " & Me.cboFilteren.Value
            .FilterOn = True
        Else
            .Filter = ""
            .FilterOn = False
        End If
    End With
    Me.Repaint
End Sub
Ik heb de oorspronkelijke code even omgezet naar commentaar, zodat je beide varianten kan uitproberen. De oorspronkelijke code werkt uiteraard alleen als je ook het veld van de query aanpast.

Daarnaast lijkt het mij handig als je alleen kunt filteren op auteurs die ook daadwerkelijk gebruikt zijn in de tabel Titels. Wat heeft het immers voor zin om een auteur te kiezen waarvan je nog geen boek hebt (ingevoerd)?
Dus ik zou de query voor het formulier zo maken:
Code:
SELECT Titel.Titel, Auteur.AuteurID, Auteur.Auteur, Categorie.Categorie, Titel.Foto,
Titel.Opmerking, Titel.Gelezen, Titel.TitelID
FROM Categorie INNER JOIN (Auteur INNER JOIN Titel ON
Auteur.[AuteurID] = Titel.[AuteurID]) ON Categorie.[CategorieID] = Titel.[CategorieID];

Kijk maar of je er zo uit komt!
(De Windows versie doet overigens niet ter zake, dit probleem had je in Windows XP ook gehad ;))
 
Helaas ik kom maar niet verder. (Black out?)
Ik probeer nu stapje voor stapje verder te komen door te vragen of ik op de goede weg ben.
Wat heb ik gedaan:
- opnieuw Keuzelijst met invoervak geplaatst op formulier.
- de waarden opgehaald uit Tabel Auteur.
- veld auteur toegevoegd.
- de waarden opgeslagen in veld: Auteur.
- label Auteur meegegeven.

Is dit juist?
zo ja ga ik verder met het proberen om de filter werkend te krijgen.
zo nee wat gaat er mis.

PS
De handleiding voor beginners hoofdstuk 8 geraadpleegd maar kom hier niet verder mee
 

Bijlagen

Ik kijk er morgen even naar, en zal dan ook mijn (werkende) oplossing posten die gemaakt is op basis van de vorige database. Maar ik kijk uiteraard ook even naar de laatste db, want ik ben nieuwsgierig naar waarom het niet lukt op basis van de aanwijzingen.
 
Laatst bewerkt:
Het is volgens mij niet handig om een afhankelijk formulier/veld te gebruiken om filtercriteria in te geven. Als je nu op het formulier Titel een auteur kiest, wordt de auteur van het voorstaande boek gewijzigd. Dat kan niet de bedoeling zijn. In je vorige versie had je wel een niet-afhankelijk veld. Die versie werkt met een kleine aanpassing overigens gewoon (auteurID opnemen in de bron van het formulier).
Zie 2025_01 Boekenbestand TEST FILTEREN.accdb.

Persoonlijk vind ik een nadeel van deze aanpak dat je moet navigeren door alle resultaten. Ik heb ter illustratie een opzetje gemaakt met een hoofd en subformulier. Op het hoofdformulier geef je de auteur op en op het subformulier zie je direct alle resultaten. Hoofd en sub zijn niet gekoppeld.
Zie 2025_01 Boekenbestand filteren.accdb.

Nog een paar andere tips:
  • Zet bij al de relaties de eigenschap referentiële integriteit afdwingen op Ja. Zo voorkom je bijvoorbeeld dat in titels een niet bestaande locatie (ID = 0) opgeslagen wordt (zie Query1 in 2025_01 Boekenbestand filteren.accdb).
  • Bedenk dat boeken geschreven kunnen zijn door meer dan één auteur. Jouw model kan dat niet aan.
  • Triller schrijf je als Thriller 😁.
 

Bijlagen

Of de opmerkingen van Peter nu handig()er) zijn of niet: ik snap ook niet waarom je de keuzelijst in het formulier hebt veranderd, en niet de keuzelijst in de koptekst. Want om te filteren ga je natuurlijk niet de keuzelijst gebruiken waarmee je de waarden in de tabel muteert. Daarmee vernaggel je de data, en dat is het laatste dat je moet willen.

In mijn voorbeeldje hou ik me dus gewoon aan de originele opzet, en die werkt prima. Zelf zou ik het formulier dus niet aanpassen naar een doorlopend formulier, want je ziet, als je filtert, het aantal overblijvende boeken per auteur dus netjes in de navigatiebalk aangegeven. En je wilt de boekgegevens nu eenmaal netjes op je scherm zien :).
 

Bijlagen

Heren, beide bedankt voor jullie aanwijzingen, tips, bestanden.
Alles werkt nu zoals de bedoeling is. Heb ook weer het een en ander geleerd.
De taalverbetering heb ik ook aangepast😀
 
Peter gaf nog een opmerking die wellicht handig voor je kan zijn. Namelijk: boeken kunnen door meerdere auteurs zijn geschreven. Dat geldt voornamelijk voor wetenschappelijke uitgaven, maar ook voor schrijvers (echt)paren zoals Sjöwall & Wahlöö. Je zult toch moeten nadenken over hoe je die wilt opslaan.

Als je dat niet belangrijk vindt, en altijd vanuit een boektitel wil werken, dan kun je wel met één auteursveld, of desnoods 2 in geval van twee auteurs, wel volstaan. Maar wil je het echt genormaliseerd doen, dan heb je dus tussen de boektitels en de auteurs een koppeltabelnodig (tAuteur-Titel) waarin je elke schrijver koppelt aan een boek. Op die manier zit je nergens aan vast, en kun je (bijna) alle situaties wel vastleggen.

Nogmaals: het is aan jou om te bepalen wat voor jou belangrijk is. Je zou bijvoorbeeld, als de data Access niet uitkomt, ook kunnen kiezen voor een keuzelijst met meerdere waarden. Dan heb je in essentie de beschreven situatie al gemaakt, waarbij je als voordeel hebt dat je alle gelinkte auteurs in één veld kan zien, maar ze ook apart kunt Filteren in een query. Ik ben zelf geen voorstander van zo'n veld, maar het wérkt wel :).

Overigens zijn relaties niet verplicht; je kunt Referentiële Integriteit ook op andere manieren afdwingen. bijvoorbeeld door zo'n keuzelijst te gebruiken. Maar het kan in mijn ogen geen kwaad om dat altijd op orde te hebben. Ook al omdat het andere voordelen biedt. Zoals het "Trapsgewijs verwijderen". Stel dat je een auteur uit je collectie wilt verwijderen, en daarmee óók al zijn/haar boeken. Dan hoef je met die instelling alleen de auteur te verwijderen, en dan vertrekken de boeken ook. Dat kán handig zijn. Ook gevaarlijk: doe je dat met klanten, dan ben je vermoedelijk ook de bestellingen kwijt, en klopt je administratie niet meer. Dus dat zijn zaken waar je over na moet denken :).
 
Terug
Bovenaan Onderaan