Foutmelding: Object variable or With block variable not set

Status
Niet open voor verdere reacties.

TimWoo

Gebruiker
Lid geworden
26 mrt 2012
Berichten
5
Hoi allemaal,

Eerste post hier volgens mij. Ik zal me even kort voorstellen.
Ik ben Tim uit Wageningen en ik doe de deeltijd studie Technische Informatica aan de HAN in Arnhem.

Ik ben bezig aan een database applicatie in Access voor een casus. Op zich vlot het redelijk, ik loop nu alleen vast.

Zoals in de titel beschreven gaat het om de foutmelding "Object variable or With block variable not set"

Ik krijg deze foutmelding bij het uitvoeren van de volgende code:
Code:
Private Sub btnNieuweKlant_Click()
On Error GoTo Err_btnNieuweKlant_Click

    DoCmd.GoToRecord , , acNewRec
    Dim MyDb As Database
    Dim MyRec As Recordset
    Dim knr As Integer
    Set MyDb = CurrentDb()
    MsgBox ("booyah")
    Set MyRec = MyDb.OpenRecordset("SELECT MAX(klantnr) FROM Klant")
    Me.klantnr.Value = MyRec![klantnr] + 1

Exit_btnNieuweKlant_Click:
    Exit Sub

Err_btnNieuweKlant_Click:
    MsgBox Err.Description
    Resume Exit_btnNieuweKlant_Click
    
End Sub

Wat ik probeer te bereiken met de code is het volgende.
Als er op de knop "Nieuwe Klant" geklikt wordt, dan moet het formulier leeg en klaar zijn om een nieuwe klant in te voeren.
Tot zover geen probleem, maar bij het opslaan van de klant ontbreekt het klantnr (primary key van de Klant tabel in de database). De PK van deze tabel heeft geen AI.
Ik probeer dus te achterhalen wat de volgende id (klantnr) van de PK moet worden. In bovenstaande code probeer ik dus d.m.v. een query de huidige grootste waarde voor klantnr te achterhalen. De code wordt correct uitgevoerd t/m de regel "MsgBox ("booyah")". Daarna verschijnt de foutcode.

Ik probeer het dmv een database query op te lossen, maar misschien is er wel een veel makkelijkere manier om het juiste waarde voor klantnr (hoogste nog niet bestaande) mee te geven als het record opgeslagen wordt (Save Record).

Alle suggesties zijn zeer welkom.
Bij voorbaat dank.

Groet,
Tim
 
Probeer dit eens:
Code:
Private Sub btnNieuweKlant_Click()
On Error GoTo Err_btnNieuweKlant_Click

    DoCmd.GoToRecord , , acNewRec
    With CurrentDb.OpenRecordset("SELECT MAX(klantnr) FROM Klant")
        Me.klantnr.Value = .Fields(0) + 1
        .Close
    End With
    Exit Sub

Err_btnNieuweKlant_Click:
    MsgBox Err.Description
    
End Sub

Overigens kan het veel simpeler, door de waarde als Standaardwaarde op het veld Klantnr te zetten met deze formule: DMax("[klantnr]", "Klant") + 1
 
Super! Bedankt voor de oplossing.

Maar ik ben stiekem ook benieuwd naar het waarom van de foutmelding en hoe die op te lossen is.
 
Je SET commando klopt denk ik niet; je set een object variabele, en vervolgens doe je daar wat mee. Jij probeert die twee handelingen te combineren. Een Recordset moet je wel openen, maar niet in de SET actie. Overigens hoeft het dus allemaal niet zo ingewikkeld, zoals mijn oplossingen aangeven. Welke oplossing heb je gekozen?
 
De makkelijke uiteraard :).

Ik was alleen nog geinteresseerd in de gecompliceerdere oplossing, omdat ik misschien nog iets met Recordsets wil/moet in deze opdracht.

Nogmaals hartelijk dank. Ik heb het al weer meerdere malen toegepast.
 
Ik probeer weer een wat direct te querien, met weinig succes.

Code:
CurrentDb.Execute "INSERT into Opdrachttaak 
(taaknr, opdrachtnr, monteurcode) VALUES 
(" & Me.taaknr.Value & ", " & Me.opdrachtnr.Value & ", " & Me.subfrmMonteursVoorTaak.Form.monteurcode & ")"

Weer dezelfde foutmelding. Enig idee hoe ik dit op kan lossen of anders aan kan pakken?
 
Laatst bewerkt:
Ik denk dat je de waarden niet goed uitleest, en dan met name die van het subformulier. Maar dat is een beetje afhankelijk van of je de code afschiet vanaf hoofdformulier, of van subformulier.
Ik ben zowiezo al geen voorstander van de SQL rechtstreeks in de Execute hangen; je hebt dan al helemaal geen controle over de inhoud van de string. Dus ik zou dit proberen:

Code:
Dim strSQL as String
Dim tmp
strSQL = "INSERT into Opdrachttaak (taaknr, opdrachtnr, monteurcode) VALUES (" & Me.taaknr.Value & ", " & Me.opdrachtnr.Value & ", " & Me.subfrmMonteursVoorTaak.Form.monteurcode & ")"
tmp=InputBox("","",strSQL)
CurrentDb.Execute strSQL
De Inputbox kun je dan gebruiken om de inhoud van de SQL te kopiëren en in een nieuwe query te plakken. Of in Notepad.
 
Status
Niet open voor verdere reacties.
Terug
Bovenaan Onderaan