Records bewerken dmv een querie

Status
Niet open voor verdere reacties.

rvdsch

Gebruiker
Lid geworden
18 jun 2009
Berichten
170
Beste forummers,

Ik zit met het volgende probleem; gebruiker A vult een levering in. Een tweede gebruiker controleert enkele dagen later de levering. Deze tweede gebruiker moet dan een vinkje aan kunnen tikken om aan te tonen dat de levering goed gekeurt is.
Ik heb een querie gemaakt omdat er bij het controleren van de levering uit een tweede tabel informatie moet worden gehaald. Ik heb dus dmv een querie die informatie gecombineerd. Alleen als ik in een querie zit kan ik het record niet meer aanpassen. Ik heb al zitten klooien met dingen als AllowEdits = true maar ik kom er niet uit.
Iemand enig idee, Is het bijvoorbeeld ook mogelijk om rechtstreeks in de tabel te editen maar dan moet wel de info uit de tweede tabel zichtbaar zijn.
 
Controleer eerst eens of je het sleutelveld uit de tweede tabel in de query hebt opgenomen; als dat zo is kan je de query niet bijwerken.
Waarschijnlijk heb je dat veld toch niet nodig, maar als je het wilt zien, dan moet je de verwijzing in tabel 1 gebruiken.
Verder is het beter om geen outer join te gebruiken, mocht dat het geval zijn.

Michel
 
Michel,

Ik begrijp je post niet helemaal. Ik verwijs in de querie naar beide tabellen. Maar slechts 1 tabel hoeft maar upgedate te worden. Wat kan ik doen:)
 
Ik ga er vanuit, dat je de twee tabellen aan elkaar hebt gekoppeld. Hierbij leg je een koppeling tussen het sleutelveld uit de eerste tabel met het veld dat hetzelfde gegeven bevat in de tweede tabel.

Voorbeeldje: je wilt een query tussen de tabel Personen en de tabel Uitleen maken. Je wilt de tabel Uitleen bijwerken, bijvoorbeeld met nieuwe uitleengegevens. Of bijwerken, als iemand een boek terugbrengt.
In de tabel Personen heb je een sleutelveld gemaakt, Pas_ID zodat iedereen uniek in de tabel staat. In de tabel Uitleen heb je, behalve de uitleengegevens, ook het veld Pas_ID opgenomen, omdat je uiteraard wilt weten wie het boek geleend heeft.
Deze twee tabellen koppel je dus aan elkaar door het veld Pas_ID uit tabel Persoon te slepen naar het veld Pas_ID uit de tabel Uitleen.
Ik probeer altijd zoveel mogelijk om logische sleutelnamen te bedenken, en al helemaal om de sleutelnamen en verwijzingen in de verschillende tabellen dezelfde naam te laten gebruiken. Waarom? Omdat Access ze dan al zelf voor me koppelt als ik een query maak. En da's wel zo handig...

Als dit voor elkaar is, en ik ga de query maken, dan heb ik dus in twee tabellen hetzelfde veld staan: Pas_ID komt voor in Personen, en Pas_ID komt voor in Uitleen. Welke van de twee moet je nu gebruiken?
Om de tabel Uitleen bij te kunnen werken, moet je het veld uit de tabel Uitleen gebruiken. Doe je dat niet, dan krijg je het probleem dat jij hebt.
En dat was dus de essentie van mijn eerste reactie: controleer eerst of
a. de tabellen wel goed aan elkaar zijn gekoppeld
b. of je het verwijzingsveld hebt gebruikt, en niet het sleutelveld
c. je mag ook geen outer join gebruiken op basis van de tabel Personen (in dit voorbeeld)

Als dit nog niet duidelijk genoeg is, dan is het misschien wel handig om de SQL code hier te plaatsen, dan kan ik wat meer zeggen over jouw code.

Michel
 
Hey Michel,

Het gaat mij slechts om twee velden die bewerkt moet kunnen worden. Het is een Ja/Nee veld en het Hoeveelheid veld welke in slechts 1 tabel voorkomen. Hier volgt mijn code. De naam van het veld wat bewerkt moet worden is
Code:
SELECT AlleOrders.Datum, AlleOrders.Bedrijfsonderdeel AS AlleOrders_Bedrijfsonderdeel, AlleOrders.Leverancier AS AlleOrders_Leverancier, AlleOrders.Product, AlleOrders.Hoeveelheid, AlleOrders.Transporteur, AlleOrders.Transportmiddel, AlleOrders.Doorgeleverd, AlleOrders.[Factuur geaccordeerd], Producten.Prijs, [Prijs]*[Hoeveelheid] AS Kosten
FROM Producten INNER JOIN AlleOrders ON Producten.NaamProduct = AlleOrders.Product
WHERE (((Producten.Bedrijfsonderdeel)=[AlleOrders].[Bedrijfsonderdeel]) AND ((Producten.NaamProduct)=[AlleOrders].[Product]) AND ((Producten.Leverancier)=[AlleOrders].[Leverancier]))
GROUP BY AlleOrders.Datum, AlleOrders.Bedrijfsonderdeel, AlleOrders.Leverancier, AlleOrders.Product, AlleOrders.Hoeveelheid, AlleOrders.Transporteur, AlleOrders.Transportmiddel, AlleOrders.Doorgeleverd, AlleOrders.[Factuur geaccordeerd], Producten.Prijs;
 
Waarom heb je <Group By> gebruikt? Zodra je de knop Totalen aanzet, is de query per definitie al niet meer te gebruiken om records te bewerken, dus die moet in ieder geval uit.
Het zal voor je berekening overigens ook helemaal niet uitmaken om die knop aan- of uit te zetten.
Verder neem ik aan, dat het veld <Producten.NaamProduct> je sleutelveld is in de tabel producten, anders werkt het ook niet.

Dus: zet de knop Totalen eens uit, en kijk dan nog eens of het werkt!

Michel
 
Hoi Michel,

Dankjewel voor je input. Ik heb de totalen knop uitgezet. Het sleutelveld is niet ProductNaam maar ProductID. Maar in de tabel AlleOrders wordt die niet ingevoerd. Ik kan het veld ProductNaam niet tot sleutelveld maken aangezien het geen uniek veld is. Is het wellicht een idee om het veld Product in de tabel AlleOrders ook een koppeling te maken naar ProductID?
 
Dat lijkt mij zelfs noodzaklijk! Om een query updatable te maken, moet je een sleutelverwijzing hebben naar de brontabel. Dat is per definitie het sleutelveld uit die brontabel. Dit veld moet dus aanwezig zijn in de tweede tabel, in jouw geval de tabel AlleOrders.
Dus dat is stap 1. De volgende stap is: in het scherm Relaties aangeven dat er een één op veel relatie is tussen de tabel Producten en AlleOrders. Er moet namelijk referentiële integriteit zijn tussen de tabel Producten en AlleOrders.
Dit betekent: je mag in de tabel AlleOrders geen producten opnemen, die niet in de tabel Producten voorkomen. Klinkt nog logisch ook...

Kijk maar eens of dt al genoeg is...

Michel
 
Hey Michel,

Ik kom er niet echt uit. In de tabel Producten heb ik ProductID(autonummering) als sleutelveld staan. Hoe krijg ik dan referentiele integriteit? Ik heb in de tabel AlleOrders geprobeerd een veld ProductID(numeriek) te maken. Alleen nu kan ik mijn formulieren niet meer gebruiken om de tabel AlleOrders up te daten. Er zit een probleem in met het introduceren van een OrderID in de tabel AlleOrders. Ik wil dat de gebruikers de naam van het product nemen.
Ik kan eigenlijk de tabel Alle Orders niet opslaan want dan krijg ik een foutmelding dat er een gerelateerde record in Producten moet zijn. Maar dat hoeft helemaal niet.:o

Is het eigenlijk uberhaupt mogelijk om een tabel uptedaten dmv een querie? Ik wil eigenlijk dat iemand gewoon een veld kan aanklikken in de querie en dat dan de tabel ook meteen geupdate wordt. Dus als er in een veld een ja/nee waarde wordt verandert verandert het record in de tabel ook.

Bedankt voor alle hulp:thumb:
 
Even voor alle duidelijkheid:
ik een foutmelding dat er een gerelateerde record in Producten moet zijn. Maar dat hoeft helemaal niet
Wat bedoel je daar precies mee? Zoals het er staat, wil jij dat het is toegestaan om producten te lveren/verkopen die je niet hebt. Je hebt tenslotte geen record van het bestelde artikel in produkten. Dat lijkt mij een vreemde situatie....
Ik denk ook niet dat dit het geval is, want in je oorspronkelijke query had je een koppeling gemaakt op NaamProdukt.

De bedoeling van Referentiële integriteit is, voorkomen dat je produkten uit de hoofdtabel opneemt in de gerelateerde tabel. In jouw geval is Produkten de hoofdabel, en AlleOrders is daar dus aan gerelateerd.
Op het moment dat je een sleutelverwijzing toevoegt aan de gerelateerde tabel, en je probeert de koppeling te leggen, zal dat niet lukken. Tenzij je nog helemaal geen records hebt aangemaakt in de tabel AlleOrders, maar daar is hier geen sprake van.
Het probleem dat je nu hebt, is dus: je hebt records in de tabel AlleOrders, die geen geldige waarde hebben in het veld ProduktID. Dat kan ook niet, want dat veld heb je net toegevoegd, en dat is dus automatisch leeg.
Om dus referentiële integriteit waar te borgen, zul je eerst de produktID's moeten invullen voor de bestaande records. Dat kan een lastig klusje zijn, als het veel records betreft. Je zou kunnen proberen om met een bijwerkquery deze velden bij te werken. Je zou bijvoorbeeld die records kunnen updaten waarbij in de tabel prdukt het veld NaamProdukt uniek is, dus één keer voorkomt in de tabel. Bij die produkten heb je namelijk ook maar één ProduktID.

Ik heb een voorbeeldje gemaakt, waarin het proces hopelijk wat duidelijker wordt.
Je moet dan kijken naar de tabellen tProdukten, en tAlleOrders. In de laatste tabel heb ik een lege kolom ANO gemaakt, die gevuld moet worden met de waarde uit de tabel tProdukten. Hierin is één artikelomschrijving niet uniek.
Met de queries 01 t/m 04 kun je zien wat je moet doen om het veld ANO van de unieke records toe te voegen aan de tabel tAlleOrders.

Om op het laatste deel van je vraag terug te komen: het is zonder meer mogelijk om records in een tabel m.b.v. een query bij te werken; ik doe eigenlijk nooit anders!

Hopelijk ben je hier weer wat wijzer van geworden...

Michel
 

Bijlagen

Dankjewel voor je voorbeeld. Ik ben totaal niet duidelijk geweest sorry daarvoor:o

Het feitelijke probleem is als volgt. Iemand moet dus handmatig de querie doorlopen en daarin records wijzigen. Deze wijzigingen komen alleen in de tabel AlleOrders voor.
De tabel Producten staat er alleen in om prijsinformatie te verschaffen. De tabel Producten hoeft niet gewijzigd of geupdate te worden.
Uitsluitend de velden Factuur Geaccordeerd en Hoeveelheid hoeven aangepast te kunnen worden met de querie. Het is dus echter geen automatisch update. Er kan dus ook geen command geschreven worden om het te wijzigen. Iemand moet dus die velden kunnen wijzigen.
Het zou dus ook rechtstreeks in de tabel AlleOrders kunnen wat mijn eerste gedachte was maar ik heb die querie in de productentabel nodig om de juiste prijsinformatie erbij te kunnen halen. Zijn er wellicht andere ideeen om dit te doen??
 
Misschien ben ik dan ook niet helemaal duidelijk geweest :) Jouw uitleg is precies zoals ik hem had begrepen ;)

Dus een nieuwe poging:
Je wilt records updaten in de tabel AlleOrders. Dat kan uiteraard in de tabel zelf, maar dan zie je niet alle produktgegevens. Je kunt ook een query maken op basis van de tabel, waarin je dan de velden zet die je wilt kunnen bijwerken. Tot zover niks aan de hand, alles werkt, en je kunt prima bijwerken.

Je wilt echter ook kunnen zien welke produkten je bijwerkt. Daarom heb je de tabel Produkten erbij gehaald, om die aanvullende informatie te zien. En nu begint het probleem. Access kan alleen maar weten welke informatie uit Produkten moet worden getoond, als de tabel Produkten precies één record heeft voor het record uit de tabel AlleOrders. Als die link niet kan worden gelegd door Access, kan de query niet worden bijgewerkt. Daarom moet er in de tabel AlleOrders dus een veld zijn, dat altijd naar een uniek record in Produkten verwijst. Dat zal dus eigenlijk altijd het sleutelveld uit de tabel Produkten moeten zijn, in jouw geval is dat dus ProduktID, want dat is een Autonummering veld, dat je als sleutel hebt vastgelegd.

Wat is nu waarschijnijk jouw probleem?
Moet ik weer naar een eerdere tekst verwijzen: in de tabel AlleOrders moet dus voor elk record een waarde zijn ingevuld in het veld ProduktID. Ik hoop, dat je van dit veld geen autonummer veld hebt gemaakt, want dan kunnen de artikelen natuurlijk nooit goed gematcht worden; dit veld moet een normaal numeriek veld zijn, met dezelfde veldinstelling als in de tabel Produkten, waarschijnlijk dus <Lange Integer>.
Op het moment dat je alle records in de tabel AlleOrders hebt voorzien van een geldig ProduktID, kun je in het scherm Relaties een koppeling leggen tussen de tabellen Produkten en AlleOrders. Nu kun je ook de optie <Referentiële integriteit> selecteren, want nu kan Access voor elk record in AlleOrders een geldig record in Produkten terugvinden.
Nu kun je ook queries maken die je kunt bijwerken.

Ik denk dus, dat er ergens bij jou nog een probleempje zit met je data in de tabel AlleProdukten, en vermoedelijk is dat dus dat je niet alle velden hebt voorzien van een geldig ProduktID.

Kun je anders een voorbeeldje posten, dan kan ik wat specifieker zijn.

Michel
 
Ok Michel ik snap hem helemaal. De vraag is alleen: hoe laat ik ProductID voorkomen in mijn tabel AlleOrders. Het is niet mijn bedoeling dat de gebruiker een nummer moet gaan intoetsen. Ik heb geprobeerd het te koppelen aan het veld Product in de tabel Alle Orders alleen dat lukte niet. Heb ik het niet goed gedaan of is er een andere methode?
 
Het zou zo moeten zijn, dat op het moment dat je een order aanmaakt in AlleOrders, er dus (waarschijnlijk via een formulier?) gelijk een ProduktID wordt weggeschreven in de tabel, tegelijk uiteraard met alle overige informatie die je opslaat als je een order maakt. Dat wijkt dus niet af van je standaardprocedure. Alleen: ik heb de indruk dat je tot nu toe dus geen ProduktID invoert, maar een ProduktNaam. Die dan wel uit de tabel Produkten wordt gehaald.
Als dat zo is, dan moet je dat deel van het proces aanpassen, dat je dus geen ProduktNaam meer opslaat, maar een ProduktID.
Voordat je dus verder gaat met verwerken van de tabel AlleOrders moet je eerst het veld ProduktID vullen met de juiste ProduktID's.
Dat doe je a.d.h. van de voorbeelden uit de db die ik eerder heb neergezet.

Nog even in het kort een uitleg daarover:
<01 - Aantal Records per ProduktNaam> is een query die bekijkt welke produkten dubbel voorkomen in de tabel Produkten.
Als je mazzel hebt, komt elke produktnaam maar één keer voor...
<02 - Producten met Uniek Artkelnummer> zoekt vervolgens m.b.v. query 01 op welke produktID's horen bij welke produktnamen.
Dat kan-ie doen, omdat hij alleen unieke produktnamen hoeft op te zoeken.
<03 - Tijdelijke tabel maken> maakt vervolgens een tijdelijke tabel aan met de produktnamen en produktnummers (ProduktID's in jouw geval)
Je hebt een tijdelijke tabel nodig, omdat je straks met het bijwerken anders in de problemen komt. Access voert moeilijk bijwerkqueries uit op basis van een andere query. Daarom maken we eerst een tijdelijke tabel.
<:p04 - AlleOrders ANO bijwerken> is dan de query die alles bijwerkt. We hebben nu een tijdelijke tabel met unieke produktnamen, en unieke produktD's.
Die gaan we koppelen op basis van Produktnaam (en dus niet ProduktID). Omdat we alleen de unieke produktnamen hebben, kunnen we de kolom ProduktID in de tabel tAlleOrders netjes bijwerken.
Wat je dan overhoudt, is een aantal records in de tabel AlleOrders waarvoor geen ProduktID kon worden gevonden, voornamelijk dus doordat de produktnaam in de tabel Produkten meer dan één keer voorkwam.
Die records zul je dus eerst met de hand moeten opzoeken en invullen, omdat je anders ook geen relatie kan leggen tussen de tabel Produkten en AlleOrders. (je weet wel: referentiële integriteit houdt in: alle records in de tabel AlleOrders kunnen via het ProduktID worden gekoppeld aan de tabel Produkten)

Overigens zou jouw oude procedure al helemaal niet goed kunnen werken als het veld ProduktNaam dubbele waarden zou bevatten in de tabel Produkten, dus ik denk dat Query 01 bij jou niet veel artikelen met meerdere ProduktID's zal opleveren, dus het uiteindelijke werk zal best mee kunnen vallen. Maar je hebt dus kans, dat er een aantal records in AlleOrders overblijft, waar geen ProduktID is ingevuld door query 04, en die moet je dus met de hand invullen.

Daarna hoef je daar dus nooit meer naar te kijken, en kun je m.b.v. de query de tabel AlleOrders altijd bijwerken.

Michel
 
Om dus even wat duidelijker te zijn:D Ik heb dus gedaan wat jij zei maar dan krijg ik dus bij het invullen van de tabel AlleOrders een foutmelding "Kan geen record toevoegen of wijzigen omdat er een gerelateerde record is vereist in de tabel Producten.

Ik vul in mijn formulier geen ProductID in. :eek:
Hoe zorg ik er nou voor dat dat goed gaat. Maw ik heb het al proberen te koppelen met het veld Product maar het lukt me gewoon niet.
 
Die foutmelding is op zich goed, want dat betekent dat Access nu controleert op geldige ProduktID's. Prima!
Nu de vraag: wat doe je er aan.... Eigenlijk geef je zelf al het antwoord: op je formulier vul je geen ProduktID in. En dat is nu verplicht, dus je zult op de een of andere manier dat nummer op je formulier moeten zetten.
Waarschijnlijk kun je in het ontwerpscherm de eigenschappen van ProduktNaam wel aanpassen, en daar nu het ProduktID als Besturingselementbron aanwijzen, maar dan zie je geen ProduktNaam meer.
Ik zou er dus een aparte keuzelijst met invoerbox bijzetten. Je kunt die maken met de Wizard, en dan de tabel Produkten gebruiken als basis, de velden ProduktID en Produktnaam als gegevensvelden, en dan eventueel de optie Sleutelkolom verbergen gebruiken om alleen de produktnamen te zien.
In een volgende stap gebruik je dan het veld ProduktID als doel om de waarde in op te slaan, en dan ben je er!
Omdat je het veld ProduktID uit de tabel AlleOrders in de onderliggende query (de bron van het formulier) hebt gekozen, wordt het ProduktID van de keuzelijst dan automatisch opgeslagen in de tabel AlleOrders, en is je probleem verholpen.
Doordat je in de keuzelijst nu ook de produktnamen ziet, kan het veld ProduktNaam uiteindelijk weg, want die info zie je nu twee keer.

Succes!

Michel
 
He eindelijk
Triomf! Hardstikke bedankt Michel. Ik heb het werkende gekregen. :thumb:
Het enige probleem is nog eigenlijk:o Hoe zorg ik ervoor dat er in de tabel AlleOrders automatisch het juiste ProductID wordt gekozen??
 
Dat staat dus in mijn vorige antwoord: maak op je formulier een keuzelijst met invoervak, die je baseert op de tabel Produkt, en laat opslaan in de tabel AlleOrders.
Dat laatste gebeurt dus als je kiest voor de optie <Waarde opslaan in dit veld>, waar je, als het goed is, het veld ProduktID tussen moet hebben staan. Ik ga er nu vanuit, dat je het veld ProduktID uit de tabel AlleOrders in je query hebt staan, want anders werkt het nog steeds niet....

Michel
 
Hey Michel

Ik had je post van 1357 over het hoofd gezien... Maar hoe maak je het doel van de waarde opslaan? ik heb nog steeds hetzelfde probleem. Dit is de code van de querie die ik gebruik in mijn formulier om het goed te krijgen. Maar hij slaat nog steeds niet de waarde op als de juiste ProductID. Hardstikke bedankt voor al je hulp dusver:thumb:

Code:
SELECT AlleOrders.ProductID, Producten.ProductId, Producten.NaamProduct
FROM AlleOrders INNER JOIN Producten ON (Producten.ProductId = AlleOrders.ProductID) AND (AlleOrders.Product = Producten.NaamProduct)
WHERE (((Producten.Leverancier)=[forms]![BCNW].[Leverancier]) AND ((Producten.Bedrijfsonderdeel)=[forms]![BCNW].[Bedrijfsonderdeel]))
ORDER BY AlleOrders.ProductID, Producten.ProductId;

Ok ik heb het werkend gekregen. Ik vul nu dus idd alles dubbel in. Wat je zegt Michel kan wel maar dan wordt er voor het veld ProductNaam niets meer ingevuld. Dat betekent dus dat degene die AlleOrders tabel gebruikt aan de hand van ProductID moet kunnen zien welk product er gebruikt wordt.
Is het mogelijk om met 1 veld twee invoervakken in te vullen. Of moet ik ProductID in mijn tabel AlleOrders zo instellen dat daar ook een Productnaam inverschijnt? Zoja hoe kan dat dan?
 
Laatst bewerkt:
Begrijpend lezen is ook een kunst:o

Ok aan de hand van jouw post 1245, die bijwerkquerie hoef je dus maar 1 keer te doen of om de zoveel tijd? Ik vrees namelijk dat ik veel dubbele productnamen ga hebben.

Ik ga er morgen weer verder mee

Bedankt voor al je geduld ook:p
 
Status
Niet open voor verdere reacties.
Terug
Bovenaan Onderaan