Recordset zonder record doorlopen

Status
Niet open voor verdere reacties.

access

Gebruiker
Lid geworden
15 mei 2006
Berichten
7
Ik heb een knop, als ik op deze knop drukt doorloopt hij verschillende query's.
In bepaalde queries staan nog geen records. Ik krijg dan ook de foutmelding EOF/BOF is waar. Voor het gewenste bewerking moet een record aanwezig zijn. Hij doorloopt de code maar als hij bij een query is zonder record krijg ik deze foutmelding! ik wil graag dat hij deze code doorloopt!

Wie kan mij helpen? :o

Private Sub Knop6_Click()
Dim objOL As Outlook.Application
Dim oTask As Outlook.TaskItem
Dim objTaskItem As TaskItem
Dim stDocName As String
Dim strSQL As String
Dim rst As New ADODB.Recordset
Dim strDocumentPath As String
Dim recordcount As Long


Set objOL = New Outlook.Application
Set objTaskItem = objOL.CreateItem(olTaskItem)
strDocumentPath = "O\staf\AJZ\Laura\tekst1.rtf"


strSQL = "SELECT Expr10, Bezwaarschriftnummer FROM [Ambtelijkhorenwelverdagengeenverzuim]"
rst.Open strSQL, CurrentProject.Connection, adOpenKeyset, adLockOptimistic

strExpr10 = rst!Expr10 'Bij elk record moet je de string wel weer opnieuw vullen
strbezwaarschriftnummer = rst!Bezwaarschriftnummer 'Bij elk record moet je de string wel weer opnieuw vullen

With rst
.MoveFirst ' Zet de pointer op eerst record
Do Until rst.EOF
strExp10 = rst!Expr10
strbezwaarschriftnummer = rst!Bezwaarschriftnummer
If strExpr10 < -2 Then
With objTaskItem
.Subject = "Beslistermijn overschreden!"
.body = strbezwaarschriftnummer & " De beslistermijn is overschreden " & strExpr10 & " dagen geleden"
.StartDate = Date
.Display
.Close olSave
.Save
End With
End If
.MoveNext
Loop
End With
rst.Close

strSQL = "SELECT Expr10, Bezwaarschriftnummer FROM [Ambtelijkhorengeenverzuimgeenverdaging]"
rst.Open strSQL, CurrentProject.Connection, adOpenKeyset, adLockOptimistic

strExpr10 = rst!Expr10 'Bij elk record moet je de string wel weer opnieuw vullen
strbezwaarschriftnummer = rst!Bezwaarschriftnummer 'Bij elk record moet je de string wel weer opnieuw vullen

With rst
.MoveFirst ' Zet de pointer op eerst record
Do Until rst.EOF
strExp10 = rst!Expr10
strbezwaarschriftnummer = rst!Bezwaarschriftnummer
If strExpr10 < -2 Then
With objTaskItem
.Subject = "Beslistermijn overschreden!"
.body = strbezwaarschriftnummer & " De beslistermijn is overschreden " & strExpr10 & " dagen geleden"
.StartDate = Date
.Display
.Close olSave
.Save
End With
End If
.MoveNext
Loop
End With
rst.Close
end sub
 
Lus inbouwen waarbij je via DCount of Recordcount checkt of je query gegevens ophaalt.
Zo ja, door je code fietsen.
Zo nee, niet.

FESTER
 
Lees de toegevoegde commentaren en kijk eens of dit werkt.

Code:
'zet option explicit boven je code en declareer al je variabelen (Dim .. as ..)
Private Sub Knop6_Click()
Dim ObjOL As Outlook.Application
Dim OTask As Outlook.TaskItem
Dim ObjTaskItem As TaskItem
Dim StDocName As String
Dim StrSQL As String
Dim Rst As New ADODB.Recordset
Dim StrDocumentPath As String
Dim RecordCount As Long

On Error GoTo 0

Set ObjOL = New Outlook.Application
Set ObjTaskItem = ObjOL.CreateItem(olTaskItem)
StrDocumentPath = "O\staf\AJZ\Laura\tekst1.rtf"


StrSQL = "SELECT Expr10, Bezwaarschriftnummer FROM [Ambtelijkhorenwelverdagengeenverzuim]"
Rst.Open StrSQL, CurrentProject.Connection, adOpenForwardOnly, adLockReadOnly

'ik denk dat dit je probleem was....omdat het voor de movefirst gebuerde.
'met deze cusor staat hij al op het eerste record als dat aanwezig is.
If Not Rst.EOF Then
    strExpr10 = Rst.Fields("Expr10") 'Bij elk record moet je de string wel weer opnieuw vullen
    strbezwaarschriftnummer = Rst.Fields("Bezwaarschriftnummer") 'Bij elk record moet je de string wel weer opnieuw vullen
    Do Until Rst.EOF
        strExp10 = Rst!Expr10
        strbezwaarschriftnummer = Rst!Bezwaarschriftnummer
        If strExpr10 < -2 Then
            With ObjTaskItem
                .Subject = "Beslistermijn overschreden!"
                .body = strbezwaarschriftnummer & " De beslistermijn is overschreden " & strExpr10 & " dagen geleden"
                .StartDate = Date
                .Display
                .Close olSave
                .Save
            End With
        End If
    Rst.MoveNext
    Loop
End If
Rst.Close
Set Rst = Nothing

StrSQL = "SELECT Expr10, Bezwaarschriftnummer FROM [Ambtelijkhorengeenverzuimgeenverdaging]"
Rst.Open StrSQL, CurrentProject.Connection, adOpenForwardOnly, adLockReadOnly
If Not Rst.EOF Then
    strExpr10 = Rst!Expr10 'Bij elk record moet je de string wel weer opnieuw vullen
    strbezwaarschriftnummer = Rst!Bezwaarschriftnummer 'Bij elk record moet je de string wel weer opnieuw vullen
    Do Until Rst.EOF
    strExp10 = Rst!Expr10
    strbezwaarschriftnummer = Rst!Bezwaarschriftnummer
    If strExpr10 < -2 Then
        With ObjTaskItem
            .Subject = "Beslistermijn overschreden!"
            .body = strbezwaarschriftnummer & " De beslistermijn is overschreden " & strExpr10 & " dagen geleden"
            .StartDate = Date
            .Display
            .Close olSave
            .Save
        End With
    End If
    Rst.MoveNext
    Loop
End If
Rst.Close
Set Rst = Nothing
End Sub
 
Dank je Dnereb! Hij doet het!

Ik heb nog een vraag..misschien kan jij hem voor me beantwoorden.
Hij loopt nu door de code maar slaat alleen de laatste record op als TaskItem.
ik heb het geprobeerd met .SaveAs objTaskItem, maar dan krijg ik de foutmelding dat ik niet gemachtigd ben voor het opslaan.

Weet jij misschien waarom hij alleen het laatste record opslaat?

:thumb:
 
Dit komt omdat je 1 mailitem creert met:
Code:
Set ObjTaskItem = ObjOL.CreateItem(olTaskItem)
en deze telkens opnieuw bewaart.
verplaats/kopieer deze regel onder de regel
Code:
If strExpr10 < -2 Then
zodat er elke keer een nieuw item gemaakt wordt zodra dat nodig is.

verder vermoed ik dat je de commentaren van de vorige beantwoorder niet hebt opgevolgd...

Code:
strExpr10 = Rst.Fields("Expr10") 'Bij elk record moet je de string wel weer opnieuw vullen
    strbezwaarschriftnummer = Rst.Fields("Bezwaarschriftnummer") 'Bij elk record moet je de string wel weer opnieuw vullen

zodra je dit vlak na Do until... kloppen de nummers en dergelijke tenminste.
 
Mhhhh.... grappig.... uiteindelijk is die if namelijk niet meer nodig (nadat ander foutjes werden glad gestreken) vandaar mijn onzekerheid over je commentaar
het spul kan zo namelijk ook lopen:

Code:
'zet option explicit boven je code en declareer al je variabelen (Dim .. as ..)
Private Sub Knop6_Click()
Dim ObjOL As Outlook.Application
Dim OTask As Outlook.TaskItem
Dim ObjTaskItem As TaskItem
Dim StDocName As String
Dim StrSQL As String
Dim Rst As New ADODB.Recordset
Dim StrDocumentPath As String
Dim RecordCount As Long

On Error GoTo 0

Set ObjOL = New Outlook.Application
StrDocumentPath = "O\staf\AJZ\Laura\tekst1.rtf"


StrSQL = "SELECT Expr10, Bezwaarschriftnummer FROM [Ambtelijkhorenwelverdagengeenverzuim]"
Rst.Open StrSQL, CurrentProject.Connection, adOpenForwardOnly, adLockReadOnly

Do Until Rst.EOF
        strExpr10 = Rst.Fields("Expr10")     
        strbezwaarschriftnummer = Rst.Fields("Bezwaarschriftnummer") 
        If strExpr10 < -2 Then
            Set ObjTaskItem = ObjOL.CreateItem(olTaskItem)
            With ObjTaskItem
                .Subject = "Beslistermijn overschreden!"
                .body = strbezwaarschriftnummer & " De beslistermijn is overschreden " & strExpr10 & " dagen geleden"
                .StartDate = Date
                .Display
                .Close olSave
                .Save
            End With
        End If
    Rst.MoveNext
Loop
Rst.Close
Set Rst = Nothing

StrSQL = "SELECT Expr10, Bezwaarschriftnummer FROM [Ambtelijkhorengeenverzuimgeenverdaging]"
Rst.Open StrSQL, CurrentProject.Connection, adOpenForwardOnly, adLockReadOnly
Do Until Rst.EOF
    strExpr10 = Rst!Expr10 
    strbezwaarschriftnummer = Rst!Bezwaarschriftnummer 
    If strExpr10 < -2 Then
        Set ObjTaskItem = ObjOL.CreateItem(olTaskItem)
        With ObjTaskItem
            .Subject = "Beslistermijn overschreden!"
            .body = strbezwaarschriftnummer & " De beslistermijn is overschreden " & strExpr10 & " dagen geleden"
            .StartDate = Date
            .Display
            .Close olSave
            .Save
        End With
    End If
    Rst.MoveNext
Loop
Rst.Close
Set Rst = Nothing
End Sub


De truc zat hem eigenlijk in het cursor type. door een forwardonly,readonly cursor wordt de cursor altijd op het eerste record gezet als dat aanwezig is, maar doordat delen binnen de loop zijn gebracht is dat zelfs niet meer echt belangrijk. Het enige voordeel is nog dat zo'n cursorless recordset veel sneller is als een keyset of dynaset cursor.
 
Status
Niet open voor verdere reacties.
Terug
Bovenaan Onderaan