Toevoegquery enkel nieuwe gegevens toevoegen

Status
Niet open voor verdere reacties.

Webster23

Gebruiker
Lid geworden
17 apr 2018
Berichten
21
Beste forumleden,

Ik ben al een paar dagen aan het knoeien met een toevoegquery die uit verschillende tabellen gegevens combineert om er een nieuwe tabel van te maken.
Maar er komen in de eerste tabellen gegevens bij, deze moeten dus ook aan de tabel toegevoegd worden, maar enkel de nieuwe gegevens dus.
En daar loop ik telkens vast dat hij alles terug invoegt wat niet de bedoeling is.
Het zou ergens moeten lukken met in de SQL iets aan te passen, maar kan het zo niet direct vinden.
Hieronder mijn SQL Code:

INSERT INTO Tbl_VerdelingPlanAdressen ( DossierID, AdresId, Aantal )
SELECT Tbl_Dossiers.DossierID, Tbl_VastAdressen.AdresId, Tbl_Verdeellijst.Aantal
FROM (Tbl_VastPlan INNER JOIN Tbl_Dossiers ON Tbl_VastPlan.PlanNr = Tbl_Dossiers.PlanNr) INNER JOIN (Tbl_VastAdressen INNER JOIN Tbl_Verdeellijst ON Tbl_VastAdressen.AdresId = Tbl_Verdeellijst.DienstNaam) ON Tbl_VastPlan.PlanNr = Tbl_Verdeellijst.PlanNr
ORDER BY Tbl_Dossiers.DossierID, Tbl_VastAdressen.AdresId;

Kan er iemand mij hierbij helpen, hebben jullie meer gegevens nodig?
Laat maar weten!
In bijlage ook nog mijn ontwerpweergave.

Edit: nog vergeten te zeggen dat er geen unieke gegevens zijn. Per dossier kunnen er wel geen zelfde adressen terugkomen, maar in ander dossier kunnen die wel terugkomen.
Zie Toevoegquery2Forum.PNG


Alvast bedankt!

Webster23
 

Bijlagen

  • ToevoegqueryForum.PNG
    ToevoegqueryForum.PNG
    58,2 KB · Weergaven: 75
Laatst bewerkt:
Ik zie geen bijlage, alleen plaatjes. Of is dat wat je bedoelt met bijlage? Leg eens uit welke tabel dan de nieuwe records bevat, want ik snap je probleem wel, maar ik zie niet waar dat ontstaat. Wil je voorkomen dat de combinatie van de velden niet mogelijk is als het record al bestaat? Of gaat het om de records uit een specifieke tabel?
 
Hoi OctaFish,

Bedankt voor de snelle reactie!
Ik zal men database misschien toevoegen, is het duidelijker.Bekijk bijlage Verdeling Manuals & ProtocolsV0.4.accdb.zip

En nog een woordje uitleg...

Tbl_VastPlan: tabel van de plannen die we gebruiken
Tbl_VastAdressen: tabel van de diensten naar waar we de plannen dienen op te sturen
Tbl_Verdeellijst: tabel van hoeveelheid plannen en welke plannen er naar welke dienst gestuurd dienen te worden
Tbl_Dossiers: om de zoveel tijd kunnen er plannen aangepast worden, deze krijgen dan versienummers en datum wanneer ze in voege gaan, dit zet ik dan in een dossier met een dossiernummer en is gebasseerd op Tbl_VastPlan.

Tot zover geen probleem, maar nu wil ik een tabel maken (Tbl_VerdelingPlanAdressen), deze gegevens komen uit de toevoegquery Qry_VerdelingPlanAdressen.
Dus per dossier dienen de plannen via de verdeellijst naar verschillende diensten opgestuurd te worden, als ik de eerste keer de toevoegquery uitvoer is er geen probleem, maar de volgende keer als ik uitvoer komen de eerste dossiernummers ook bij in de Tbl_VerdelingPlanAdressen, en dit is niet de bedoeling, het zou enkel maar de nieuwste gegevens mogen zijn.

Eigenlijk is het moeilijker uitgelegd dan het is, maar weet niet goed hoe ik het anders moest doen :rolleyes:

Bedankt!
 
Tbl_Dossiers: om de zoveel tijd kunnen er plannen aangepast worden, deze krijgen dan versienummers en datum wanneer ze in voege gaan, dit zet ik dan in een dossier met een dossiernummer en is gebasseerd op Tbl_VastPlan. Tot zover geen probleem
Ik snap niet zoveel van je db, en de gegevens die je opslaat, en wellicht hoeft dat ook niet, maar toch even een vraagje over bovengaande zin. Je hebt zowel in de tabel [Tbl_Dossiers] als in de tabel [Tbl_VastPlan] een veld [Specialiteit] zitten, en dat veld moet m.i. in in ieder geval één tabel weg. [Specialiteit] is ofwel een eigenschap van een vastplan, ofwel een eigenschap van een dossier. In het eerste geval zal het veld in dossier nooit veranderen, in het andere geval kan het gedurende het werken met de dossiers wél veranderen, en dan is het dus geen status van het vastplan. Door het dubbel in te voeren vergroot je de kans op fouten, en heb je sowieso nodeloze dataredundantie (voor zover dataredundantie niet altijd nodeloos is natuurlijk). Daarnaast zie ik in Dossiers dat de versienummers niet logisch oplopen, wat ik wel zou verwachten. Als ik naar Plannr "SBP FLV" kijk, lopen de versienummers als volgt: 42-43-20. Dat is niet echt logisch. Dat kan natuurlijk met een testversie te maken hebben, maar toch.

Of het moeilijker uitgelegd is dan het is weet ik nog niet, want echt snappen doe ik het niet :). Ik zie in de tabel Dossiers maar één uniek veld, en dat is het DossierID. Een nieuw dossier is dus, als dat het criterium is, te filteren op basis van het niet-aaanwezig zijn van de dossierID's in de tabel [Tbl_VerdelingPlanAdressen]. Wat mij ook verbaast is dat het veld [DossierID] in [Tbl_Dossiers] numeriek is, en in [Tbl_VerdelingPlanAdressen] tekst. Dat kan natuurlijk niet, een getalveld moet een getalveld blijven.

Ik heb eerst een testje gedaan met een aantal dossiers, omdat ik niet in één keer alle dossiers wilde toevoegen. In de bijlage vind je nu 3 queries waarmee je kan spelen.
1. Qry_VerdelingPlanAdressen_0 maakt de tabel leeg
2. Qry_VerdelingPlanAdressen_1 vult de tabel met dossiers t/m dossier 10
3. Qry_VerdelingPlanAdressen_2 vult de tabel met 'nieuwe' dossiers (nummers hoger dan 10).

De derde query kun je dus gebruiken om de nieuwe dossiernummers toe te voegen. Overigens heb ik in je voorbeeldje wat aanpassingen gedaan, zodat a) de relaties weer kloppen en b) alle keuzelijsten in je tabellen er uit zijn. Dat laatste moet je in mijn ogen dus nooit doen; in een tabel horen geen keuzelijsten (op basis van tabellen) te staan.
 

Bijlagen

  • Verdeling Manuals & ProtocolsV0.4.1.zip
    63,7 KB · Weergaven: 49
Je hebt zowel in de tabel [Tbl_Dossiers] als in de tabel [Tbl_VastPlan] een veld [Specialiteit] zitten, en dat veld moet m.i. in in ieder geval één tabel weg. [Specialiteit] is ofwel een eigenschap van een vastplan, ofwel een eigenschap van een dossier. In het eerste geval zal het veld in dossier nooit veranderen, in het andere geval kan het gedurende het werken met de dossiers wél veranderen, en dan is het dus geen status van het vastplan. Door het dubbel in te voeren vergroot je de kans op fouten, en heb je sowieso nodeloze dataredundantie (voor zover dataredundantie niet altijd nodeloos is natuurlijk).
Is inderdaad een eigenschap van vastplan. Maar omdat ik in het formulier om Dossiers aan te maken, met "Keuzelijst met invoervak" werkte om de lijst van PlanNr de beperken stond dit erbij, kan ik dit anders oplossen? Of hoe moet ik die keuzelijsten invoeren?

Daarnaast zie ik in Dossiers dat de versienummers niet logisch oplopen, wat ik wel zou verwachten. Als ik naar Plannr "SBP FLV" kijk, lopen de versienummers als volgt: 42-43-20. Dat is niet echt logisch. Dat kan natuurlijk met een testversie te maken hebben, maar toch.
Komt inderdaad door testversie, normaal lopen die logisch op.

Wat mij ook verbaast is dat het veld [DossierID] in [Tbl_Dossiers] numeriek is, en in [Tbl_VerdelingPlanAdressen] tekst. Dat kan natuurlijk niet, een getalveld moet een getalveld blijven.
Moet ik de velden AdresID en Aantal ook veranderen in numeriek?

Ik heb eerst een testje gedaan met een aantal dossiers, omdat ik niet in één keer alle dossiers wilde toevoegen. In de bijlage vind je nu 3 queries waarmee je kan spelen.
1. Qry_VerdelingPlanAdressen_0 maakt de tabel leeg
2. Qry_VerdelingPlanAdressen_1 vult de tabel met dossiers t/m dossier 10
3. Qry_VerdelingPlanAdressen_2 vult de tabel met 'nieuwe' dossiers (nummers hoger dan 10).

De derde query kun je dus gebruiken om de nieuwe dossiernummers toe te voegen.
De derde query werkt idd uitstekend! Dat was wat ik zocht, enkel de nieuwe dossiers toevoegen.
Eerste kan ik niet gebruiken omdat ik tabel altijd moet bijhouden...

b) alle keuzelijsten in je tabellen er uit zijn. Dat laatste moet je in mijn ogen dus nooit doen; in een tabel horen geen keuzelijsten (op basis van tabellen) te staan.
Dan zit er ergens iets mis in mijn denkwijze om in een formulier keuzelijsten in te voeren, die tot doel hebben een tabel aan te vullen.
Hoe zit dit dan?

Alvast hartelijk bedankt!
 
Dan zit er ergens iets mis in mijn denkwijze om in een formulier keuzelijsten in te voeren, die tot doel hebben een tabel aan te vullen. Hoe zit dit dan?
Je denkwijze die je híer etaleert klopt als een bus. Keuzelijsten horen in mijn optiek thuis op formulieren, nergens anders. Daarbij kun je in de keuzelijst meerdere velden tonen om de selectie makkelijker te maken, maar de overige waarden uit die keuzelijst sla je dus níet op in de tabel. Vanwege de dataredundantie. Enige uitzondering: gegevens die variabel zijn. Denk aan artikelprijzen, die nog wel eens veranderen. Met alleen een verwijzing naar het ArtikelID kun je de prijs wel ophalen uit de tabel Artikelen, maar je krijgt dan altijd de actuele prijs, niet de prijs op het moment van de transactie. Dus in dat geval sla je de prijs wél op in de gekoppelde tabel. In een tabel horen geen keuzelijsten, omdat je in de tabel altijd moet kunnen zien wat er daadwerkelijk is opgeslagen. Met een keuzelijst zie je doorgaans een naam, en sla je een ID op.

Maar omdat ik in het formulier om Dossiers aan te maken, met "Keuzelijst met invoervak" werkte om de lijst van PlanNr de beperken stond dit erbij, kan ik dit anders oplossen?
Dat verklaart nog niet waarom je in de tabel [tbl_Dossiers] óók dat veld hebt staan. Zie uitleg hierboven wat betreft de keuzelijsten en variabele velden.

Moet ik de velden AdresID en Aantal ook veranderen in numeriek?
Overal waar je identieke velden gebruikt, die aan elkaar gekoppeld kunnen zijn, moeten de gegevenstypen ook hetzelfde zijn. Dus getalvelden matchen met getalvelden, en tekstvelden met tekstvelden.

De derde query werkt idd uitstekend! Dat was wat ik zocht, enkel de nieuwe dossiers toevoegen. Eerste kan ik niet gebruiken omdat ik tabel altijd moet bijhouden...
De eerste query (en de tweede dus ook) zijn alleen bedoeld om de werking van de derde query te demonstreren. Als je namelijk een toevoegquery draait met alle gegevens, geberut er daarna niet zoveel meer. Daarom maak ik dus eerst de tabel leeg, vul hem met de tweede query voor een deel, en gebruik de derde query om het gewenste effect te laten zien. En dat kan je dan een paar keer uittesten door weer overnieuw te beginnen :).
 
Dat verklaart nog niet waarom je in de tabel [tbl_Dossiers] óók dat veld hebt staan. Zie uitleg hierboven wat betreft de keuzelijsten en variabele velden.
Kan je in een formulier via die specialiteit de keuzelijst verkleinen in PlanNr? Zonder specialiteit ook als veld staan te hebben? Had veld specialiteit eens weg gedaan en toen werkte het niet meer.


In formulier dossiers zouden ook twee keer Username moeten geselecteerd kunnen worden, één keer als mail ontvangen is en één keer als plan ontvangen is. U had in de relaties 1 weggedaan, is dit gewoon terug toe te voegen?
Of is er een andere oplossing voor?

Bedankt!
 
Er is geen enkele noodzaak om die relatie überhaupt te leggen, laat staan twee keer. Relaties zijn bedoeld om in gekoppelde tabellen af te dwingen dat er geen ‘weduwen en wezen’ ontstaan. Dat je dus in de tabel [Verkopen] records hebt van niet-bestaande klanten. Keuzelijsten gebruik je op een formulier om specifieke gegevens in te vullen in een tabel, zoals in jouw geval medewerkers die ofwel een mailactie hebben uitgevoerd, ofwel een plan hebben ontvangen. Daarvoor gebruik je een keuzelijst, die is gebaseerd op de tabel [Medewerkers]. Het feit dat die medewerkers in de keuzelijst voorkomen betekent automatisch dat die personen zijn ingevoerd; je kunt immers geen personen kiezen die niet in de tabel staan. Door dus keuzelijsten te gebruiken op je formulier, heb je al de garantie dat die personen bestaan. Relaties maken die zekerheid, die dus al 100% is, niet groter of kleiner. Vandaar dat die relaties echt wel weg kunnen. Of je dat proces zo moet vastleggen is een heel andere vraag, maar daar gaat het hier niet om.

Je eerste vraag snap ik niet helemaal; wil je de keuzelijst kunnen filteren?
 
Nu kan ik idd beter volgen, ga ik een beetje oefenen met die namen van medewerkers in mijn formulier te krijgen.
En anders kom ik hier nog wel eens vragen als we vastlopen :rolleyes:


Je eerste vraag snap ik niet helemaal; wil je de keuzelijst kunnen filteren?

Er zijn voorlopig (komen er nog bij) 4 soorten plannen, SBP, SIP, SSP en MAN , die zijj nog onderverdeeld in verschillende zones vb SBP FLV, SBP FN,...
En om niet in de grote lijst met de zones te moeten zoeken had ik eerst op SBP, SIP,... gefilterd om in tweede keuzelijst minder opties te hebben.
Kan dit dan ook anders dan dit ook in de tabel te laten komen?
 
Dat moet je natuurlijk niet vanuit de tabel doen, maar vanuit een extra keuzelijst. Nogmaals: waarden dubbel opslaan doe je normaal gesproken niet. Dus in dit geval maak je een niet-afhankelijke keuzelijst met de plansoorten en die gebruik je vervolgens als filter om de tweede lijst samen te stellen. Daar zijn verschillende manieren voor, waarvan de makkelijkste bijna geen code nodig heeft; één regel om de tweede keuzelijst bij te werken (Me.TweedeKeuzelijst.Requery). En die actie hang je aan de gebeurtenis <Bij klikken> van de eerste keuzelijst (die met de plannen) zodat bij een klik op een type (SBP) de tweede wordt bijgewerkt.
 
Blijkbaar was mijn cursus Access toch maar heel basis.
Ik kan nog volgen met het maken van niet-afhankelijke keuzelijst, en dan ook nog waar ik die code moet ingeven.
Maar dan geeft hij foutmelding over die Me, of moet ik daar ook nog iets aan veranderen? :eek: Shoot me...

Heb dankzij u wel al meer inzicht gekregen in hoe tabels best opgebouwd worden.
Ik was ook meer vanuit een oplossing aan het terugwerken, maar blijkbaar is dat niet de goede weg...
 
Ik ga er vanuit dat je de keuzelijsten op een formulier gebruikt en niet vanuit een tabel. Met Me. verwijs je naar een object op het actieve formulier, dus als de naam van het object klopt, dan moet de code ook werken. Je krijgt sowieso als je dit typt dankzij de IntelliSense een lijst met objecten die aan de beginletters voldoen, zodat je het juiste object (=keuzelijst) makkelijk kan vinden.
 
Paar daagjes verlof gehad en vandaag vol goede moed ertegenaan gegaan!

Heb ineens maar van nul terug begonnen, waren hier en daar wat foutjes in en kon ik met schone lei beginnen.

Maar ik heb nog altijd problemen bij Frm_VerdeellijstInvul met de specialiteit, daar krijg ik het hele overzicht van alles in de tabel, en ik zou enkel de gegevens SBP, SIP, SSP en MAN moeten kunnen selecteren om verder te gaan.
Dacht eerst met een query te proberen, maar geraak niet verder.
Ook de code proberen in te voeren, dit lukte inderdaad met de IntelliSense, maar had precies geen uitwerking...

Bij adresID heb ik nu de keuze uit de AdresID, maar zou daar graag de AdresNaam krijgen om uit te kiezen, maar dat hij in de tabel wel de AdresID opslaat.

Hierbij ook de nieuwe database:
Bekijk bijlage Manuals & Protocols V0.5.4.accdb.zip
 
Maar ik heb nog altijd problemen met de specialiteit, daar krijg ik het hele overzicht van alles in de tabel, en ik zou enkel de gegevens SBP, SIP, SSP en MAN moeten kunnen selecteren om verder te gaan.
Dat komt omdat je in de keuzelijst het veld PlanID gebruikt, en dat is het sleutelveld. Je ziet dan dus alle records en niet alleen de unieke specialiteiten. Die zie je wel met deze query:
PHP:
SELECT DISTINCT Specialiteit FROM Tbl_Plannen ORDER BY Specialiteit
Dan moet je ook de keuzelijst aanpassen, die dan maar één kolom heeft en geen twee.
Bij het adres doe je ook iets verkeerd: daar heb je maar één kolom i.p.v. twee. Dan zie je uiteraard ook alleen dat ene veld. Hier moet je de keuzelijst zo instellen:
PHP:
SELECT AdresID, AdresNaam FROM Tbl_Adressen Order By AdresNaam
En dus het aantal kolommen op 2, en de kolombreedte op 0;6cm.

En de bron voor PlanID moet als volgt worden:
PHP:
SELECT PlanID FROM Tbl_Plannen WHERE Specialiteit=[Formulieren]![Frm_VerdeellijstInvul]![Keuzelijst9] ORDER BY PlanID
 
Het is gelukt! Bedankt!

Voorlopig lukt het met de rest ook.

Kan ik dan best dit topic sluiten en als ik andere vraag heb ander topic openen?
 
Als je een andere vraag hebt, kun je deze inderdaad het beste op <Opgelost> zetten en een nieuwe maken. Fijn dat het gelukt is!
 
Status
Niet open voor verdere reacties.
Terug
Bovenaan Onderaan