• Privacywetgeving
    Het is bij Helpmij.nl niet toegestaan om persoonsgegevens in een voorbeeld te plaatsen. Alle voorbeelden die persoonsgegevens bevatten zullen zonder opgaaf van reden verwijderd worden. In de vraag zal specifiek vermeld moeten worden dat het om fictieve namen gaat.

Database vullen via klassemodule

Status
Niet open voor verdere reacties.

NogGeenGuru

Gebruiker
Lid geworden
5 aug 2015
Berichten
130
Beste Helpers,

In een poging mijn VBA wat op te schonen ben ik gebruik gaan maken van klassenmodules.
Nu is dit compleet nieuw voor mij maar met wat hulp van professor google ben ik al een heel eind gekomen :cool:

Het lezen vanuit mijn database gaat goed maar het schrijven naar de database wil niet zo lukken :(

Ik heb onderstaande klassenmodule aangemaakt:

Code:
Dim cn As ADODB.Connection
Dim rs As ADODB.Recordset

Private pOpdrachtgeverNR As Integer
Private pOpdrachtgeverNaam As String

'Constructor
'database en recordset initialiseren
Private Sub Class_Initialize()
    Set cn = New ADODB.Connection
    Set rs = New ADODB.Recordset
    
    With cn
       .ConnectionString = "Provider = Microsoft.ACE.OLEDB.12.0; Data Source = " & ActiveWorkbook.Path & "\DB.accdb"
       .Open
    End With
End Sub

'Gegevens ophalen gebruik makend van OpdrachtgeverNR (primary key)
Public Property Let OpdrachtgeverNR(intOpdrachtgeverNR)
pOpdrachtgeverNR = intOpdrachtgeverNR
    
With rs
    .Open "Select * from Opdrachtgever where OpdrachtgeverNR = " & OpdrachtgeverNR, cn
    
    If rs.EOF = False Then
        pOpdrachtgeverNaam = .Fields("OpdrachtgeverNaam").Value
    Else
        MsgBox "Opdrachtgever met OpdrachtgeverNR " & OpdrachtgeverNR & " is niet gevonden!", vbCritical
        End
    End If
End With
End Property

'Gegevens ophalen gebruik makend van OpdrachtgeverNaam
Public Property Let OpdrachtgeverNaam(strOpdrachtgeverNaam)
pOpdrachtgeverNaam = strOpdrachtgeverNaam
    
With rs
    .Open "Select * from Opdrachtgever where OpdrachtgeverNaam = " & OpdrachtgeverNaam, cn
    
    If rs.EOF = False Then
        pOpdrachtgeverNR = .Fields("OpdrachtgeverNR").Value
    Else
        MsgBox "Opdrachtgever met OpdrachtgeverNaam " & OpdrachtgeverNaam & " is niet gevonden!", vbCritical
        End
    End If
End With
End Property

'waarden teruggeven
Public Property Get OpdrachtgeverNR()
    OpdrachtgeverNR = pOpdrachtgeverNR
End Property
Public Property Get OpdrachtgeverNaam()
    OpdrachtgeverNaam = pOpdrachtgeverNaam
End Property

'Destructor
'recordset en database sluiten
Private Sub Class_Terminate()
rs.Close
cn.Close
    
Set rs = Nothing
Set cn = Nothing
End Sub

Hieraan zou ik graag nog een mogelijkheid toevoegen om nieuwe records aan te maken (en één om record(s) te verwijderen)
De primary key OpdrachtgeverNR zal ik voor het toevoegen niet nodig hebben omdat dit een autoincrement veld is.

dus ik ga er van uit dat ik een sub/functie/property nodig heb die als arugment een string OpdrachtgeverNaam aan neemt...

volgende code heb ik daarvoor geprobeerd:

Code:
'Record Toevoegen
Public Property Let OpdrachtgeverToevoegen(strOpdrachtgeverNaam)
Dim Query As String
    pOpdrachtgeverNaam = strOpdrachtgeverNaam
    
    Query = "INSERT INTO Opdrachtgever ([OpdrachtgeverNaam])" & _
        " VALUES ('" & OpdrachtgeverNaam & "');"
    
    rs.Open Query, cn
End Property

Deze werkt tot op zeker hoogte...
De query wordt uitgevoerd en het record wordt ook idd aangemaakt.
maar mijn Class_Terminate() is het hier niet zo mee eens... hij loopt vast bij rs.close en geeft de melding:
Fout: 3704 De bewerking is niet toegestaan als het object gesloten is.

naar mijn mening heb ik rs geopend in rs.Open (rs = recordset)

Ik doe dus duidelijk iets verkeerd. maar ik kom er niet achter wat ik precies verkeerd doe...

kan iemand mij daar mee helpen?
 
Ik zie niet in hoe een klasse hier behulpzaam kan zijn.
Je gebruikt ieder record in de database toch al als object om gegevens in op te slaan.

Ophalen met nummer of naam:
Code:
Sub M_snb()
  With createobject("ADODB.recordset")
    .Open "SELECT * FROM Opdrachtgever where OpdrachtgeverNR = " & OpdrachtgeverNR", "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" & ActiveWorkbook.Path & "\DB.accdb"
    Sheet1.Cells(20, 1).CopyFromRecordset .DataSource
    .open "Select * FROM Opdrachtgever where OpdrachtgeverNaam = " & OpdrachtgeverNaam"
    Sheet1.Cells(20, 1).CopyFromRecordset .DataSource
  End With
End Sub

Ik ken de velden van ieder record niet; als voorbeeld een record toevoegen.
Code:
sub M_snb_toevoegen record()
  with createobject("ADODB.Recordset")
     .Open "Opdrachtgever", "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" & ActiveWorkbook.Path & "\DB.accdb", , 2    
     .ActiveConnection.Execute "insert into Opdrachtgever (NR,naam,adres,postcode,email)values(88765,'snb', 'adres1','1074GH','snb@wel.nl')"
     .Update
  End With
End sub
 
Laatst bewerkt:
Status
Niet open voor verdere reacties.
Terug
Bovenaan Onderaan