foutmelding bij opslaan selectievakjes

Status
Niet open voor verdere reacties.

Tamara27

Gebruiker
Lid geworden
1 mrt 2010
Berichten
224
Beste

Onafhankelijk formulier waarop zich 1 combobox bevindt (unieke code) en een aantal selectievakjes.

Hieronder de code om ervoor te zorgen dat deze selectievakjes worden opgeslagen in de juiste tabel:

Code:
Private Sub cmdVerder_Click()
Dim lResponse As Integer
Dim sUniekeCode As String
Dim sTabel As String

lResponse = MsgBox("Verder gaan?", vbYesNo, "Verder gaan")
If lResponse = vbYes Then

    If Nz(cmbCode, "") = "" Then
    MsgBox ("Vul de unieke code in aub")
    Exit Sub

    Else
        With CurrentDb.OpenRecordset(sTabel)
            .AddNew
            ![Unieke Code] = cmbCode
            ![Fistel] = Me.checkboxFistel
            ![Abces] = Me.checkboxAbces
            ![Strictuur] = Me.checkboxStrictuur
            ![Gewrichtsaandoening] = Me.checkboxGewrichtsaandoeningen
            ![Uveitis] = Me.checkboxUveitis
            ![Erythema Nodosum] = Me.checkboxErythema
            .Update
            .Close
        End With
    End If
    
    lResponse = MsgBox("Verder gaan naar Invoeren behandeling?", vbYesNo, "Verder gaan")
        If lResponse = vbYes Then
            sUniekeCode = Me.cmbCode
            DoCmd.Close acForm, "F_InvoerenComplicatiesAandoeningen"
            DoCmd.OpenForm "F_InvoerenBehandeling", , , , , , sUniekeCode
        Else
            DoCmd.Close acForm, "F_InvoerenComplicatiesAandoeningen"
            DoCmd.OpenForm "F_Start"
        End If

Else
    Exit Sub
End If
End Sub

PROBLEEM: Bij het opslaan krijg ik telkens een foutmelding:
"Fout 3078 tijdens uitvoering: De microsoft Office Access-databank-Engine kan de invoertabel of -query niet vinden. Zorg ervoor dat deze bestaat en dat de naam correct is gespeld."

Bij foutopsporing, duid hij telkens deze regel aan:
Code:
[B]  With CurrentDb.OpenRecordset(sTabel)[/B]

Ik heb de .tag overal nagekeken evenals de namen van de tabellen, klopt allemaal.
Waar kan de fout nog zitten?

bedankt!
 
Je defnieert een variabele sTabel, maar je vult 'm niet. Ik vermoed dat je een regeltje vergeten bent.
 
Jah, ik denk dat ik ergens een volgend regeltje moet zetten:

Code:
sTabel = .Tag

maar waar ik deze ook zet in de code, blijft hij foutmelding geven? :confused:
 
Je tabelnaam zal vast niet in een tag staan; ik zou 'm gewoon intypen. Of je moet dezelfde tabel gebruiken die je als Recordsource hebt voor je formulier. In dat geval gebruik je: sTabel = Me.RecordSource.
 
het betreft 2 verschillende tabellen, daarom dat ik gebruik maakte van de sTabel :)
 
Maar je opent maar één tabel met OpenRecordset; die tabelnaam moet je ergens ophalen/invullen.
 
ik had het stukje code gehaald uit een code voor een ander, gelijkaardig formulier. Hier werkt de code perfect. Heb het rode eruit gehaald...

Code:
lResponse = MsgBox("Verder gaan?", vbYesNo, "Verder gaan")
If lResponse = vbYes Then

    If Nz(cmbCode, "") = "" Then
    MsgBox ("Vul de unieke code in aub")
    Exit Sub

    Else
    Dim sTabel As String
    Dim sComplicaties As String
    
        For Each ctl In Controls
            With ctl
                Select Case .ControlType
                    Case acCheckBox
                        If .Value = -1 Then
                            sComplicaties = Mid(.Name, 9, Len(.Name) - 8)
                            [COLOR="red"]sTabel = .Tag
                            On Error Resume Next
                            With CurrentDb.OpenRecordset(sTabel)
                                .AddNew
                                ![Unieke Code] = cmbCode
                                ![Complicaties] = sComplicaties
                                ![Aandoeningen] = sComplicaties
                                ![Aantasting] = sComplicaties
                                .Update
                                .Close
                            End With[/COLOR]
                        End If
                    Case acComboBox
                        If .Value <> "" Then
                            sTabel = .Tag
                            On Error Resume Next
                            With CurrentDb.OpenRecordset("Select [Diagnosedatum], [Type IBD] FROM [GegevensPatienten] WHERE [Unieke Code] ='" & Me.cmbCode & "'")
                                If .RecordCount = 1 Then
                                .Edit
                                ![Diagnosedatum] = Me.txtDiagnosedatum
                                ![Type IBD] = Me.cmbIBD
                                .Update
                                End If
                                .Close
                            End With
                        End If
                End Select
            End With
        Next ctl

        If Me.txtAantalcm <> "" Then
        With CurrentDb.OpenRecordset("GegevensAantasting")
            .AddNew
            ![Unieke Code] = cmbCode
            ![Aantasting] = txtAantalcm & " cm"
            .Update
            .Close
        End With
        ElseIf Me.txtOngedefinieerd <> "" Then
        With CurrentDb.OpenRecordset("GegevensAantasting")
            .AddNew
            ![Unieke Code] = cmbCode
            ![Aantasting] = txtOngedefinieerd
            .Update
            .Close
        End With
        End If
        
    End If
    
    lResponse = MsgBox("Verder gaan naar Invoeren behandeling?", vbYesNo, "Verder gaan")
        If lResponse = vbYes Then
            sUniekeCode = Me.cmbCode
            DoCmd.Close acForm, "F_InvoerenIBD"
            DoCmd.OpenForm "F_InvoerenBehandeling", , , , , , sUniekeCode
        Else
            DoCmd.Close acForm, "F_InvoerenIBD"
            DoCmd.OpenForm "F_Start"
        End If

Else
    Exit Sub
End If
End Sub

dat rode gedeelte, wordt ook weggeschreven in verschillende tabelletjes, afhankelijk van de tabel die ik bij extra info had gedefinieerd... hier werkt het perfect.. vandaar dat ik dacht dat ik gewoon een .Tag ergens moest zetten, maar dat werkt niet...
 
En hier haal je de tabelnaam uit de tag van de selectievakjes. In de code uit je eerste post ontbreekt die lus. En je moet de tabelnaam uiteraard dan ook invullen bij de selectievak eigenschappen.
 
Goed, we zijn zover geraakt, dat ik er dan dit van heb gemaakt:

Code:
    If Nz(cmbCode, "") = "" Then
    MsgBox "Vul de unieke code in aub", vbOKOnly, "Oeps!"
    Exit Sub
    
    Else
    
    For Each ctl In Controls
    With ctl
        Select Case .ControlType
        Case acCheckBox
            
            With CurrentDb.OpenRecordset("GegevensComplicaties")
                .AddNew
                ![Unieke Code] = cmbCode
                ![Fistel] = Me.checkboxFistel
                ![Abces] = Me.checkboxAbces
                ![Strictuur] = Me.checkboxStrictuur
                .Update
                .Close
            End With
            
            With CurrentDb.OpenRecordset("GegevensEIAandoeningen")
                .AddNew
                ![Unieke Code] = cmbCode
                ![Gewrichtsaandoeningen] = Me.checkboxGewrichtsaandoeningen
                ![Uveitis] = Me.checkboxUveitis
                ![Erythema Nodosum] = Me.checkboxErythema
                .Update
                .Close
            End With
            
        End Select
        End With
    Next ctl
            
    End If

maar dan geeft hij een fout bij .Update

Ik snap er niks meer van. Dit heeft altijd zo mooi gewerkt? :(
 
Je opent twee keer een recordset; bij welke werkt hij niet?
 
Ok, nog wat zitten prullen.

Code:
For Each ctl In Controls
    With ctl
        Select Case .ControlType
        Case acCheckBox
            
            With CurrentDb.OpenRecordset("GegevensComplicaties")
                .AddNew
                ![Unieke Code] = cmbCode
                ![Fistel] = Me.checkboxFistel
                ![Abces] = Me.checkboxAbces
                ![Strictuur] = Me.checkboxStrictuur
             [COLOR="yellow"][B]   .Update[/B][/COLOR]
                .Close
            End With
            
            With CurrentDb.OpenRecordset("GegevensEIAandoeningen")
                .AddNew
                ![Unieke Code] = cmbCode
                ![Gewrichtsaandoeningen] = Me.checkboxGewrichtsaandoeningen
                ![Uveitis] = Me.checkboxUveitis
                ![Erythema Nodosum] = Me.checkboxErythema
                .Update
                .Close
            End With
            
        End Select
        End With
    Next ctl

De gegevens worden wel weggeschreven, maar hij geeft een foutmelding dat hij de gegevens niet kan wegzetten omdat er dan een dubbel record zal ontstaan (ik heb geindexeerd en duplicaten NEE, want er kan altijd maar 1 lijntje per tabel zijn.).

Als ik dan kijk bij de foutopsporing geeft hij .Update als fout aan bij het eerste stukje, hetgeen ik in het geel gezet heb.
Als ik dit gewoon weglaat, geeft hij dezelfde .Update ook aan in het tweede stukje.

Dit kan ik toch niet gewoon weglaten???
 
Laatst bewerkt:
Update is het feitenlijke opslaan van de gegevens; met AddNew zet je de data a.h.w. alleen maar klaar. De foutmelding die je krijgt is vrij eenduidig: het record bestaat al. Dus daar zou ik eerst eens naar kijken. Blijkbaar wordt het record al op een andere manier gemaakt.Misschien dat je niet AddNew moet toepassen, maar Edit. Dan moet je uiteraard de recordset op een andere manier openen, want om één record te bewerken, moet je die wel eerst opzoeken/openen.
 
het is dat dat ik niet goed begrijp. Ik heb al nagekeken of de records al bestaan, en dat is niet het geval :s
 
Heb geprobeerd de database te zippen en up te loaden, maar dat gaat niet :(
is gezipt nog 480 kb...
 
Laatst bewerkt:
Stuur 'm maar; dan kijk ik er wel even naar.
 
Laatst bewerkt:
k heb 'm! Werp er nog even een snelle blik op; met zo weg.
 
Het klopt wel wat ik dacht; je komt in de knoei met je Unieke code die (de naam zegt het... uniek is. Wil je meer opties per patiënt kunnen opslaan, zul je een andere sleutel moeten verzinnen, of de code aanpassen:

Code:
                Select Case .ControlType
                    Case acCheckBox
                        strSQL = "SELECT * FROM GegevensComplicaties WHERE [Unieke Code] ='" & Me.cmbCode & "'"
                        With CurrentDb.OpenRecordset(strSQL)
                            If .RecordCount = 0 Then
                                .AddNew
                                ![Unieke Code] = cmbCode
                            Else
                                .Edit
                            End If
                            ![Fistel] = Me.checkboxFistel
                            ![Abces] = Me.checkboxAbces
                            ![Strictuur] = Me.checkboxStrictuur
                            .Update
                            .Close
                        End With
                        strSQL = "SELECT * FROM GegevensEIAandoeningen WHERE [Unieke Code] ='" & Me.cmbCode & "'"
                        With CurrentDb.OpenRecordset(strSQL)
                            If .RecordCount = 0 Then
                                .AddNew
                                ![Unieke Code] = cmbCode
                            Else
                                .Edit
                            End If
                            ![Gewrichtsaandoeningen] = Me.checkboxGewrichtsaandoeningen
                            ![Uveitis] = Me.checkboxUveitis
                            ![Erythema Nodosum] = Me.checkboxErythema
                            .Update
                            .Close
                        End With
                End Select
 
Het is inderdaad gelukt! Heel erg bedankt.

Toch snap ik het niet zo heel goed. Bij het aanmaken van andere unieke records, lukt het me ook zonder de .edit. Is hier een reden voor?

Ik zet het item alvast op opgelost, want het werkt! :)
 
Afhankelijk van de sleutel in je tabel kun je een veld één keer toevoegen, of meer. In jouw geval kan [Unieke Code] dus maar éen keer in de twee tabellen voorkomen. Vermoedeljk heb je de situatie in de andere formulieren niet bij de hand gehad, omdat er maar één keer een patiënt wordt aangemaakt. In bovenstaand voorbeeld bewerk je blijkbaar je records ook, en dan krijg je dus dit probleem. Zelf zou ik het oplossen door een datumveld toe te voegen en dat op te nemen in de sleutel. Overigens alleen als je inderdaad wilt toestaan dat er meerdere records per patiënt mogen staan natuurlijk.
 
Status
Niet open voor verdere reacties.
Terug
Bovenaan Onderaan