vba insert query

Status
Niet open voor verdere reacties.

annetiti

Gebruiker
Lid geworden
6 aug 2007
Berichten
195
Dag
Een probleempje met een insert query in vba

begin en einddatum worden via een formulier opgevraagd -->ingesteld in formulier als notatie: korte datumnotatie velden datvan en dattot
dim i as date

For i = datvan To dattot --> geven vb 31072017 weer


INSERT INTO tbl_Med_Check_Opvoeder ( leerling_id, dat, checkMorg, CheckcodeMorg )
SELECT (leerlingen.leerling_id, i , 'nee', 'Z' ) FROM leerlingen INNER JOIN Tblmedicatievoorschriften ON leerlingen.[leerling_id] = Tblmedicatievoorschriften.[idnrjongere] WHERE (((leerlingen.leerling_id)=2017002) AND ((Tblmedicatievoorschriften.MedEinddatum) Is Null));

doel: dat moet de datumwaarde zijn maw de I --> welke schrijwijze moet ik hirvoor gebruiken
checkMorg is altijd : nee--> ik gebruik niet de juiste schrijfwijze
CheckcodeMorg is altijd "Z"



vraag: hoe gebruik ik de juiste schrijfwijze om een datumwaarde in te voeren, een vast waarde vb Nee of Z

het probleem ligt in de schrijfwijze van de query in vba.

Hartelijk dank voor de hulp.
Het al # gebruik bij datum en dubbel aanhalingstekens bij vaste tekst maar het werkt niet juiST

groeten Anne
 
Ik snap niet helemaal wat je bedoeling is. Je hebt een lus (die vermoed ik al niet werkt) en een Insert query, die, krijg ik het idee, ook niet werkt. Twee keer 'niet' is in deze niet één keer 'wel':). Sowieso zou ik ofwel een Toevoegquery gebruiken (die kun je wel werkend krijgen) ofwel alles in VBA doen, en dan prefereer ik een Recordset oplossing. Hoe dan ook: datums op een formulier vertalen naar VBA betekent doorgaans dat je een oplossing moet hebben voor de conversie van Europese datumnotatie naar Amerikaanse notatie. Daarbij heeft het format dat je in de tabel en het formulier gebruikt, totaal niets te maken met het probleem. Dat format bepaalt alleen het uiterlijk van de datum, niet de inhoud.

Wat je dus in ieder geval moet doen, is de datum converteren naar een leesbaar format. Zelf doe ik dat door de datum te vertalen naar een getal (iDatumvan = CDbl([Datumvan])) , en in de query terug te zetten naar een datum ("[Datum] = CDate(" & iDatumvan & ")")). Dat werkt bij mij perfect. Maar die query in combinatie met die lus...
 
dag Octafish

Het is me gelukt met de query wel zitten prutsen met de syntax. Soms dubbele quotes! Ik geraak er nog niet goed aan uit!

Heb ook goed je voorbeeld gevolgd met de datums. Nog eens grondig testen en ik hoop dat ik er ben.

Hartelijk dank voor je goede tips!
groeten Anne
 
Graag gedaan :). Het 'gedoe' met de dubbele quotes is eigenlijk heel simpel, als je het weet. En vanaf nu is dat bij jou hopelijk ook het geval.

Het zit namelijk zo: tekststrings moeten altijd, of dat nou in een query is of in VBA, tussen dubbele aanhalingstekens staan. Dus een opdracht als Msgbox Dit is een mededeling werkt niet; je moet de opdracht zo maken: Msgbox "Dit is een mededeling". Dat principe levert een probleem op als je de dubbele aanhaling in de tekst zelf nodig hebt.

Deze constructie: Msgbox "Dit is een meer dan "hopeloze" mededeling" geeft dan een foutmelding, omdat Access het dubbele aanhalingsteken als het einde ziet van de string, die dus begint bij "Dit is... en eindigt bij ...dan ". Te tekst tussen de vólgende quoot is dan weer het begin van een nieuwe string, die ook weer een eindquoot heeft. Je hebt dus in het laatste voorbeeld twee losse strings staan. En daartussenin staat dan het woord 'hopeloze'. Strings combineren tot één string kan prima, mits je ze samenvoegt met het Ampersand teken (&). Maar dan nog zou je nu een fout hebben:
Msgbox "Dit is een meer dan " & hopeloze & " mededeling"
In deze stringcombi zit nog een woord zonder quootjes en zonder koppeling.
Msgbox "Dit is een meer dan " & "hopeloze" & " mededeling"
Is dan weer correct, maar je ziet nu in de Msgbox nog steeds qeen dubbele quoots om 'hopeloze'.

Om een dubbele quote in een tekst te krijgen kun je twee dingen doen: ofwel het teken als ASCII teken invoegen, ofwel het teken een 'voorloopteken' geven. De eerste variant ziet er zo uit:
Msgbox "Dit is een meer dan " & Chr(34) & "hopeloze" & Chr(34) & " mededeling"
Maar dat is dus een beetje ingewikkeld. Gelukkig is de tweede oplossing dat niet: je herhaalt namelijk het dubbele aanhalingsteken vóór het aanhalingsteken dat je nodig hebt. Dat ziet er dan zo uit:
Msgbox "Dit is een meer dan ""hopeloze"" mededeling"

Redelijk simpel, niet? Iets ingewikkelder wordt het (maar toch ook weer niet) als je een filter maakt. Dat is voor een numeriek filter niet zo moeilijk:
Me.Filter = "PersoonID] = " & Me.PersoonID

Maar bij een tekstfilter heb je weer het probleem dat de tekst tussen aanhalingstekens moet staan. Wederom twee varianten, waarvan de tweede het veiligst is.

Me.Filter = "Achternaam = '" & Me.Achternaam & "'"
Hier wordt het enkele aanhalingsteken gebruikt om de tekst als string te definiëren. De volgende variant gebruikt de dubbele aanhaling.
Me.Filter = "Achternaam = """ & Me.Achternaam & """"[/COLOR]

Waarom is de tweede veiliger? Omdat in de eerste variant geen rekening wordt gehouden met het voorkomen van een mogelijke apostroph in een naam. Zou die daar zijn, dan loopt de code daarop vast, omdat je dan het principe krijgt dat een string altijd wordt gedefinieerd tussen twee aanhalingstekens. En dat zou dan de aanhaling in de naam zijn, niet die van de stringdefinitie. Met de tweede variant speelt dat probleem dus niet, omdat de dubbele quoot nu geheel om de variabele staat.

Hopelijk is het principe nu wat duidelijker :).
 
DAg Octafish

Hartelijk dank een heel interessant document.

Zal het nog veel nodig hebben!

groeten Anne
 
Status
Niet open voor verdere reacties.
Terug
Bovenaan Onderaan