Records verwijderen met VBA

Status
Niet open voor verdere reacties.

john64

Gebruiker
Lid geworden
12 jun 2011
Berichten
268
Goedenavond

Ik heb een veel op veel relatie tussen 2 tabellen (tblDiploma en tblVaardigheid) gemaakt dmv een tussentabel (beide dus 1 op veel gekoppeld met die tussentabel - tblDiplomaVaardigheid genaamd).
Op een formulier heb ik 2 keuzelijsten: 1 met alle beschikbare vaardigheden, en 1 met alle gekozen vaardighede voor het specifieke diploma. (in beide keuzelijsten staat meervoudige selectie op uitgebreid). Dmv een 2-tal knoppen koppel ik in VBA tblDiploma aan tblVaardigheid en maak een record aan in tblDiplomaVaardigheid
Code:
    If Me!kzlBeschikbareVaardigheden.ItemsSelected.Count = 0 Then Exit Sub
    
    ' Open de DiplomaVaardigheid tabel
    Set db = CurrentDb()
    Set rst = db.OpenRecordset("tblDiplomaVaardigheid")
    
    ' Bepaal DiplomaID
    lngBrevetID = Me.kzlDiploma
    
    'Voeg geselecteerde vaardigheden toe aan diploma
    For Each varItem In Me!kzlBeschikbareVaardigheden.ItemsSelected
        lngVaardigheidID = Me!kzlBeschikbareVaardigheden.Column(0, varItem)
        
        ' Begin een nieuwe regel
        rst.AddNew
        rst!DiplomaID = lngDiplomaID 
        rst!VaardigheidID = lngVaardigheidID
    
        ' Sla de nieuwe regel op
        rst.Update
    
    Next varItem

Daarna filter ik in keuzelijst kzlBeschikbareVaardigheden die vaardigheden die nog niet gekozen zijn.
Dit gaat prima.

Nu wil ik ook een mogelijkheid hebben om de geselecteerd vaardigheden waar los te koppelen, en dus een record uit die tussentabel te verwijderen.
Hoe doe ik dat in VBA ? Het gaat dus om de records die in de gekozenvaardigheden staan en die dus met DiplomaID en VaardigheidID opgezocht en verwijderd moeten worden.
alvast bedankt

John
 
Laatst bewerkt:
Met AddNew maak je een record, met Delete gooi je 'm weg. Wat je weggooit wordt uiteraard bepaald door je recordaanwijzing.
 
Hoi Michel

Dank voor reactie. Heb het geprobeerd met volgende code
Code:
    ' Bepaal BrevetID
    lngBrevetID = Me.kzlBrevet
    
    'Voeg geselecteerde vaardigheden toe aan brevet
    For Each varItem In Me!kzlGekozenBV.ItemsSelected
        lngVaardigheidID = Me!kzlGekozenBV.Column(0, varItem)
        
        rst.Delete
        
    Next varItem
    
    ' Klaar
    rst.Close
    Set rst = Nothing
    Set db = Nothing
Ik zie in lokale variabelen scherm dat de juiste ID's gebruikt worden, maar uiteindelijk wordt het eerste record in de tabel verwijderd (dus niet degene met de ID's zoals bepaald in de code.
Moet ik nog op één of andere manier een pointer verplaatsen naar het juiste record voordat ik deze delete ?


AANPASSING: ik zie dat ik helemaal geen gebruik maak van de ID's :(
Hoe verwijder ik dus het juiste record, op basis van gevonden ID's ?

mvg
John
 
Laatst bewerkt:
Als je deze recordset gebruikt (Set rst = db.OpenRecordset("tblDiplomaVaardigheid")) dan wil ik dat wel geloven... Je moet uiteraard wel filteren op het record dat je wilt verwijderen.
 
Nieuwe poging
Code:
    On Error Resume Next
    ' Verzoek om geselecteerde items uit de kzlGekozenBV te verwijderen
    ' Indien geen items geselecteerd, dan niets doen
    If Me!kzlGekozenBV.ItemsSelected.Count = 0 Then Exit Sub
    
    ' Loop door de geselecteerde itemcollectie
    For Each varItem In Me!kzlGekozenBV.ItemsSelected
        ' Neem de VaardigheidID kolom voor ieder geselecteerd item
        strWhere = strWhere & Me!kzlGekozenBV.Column(0, varItem) & ","
    Next varItem
    ' Verwijder de extra komma uit de "IN" tekenreeks
    strWhere = Left$(strWhere, Len(strWhere) - 1)
    
    'Stel SQL-statement samen
    strSQL = "SELECT * FROM tblBrevetVaardigheid WHERE "
    strSQL = strSQL & "BrevetID = Me.kzlBrevet "
    strSQL = strSQL & "AND VaardigheidID IN (" & strWhere & ")"
    
    ' Selecteer de recordset dmv SQL statement
    Set db = CurrentDb()
    Set rst = db.OpenRecordset(strSQL)
    
    'Als er geen records zijn dan exit
    If rst.EOF Then Exit Sub

    rst.MoveNext
    
    Do Until rst.EOF
        rst.Delete
        rst.MoveNext
    Loop
        
    ' Klaar
    rst.Close
    Set rst = Nothing
    Set db = Nothing

In lokale var. scherm komt te staan voor strSQL
Code:
SELECT * FROM tblBrevetVaardigheid WHERE BrevetID = Me.kzlBrevet AND VaardigheidID IN (14,17)

De recordset rst blijft echter leeg.
(de 14 en 17 zijn de ID's van Vaardigheid die gekozen zijn in een keuzelijst.)

Iemand een idee hoe ik bepaalde records uit een tabel kan verwijderen ?

mvg
John
 
en aan je laatste code kun je al zien dat het eerste deel van de SQL niet goed is.
Code:
    'Stel SQL-statement samen
    strSQL = "SELECT * FROM tblBrevetVaardigheid WHERE BrevetID = " & Me.kzlBrevet & " "
    strSQL = strSQL & "AND VaardigheidID IN (" & strWhere & ")"
 
Hoi Michel,

ja, stom :(

had ik zelf kunnen verzinnen. :thumb:

Maar hij werkt nu, thnx

John
 
Status
Niet open voor verdere reacties.
Terug
Bovenaan Onderaan