In Access uit meerdere kolommen de laagste waarde bepalen

Status
Niet open voor verdere reacties.

ErikJonkers

Gebruiker
Lid geworden
27 feb 2012
Berichten
11
Ik heb de volgende uitdaging.
In een query heb ik voor verschillende records meerdere kolommen gecreeerd. In deze kolommen staan waarden en ik wil in de qeury een aparte kolom toevoegen die per record de laagste waarde uit deze kolommen terug laat komen.
Hoe krijg ik dit voor elkaar?

Alvast bedankt,
Erik
 
Niet doen, want waarom zou je? Gegevens die je kunt berekenen (en dit is er zo een) bereken je in een query, en sla je nooit op (al zijn er uitzonderingen denkbaar), maar laat je berekenen.
 
Klopt ik wil de waarde ook graag berekenen in de query en heb deze op een later moment nodig in een rapport.
Ter verduidelijking een voorbeeld:

Record Waarde1 Waarde2 Waarde3 Waarde4
A 5 2 4 9
B 7 9 1 2

De kolomkoppen zijn Record, Waarde1 etc..
De records zijn A met waarde 5,2 etc.... en B met waarde 7,9 etc.
En nu wil ik in een aparte kolom de laagste waarde bepalen van de kolommen Waarde1 t/m Waarde4
Voor record A is dit 2 en voor record B is dit 1.
Deze laagste waarde per record wil ik op een later moment weer gebruiken in een rapport.

Ik hoop dat het zo duidelijk is.
 
Als je 4 velden hebt met waarden is het nog wel te doen, al zet ik mijn vraagtekens bij deze manier van waarden opslaan. En zoals ik al zei: die vraagtekens staan al helemaal bij het willen opslaan in een tabel, want dat is dus totaal niet nodig. Ook een rapport kun je baseren op een query, en daar zit de berekening dan ook in. De manier waarop je het kunt doen, is met een aantal geneste IIF functies. Je kunt niet, zoals in Excel, een formule maken die de laagste waarde teruggeeft. Je moet elk veld apart met IIF met een ander veld vergelijken. Da's een behoorlijk gebrei, maar wel te doen.
 
Ik ga het rapport baseren op de query. Het opslaan in een tabel is niet nodig.

Ik ben een heel eind gekomen met de geneste IIf functie, zie het onderstaande breiwerkje van IIf functies;-) Het werkt maar tot op een zekere hoogte....
Ik heb uiteindelijk meer dan 20 waarden waarvan ik de laagste waarde wil bepalen en ik dacht effe doorbijten dan heb ik de formule maar zodra ik nog een IIf toevoeg aan het onderstaande breiwerkje dan krijg ik de volgende foutmelding 'de expressie die u hebt opgegeven is te complex' en daarmee geen resultaat, gggggrrrr en ik was zo lekker bezig maar Access trekt dit niet.
Heb jij nog een creatief idee?

Laagste waarde: IIf([C_032012]<[C_042012];[C_032012];(IIf([C_042012]<[C_052012];[C_042012];(IIf([C_052012]<[C_062012];[C_052012];(IIf([C_062012]<[C_072012];[C_062012];(IIf([C_072012]<[C_082012];[C_072012];(IIf([C_082012]<[C_092012];[C_082012];(IIf([C_092012]<[C_102012];[C_092012];(IIf([C_102012]<[C_112012];[C_102012];(IIf([C_112012]<[C_122012];[C_112012];[C_122012])))))))))))))))))
 
Je kunt maximaal 7 IIF functies nesten, dus daar ga je waarschijnlijk de teil in. In dat geval kun je nog een functie maken, en die aanroepen.
 
Als je gelijk had gezegd dat het om 10 (of misschien wel meer) velden zou gaan, had ik de IIF niet eens voorgesteld, want daar gaat het echt niet mee lukken. Bovendien is de formule die je nu gebruikt niet eens geschikt, omdat je maar één veld vergelijkt met een ander. Om bij het eerste veld te blijven: je kijkt of het eerste veld kleiner is dan het tweede, maar niet of het eerste veld groter is dan het tweede, en kleiner dan het derde. En zo zijn er tientallen combinaties die je moet controleren. Dus dit gaat echt niet lukken. Ik krijg wel de indruk dat je een totaal verkeerde tabelstructuur hebt gemaakt; ik zou hier een tabel voor gebruiken met een recordID, en één veld met de waarde. Heb je dan 10 meetwaarden, dan maak je 10 records aan. Vervolgens maak je op basis van die tabel een query die je groepeert op RecordID, en met de functie MIN zoek je dan de laagste waarde op. Zo simpel werkt dat in een goede database. Maar wat jij hebt, is dat helaas niet...
Met een functie met een virtuele tabel kan het overigens nog wel worden opgelost; je moet dan alle velden (record ID en Waarde uitlezen en in een nieuwe tabel zetten die dus is opgezet volgens mijn opzet. Vervolgens sorteer je de virtuele tabel, en lees je de laagste waarde weer uit. Zoals gezegd: daar heb je een virtuele tabel voor nodig.
 
Klopt ik ben het helemaal met je eens; de tabelstructuur die ik gebruik is niet volgens het boekje en daar ondervind ik nu ook de problemen van.
Ik heb hiervoor gekozen omdat de basisgegevens voor de database uit Excel komen en in kolommen zijn vastgelegd. Deze gegevens importeer ik in Access en daar worden deze gegevens weer gekoppeld met allerlei andere relevante gegevens. Ik heb er voor gekozen om de gegevens uit Excel 1 op 1 te importeren in een tabel in Access. Ik heb namelijk geen idee hoe ik dit anders had moeten doen...
Ik ben nu zo ver met mij database dat ik alleen nog op zoek ben naar de oplossing van dit probleem en de virtuele tabel klinkt als een mogelijke oplossing! Ik heb me verdiept in de virtuele tabellen maar ik kom er nog niet helemaal uit. Kun je me nog een stukje op weg helpen?
 
Als je niet opziet tegen een stevig stukje programmeren, dan kan dat uiteraard. Dan wil ik wel een werkend voorbeeldje hebben van jouw db structuur, want dit verhaal wordt anders dermate ingewikkeld dat ik vrees dat je het zelf niet zonder meer kunt omzetten naar jouw eigen situatie. En dan gaat het wel heel veel tijd kosten!
Overigens is het vermoedelijk een stuk simpeler als je de huidige situatie omzet en er alsnog een correcte db van maakt; uiteindelijk ben je daar veel beter mee af dan dat je nu een lapmiddel in de strijd gaat gooien. Althans: dat zou mijn insteek zijn... Je bent uiteraard niet de eerste die een Excel bestand moet omzetten naar een database ;)
 
Ik heb de oplossing gevonden. Ik heb een tabel gemaakt zoals het hoort, een recordID met een waarde en middels toevoegquery's wordt deze gevuld. Dit betekent dus wel een toevoegquery per waarde maar dat is te overzien. En zoals jij aangaf heb ik van die tabel een query gemaakt die groepeert op recordID en met de functie MIN bepaal ik de laagste waarde.
Bedankt voor de hulp!
 
Deze constructie zal misschien werken, maar is zo'n beetje de meest onhandige variant die je kunt bedenken, omdat je nu constant tabellen aan het legen en toevoegen bent. En bovendien heb je nu extra tabellen met in beginsel nutteloze informatie, want die staat ook in de andere tabellen. Dus ook al ben je nu tevreden met je oplossing, ik zou die toch snel vergeten, en het anders doen.
Omdat je wel in staat bent om de juiste queries te maken, kun je de oplossing ook met een Union query uitvoeren. In een Union query doe je eigenlijk wat ik voorstelde, namelijk alle 'horizontale' gegevens omzetten naar een 'verticale' tabel. Dus als je voor een veld nu 6 waarden hebt in de velden Waarde1 t/m Waarde6, krijg je in de Union query 6 records, met daarin de velden RecordID en Waarde.
Die is relatief simpel te maken, al moet je dat wel via het SQL venster doen, en niet via het Query ontwerpscherm. Het gaat als volgt:
Je kunt nog wel beginnen in het Ontwerpvenster, want de eerste query is een gewone selectiequery. Met daarin twee velden: [RecordID] en [Waarde1]. [Waarde1] geef je dan de naam: Waarde. In het veld Waarde1 staat dan dus: Waarde:[Waarde1].
De volgende stap moet dan in het SQL venster gebeuren, want nu ga je de code verder combineren. Zodra je de SQL knop aanklikt, zie je de huidige code:

[sql]SELECT [RecordID], [Waarde1] AS Waarde
FROM [Tabelnaam][/sql]

Deze kopieer je, en breid je als volgt uit:

[sql]UNION
SELECT [RecordID], [Waarde2] AS Waarde
FROM [Tabelnaam]
UNION
SELECT [RecordID], [Waarde3] AS Waarde
FROM [Tabelnaam][/sql]

En dat kopieer je dan net zo vaak door tot je alle waardevelden hebt toegevoegd. De laatste regel wordt dan nog:
[sql]ORDER BY [RecordID][/sql]

Nu kun je query opslaan, en heb je een dynamische tabel die altijd de juiste waarden laat zien, en je hoeft dus nooit meer een tabel te maken of bij te werken. Hooguit, als er een veld bij komt, de Union query aanpassen.
 
Top! dit is wat ik nodig heb. Thanks!

En mag ik dan zo vrij zijn om nog een vraag te stellen...?
Kun je in Access2003 een rapport exporteren naar PDF? Als ik google kom ik tot de conclusie dat dit alleen mogelijk is met Access2007/2010. klopt dat?
 
Het kan, maar is inderdaad nogal ingewikkeld, omdat Access zelf geen PDF kent. Maar hier staat een voorbeeldje van hoe het moet. Ik heb 'm zelf getest, en het werkt!
 
Het is me onduidelijk waar ik de bestanden moet neerzetten. Ik ben zo wie zo onbekend met DLL bestanden. Kun je dit zo maar doen zonder dat er iets omvalt?
En als ik de database in Access 2007/2010 ga gebruiken werkt het dan nog steeds?
Ik denk dat dit misschien wel een moment is dat ik ga overstappen naar MS 2010.
 
De code werkt ook als je de db overzet naar 2010, maar je hebt hem daar dus niet nodig. Sterker nog, het is beter om de eigen functie van 2010 te gebruiken. Alleen kun je dan alle verwijzingen naar de module van Lebans beter verwijderen.
In die db zitten dus procedures in modules die je in zijn geheel kunt importeren in je eigen db. Dat is de makkelijkste oplossing. Dus de modules van Lebans exporteren naar een bas bestandje (extensie van modules) en importeren in je eigen db.
 
Status
Niet open voor verdere reacties.
Terug
Bovenaan Onderaan