SQL uit query gebruiken in VBA code

Status
Niet open voor verdere reacties.

ongenae

Gebruiker
Lid geworden
20 okt 2010
Berichten
124
Hallo iedereen

Heb opnieuw een klein probleempje en aangezien jullie mij de vorige keer supper geholpen hebben probeer ik het deze keer dus opnieuw.

Dit is wat ik wil:

Ik heb een tabel met Claims en een tabel met Bestellingenwanden.
Ik heb een query gemaakt die velden ophaalt uit deze twee tabellen en die wil automatisch weergeven in een ander formulier, dit heb ik ook al gedaan ergens anders dus wou ik in analogie werken, het enigste verschil is dat ik hier gegevens uit 2 tabellen wil halen, wat voor mij de eerste keer is. Dus heb ik de sql gekopierd maar hij maakt van zijn neus.

Weet iemand van jullie een oplossing op deze fout:

Fout 3075 tijdens uitvoering:

Syntaxisfout in query-expressie SELECT t_claims.claimnr.


VBA code (als er fouten in staan hoor ik ze graag):

Code:
Dim dossiernrinput As String
Dim claimnrinput As String

Dim strsql As String

dossiernrinput = Nz(Form_f_claims.dossiernr.Value)
claimnrinput = Nz(Form_f_claims.claimnr.Value)


strsql = "SELECT SELECT t_claims.claimnr, t_bestellingenwanden.dossiernr, t_bestellingenwanden.klantnr, t_bestellingenwanden.klantref, t_bestellingenwanden.dossiernrde, " & vbCrLf _
& " t_bestellingenwanden.abnummer , t_bestellingenwanden.klantorder, t_bestellingenwanden.leverorder, t_claims.materiaalnr, t_bestellingenwanden.hswg, t_bestellingenwanden.hswgp, " & vbCrLf _
& " t_bestellingenwanden.hswr , t_bestellingenwanden.hswiso, t_bestellingenwanden.hswmr, t_bestellingenwanden.fswg, t_bestellingenwanden.fswc, t_bestellingenwanden.bswr, " & vbCrLf _
& "t_bestellingenwanden.bswg" & vbCrLf _
& "FROM t_claims INNER JOIN t_bestellingenwanden ON t_claims.dossiernr = t_bestellingenwanden.dossiernr" & vbCrLf _
& "WHERE (((t_claims.claimnr) ='" & "*" & claimnrinput & "*" & "' AND ((t_bestellingenwanden.dossiernr) = '" & "*" & dossiernrinput & "*" & "'));"



'BELANGRIJK DAT DE RECORDSET VAN DE SQL WORDT GEOPEND
With CurrentDb.OpenRecordset(strsql)
    If .recordcount >= 1 Then
     
'WEERGEVEN VAN DE WAARDEN IN HET FORMULIER F_VOLLEDIGEWANDEN
        Form_f_claims.claimnr.Value = .Fields("claimnr")
        Form_f_claims.dossiernr.Value = .Fields("dossiernr")
        Form_f_claims.klantnr.Value = .Fields("klantnr")
        Form_f_claims.klantref.Value = .Fields("klantref")
        Form_f_claims.dossiernrde.Value = .Fields("dossiernrde")
        Form_f_claims.abnummer.Value = .Fields("abnummer")
        Form_f_claims.klantorder.Value = .Fields("klantorder")
        Form_f_claims.leverorder.Value = .Fields("leverorder")
        Form_f_claims.materiaalnr.Value = .Fields("materiaalnr")
        
        Form_f_claims.hswg.Value = .Fields("hswg")
        Form_f_claims.hswgp.Value = .Fields("hswgp")
        Form_f_claims.hswr.Value = .Fields("hswr")
        Form_f_claims.hswiso.Value = .Fields("hswiso")
        Form_f_claims.hswmr.Value = .Fields("hswmr")
        Form_f_claims.fswg.Value = .Fields("fswg")
        Form_f_claims.fswc.Value = .Fields("fswc")
        Form_f_claims.bswr.Value = .Fields("bswr")
        Form_f_claims.bswg.Value = .Fields("bswg")
        
        
        
        Else
        MsgBox ("Geen klacht gevonden")
                
    End If
    .Close
    
End With
 
Probeer deze code er eens bij te zetten..

Code:
dim tmp
tmp=Inputbox("","",strSQL)

Dit komt dan onder de regels te staan waarin je de sql string opbouwt. Als je de code uitvoert, kun je de string uit de inputbox kopieëren, en plakken in een nieuwe query. Als de sql goed is, werkt de query, anders kun je vrij makkelijk zien waar een fout zit, want dat geeft Access meestal wel goed aan.

Overigens zie ik dat je een numerieke variabele vraagt (Nz(Form_f_claims.dossiernr.Value)) maar die in de sql als tekst behandelt...
 
Laatst bewerkt:
Er stond om te beginnen 2 x select, dat is nu opgelost. maar nu krijg ik nog iets anders:

Syntaxisfout. in query-expressie (((t_claims.claimnr)='waardeuittxtbox' and ((t_bestellingenwanden.dossiernr)='waardeuittxtbox'));.

dit is wat ik uit de imputbox haal:

SELECT t_claims.claimnr, t_bestellingenwanden.dossiernr, t_bestellingenwanden.klantnr, t_bestellingenwanden.klantref, t_bestellingenwanden.dossiernrde,
t_bestellingenwanden.abnummer , t_bestellingenwanden.klantorder, t_bestellingenwanden.leverorder, t_claims.materiaalnr, t_bestellingenwanden.hswg, t_bestellingenwanden.hswgp,
t_bestellingenwanden.hswr , t_bestellingenwanden.hswiso, t_bestellingenwanden.hswmr, t_bestellingenwanden.fswg, t_bestellingenwanden.fswc, t_bestellingenwanden.bswr,
t_bestellingenwanden.bswg
FROM t_claims INNER JOIN t_bestellingenwanden ON t_claims.dossiernr = t_bestellingenwanden.dossiernr
WHERE (((t_claims.claimnr) ='200115957 13.10.2011' AND ((t_bestellingenwanden.dossiernr) = 'ZH11H1168A'));

Ik wil wel hebben dat ik maar 1 van de 2 zoekwaarden moet invullen.
Misschien kan ik werken met een *
 
Ik snap je foutmelding niet helemaal; wat zijn 'waardeuittxtbox' en 'waardeuittxtbox'? Je leest tekstvakken uit op je formulier die je aan variabelen toewijst. In de voorbeeld string vult hij die prima, want er staan twee tekstwaarden in de WHERE. Dus waar gaat het dan nog fout?
 
Geen flauw idee, daarom ben ik hier :p

Claimnr en dossiernr worden beiden beschouwd als tekst in mijn tabellen.
Dit is de foutmelding zoals hij in access voorkomt:

Fout 3075 tijdens uitvoering:

Syntaxisfout. in query-expressie (((t_claims.claimnr)='200115957 13.10.2011' and ((t_bestellingenwanden.dossiernr)='ZH11H1168A'));.

Misschien is het omdat de ene waarde komt uit tabel claims en de andere uit tabel bestellingenwanden.
 
Wat zitten prutsen en blijkbaar werkt dit nu wel:

"WHERE (((t_claims.claimnr) ='" & claimnrinput & "') AND ((t_bestellingenwanden.dossiernr) = '" & dossiernrinput & "'));"

Maar nu moet ik nog altijd in mijn twee textboxen de waarde exact ingeven, terwijl ik eignelijk 1 van de 2 velden wil kunnen openlaten, en met een sterretje lukt het ook niet:

"WHERE (((t_claims.claimnr) ='" & "*" & claimnrinput & "*" & "') AND ((t_bestellingenwanden.dossiernr) = '" & "*" & dossiernrinput & "*" & "'));"

Heb je toevallig hier een oplossing voor?
 
Het probleem lijkt voorlopig opgelost te zijn.

Ik heb de AND vervangen door OR
 
Je moet je filter flexibel opbouwen; als er één (of beide) leeg is hoef je 'm uiteraard niet te gebruiken.

Code:
sFilter=""
If claimnrinput <>"" Then
     sfilter="t_claims.claimnr ='*" & claimnrinput & "*')
If dossiernrinput <> "" Then
     If sFilter<>"" Then sFilter=sFilter & " AND "
     sfilter="_bestellingenwanden.dossiernr ='*" & dossiernrinput & "*')
End If
If sFilter <>"" Then strSQL=strSQL & " WHERE " & sFilter
 
Status
Niet open voor verdere reacties.
Terug
Bovenaan Onderaan