INSERT INTO SELECT en WHERE????

Status
Niet open voor verdere reacties.

Twanno5483

Gebruiker
Lid geworden
1 mrt 2009
Berichten
74
Hallo mensen,

Ik zit met een uitdaging. Mijn bedoeling is dat uit 3 verschillende tabellen gegevens worden gehaald en in een andere tabel gezet worden. Zoals hier onderstaand werkt het.
De uitdaging is:
Een Textbox (SeizoenTextBox) waar een waarde in staat, moet mijn onderstaande string gaan filteren.
SeizoenTextBox is gewoon een textbox met de waarde van tbl_seizoen.[Seizoen].

Nu is het zo dat de onderstaande string alle leden en alle seizoenen in het tabel tbl_contributie neerzet. Door middel van de SeizoenTextBox wil ik dus alleen maar dat alle leden van het geselecteerd seizoen wordt aangemaakt in tbl_contribute. Met nog het liefst, dat hij eerst kijkt of deze record (lid en seizoen) al aanwezig is.

Code:
DoCmd.RunSQL "INSERT INTO tbl_contributie (achternaam, voornaam, plaats, seizoen, bedrag)" _
             & "SELECT tbl_leden.[achternaam], tbl_leden.[voornaam], tbl_leden.[plaats], tbl_seizoen.[Seizoen], tbl_instellingen.[contributiebedrag] FROM tbl_leden, tbl_seizoen, tbl_instellingen; "

Alvast bedankt voor de moeite,
Twan
 
Via recordset ( te maken vanuit een Query ) wellicht oplossing

Goedemiddag,

Wellicht is het handig om eerst één selectiequery te maken. Je hebt dan de gewenste gegevens uit de 3 verschillende tabellen samen in één query.

Als je dan één recordset maakt van die query, dan kun je vervolgens al die records - via een lus - opnemen in die ene nieuwe tabel, waarin je kennelijk graag e.e.a. (definitief ?) wilt vastleggen.

Zo'n recordset maak je zo ongeveer als volgt :

Dim rst as Recordset2
set rst = dbOpenRecordset("SELECT* FROM qryGEMAAKTEQUERY", dbOpendynaset )

Vervolgens maak je een lus binnen die recordset en zet één voor één de records over naar je tabel ( voor die laatste via een tweede recordset ).

Hoop dat je d'r iets aan hebt.


Mvg,

Hans
 
Hoi Hans,

Daar ben ik inderdaad mee begonnen, maar toen kwam ik de Insert Into Select statement tegen. Hierin zit meteen de selectie query toch??

Groetjes
Twan
 
De makkelijkste manier om een gefilterde toevoegquery maken is: maak hem eerst in het query ontwerp scherm. Kopieer vervolgens de SQL ervan en plak die in je VBA code. Daar pas je de code dan (indien nodig) verder aan. Je zult in ieder geval een WHERE aan je code moeten toevoegen. Dat ziet er dan uit als:
Code:
WHERE tblSeizoen.Seizoen = '" & Me.SeizoenTekstBox & "'"
 
Hoi Octafish,

Ik heb gedaan wat je schreef, maar ik krijg nu de volgende foutmelding:

"Syntaxisfout (operator ontbreekt) in query-expressie tbl_instellingen.contributiebedrag FROM tbl_leden"

Code:
DoCmd.RunSQL "INSERT INTO tbl_contributie ( achternaam, voornaam, plaats, seizoen, bedrag )" _
& "SELECT tbl_leden.achternaam, tbl_leden.voornaam, tbl_leden.plaats, tbl_seizoen.Seizoen, tbl_instellingen.contributiebedrag" _
& "FROM tbl_leden, tbl_seizoen, tbl_instellingen" _
& "WHERE tblSeizoen.Seizoen = '" & Me.SeizoenTextBox & "'"

Nu heb ik de code aangepast naar:
Code:
DoCmd.RunSQL "INSERT INTO tbl_contributie ( achternaam, voornaam, plaats, bedrag, seizoen )" _
            & "SELECT tbl_leden.[achternaam], tbl_leden.[voornaam], tbl_leden.[plaats], tbl_instellingen.[contributiebedrag], tbl_seizoen.[Seizoen]" _
            & "WHERE tblSeizoen.[Seizoen] = " & Me![SeizoenTextBox] & "" _
            & "FROM  tbl_seizoen, tbl_leden, tbl_instellingen"

Nu krijg ik de foutmelding "component FROM bevat een syntaxisfout".
Zodra ik de WHERE component weer weghaal, doet de query het weer, maar dan met alle leden en alle seizoenen.
 
Laatst bewerkt:
Ik zei ook niet voor niks: dat ziet er uit als... Zonder de db kan ik de juiste syntaxis niet vaststellen. Al zie ik in je code wel een foutje; de samenvoeging van de laatste twee regels zorgt ervoor dat er geen spatie staat, zodat WHERE niet los staat. Dus daar kun je eerst eens wat aan doen.
 
Beste Octafish,

Met uw help is het me gelukt. Mijn dank is groot. Ik heb het volgende string gebruikt:
Code:
DoCmd.RunSQL "INSERT INTO tbl_contributie ( achternaam, voornaam, plaats, bedrag, seizoen )" _
            & "SELECT tbl_ledenvolwassen.[achternaam], tbl_ledenvolwassen.[voornaam], tbl_ledenvolwassen.[plaats], tbl_instellingen.[contributiebedrag], tbl_seizoen.[Seizoen]" _
            & "FROM  tbl_seizoen, tbl_ledenvolwassen, tbl_instellingen" _
            & " WHERE seizoen = '" & Me.SeizoenTextBox & "'"

Heeft u nog een idee hoe ik ervoor kan zorgen dat in mijn tbl_contributie niet 2x dezelfde namen en seizoenen kan toevoegen?

dankbare groet,
Twan
 
Als je een herleidbaar veld hebt, kun je daar een exclude filter op maken. Je moet dus de toegevoegde records kunnen filteren. Ik doe dat meestal met Not In(Select etc)
 
hoi Octafish,

Ik neem aan met herleidbaar veld, dat je bedoeld naar welke velden gekeken moet worden of er dubbele records zijn?
Nu is het mijn bedoeling dat hij moet kijken of er een record is met zowel de Achternaam EN voornaam EN plaats EN seizoen

Nu ben ik niet echt bekend met de "Not in" functie. Ik was meer aan het denken aan een "WHERE NOT EXISTS" statement, maar mijn kennis schiet toch te kort om zo'n functie te maken met zoveel afhankelijkheden en met de bovenstaande code.

Misschien is de "Not in" functie wel beter. Kun je daar een voorbeeld mee maken misschien?
 
Het voorbeeld kan beter van jou komen, omdat een (Not) In criterium redelijk nauw luistert. Hij werkt ook het best als je een KlantID o.i.d. hebt; één veld dus. Nu zou je kunnen overwegen om de gezamenlijke sleutelvelden samen te voegen tot één veld, en daar dan het filter op bouwen.
 
Hoi Octafish,

Mag ik in mijn "Where .. Not In" functie meerdere velden vergelijken met bijvoorbeeld een AND functie?

Bijvoorbeeld:
Code:
WHERE tbl_ledenvolwassen.[achternaam] NOT IN (SELECT achternaam FROM tbl_contributie) AND tbl_ledenvolwassen.[voornaam] NOT IN (SELECT voornaam FROM tbl_contributie)]" _
            & " AND tbl_ledenvolwassen.[plaats] NOT IN (SELECT plaats FROM tbl_contributie)] AND tbl_seizoen.[Seizoen] NOT IN (SELECT seizoen FROM tbl_contributie)"

PS dit werkt niet, maar het gaat me even om het idee...
 
Zoals je het nu doet krijg je heel snel geen records, omdat je bijv. bij het filter Plaats een plaats wegfiltert als die al voorkomt. Maar dat zegt natuurlijk niks over de rest van de gegevens, die best nog toegevoegd zou moeten worden. Als Jansen uit Rotterdam al in de tabel zit, zou met dit filter Pieters uit Rotterdam al niet meer mogen toegevoegd.
Kortom: zomaar het niet werken. Daarom zei ik ook: maak een extra veld waarin je alles combineert, en baseer daar je filter op.
 
Status
Niet open voor verdere reacties.
Terug
Bovenaan Onderaan