Alles weergeven in Query na niets invullen keuzelijst

  • Onderwerp starter Onderwerp starter EGeen
  • Startdatum Startdatum
Status
Niet open voor verdere reacties.

EGeen

Gebruiker
Lid geworden
21 mrt 2008
Berichten
84
Ik heb verschillende dingen geprobeerd, maar wat moet er op de puntjes staan?

IIf([Forms]![FrmInventaris].[CboVoertuig].[Value]="";...............;[Forms]![FrmInventaris].[CboVoertuig].[Value])

Wat is de bedoeling? Als in de keuzelijst (CboVoertuig) niets wordt ingevuld, dan moet gewoon alle records worden weergegeven. Als er wel wat wordt ingevuld, dan moet die waarde uit de keuzelijst als criterium dienen in de query. Dat laatste lukt wel.

O.a. geprobeerd met <>"" Werkt wel in een leeg criteriumveld bij een query, maar niet in bovenstaande regel van IIF.

Mijn dank!
 
De constructie is geheel anders als je denkt, maar uiteraard wel te maken.
Code:
IIf([Forms]![FrmInventaris].[CboVoertuig].[Value] Is Null;True;[VoertuigID] = [Forms]![FrmInventaris].[CboVoertuig].[Value])
En dan filteren op <>Onwaar.
 
Top, hartelijk dank, heb even zitten knutselen. Maar is gelukt. Dus eigenlijk is het klaar, maar...

Ik probeer het steeds te begrijpen en probeer dus steeds dingen uit. Nu heb ik bijvoorbeeld het <>onwaar gedeelte eruit gelaten, en dan doet hij het ook goed. Doe ik iets verkeerd of?

Het is nu zo:

SELECT TblPlaatscombi.Vak, TblPlaatscombi.Opbergmethode, TblProductlijst.CategorieID, TblProductlijst.Productnaam, TblProductlijst.MaatID, TblProductlijst.TypeID, TblInventaris.ProductID, TblProductlijst.SoortID, TblProductlijst.TitelID, TblProductlijst.MerkID, TblProductlijst.Maatextra, TblInventaris.Hoeveelheid, TblInventaris.[Volume(0-100%)], TblInventaris.Houdbaarheid, TblInventaris.Getest, TblInventaris.[Schoon/leeg], TblInventaris.Opmerkingen, TblPlaatscombi.Voertuig
FROM TblProductlijst INNER JOIN (TblPlaatscombi INNER JOIN TblInventaris ON TblPlaatscombi.PlaatsID = TblInventaris.PlaatsID) ON TblProductlijst.ProductlijstID = TblInventaris.ProductID
WHERE (IIf([Forms]![FrmInventaris]![CboVoertuig] Is Null,True,[Voertuig]=[Forms]![FrmInventaris]![CboVoertuig]));
 
Klopt het volgende als ik de formule uitelkaar splits:

De formule geeft aan dat: Als de keuzelijst "niets is", alles moet worden geretourneerd dat wel een waarde heeft. En als er wel wat in de keuzelijst staat, dat dit als criterium geldt. Echter als wordt aangegeven dat alle records moeten worden weergegeven "die waar zijn" (en dat er dus wat in staat, toch?), dan is de selectie (<>ONwaar) die aangeeft alle records met de gekozen velden waar "niets in staat" weg te laten toch dubbelop?
 
Laatst bewerkt:
Dan komt er een probleempje bij. Het lukt me om de formules er netjes werkend in te krijgen (twee van de vier keuzelijsten). Maar als ik aankom bij de derde en vierde gaat het mis. Dit komt volgens mij omdat het subformulier met een query werkt waarbij de eerste twee kolommen nog gebaseerd zijn om de derde en vierde keuzelijst.

Het gaat dus om FrmInventaris.

(let niet op de de rechter tabellen in het relatieschema, het is een werkdocument tot nu toe :o)

Vervolg als dit af is om indruk te geven wat het ongeveer wordt:
Om de link te maken tussen de twee tabellen wil ik later in het subformulier eerst zelf drie keuzes maken (Categorie, productnaam en maat) waarna in een keuzelijst op basis van de ingevoerde gegevens de record(s) laat zien die erbij horen uit de tabel "producten". Dit om niet in één keuzelijst een lijst met duizend producten te hebben, en om het duidelijk te laten zien in het scherm welke producten in de gekozen plaats bevind.

Hierna als dit lukt met rechterklik op een desbetreffende record, zodat voor die record een popup komt met de keuze om het product te verplaatsen naar andere auto/plaats (stel het product bevind zich daar al, dan moet het aantal worden opgeteld.) Nog genoeg uit te zoeken voor mij dus.
 

Bijlagen

Laatst bewerkt:
Waar zit ik naar te kijken? Behalve naar tabellen met een (in mijn ogen) verkeerde sleutel (Merk is een tekstveld met de omschrijving, moet je niet als sleutel gebruiken. Maak een veld MerkID en gebruik dat om te koppelen bijvoorbeeld) doet de filtering op de query het toch prima? Het formulier filtert niet op de keuzelijsten, maar die doen sowieso gekke dingen, dus voordat ik er iets van kan zeggen, wil ik eerst weten wat de bedoeling is :).

Wat de filtering zelf betreft: die is best verklaarbaar. Je kijkt met de IIF naar een keuzelijst, en dan naar of die keuzelijst leeg is of niet. Is die leeg, dan retourneert de IIF de waarde TRUE. Dat snapte je al geloof ik. Is de keuzelijst niet leeg, i.e. er is een waarde geselecteerd, dan kijkt de IIF naar de ONWAAR tak. En daarin staat een vergelijking, namelijk: [VoertuigID] = [Forms]![FrmInventaris].[CboVoertuig].[Value]. En een vergelijking is Waar of Niet waar. Een vergelijking die WAAR is krijgt de waarde -1, en bij ONWAAR zie je een 0. Kortom: de hele IIF levert altijd één van deze twee waarden op: WAAR (lijst is leeg of voertuig is gelijk aan keuzelijst) of ONWAAR (lijst is niet leeg, en voertuig is niet gelijk aan keuzelijst). Door te fiteren op WAAR, of (iets uitgebreider) <>ONWAAR laat je dus alleen die records zien die je wilt zien.
 
Zoals ik in een boek heb gelezen kon het werken met een primaire sleutel voor een tekstvak wel. Het voordeel is dat het een redelijk statische lijst is, en in de verschillende namen(bijvoorbeeld de merken) geen dubbele waarden voorkomen. Als gewerkt wordt met een primaire sleutel, kan het wel voorkomen dat er dubbele waarden voorkomen. Vanwaar dat het niet goed is om het zo te doen?

Zal nu kijken naar uw uitleg over filteren :d
(Het filter werkt inderdaad nu niet. Als ik de laaste twee "Where's" weglaat (dus over methode en vak) dan werk hij wel. Dus in geval van "Quad" met o.a. Spalkentas (wat nu de enige is met inhoud) geeft hij het hiervan weer.
 
Laatst bewerkt:
In deze bijlage heb ik het aangepast en werkt het filter dus wel (afgezien de "methode" en "vak").
Moet nog nadenken hoe ik het inelkaar krijg, want zoals te zien wordt het eigenlijk een te lange opsomming van kolommen.

Echter als voorbeeld heb ik hier ook <>False weggelaten, want dan doet hij hetzelfde als dat het er wel in staat.

Echter het gaat er dus om, dat als ik dezelfde regel erin typ voor methode en vak, de hele filtering werkt zoals in vorige bijlage. (Oftewel dat werkt dus niet)
 

Bijlagen

Laatst bewerkt:
Het voordeel is dat het een redelijk statische lijst is, en in de verschillende namen(bijvoorbeeld de merken) geen dubbele waarden voorkomen. Als gewerkt wordt met een primaire sleutel, kan het wel voorkomen dat er dubbele waarden voorkomen.
Tekstvelden nemen per definitie altijd meer ruimte in beslag dan numerieke velden, dus alleen dat al zou een reden moeten zijn. Om dubbele (naam)waarden te voorkomen, maak je een unieke index op het tekstveld. Kun je een tekst ook niet dubbel invoeren.
 
Heb de tabellen zoals je zei veranderd. Hele database moest dus even over de kop. Met leuke foutmelding van Access erbij. In ieder geval Ben nu weer op hetzefde punt aanbeland. Echter in de vorige dataset lukte het mij wel om de boel te filteren, echter nu niet meer.

SELECT TblVoertuig.Voertuignaam, TblKoffer.Koffer, TblVak.Vak, TblMethode.Methode, TblInventaris.Hoeveelheid, TblCategorie.Categorie, TblProductnaam.Producten, TblType.Type, TblProductlijst.ProductID, TblInventaris.Houdbaarheid, TblInventaris.[Volume(0-100%)], TblInventaris.Opmerkingen
FROM TblVak INNER JOIN (TblVoertuig INNER JOIN (TblMaat INNER JOIN (TblCategorie INNER JOIN (TblType INNER JOIN (TblProductnaam INNER JOIN (TblMerk INNER JOIN (TblMethode INNER JOIN (TblProductlijst INNER JOIN (TblKoffer INNER JOIN (TblPlaatscombi INNER JOIN TblInventaris ON TblPlaatscombi.PlaatsID = TblInventaris.PlaatsID) ON TblKoffer.KofferID = TblPlaatscombi.KofferID) ON TblProductlijst.ProductID = TblInventaris.ProductID) ON TblMethode.MethodeID = TblPlaatscombi.MethodeID) ON TblMerk.MerkID = TblProductlijst.MerkID) ON TblProductnaam.ProductnaamID = TblProductlijst.ProductnaamID) ON TblType.TypeID = TblProductlijst.TypeID) ON TblCategorie.CategorieID = TblProductlijst.CategorieID) ON TblMaat.MaatID = TblProductlijst.MaatID) ON TblVoertuig.VoertuigID = TblPlaatscombi.VoertuigID) ON TblVak.VakID = TblPlaatscombi.VakID
WHERE (IIf([Forms]![FrmInventaris]![CboVoertuig] Is Null,True,TblPlaatscombi!VoertuigID=[Forms]![FrmInventaris]![CboVoertuig])<>False);

Ik weet niet hoe ik duidelijker moet maken wat en hoe ik het precies wil maken. Hopelijk lukt het met de info die ik aangeef.
 

Bijlagen

Laatst bewerkt:
Eventjes vlug jou DB geopend en in de QryInventaris de criteria gewist en nog blijft de query leeg; dus daar klopt er al iets niet. Normaal zou Uw sub dus (denk ik) moeten gevuld zijn met alle data als alle lijsten leeg zijn en dan filter je met de keuzelijsten tot je je beoogde resultaat krijgt? Ik heb indertijd zoiets gemaakt aan de hand van internet voorbeeld (welliswaar met VBA) waar je keuzelijstjes van ja-nee, datum, getallen en tekst met elkaar kon combineren en dan de kolommen die je nodig had kon verbergen of weergeven en daar dan een printscreen of rapport van maken. Is dat je bedoeling? Kan je daar dan wel bij helpen dacht ik.
 
Dat je geen records meer ziet in je subformulier is vrij logisch, omdat je overal Inner Joins gebruikt. En dat betekent dat het aantal records vermindert als er geen waarden worden ingevuld in tabellen die gekoppeld zijn. Dat is het geval met de tabel [TblPlaatscombi] waar een aantal records geen waarde heeft voor [VakID] en [MethodeID]. En daarmee verlaag je het aantal records tot 0. Voor die tabellen moet je dus een Outer Join gebruiken, zodat je altijd alle records van [TblPlaatscombi] blijft zien.
 
Ik heb de db (uiteraard, zou ik zeggen) weer aangepast, en de filtering uit de query weggehaald. Sowieso ben ik daar geen voorstander van, ik filter liever op het formulier zelf. Op die manier houd je de onderliggende query namelijk schoon. Al werkt de truc met de IIF an sich verder wel goed. Maar zonder het formulier actief krijg je altijd de vraag naar de parameter, en dat zou je niet moeten willen hebben. Vandaar dat ik liever op het formulier filter. Omdat je 4 filters hebt, heb ik daar een functie voor gemaakt. Dat hoeft niet, maar je krijgt dan veel meer code en dit is vind ik wat netter.
 

Bijlagen

Wederom heel erg bedankt. Zit nu met verschillende Excelbestanden te werken, en dat werkt totaal niet. Er moet dus een werkbare oplossing komen. En naar mijn idee is Access dan de oplossing. Als Accessbeginner is het erg lastig.

Zal meteen kijken wat jullie oplossingen zijn en hoe dit verder vormgegeven is en moet. Had totaal nog niet stilgestaan bij de Jointypes. Ben erg blij met alle hulp die al tot zover is verkregen. Top!

P.s. Zit sowieso door de hulp al met een smile achter het beeldscherm, maar met een straaljager in het document begin ik echt luidop te lachen. :P


@JohanRVT: Het moet een soort werkformulier worden waarin ik als ik bezig ben met de materialen, deze gemakkelijk kan verschuiven van de ene plaats naar de andere. Gebruikte producten kan aanvullen uit bijvoorbeeld de voorraad (of nieuwe producten bijvoegen etc). Dus het moet eigenlijk goed duidelijk zijn met welke producten op welke plaats ik bezig ben. Vandaar dit overzicht. Daarnaast en dat is dan niet zo'n probleem meer in één klap kan zien welke producten bijna over datum zijn. Nu moet ik dat aan de hand van vele verschillende Exceldocumenten(met verschillende tabbladen) met de hand gaan doorspitten.

Dat is het eerst het belangrijkste. Daarna als ik wat meer vaardigheid heb ontwikkeld :confused: Het zo laten maken dat het ook bijhoud hoeveel producten zijn gebruikt, weg zijn gegooid etc. Zodat op het einde van het jaar duidelijk wordt wat de kosten zijn geweest.
 
Laatst bewerkt:
In een formulier met subformulier met gegevensblad weergave kan je kolommen makkelijk verslepen van plaats wat jou ene vraag zou oplossen. Ik gebruik dan een pop-up formuliertje dat je opent via dubbelklikken op de recordkiezer van het item dat je wenst. Je kunt dan in die pop allerlei dingen laten verschijnen gerelateerd aan die record (heb een voorbeeldje gemaakt via sloopwerk uit m'n database, sorry als een en ander er niet bij zit maar je kunt daar misschien mee weg)
 

Bijlagen

Dank, ben het weekend drukbezet. Maar zal na nu straks het vluchtig bekijken, begin volgende week helemaal uitspitten. Erg bedankt!
 
Vandaag toch maar even goed voor gaan zitten. Ben opzich een eind gekomen, echter wel steeds met de codes die mij bekend (geworden) zijn. Een stap verder lukt slecht. Google geeft helaas niet altijd antwoord. Er werd al eens gezegd: "Niet handig dat je niet van te voren een plan hebt opgesteld zodat goed te zien is wat je wilt bereiken". Ik merk dat nu ook, echter ik weet ook niet precies wat de mogelijkheden zijn (en het gemakkelijkste is). Op basis van de reacties ben ik al stukken verder gekomen en heb ik nieuwe ideeën opgedaan.

Plan 1: In hetzelfde formulier (dat gegeven was) de data zo veel mogelijk aanpassen (mislukt)
Als ik nu de data aanpas, dan vult Access gegevens aan in een tabel waar het niet hoort of moet. De keuzes zijn namelijk al gegeven in een tabel. Meer zijn er niet en mogen er niet bijkomen. Pas ik dit aan (dus de besturingselementbron weglaten) dan laat hij alle vakken leeg(afgezien daarvan een keuzelijst werkt ook niet). Dus daar heb je niets aan. Daarbij komt natuurlijk dat ik een tabel heb gemaakt waarin de combinaties staan. Uit vier 'keuzelijsten met invoervak' zou dan in principe een Plaatsbepaling (combinatieID) moeten komen die Access apart overneemt en opslaat in de andere tabel(Inventaris). Dacht al aan systemen om de eerste twee categorieën m.b.v. keuzelijsten uit te kiezen, waarna de ID opgeslagen wordt doormiddel van een keuzelijst met invoervak waarbij de keuze door de eerste twee gemaakte keuzes een stuk kleiner is. Echter dit gebeurd niet, en er moet natuurlijk veel meer gebeuren dan alleen het wijzigen van een plaats van een product.

Plan 2: Wat mooier lijkt mij (vastgelopen)
Ik dacht, als ik nou een formulier laat openen bij het aanklikken van de rechtermuisknop op een bepaalde rij met gegevens zodat deze op die manier wordt aangepast. Hierin wordt in dat formulier een subformulier gewijzigd a.d.h. van de bovenstaande gegevens (selectievak toename, afname, wijziging etc). Wat er verder moet gebeuren met de record bij het wijzigen (etc) is dan volgende lastigheid, echter het is volgens mij de enige mogelijkheid. (In sommige gevallen hangt het product niet helemaal af van productID (want Merk doet er dan vaak niet toe, maar wel de productnaam, type en maat(en deels Houdbaarheidsdatum), dus hierop moet dan gesorteerd en gezocht worden om te kunnen aangeven wat ter vervangen op voorraad ligt).

Wat moet er gebeuren:
- In het eerste formulier (precies te zijn subform): als er met de rechtermuisklik op een cel wordt geklikt: De record van deze cel (uit de query dus) opslaan in variabele en een formulier openen.
- De inhoud van het subformulier afhankelijk maken van het gekozen selectievakje.

Ik hoop dat steeds meer duidelijk wordt wat er mijn doel is. Als er andere oplossingen zijn (afgezien inventarissoftware kopen :P) sta ik daar altijd voor open.

Mijn dank,
 

Bijlagen

  • InventarisJPG.JPG
    InventarisJPG.JPG
    72 KB · Weergaven: 75
... Ik merk dat nu ook, echter ik weet ook niet precies wat de mogelijkheden zijn (en het gemakkelijkste is).
Het is nog niet te laat om je datamodel alsnog eens onder de loep te nemen, en je af te vragen wat de database eigenlijk moet doen. Wat is de informatiebehoefte die je hebt en die je wilt vastleggen? Voordat je überhaupt aan formulieren en keuzelijsten gaat denken, laat staan bouwen, moet je die eerst duidelijk hebben. Zo'n vraag zou als antwoord kunnen hebben: "ik wil per voertuig een verbandkoffer hebben, en per koffer wil ik vastleggen wat er in zit, en wat de houdbaarheidsdatum is." Zo'n antwoord lijdt tot een compleet andere database aan datgene wat je nu aan het bouwen bent. Maar ik weet je informatiebehoefte niet, en dan is het lastig adviseren.
 
Je gaat nu van een zuiver opzoekformulier naar formulieren waarin je allerhande direct wilt kunnen aanpassen. Ik zou dus een popup formulier laten openen als je dubbelklikt op een record in de subform zoals in mijn voorbeeld en de rest bij zuiver opzoeken houden.
 
Status
Niet open voor verdere reacties.
Terug
Bovenaan Onderaan