Recordset bewerken zonder tabel te wijzigen

Status
Niet open voor verdere reacties.

janluc

Gebruiker
Lid geworden
10 jul 2016
Berichten
53
Ik genereer een mailinglijst door middel van een query. Voordat ik de mailing verstuur, wil ik nog enkele records handmatig uit die lijst verwijderen. Ik maak daarvoor een recordset aan, en open een daarop gebaseerd formulier om de records te kunnen bekijken die ik wil verwijderen. Maar als ik een record uit de set wil verwijderen, lijkt de recordset nog gebonden aan de originele tabel, want ik krijg de melding dat ik de record niet kan verwijderen omdat er gerelateerde records zijn in een andere tabel. Hoe kan ik de recordset bewerken zonder de tabel(len) waarop hij is gebaseerd aan te tasten?

Alvast dank voor de suggesties!

Groet, Jan-Luc

Voor de zekerheid de code die ik tot nu toe heb (het middelste deel heeft te maken met de omstandigheid dat de query parameters heeft die bepaald worden door de selectievakjes op een ander formulier):

Code:
Private Sub Form_Load()
Dim db As Database
Dim qdf As QueryDef
Dim rsMailinglijst As Recordset
  Set db = CurrentDb
'Satisfy the four parameters before creating the recordset.
   Set qdf = db.QueryDefs("qryMailings")
   qdf("[Formulieren]![frmMailinglijstMaken]![SeIIB]") = Forms!frmMailinglijstMaken!SeIIB
   qdf("[Formulieren]![frmMailinglijstMaken]![SelWinst]") = Forms!frmMailinglijstMaken!SelWinst
   qdf("[Formulieren]![frmMailinglijstMaken]![SelBTW]") = Forms!frmMailinglijstMaken!SelBTW
   qdf("[Formulieren]![frmMailinglijstMaken]![SelToeslag]") = Forms!frmMailinglijstMaken!SelToeslag
' Maak de recordset.
    Set rsMailinglijst = qdf.OpenRecordset()
 'Bind formulier aan recordset:
    Set Me.Recordset = rsMailinglijst
   
End Sub
 
Hoi, gebruik een tabel-maak query om een tijdelijke tabel aan te maken en gebruik deze als basis voor je mailing. Bij een volgende mailing kan je deze gewoon overschrijven met de tabel-maak query.

Vriendelijke groeten
Noëlla
 
Of, en dat lijkt mij veel slimmer, gebruik een virtuele (ADO) recordset die je aan het formulier koppelt en gebruik dat om de records verder te filteren. Extra tabellen kun je weliswaar altijd weer opruimen, maar je maakt de db daarmee ongemerkt groter. Dat kun je dan met comprimeren wel weer opschonen, maar echt nodig is dat dus allemaal niet als je een virtuele recordset gebruikt.
 
Ik heb op basis van jouw code een voorbeeldje gemaakt, dat wellicht zou kunnen werken. Misschien moet je nog wat aanpassen (veldtypes bijvoorbeeld).
Code:
Private Sub Form_Load()
Dim rstDAO As DAO.Recordset

'============================================================================================
'Inrichting met Early Binding; ADO 6.1 aanzetten in <Extra>, <Verwijzingen>.
Dim rstADO As ADODB.Recordset
Dim fld As ADODB.Field
    Set rstADO = New ADODB.Recordset
'============================================================================================

'============================================================================================
'Inrichting met Late Binding. Geen verwijzing nodig, maar een beetje trager.
''Dim rstADO As Object
''Dim fld As Object
''    Set rstADO = CreateObject("ADODB.Recordset")
'============================================================================================
    
    With rstADO
        .Fields.Append "SeIIB", adInteger, , adFldKeyColumn
        .Fields.Append "SelWinst", adCurrency, , adFldMayBeNull
        .Fields.Append "SelBTW", adCurrency, , adFldMayBeNull
        .Fields.Append "SelToeslag", adCurrency, , adFldMayBeNull
        .Fields.Append "Selected", adBoolean, , adFldMayBeNull
        .CursorType = adOpenKeyset
        .CursorLocation = adUseClient
        .LockType = adLockPessimistic
        .Open
    End With

    Set rstDAO = CurrentDb.OpenRecordset("SELECT * FROM qryMailings", dbOpenDynaset)
    Do Until rstDAO.EOF
        rstADO.AddNew
        rstADO.Fields(0) = rstDAO!SeIIB
        rstADO.Fields(1) = rstDAO!SelWinst
        rstADO.Fields(2) = rstDAO!SelBTW
        rstADO.Fields(3) = rstDAO!SelToeslag
        rstADO.Fields(4) = True
        rstADO.Update
        rstDAO.MoveNext
    Loop
    With Me
        Set .Recordset = rstADO
        .AllowAdditions = True
        .Requery
    End With
End Sub
 
Dank voor jullie snelle reacties!
@Noëlla: wat je voorstelt is de oplossing die ik tot nu toe gebruikte en die werkt inderdaad prima, op de door Octafish genoemde bijwerking na. Maar toen ik te weten kwam over het bestaan van recordsets (ik ben een beginner), leek me dit een goede gelegenheid om er mee te oefenen.
@Octafish: dank je wel, ik ga met je code aan de slag, en laat je weten wanneer het is gelukt.

Groet, Jan-Luc
 
Status
Niet open voor verdere reacties.
Steun Ons

Nieuwste berichten

Terug
Bovenaan Onderaan