SQL van query gebruiken in VBA

Status
Niet open voor verdere reacties.

ongenae

Gebruiker
Lid geworden
20 okt 2010
Berichten
124
Ik zit met een dom probleem

Ik heb namelijk een qeury gemaakt en de SQL code van die query wil ik gebruiken in VBA:

Dim stringsql As String
stringsql="......"

Dus ik dacht copy paste zal het wel doen, maar ik krijg constant foutmeldingen.
Vroeger lukte me dit wel maar nu niet meer;

Zou iemand deze SQL code willen omzetten zodat hij bruikbaar is in vba?

[SQL]
SELECT DISTINCT T_TIKKLOK_EDIT.Technummer
FROM Tiva_Foquin_pers INNER JOIN T_TIKKLOK_EDIT ON Tiva_Foquin_pers.Techniekernummer = T_TIKKLOK_EDIT.Technummer
WHERE (((Tiva_Foquin_pers.Naampers) Like "*" & [Formulieren]![F_controle]![name2] & "*"));
[/SQL]
 
Dat wordt dan zoiets:

Code:
Dim strSQL As String
strSQL="SELECT DISTINCT T_TIKKLOK_EDIT.Technummer " & VbCrLf _
     & "FROM Tiva_Foquin_pers INNER JOIN T_TIKKLOK_EDIT ON Tiva_Foquin_pers.Techniekernummer = T_TIKKLOK_EDIT.Technummer " & VbCrLf _
     & "WHERE (Tiva_Foquin_pers.Naampers LIKE "*" & [Formulieren]![F_controle]![name2] & "*")"

Of, mooier,:

Code:
strSQL="SELECT DISTINCT T_TIKKLOK_EDIT.Technummer " & VbCrLf _
     & "FROM Tiva_Foquin_pers INNER JOIN T_TIKKLOK_EDIT ON Tiva_Foquin_pers.Techniekernummer = T_TIKKLOK_EDIT.Technummer " & VbCrLf _
     & "WHERE (Tiva_Foquin_pers.Naampers LIKE '*'" & Me.name2 & "'*')"

In de laatste variant vervang je het object door de waarde van het tekstvak.
 
Laatst bewerkt:
Alvast bedankt, maar nu krijg ik de melding "typen komen niet overeen met elkaar"

Hieronder alvast mijn hele code:
De bedoeling is het resultaat van een qeury (1 resultaat) weer te geven in een txt box op mijn formulier:

[SQL]
Dim recordst As Recordset
Dim db As DAO.Database
Dim stringsql As String
Dim result As String

Set db = CurrentDb()
stringsql = "SELECT DISTINCT T_TIKKLOK_EDIT.Technummer " & vbCrLf _
& "FROM Tiva_Foquin_pers INNER JOIN T_TIKKLOK_EDIT ON Tiva_Foquin_pers.Techniekernummer = T_TIKKLOK_EDIT.Technummer " & vbCrLf _
& "WHERE (Tiva_Foquin_pers.Naampers LIKE " * " & [Formulieren]![F_controle]![name2] & " * ")"

Set recordst = db.openrecordset(stringsql)
result = recordst.Fields("Technummer").Value

txtnr.Value = result

[/SQL]
 
Ik was in het eerste voorbeeld vergeten de dubbele quootjes te vervangen door enkele. Overigens zou ik als ik jou was de tweede variant gebruiken, want je wilt dus maar één waarde opzoeken. En die staat in het tekstvak.

Dus zo:
Code:
Dim stringsql As String
stringsql = "SELECT DISTINCT T_TIKKLOK_EDIT.Technummer " & vbCrLf _
    & "FROM Tiva_Foquin_pers INNER JOIN T_TIKKLOK_EDIT ON Tiva_Foquin_pers.Techniekernummer = T_TIKKLOK_EDIT.Technummer " & vbCrLf _
    & "WHERE (Tiva_Foquin_pers.Naampers LIKE '*'" & Me.name2 & "'*')"

With CurrentDb.OpenRecordset(stringsql)
    If .RecordCount > 0 Then
        txtnr.Value = .Fields(0)
    Else
        txtnr.Value = "n.b."
    End If
    .Close
End With
 
Laatst bewerkt:
bedankt, maar nu krijg ik volgende melding :eek:


fout 3075
syntaxisfout (operator ontbreekt) in query-expressie
(Tiva_Foquin_pers.Naampers LIKE '*' ... '*').
 
Je kan wel zien dat ik niet zo vaak filter met LIKE :)
Code:
WHERE (Tiva_Foquin_pers.Naampers Like '*' & Me.Naampers & '*')
 
Sorry maar nu krijg ik dit:

fout 3061
Er zijn te weinig parameters. Het verwachte aantal is: 1.


toch geeft mijn query als ik hem manueel uitvoer wel 1 resultaat weer.
maar we zijn toch al een stapje dichter.
 
Omdat we verder geen voorbeeld db hebben, is het wat lastiger om te zien wat er uitkomt/zou moeten komen. Filter je bijvoorbeeld op tekst, of op getallen? Dat maakt nogal uit.... Je kunt de sql als volgt testen, door deze code onder je sql te zetten:

Code:
Dim tmp
tmp=Inputbox("","",stringsql)

Kopieer vervolgens de string die je uit de inputbox krijgt, maak een nieuwe query aan, open het SQL venster en plak de tekst er in. Voer de query nu uit, en check waar de fout zit. Access geeft dat nu redelijk nauwkeurig aan.
 
Dit is nu om helemaal zot te worden

Hij heeft helemaal geen fout weer. Ik krijg in mijn query exact de waarde die ik wil hebben.

hij struikelt over dit denk ik (staat toch in geel aangeduid)

With CurrentDb.OpenRecordset(stringsql)

De naam en de nummer (alle velden in de query) zijn tekstvelden.
 
Je kan het nog eens met je eigen code proberen.... Allicht dat de sql daar wel in werkt. Ik gebruik meestal CurrentDB om een recordset te openen, want dan hoef ik niet zoveel te typen en declareren. :) Kijk ook even hoe je bibliotheken staan; mijn ervaring is dat e.e.a. nog wel eens spaak loopt als ADO nà DAO wordt geladen, dus ik heb de DAO 3.6 altijd als laatste staan. En, laatste (zou eigenlijk als eerste moeten) tip: Kijk even wat er gebeurt als je de db compileert met <Foutopsporing>, <db compileren>.
 
Bingo

Het heeft te maken met het volgende:

[SQL]

Like '*' & Me.Naampers & '*'

[/SQL]

Wanneer ik dit vervang door de waarde zelf zoals mijn voledige vba werkt het wel perfect.

Dus moet ik alleen nog zien dat ik Tiva_Foquin_pers.Naampers) ='Lagast Alain'
kan vervangen door een waardie die ik ingetypt heb in me.name2


[SQL]


Dim rs As DAO.Recordset
Dim db As DAO.Database
Dim stringsql As String

Dim result As String

stringsql = "SELECT DISTINCT T_TIKKLOK_EDIT.Technummer" & vbCrLf _
& "FROM Tiva_Foquin_pers INNER JOIN T_TIKKLOK_EDIT ON Tiva_Foquin_pers.Techniekernummer = T_TIKKLOK_EDIT.Technummer" & vbCrLf _
& "WHERE (((Tiva_Foquin_pers.Naampers) ='Lagast Alain'));"


Set db = CurrentDb()
Set rs = db.OpenRecordset(stringsql)

result = ""
result = (rs.Fields("Technummer").Value)

txtnr.Value = result


[/SQL]
 
Dus zo:
Code:
WHERE (((Tiva_Foquin_pers.Naampers) ='" & Me.Naampers & "'));"

Overigens snap ik niet helemaal waarom je met een tekstvak werkt; ik zou zelf een keuzelijst met invoervak maken. Scheelt een hoop typwerk. Bovendien kun je geen foute persoonsnamen kiezen.
 
Met een ommewegetje ben ik er toch geraakt.
Bedankt

Heb nu inderdaad een dropdownbox genomen.
Mijn originele bedoeling was eigenlijk dat de mensen een deel van de naam konden intypen. :thumb:
 
Status
Niet open voor verdere reacties.
Terug
Bovenaan Onderaan