Data opzoeken middels query

Status
Niet open voor verdere reacties.

JosjaWillems

Gebruiker
Lid geworden
15 dec 2008
Berichten
13
Hallo,

Wat ik probeer te bereiken lijkt simpel, maar met mijn schaarse ervaring met Access kan ik er niet achter komen hoe ik dit voor mekaar krijg:

- Er zijn twee tabellen, namelijk Klanten en Dossiers
- Bij een nieuwe klant, opent men de tabel klanten en voert daar de klantnaam en het klantnummer in
- Vervolgens opent de gebruiker de tabel dossiers, typt dat het dossiernummer in en typt hij het klantnummer in
- Dan nu het probleem: ik wil er voor zorgen dat na het invoeren van het klantnummer in een derde tabel de klantnaam weer wordt getoond, zodat de gebruiker kan zien dat hij het juiste klantnummer koppelt aan het nieuwe dossier

Om dit te bereiken heb ik een inner join functie geprobeerd, maar dat lijkt niet te werken. Ik heb de functie als volgt geformuleerd:

SELECT Klanten.Klantnummer, Klanten.Klantnaam FROM Klanten INNER JOIN Dossiers ON Dossiers.Klantnummer=Klanten.Klantnummer;

De database is overigens in de bijlage te vinden.

Bekijk bijlage Nieuw - Microsoft Office Access 2007 Database.zip

Alvast hartelijke dank voor de hulp!

Jos
 
Laatst bewerkt:
Laten we bij he begin beginnen...
Bij een nieuwe klant, opent men de tabel klanten en voert daar de klantnaam en het klantnummer in
Dit is niet de juiste werkwijze. Gebruikers moet je nooit in een tabel laten werken. Altijd via formulieren. Waarom? Op formulieren kun je checks inbouwen, zodat je voorkomt dat gebruikers verkeerde gegevens invullen, of gegevens niet invullen. Op een formulier kun je relevante gegevens laten zien, zoals dossiers die aan een klant zijn gekoppeld. En via formulieren geef je de gebruikers schermen die veel makkelijker en overzichtelijker zijn dan een tabel. Kortom: een gebruiker mag (bij voorkeur) niet in een tabel werken. Dat geldt uiteraard ook voor de tabel Dossiers...

Als je tabellen hebt die je wilt koppelen, moet je dat eerst doen in het venster <Relaties>. (werkbalk <Hulpmiddelen voor database>). In jouw geval heb je klanten, en voor die klanten maak je dossiers. Elke klant heeft één unieke klantcode, en elke klant mag meerdere dossiers hebben. Daarmee is de relatie tussen die twee tabellen bepaald: er bestaat een één (klanten) op veel (dossiers) relatie tussen de tabellen. In het venster Relaties maak je die door het veld [Klantnummer] uit [Klanten] naar het veld [Klantnummer] uit [Dossiers] te slepen. Daarbij zet je de optie <Referentiële Integriteit afdwingen> aan, zodat je in [Dossiers] geen klantnummers kunt opslaan van niet-bestaande klanten. En dat is uiteraard logisch, en ook zinloos: waarom zou je niet-bestaande klanten gebruiken? En toch de je dat: als je de koppeling (op basis van je voorbeeld db) probeert te maken, zul je zien dat dat niet lukt. In Dossiers heb je namelijk een klantnummer staan van een niet-bestaande klant.... Vind ik dus niet logisch!

Je wekt de indruk dat je de query zelf hebt ingetypt. Dat zou ik zowiezo niet doen, want dat kan heel mooi grafisch in het query-ontwerp. Als je de relaties hebt gelegd, hoef je ook alleen maar de tabellen toe te voegen; Access maakt dan zelf al de koppeling tussen de tabellen. (Is namelijk in het Relaties venster al gelegd).
 
Dit is niet de juiste werkwijze. Gebruikers moet je nooit in een tabel laten werken. Altijd via formulieren....

Dan mag je nu aannemen dat we formulieren gebruiken.

Je wekt de indruk dat je de query zelf hebt ingetypt. Dat zou ik zowiezo niet doen, want dat kan heel mooi grafisch in het query-ontwerp. Als je de relaties hebt gelegd, hoef je ook alleen maar de tabellen toe te voegen; Access maakt dan zelf al de koppeling tussen de tabellen. (Is namelijk in het Relaties venster al gelegd).

Ik had de 'wizard opzoeken' gebruikt om de klantnummers aan elkaar te koppelen, dus de relatie was al gelegd. Daarna ging ik naar het veld 'klantnaam' in de tabel 'dossiers' en ging naar de rijbron om vervolgens een nieuwe query op te maken. Daar selecteerde ik alleen de velden 'klantnaam' en 'klantnummer' en de resulterende query is te zien in dat veld in de tabel 'dossiers'.

Ik heb geprobeerd om de query er juist in te zetten in de 'opbouwquery', maar dat is dus niet gelukt. Mijn vraag blijft dus hetzelfde: hoe zorg ik er voor dat als iemand een klantnummer uit een dropdown list selecteerd, de bijbehorende klantnaam automatisch getoond wordt?
 
In de bijlage een plaatje met betrekking tot de relaties tussen je tabellen. Zoals Michel al zei, moet je daar je relatie leggen. Die is er nu dus nog niet. Leg daar dus een relatie tussen de tabel Klanten en Dossiers.

Volgende vraag is wat het veld Klantnaam in je tabel Dossiers doet? Het referentieveld van de klanten in je tabel Dossiers is het veld Klantnummer. Het veld Klantnaam kun je in de tabel Dossiers dus verwijderen.

Volgende vraag is: "Hoeveel dossiers ga je per klan aanleggen"? Als dat 1 dossier is, dan is de volgende vraag waarom je daarvoor een aparte tabel aanmaakt.

Bij het maken van een database hoort een plan. Vanuit dat plan zet je een tabelstructuur op papier. Vervolgens ga je bepalen welke velden je in een tabel opneemt. Daarbij hou je rekening met databasenormalisatie. Zie onderstaande link:

http://nl.wikipedia.org/wiki/Databasenormalisatie

Nadat je de tabelstructuur hebt opgezet, begin je met het bouwen van je tabellen. Pas als dat klaar is, ga je beginnen aan je queries, formulieren en rapporten.

Zoals je zelf aangeeft is je kennis van Access schaars. Probeer dus eerst je de basisprincipes van Access eigen te maken (en dat moet je echt zelf doen), voordat je met het bouwen van een database begint. Wellicht kan onderstaande link je daarbij helpen.

http://www.gratiscursus.be/access_2007/index.htm

Mocht je daarna nog specifieke vragen hebben, dan kun je die hier altijd stellen.

Succes
 

Bijlagen

  • Relaties.PNG
    Relaties.PNG
    8,2 KB · Weergaven: 28
Laatst bewerkt:
Elke klant kan meerdere dossiers hebben, dus het komt geregeld voor dat een klant al lang geleden is ingevoerd en een nieuw dossier krijgt. In dat geval moet de gebruiker dus een nieuw dossier aanmaken en daar het juiste klantnummer aan koppelen. Ik ken de gebruiker (het is er slechts één) en het is een analfabeet die het voor elkaar krijgt om tot drie keer toe een getal fout over te typen. Daarom wil ik de klantnaam er achter laten opzoeken zodat hij kan zien dat hij het juiste nummer heeft ingetypt.

Als jullie een betere manier weten om er voor te zorgen dat hij het juiste nummer in tikt, dan hoor ik het graag.
 
Daarom wil ik de klantnaam er achter laten opzoeken zodat hij kan zien dat hij het juiste nummer heeft ingetypt.

en dat is dus een hele verkeerde denkwijze. Als je het goed inricht, heb je dat niet nodig. Wat je wel nodig hebt, is voldoende basiskennis om een relationele database in te richten.

Als jullie een betere manier weten om er voor te zorgen dat hij het juiste nummer in tikt, dan hoor ik het graag.

Met een goede koppeling hoeft er geen nummer ingetypt te worden. Een betere manier weet ik wel en dat heb ik je in mijn vorige posting uitgelegd.
 
Ik heb ook nog steeds de indruk dat je op basis van tabelgegevens werkt. Als je een goed formulier hebt gemaakt, zou je een formulier hebben op basis van Klanten, en een subformulier met Dossiers. Het subformulier is dan gekoppeld op basis van KlantID. De gebruiker hoeft dan niet eens meer een klant te zoeken, want per klant zie je de erbij horende dossiers, en je kunt zonder poespas en nieuw record toevoegen. Maar eerst zul je toch echt de koppelingen tussen de tabellen moeten regelen. Een tweede optie is nog dat je in het Dossiers formulier een keuzelijst met opzoekvak maakt voor het Klantnummer. Ook daarmee is het (zo goed als) onmogelijk om een verkeerde klant te kiezen.
verder sluit ik mij uiteraard aan bij Charles: verdiep je eerst wat meer in Access voordat je uitgebreide systemen probeert te maken. Ook op HelpMij doen we dat: met een cursus Access die we onlangs zijn gestart. In de Nieuwsbrief staat elke maand een nieuwe aflevering.
 
Status
Niet open voor verdere reacties.
Terug
Bovenaan Onderaan