Probleem met het laten draaien van een SQL statement in VBA

Status
Niet open voor verdere reacties.

allard1

Gebruiker
Lid geworden
5 dec 2006
Berichten
314
beste Accessvriende,

Ik ben bezig met een formulier op basis waarvan een query kan worden gedraaid. Na talloze websites te hebben bekeken en gelezen ben ik tot de volgende code gekomen :
Code:
Sub query_percentage_fout()
Dim strSql As String
Dim weeknr As String
Dim naam As String

naam = Form_querymakenForm.naammedewerkerComboBox
weeknr = Form_querymakenForm.weeknrComboBox

strSql = "SELECT [Query percentages].Weeknr, [Query percentages].IDnr, [Query percentages].Name, [aantal fout]/([aantal goed]+[aantal fout]) AS [percentage fout] " & vbCrLf & _
"FROM [Query percentages] Where name ='" & Form_querymakenForm.naammedewerkerComboBox & "' and weeknr='" & Form_querymakenForm.weeknrComboBox & "' ;"

DoCmd.RunSQL strSql
End Sub

Alleen nu krijg ik van Access de melding --> als u een sql'tje wilt draaien moet u een sql'ltje invoeren. Ja denk ik dan, waar ben ik mee bezig dan :) Wie ziet waar ik fout ga. Alvast dank voor een eventuele reactie.
Groet,
Allard
 
Probeer 'm eens zo:

Code:
Sub query_percentage_fout()
Dim strSQL As String, sWeeknr As String, sNaam As String

sNaam = Form_querymakenForm.naammedewerkerComboBox
sWeeknr = Form_querymakenForm.weeknrComboBox

strSQL = "SELECT Weeknr, IDnr, Name, [aantal fout]/([aantal goed]+[aantal fout]) AS [percentage fout] " & vbCrLf & _
    "FROM [Query percentages] Where name ='" & sNaam & "' and weeknr=" & sWeeknr

DoCmd.RunSQL strSQL
End Sub
 
Octafish bedankt voor je inzet en antwoord, helaas krijg ik dezelfde melding. Ik denk dat het te maken heeft met het feit dat je bij een runsql geen select query kunt doen. Weet jij van een andere mogelijkheid om de query toch variabel te maken? Alvast dank voor ieders en jouw reactie!!
 
Klopt helemaal dat je via DoCmd geen selectieaquery kunt laten uitvoeren. Wat ik vaak doe, is een tijdelijke query maken, die je maakt via CreateQuerydefs, en die opstarten. Deze tijdelijke query geef je dan steeds de nieuwe SQL mee.
 
Thats the trick. Voor de liefhebber nog even de oplossing:

Code:
Private Sub testCommand_Click()
Dim dbs As Database
Dim strsql As String
Dim strqueryname As String
Dim qrydef As QueryDef 

On Error Resume Next

Set dbs = CurrentDb
strqueryname = "qrytijdelijk"
dbs.QueryDefs.Delete strqueryname
strsql = "SELECT tbl_users.IDnr, tbl_users.user_id, tbl_users.Name, tbl_users.access_level " & vbCrLf & _
"FROM tbl_users;"

Set qrydef = dbs.CreateQueryDef(strqueryname, strsql)

DoCmd.OpenQuery strqueryname

End Sub

Uiteraard kun je hierin eventueel ook nog variabelen toevoegen als naam, idnr etc etc etc. Google en u bent gelukkig. Octafish, bedankt!
 
Meerdere afzonderlijke sqls gebruiken

N.a.v. bovenstaande, wat prachtig werkt...zit ik te zinspelen op nog een optie. De vorige methode werkt, zoals gezegd goed, maar het zou nog mooier zijn als je de sql´ltjes kunt variëren. Stel je hebt een formulier. En op dit formulier staat een combox waarin de deelnemer een keuze kan maken. Laten we voor het gemak twee keuzes aanbieden:

1. Namen
2. Namen plus geboortedata

sql 1
Code:
Select tbl_adressen.naam From tbl_adressen
sql2
Code:
Select tbl_adressen.Naam, tbl_adressen.geboortedatum From tbl_adressen

De vraag is alleen, hoe kan ik de sql variabel maken. moet ik de diverse sql als aparte strings kenmerken of kan dit bijvoorbeeld vanuit een sqltabel.

Een hersenspinsel, maar misschien toch mogelijk?
 
Dat laatste kan zeker; ik heb in een db een gebruikersformulier gemaakt waarin ze selecties kunnen maken, die ze kunnen opslaan. Elke gebruiker kan zo zijn eigen queries maken, en oproepen.
De totale code hiervoor is een beetje te uitgebreid om hier te posten. Maar een stukje hiervan kan uiteraard wel:

Code:
    iOpslaan = MsgBox("Wil je de huidige selectie opslaan?", vbYesNo + vbDefaultButton1, "Selectie opslaan")
    If iOpslaan = 6 Then
        sQueryNaam = InputBox("Typ de naam voor de query", "Query opslaan...", "Export")
        With CurrentDb.OpenRecordset("Select UserID, QueryNaam FROM tQueries WHERE UserID='" _
            & sUserID & "' AND QueryNaam = '" & sQueryNaam & "'")
            If .RecordCount > 0 Then
                iOpslaan2 = MsgBox("Wil je de huidige query vervangen?", vbYesNo + vbDefaultButton2, "Query vervangen")
                If iOpslaan2 = 6 Then
                    sQuery = "UPDATE tQueries SET QueryString = '" & strSQL & "', Datum= CDate(" & CDbl(Date) & "), " _
                        & "Tijd =#" & Format(Now, "HH:mm") & "#" & vbCrLf
                    sQuery = sQuery & " WHERE (QueryNaam='" & sQueryNaam & "' AND UserID='" & sUserID & "');"
                End If
            Else
                sQuery = "INSERT INTO tQueries(UserID,Datum,Tijd,QueryNaam,QueryString)" & vbCrLf
                sQuery = sQuery & "VALUES('" & sUserID & "', CDate(" & CDbl(Date) & "), #" & Format(Now, "HH:mm") & "#, '" _
                    & Nz(sQueryNaam) & "', '" & strSQL & "')"
                Me.cboQueries.Requery
            End If
            .Close
        End With
        DoCmd.SetWarnings False
        CurrentDb.Execute sQuery, dbFailOnError
        DoCmd.SetWarnings True
    End If

Bij het laden van het formulier wordt de keuzelijst vervolgens geïnitialiseerd:
Code:
    Me.cboQueries = ""
    sUserID = FnUserID
    strSQL = "Select QueryID, QueryNaam, QueryString FROM tQueries WHERE UserID='" & sUserID & "' ORDER BY QueryNaam"
    With CurrentDb.OpenRecordset(strSQL)
        If .RecordCount > 0 Then
            Me.cboQueries.RowSource = strSQL
            Me.cboQueries.Enabled = True
            Me.txtAantal = .RecordCount
        Else
            Me.cboQueries.Enabled = False
        End If
    End With
 
Octafish, ik heb eerst mijn ogen even gepakt welke uit mijn kassen zijn gevallen. Maar als dit een deel van de code is, dan zal de rest nog wel imposanter zijn. Man man, dat ziet er strak uit. Hoe kom je erop om deze code te schrijven. Bij mij is het altijd een gevalletje "pikken", tweeken en tentoonstellen en zodoende leren. Ik ga deze code eens even doornemen :)
 
Ter afsluiting

Allemaal,

Ter afsluiting van deze thread nog even een link naar een pagina waarop een aantal mooie voorbeelden staan. In mijn ogen een mooie oplossing voor mijn vraagstuk, neemt niet weg dat de input van octafish net zo goed is!!!!! HULDE

HTML:
http://www.access-programmers.co.uk/forums/showthread.php?t=89587

Doe er je voordeel mee of niet natuurlijk :)

Groet,
Allard
 
Status
Niet open voor verdere reacties.
Terug
Bovenaan Onderaan