SQL string

Status
Niet open voor verdere reacties.

harolda1980

Gebruiker
Lid geworden
7 aug 2007
Berichten
488
In een programma kun je zoeken io het huis van een wijn. In de query van Acces heb ik gezet dat ik deze zo kan invoeren dat hij kijkt als ik het woord chateau in voer dat hij alles terug geeft waarin dit woord voorkomt!

Nu haal ik de zoekopdracht uit een tekstbox alleen moet ik deze goed in de SQL string zetten mijn vraag weet iemand of ik alle quotjes e.d. goed heb staan om de variabele: Huisladen
Code:
WHERE (((tbWijn.Huis) Like " * " & Huisladen & " * "));"


Complete VBA procedure

Code:
Private Sub Inladenhuis()
Dim cnnlocatieladen As ADODB.Connection
Dim rstladen As ADODB.Recordset
Dim strCnn As String
Dim strSQL As String
Dim strProvider As String
Dim i As Long, r As Long
Dim jaarnummer As Long
        i = 0
        r = 0
 
        strSQL = "SELECT tbLand.Landnaam, tbStreek.Streek, tbAppellation.appellationnaam, tbWijn.Huis, tbWijn.type, tbWijnaantal.Aantal, tbWijnaantal.Prijs, tbWijnaantal.Wijnkoperij, tbWijnaantal.Jaartal, tbWijn.IDwijn, tbWijnaantal.Kelder, tbWijnaantal.Kelderlocatie, tbWijnaantal.Kelderlocatienummer, tbWijnaantal.jaartalbinnenkomst FROM (((tbLand INNER JOIN tbStreek ON tbLand.IDland = tbStreek.Land) INNER JOIN tbAppellation ON tbStreek.IDstreek = tbAppellation.Streeknaam) INNER JOIN tbWijn ON tbAppellation.IDApp = tbWijn.Apellation) INNER JOIN tbWijnaantal ON tbWijn.IDwijn = tbWijnaantal.Wijnnaam WHERE (((tbWijn.Huis) Like " * " & Streekladen & " * "));"
        strProvider = "Microsoft.Jet.OLEDB.4.0"
        strCnn = Connectionstring & "\VermaatKelderboek.mdb"
 
        Set cnnlocatieladen = New ADODB.Connection
        cnnlocatieladen.Provider = strProvider
        cnnlocatieladen.Open strCnn
 
        Set rstladen = New ADODB.Recordset
        rstladen.Open strSQL, cnnlocatieladen, adOpenForwardOnly, adLockReadOnly
        lsbWijnweergave.Clear
        Do While Not rstladen.EOF
            lsbWijnweergave.AddItem rstladen!Landnaam
            lsbWijnweergave.List(r, 1) = rstladen!Streek
            lsbWijnweergave.List(r, 2) = rstladen!appellationnaam
            lsbWijnweergave.List(r, 3) = rstladen!Huis
            lsbWijnweergave.List(r, 4) = rstladen!Wijnkoperij
            lsbWijnweergave.List(r, 5) = rstladen!Jaartal
            lsbWijnweergave.List(r, 6) = rstladen!IDwijn
            rstladen.MoveNext ' Exit conditie word hierdoor bereikt
            i = i + 1
            r = r + 1
        Loop
        rstladen.Close
        cnnlocatieladen.Close
        Set rstladen = Nothing
        Set cnnlocatieladen = Nothing
End Sub
 
Een deel van de dubbel quotes moeten single qoutes worden.

Code:
WHERE (((tbWijn.Huis) Like [COLOR="red"]'[/COLOR] * [COLOR="red"]'[/COLOR] & Huisladen & [COLOR="red"]'[/COLOR] * [COLOR="red"]'[/COLOR]));"
 
Heb jij voor mij een site waarop ik die combinaties kan terug lezen hoe je variabelen in de string verwerkt?

Krijg nu de melding dat een waarde of een of meerdere parameters ontbreken!
 
Daar kun je de Help wel voor gebruiken, lijkt mij... Overigens kun je 'm ook met dubbele quootjes maken:

Code:
Like ""*" & Huisladen  & "*"""

Het prinicipe is eigenlijk simpel: een dubbele quoot wordt in VBA gebruikt om een tekststring te definiëren. In een query zet Access een criterium zelf tussen dubbele quootjes. Haal je die code vervolgens over naar VBA, dan beschouwt access de criteriumstring als een string. Je moet daarom de aangeven dat de dubbele quoot een onderdeel is van de tekststring, en geen begin of einde is van die tekst. En dat doe je door er twee te typen. Access ziet de quoot dan als een onderdeel van de tekst. Aan het eind van mijn voorbeeld staan er dus drie: de eerste twee geven de quoot aan die in het filter staat, de derde sluit de string af.

Om deze 'ellende' te voorkomen, wordt de dubbele quoot vaak vervangen door een enkele quoot. Is overzichtelijker, en makkelijker te maken.
 
Hij geeft niet het resultaat zoals verwacht terwijl ik zelf de code heb uitgekleed. om hem fail safe maken.

Hierbij de complete procedure zoals ik hem nu gebruik:

Code:
Private Sub Inladenhuis()
Dim cnnlocatieladen As ADODB.Connection
Dim rstladen As ADODB.Recordset
Dim strCnn As String
Dim strSQL As String
Dim strProvider As String
Dim i As Long, r As Long
Dim jaarnummer As Long
        i = 0
        r = 0
        strSQL = "SELECT tbWijn.Huis, tbWijn.type, tbWijnaantal.Aantal, tbWijnaantal.Prijs, tbWijnaantal.Wijnkoperij, tbWijnaantal.Jaartal, tbWijn.IDwijn, tbWijnaantal.Kelder, tbWijnaantal.Kelderlocatie, tbWijnaantal.Kelderlocatienummer, tbWijnaantal.jaartalbinnenkomst FROM tbWijn INNER JOIN tbWijnaantal ON tbWijn.IDwijn = tbWijnaantal.Wijnnaam WHERE (((tbWijn.Huis) Like ""*" & Huisladen & "*""));"
        strProvider = "Microsoft.Jet.OLEDB.4.0"
        strCnn = Connectionstring & "\VermaatKelderboek.mdb"
 
        Set cnnlocatieladen = New ADODB.Connection
        cnnlocatieladen.Provider = strProvider
        cnnlocatieladen.Open strCnn
 
        Set rstladen = New ADODB.Recordset
        rstladen.Open strSQL, cnnlocatieladen, adOpenForwardOnly, adLockReadOnly
        lsbWijnweergave.Clear
        Do While Not rstladen.EOF
            lsbWijnweergave.AddItem rstladen!Landnaam
            lsbWijnweergave.List(r, 1) = rstladen!Streek
            lsbWijnweergave.List(r, 2) = rstladen!appellationnaam
            lsbWijnweergave.List(r, 3) = rstladen!Huis
            lsbWijnweergave.List(r, 4) = rstladen!Wijnkoperij
            lsbWijnweergave.List(r, 5) = rstladen!Jaartal
            lsbWijnweergave.List(r, 6) = rstladen!IDwijn
            rstladen.MoveNext ' Exit conditie word hierdoor bereikt
            i = i + 1
            r = r + 1
        Loop
        rstladen.Close
        cnnlocatieladen.Close
        Set rstladen = Nothing
        Set cnnlocatieladen = Nothing
End Sub
 
Wat ben je precies aan het maken? Want het lijkt mij dat je op een behoorlijk ingewikkelde manier een keuzelijst aan het vullen bent...
 
Ik gebruik een query om de records met een bepaalde tekst op te halen.
Bijvoorbeeld alle wijnen die beginnen met chateau in hun naam.

Dit laad in in een Keuzelijst waaruit de gebruiker de wijn kan selecteren die hij nodig heeft!

Ben benieuwd wat voor snellere oplossing jij hebt!
 
Waarom gebruik je niet een query als basis voor je keuzelijst, bijvoorbeeld.
 
Je bedoeld een opgeslapen Query?

De gegevens heb ik nodig in excel dus vandaar dat ik ze via de procedure uit de database haal.
 
Dat je de gegevens ook nodig hebt in Excel lijkt mij lost te staan van het gebruik binnen Access. Je kunt altijd een export doen vanuit de keuzelijst, als dat je bedoeling is.
Of werk je met niet-gebonden objecten en tabellen?
 
Ik laad de export in een keuzelijst. Na de keuze worden de gegevens in een formulier geladen waarop het meegenomen word in het proces.

Hoe bedoel je: Je kunt altijd een export doen vanuit de keuzelijst, als dat je bedoeling is.
Of werk je met niet-gebonden objecten en tabellen?
 
Ik vrees dat ik de draad een beetje kwijt ben geraakt...
Ik laad de export in een keuzelijst.
Is dat het reeds geëxporteerde bestand? Is dat een selectie die je in Access hebt gemaakt die bedoeld is voor de export? Bij 1: waarop is deze export gebaseerd geweest, en kun je dat bronbestand niet hergebruiken voor de query? Bij 2: waarom gebruik je deze bron niet als basis voor de keuzelijst?
 
Ik denk inderdaad dat we beetje uit een gelopen zijn. En ik mis nu ook de aansluiting bij jou.
Dus hierbij even een uitleg.

In mijn programma vul ik in een zoekscherm een woord in om de query aan te sturen die mijn keuzelijst vult met gevonden wijnen.

In de keuze lijst komt zoveel informatie te staan wat de keuze voor de gebruiker vergemakkelijkt
 
Dat had ik (nog steeds) wel begrepen. Wat ik niet zie, is hoe de db werkt; werk je met lokale tabellen, of gekoppelde? Of zonder recordset, en haal je die met VBA op? Om maar eens wat te noemen...
 
Als ik je vraag goed begrijp:

Wil je anders het relatieoverzicht zien van de DB?

Alle tabellen zijn gekoppeld in de database!
 
Dat komt al een eind in de richting! Dan is er dus geen noodzaak om met een recordset d keuzelijst te vullen; dat kun je met een query doen. En de Export zou ik eigenlijk op dezelfde manier doen. Waarbij je dus een exportquery maakt op basis van de selectie uit de keuzelijst. Al kan dat uiteraard ook met een recordset. Maar daar ging de vraag geloof ik niet over. Toch?
 
Als ik je goed begrijp niet nee! Ben benieuwd hoe ik die keuze lijst vul met een Query!
 
Ik zou zeggen zo:

Code:
strSQL = "SELECT tbWijn.Huis, tbWijn.type, tbWijnaantal.Aantal, tbWijnaantal.Prijs, tbWijnaantal.Wijnkoperij, tbWijnaantal.Jaartal, tbWijn.IDwijn, tbWijnaantal.Kelder, tbWijnaantal.Kelderlocatie, tbWijnaantal.Kelderlocatienummer, tbWijnaantal.jaartalbinnenkomst FROM tbWijn INNER JOIN tbWijnaantal ON tbWijn.IDwijn = tbWijnaantal.Wijnnaam WHERE (((tbWijn.Huis) Like ""*" & Me.Huisladen & "*""));"
Me.lsbWijnweergave.RowSource=strSQL
Me.lsbWijnweergave.Requery
 
Die er kort uit maar dan ben ik benieuwd of dit de gehele code is.. of hoort er nog veel bij?
 
Als ik die code in excel vba zet krijg een lading fout meldingen. Beginnende bij requery die niet bestaat
 
Status
Niet open voor verdere reacties.
Terug
Bovenaan Onderaan