mooi stukje script maar werkt niet zoals ik het wil wie o wie

Status
Niet open voor verdere reacties.

dinoshop

Terugkerende gebruiker
Lid geworden
8 sep 2000
Berichten
1.100
Code:
Private Sub Knop967_Click()
Dim CustomerEmail As String, FileName As String, Filepath As String
Dim strSQL As String
Dim rs As Recordset
Dim qTmp As QueryDef
Me.Dirty = False
Dim tmp

On Error GoTo Err_Knop967_click
DoEvents

Me.ProjectID.Requery


    Set rs = CurrentDb.OpenRecordset("select * from tblPersoneel")
    If rs.RecordCount > 0 Then
       Do Until rs.EOF
            If Not rs!Email = vbNullString Then
                If Not CustomerEmail = vbNullString Then CustomerEmail = CustomerEmail & ";"
                CustomerEmail = CustomerEmail & rs!Email
            End If
            rs.MoveNext
            Loop
            
        strSQL = "SELECT [projectid],Email FROM QryPlanningmail "
        strSQL = strSQL & "WHERE [CboProjectNR] = " & Me.ProjectID & " "
        strSQL = strSQL & "ORDER BY Email;"
        Set qTmp = CurrentDb.QueryDefs("TmpPlanning")
        qTmp.sql = strSQL

        
        
tmp = InputBox("", "", strSQL)


DoCmd.OpenReport "RpTPlanning", acViewPreview, , Me.Filter, acHidden
DoCmd.SendObject acSendReport, "RptPlanning", acFormatPDF, CustomerEmail, , , "RptPlanning", True
DoCmd.Close acReport, "RptPlanning"

Err_Knop967_click:
    MsgBox Err.Description
    End If
    
End Sub

hij blijft maar iedereen mailen en niet de mensen die gefilterd moeten zijn .
 
Het is ook vele malen makkelijker als je de Recordset al filtert. Wat daar niet in zit, kan ook geen probleem opleveren.
 
dus als ik het goed begrijp word iets als
Set rs = CurrentDb.OpenRecordset("select me.filter from tblPersoneel")
waar de filter via formulier word gebruikt
 
Nee, nu ga je echt helemaal de verkeerde kant op! Een recordset is niks anders dan een query. Als je dus een query maakt die exact laat zien wat je wilt hebben (met filter dus) dan kun je de SQL daarvan heel makkelijk hergebruiken voor de recordset.
 
Je krijgt dus zoiets:
Code:
    strSQL = "SELECT * FROM tblPersoneel WHERE ([Email] Is Not Null And Not [Email] = "")"
    Set rs = CurrentDb.OpenRecordset(strSQL)
    If rs.RecordCount > 0 Then
       Do Until rs.EOF
            If Not CustomerEmail = vbNullString Then CustomerEmail = CustomerEmail & ";"
            CustomerEmail = CustomerEmail & rs!Email
            rs.MoveNext
        Loop
    Else
        MsgBox "Geen email adressen..."
        Exit Sub
    End If
    strSQL = "SELECT [projectid],Email FROM QryPlanningmail " _
        & "WHERE [CboProjectNR] = " & Me.ProjectID & " ORDER BY Email;"
    Set qTmp = CurrentDb.QueryDefs("TmpPlanning")
    qTmp.SQL = strSQL
    DoCmd.SendObject acSendReport, "RptPlanning", acFormatPDF, CustomerEmail, , , "RptPlanning", True
    Exit Sub
 
aha das dus een heel anderen kant op dan ik had ga het proberen en op zoek naar goede cursus sql
 
Queries maken is vooral een kwestie van proberen :). Ik doe het vaak op deze manier trouwens: als ik een recordset nodig heb maak ik eerst de query, kopieer daar de SQL van en verwerk die verder in de recordset.
 
ik loop hier tegen aan de select zou dus netjes mijn email moeten aangeven maar krijg fout in rs te zien zie bijlage.
fout.jpg
 
Ik heb het je al eens eerder gezegd geloof ik, dus dit gaat bekend in de oren klinken: zet de SQL in een Inputbox en kijk of de query draait of niet.
Code:
Dim tmp as String
tmp = Inputbox("","",strSQL)
De tekst kopieer je, dan maak je een nieuwe query en in het SQL venster plak je dan de gegenereerde SQL. Die zou, als de query correct is, de juiste output moeten hebben als je hem uitvoert. Zo niet, dan geeft hij ofwel een foutmelding, ofwel geen records. In beide gevallen kun je dan kijken waar het probleem zit. Pas de query aan, kopieer de SQL weer en plak de verbeterde versie in je code.
 
zelfs met deze er in zie je het zelfde als in voorbeeld
dus strSQL slect enz .
 
Ja maar wat staat er nu in de SQL?
 
SELECT * FROM tblPersoneel WHERE ( Is Not Null And Not [Email] = ")
 
als ik deze omzet in query geeft die wel gegevens alleen de ster heb ik omgezet in achternaam .
dus achternaam en email zichtbaar
 
D'r mist nog wat, namelijk een dubbele quoot. Je had dit moeten hebben:
Code:
"SELECT * FROM tblPersoneel WHERE ([Email] Is Not Null And Not [Email] = "")
De reden dat je 'm niet ziet is omdat de code een " beschouwt als een begintag of eindtag van een string. Wil je een " als tekst in je string, dan moet je een speciale truc uithalen: het "-teken herhalen. En dat is precies wat je gedaan hebt. Vervelende voor jou is wel dat je er maar één hebt. Je moet er dus nog 2 bijplakken:
Code:
"SELECT * FROM tblPersoneel WHERE ([Email] Is Not Null And Not [Email] = """")"
Of, ziet er wat netter uit:
Code:
"SELECT * FROM tblPersoneel WHERE ([Email] Is Not Null And Not [Email] = '')"
 
dat moet je me toch eens uitleggen wat die '' allemaal betekenen wand de code had ik precies zo staan behalve die quote ''
en daar snap ik niks van
 
Quootjes (enkel en dubbel) zijn gereserveerde tekens. Die kun je dus niet zomaar gebruiken. Als je in een query filtert op tekst, dan staat de tekst tussen dubbele quoots. "Kaasfabriek" bijvoorbeeld. In de SQL van je query zie je dan:
Code:
SELECT * FROM tblPersoneel WHERE ([Klant] = "Kaasfabriek")
Gebruik je dezelfde query in VBA, dan werkt dat niet.
Code:
strSQL = "SELECT * FROM tblPersoneel WHERE ([Klant] = "Kaasfabriek")
geeft een foutmelding. De string wordt namelijk opgebouwd in de variabele tot de eerste ". Access maakt er dus dit van:
Code:
strSQL = "SELECT * FROM tblPersoneel WHERE ([Klant] = "
De rest genereert overigens al een fout, dus veel verder zul je niet komen. Maar het gaat nu even om de "-tekens.
Om nu aan de code duidelijk te maken dat je wel degelijk een "-teken in de SQL wilt hebben, moet je het teken herhalen. En dan krijg je dus:
Code:
strSQL = "SELECT * FROM tblPersoneel WHERE ([Klant] = ""Kaasfabriek"")"
Je ziet nu aan het eind 3 "-tekens staan, en dat klopt. De eerste 2 zorgen ervoor dat je het "-teken in de string ziet, het derde sluit de tekststring af.
In combinatie met een veldnaam krijg je iets vergelijkbaars: nu moet de tekststring in twee delen worden geknipt, die elk met een "-teken beginnen en worden afgesloten. Het resultaat is dan:
Code:
strSQL = "SELECT * FROM tblPersoneel WHERE ([Klant] = """ & Me.Klantnaam & """)"
En dat zou moeten werken.

Om te testen op een lege string doe je dus iets vergelijkbaars, alleen haal je dan de tekst weg tussen de middelste quootjes.
Code:
strSQL = "SELECT * FROM tblPersoneel WHERE ([Klant] = """")"
 
te gek

maar heb toch je hulp nodig
planning 1.jpg
zoals je ziet heeft deze planning projectid en zoek veld cboprojectNR en veld met namen .
nu probeer ik al een hele poos om dit voor mekaar te krijgen .
project filteren op projectid en daarbij de email adressen van de namen zoeken deze dan weer koppelen aan verzenden deze planning aan de personen die nu in een lijst tmpplanning komen te staan is query

Code:
Dim Email As String, FileName As String, Filepath As String

Dim strSQL As String
Dim rs As Recordset
Dim qTmp As QueryDef
Me.Dirty = False

   Dim tmp As String
    
    strSQL = "SELECT * FROM tblPersoneel WHERE ([Email] Is Not Null And Not [Email] = '')"
    Set rs = CurrentDb.OpenRecordset(strSQL)
    If rs.RecordCount > 0 Then
       Do Until rs.EOF
            If Not Email = vbNullString Then Email = Email & ";"
            Email = Email & rs!Email
            rs.MoveNext
        Loop
    Else
        MsgBox "Geen email adressen..."
        Exit Sub
    End If
    strSQL = "SELECT [projectid], FROM qryPlanningmail " _
        & "WHERE [projectid] = " & Me.CboProjectNR & "order by Email;"
    Set qTmp = CurrentDb.QueryDefs("TmpPlanning")
    tmp = InputBox("", "", strSQL)
    qTmp.sql = strSQL
    
    DoCmd.OpenReport "RpTPlanning", acViewPreview, , Me.Filter, acHidden
    DoCmd.SendObject acSendReport, "RptPlanning", acFormatPDF, Email, , , , True
    DoCmd.Close acReport, "RptPlanning"
    Exit Sub

dit is wat ik er van gemaakt heb maar blijft maar aangeven dat qTmp.sql = strSQL fout is
kom er niet meer uit .
 

Bijlagen

  • planning.jpg
    planning.jpg
    88,6 KB · Weergaven: 50
Laatst bewerkt:
Als je de code letterlijk hebt gepost, snap ik die foutmelding wel. Ik zou trouwens op "" filteren en niet op '', al gaat dat in dit geval wel goed (' mag niet in een email adres staan). De fout zit echter in je tweede SQL.
Code:
    strSQL = "SELECT * FROM tblPersoneel WHERE ([Email] Is Not Null And Not [Email] = """")"
    Set rs = CurrentDb.OpenRecordset(strSQL)
    If rs.RecordCount > 0 Then
       Do Until rs.EOF
            If Not Email = vbNullString Then Email = Email & ";"
            Email = Email & rs!Email
            rs.MoveNext
        Loop
    Else
        MsgBox "Geen email adressen..."
        Exit Sub
    End If
    
    strSQL = "SELECT [projectid], FROM qryPlanningmail WHERE [projectid] = " & Me.CboProjectNR [B][COLOR="#FF0000"]& " Order by Email"[/COLOR][/B]
    Set qTmp = CurrentDb.QueryDefs("TmpPlanning")
    tmp = InputBox("", "", strSQL)
    qTmp.SQL = strSQL
    DoCmd.SendObject acSendReport, "RptPlanning", acFormatPDF, Email, , , , True
 
daar was ik al bang voor ga weer proberen

SELECT [projectid], FROM qryPlanning WHERE [projectid] = 20154014 Order by Email

maar blijft steken op Qtemp.sql=strSql dat wordt geel
 
Bestaat de query wel?
 
Status
Niet open voor verdere reacties.
Terug
Bovenaan Onderaan