Fout in code opslaan

Status
Niet open voor verdere reacties.

Rommyke

Gebruiker
Lid geworden
29 mrt 2007
Berichten
357
Hoi allemaal ,

Ik alweer met een nieuwe vraag

Ik heb een code voor het opslaan van gegevens die ik in een tekstvak ingeef

Er zitten echter nog een paar foutjes in de code

1 ) Als ik mijn form opstart is mijn tekstvak niet leeg en staat er een waarde in : -> zou graag een lege tekstvak hebben .

2) Als ik op een knop 'opslaan' druk worden de gegevens die ik in mijn tekstvak heb , opgeslaan in een tabel.
Zolang de gegevens die ik ingeef niet in mijn tabel staan werkt de code perfect .:D

3) Als ik nu iets ingeef wat al in mijn tabel staat krijg ik een message dat dit al bestaat , tot hier toe werkt alles prima .

Dan krijg ik de vraag of ik een nieuwe ingave wil doen ,

Als ik ja klik kan ik een nieuwe ingave doen maar mijn tekstvak is weer niet blanco
Als ik Nee klik worden de gegevens toch opgeslaan .waardoor ze dubbel komen te staan en sluit de form .

Iemand een idee ?





Code:
Private Sub OpslaanCmd_Click()

If DCount("Afdelingsnaam", "Afdelingen", "[Afdelingsnaam] = '" & CStr(Forms!Afdelingen!Afdelingsnaam.Value) & "'") >= 1 Then
   
   If MsgBox("Afdeling bestaat al" & vbCrLf & "Wilt u een nieuwe ingave doen ?", 4, "Afdelingsnaam Opslaan") = vbYes Then
      Exit Sub
   Else
      DoCmd.Close
   End If
Else
    DoCmd.GoToRecord , , acNewRec
    Refresh
   
End If

    
End Sub
 
Heb extra vraag gewist en zal voor deze vraag nieuwe post tellen
 
Laatst bewerkt:
Hallo Rommyke,

graag 1 vraag per draadje.

Groet,

Tardis
 
Hallo Rommyke,

graag 1 vraag per draadje.

Groet,

Tardis

Oke Tardis ,

Extra vraag is gewist .

Bij de vraag handelt het enkel om puntje drie en ik denk dat alles te maken heeft met een fout in de code , vandaar in 1 vraag onderveelt in 3 puntjes waarvan puntje 2 geen vraag is want dit deel werkt .Was meer een uitleg van wat het doet.

Groetjes


Hopelijke kan je helpen
 
1 ) Als ik mijn form opstart is mijn tekstvak niet leeg en staat er een waarde in : -> zou graag een lege tekstvak hebben .
Verwijder de default waarde van je tekstvak of gebruik je bound forms? Dan wordt het iets lastiger.
2) Als ik op een knop 'opslaan' druk worden de gegevens die ik in mijn tekstvak heb , opgeslagen in een tabel.
Zolang de gegevens die ik ingeef niet in mijn tabel staan werkt de code perfect .:D

3) Als ik nu iets ingeef wat al in mijn tabel staat krijg ik een message dat dit al bestaat , tot hier toe werkt alles prima .

Dan krijg ik de vraag of ik een nieuwe ingave wil doen ,

Als ik ja klik kan ik een nieuwe ingave doen maar mijn tekstvak is weer niet blanco
Als ik Nee klik worden de gegevens toch opgeslaan .waardoor ze dubbel komen te staan en sluit de form .
Pas je procedure aan:
Code:
Private Sub OpslaanCmd_Click()

   If DCount("Afdelingsnaam", "Afdelingen", "[Afdelingsnaam] = '" & CStr(Forms!Afdelingen!Afdelingsnaam.Value) & "'") >= 1 Then
   
       If MsgBox("Afdeling bestaat al" & vbCrLf & "Wilt u een nieuwe ingave doen ?", 4, "Afdelingsnaam Opslaan") = vbYes Then
          Exit Sub
       Else
          If Me.Dirty Then 'Het toevoegen van een nieuw of gewijzigd record wordt teruggedraaid.
              DoCmd.DoMenuItem acFormBar, acEditMenu, acUndo, , acMenuVer70
          End If
       End If
    Else
        DoCmd.GoToRecord , , acNewRec
        Refresh
    End If
End Sub
 
Verwijder de default waarde van je tekstvak of gebruik je bound forms? Dan wordt het iets lastiger.

Nee Guus , ik gebruik unbound

Mijn defaultwaarde van mijn tekstveld is leeg , maar bij opstarten van mijn formulier krijg ik de eerste waarde van mijn tabel

Pas je procedure aan:

Was ook al opzoek naar volgende elementen dirty event, before insert en before update.
Heb de code gebruikt die je doorgegeven hebt maar heb er nog een vraagje bij .

3) Als ik nu iets ingeef wat al in mijn tabel staat krijg ik een message dat dit al bestaat , tot hier toe werkt alles prima .

Dan krijg ik de vraag of ik een nieuwe ingave wil doen ,

Als ik Nee klik worden de gegevens toch opgeslaan .waardoor ze dubbel komen te staan en sluit de form

Ik krijg nu geen dubbele ingave in de tabel meer maar ik heb een gedeleted id in de tabel , klopt dit ?

Heb nog een extra code toegevoegd om foute te vermijden maar als ik nu nee druk kom ik weer vast te zitten

Code:
Private Sub Form_BeforeUpdate(Cancel As Integer)
Dim Result As Long

 If Me.Dirty Then
   Result = MsgBox("Wilt u de veranderingen opslaan?", vbInformation + vbYesNo, "Record gewijzigd!")
      If Result = vbNo Then
         Cancel = True
      Else
       'Er is ja geantwoord, de normale acties mogen plaatsvinden.
       'Geen extra code nodig dus...
      End If
 End If

End Sub

krijg de melding dat ik niet naar de gespecificeerde opdracht kan gaan
 
Me.Dirty impliceert dat je een bound form hebt. Je zegt dat dat niet zo is. Waarom dan deze test? Je zit trouwens ook in het form event before update. dus ik snap het niet helemaal.
Aangenomen dat je stiekum toch een bound form hebt welke gespecificeerde opdracht bedoel je, ergo: waar zit de foud?
 
Me.Dirty impliceert dat je een bound form hebt. Je zegt dat dat niet zo is. Waarom dan deze test? Je zit trouwens ook in het form event before update. dus ik snap het niet helemaal.
Aangenomen dat je stiekum toch een bound form hebt welke gespecificeerde opdracht bedoel je, ergo: waar zit de foud?

Guus ,

Gij hebt gelijk :)

Tis bound vermits ik gebruik maak van de control source :confused: klopt toch ?

Ben nog maar 1 week met access bezig , dus er is zeer veel dat op mij afkomt;)

Ik maak dus gebruikt van uw code :

Als ik nu in mijn tekstvak een waarde ingeef die in mijn tabel staat en ik druk op toevoegen
krijg ik de melding 'Afldeling bestaat wilt u een nieuwe ingave doen ? Ja - Nee'

Als ik Ja druk krijg ik een pop up van de code Form_BeforeUpdate

'Wilt u de veranderingen opslaan ? Ja - nee'

Als ik hier nu Nee druk krijg ik de fout

you can't go to the specified record

waarbij hij deze regel aangeeft in uw code

If MsgBox("Afdeling bestaat al" & vbCrLf & "Wilt u een nieuwe ingave doen ?", 4, "Afdelingsnaam Opslaan") = vbYes Then
DoCmd.GoToRecord , , acNewRec

ik kan dus niet naar de vet gedrukte opdracht gaan

hopelijk kan je er nog een beetje aan uit
 
Tis bound vermits ik gebruik maak van de control source :confused: klopt toch ?
Ja, dat klopt.
Code:
If MsgBox("Afdeling bestaat al" & vbCrLf & "Wilt u een nieuwe ingave doen ?", 4, "Afdelingsnaam Opslaan") = vbYes Then
       [B] DoCmd.GoToRecord , , acNewRec[/B]
ik kan dus niet naar de vet gedrukte opdracht gaan
Misschien is je controlsource gekoppeld aan een query waarin je geen record kan toevoegen? Dat is meestal het geval als er meerdere tabellen zijn gejoined. Het kan ook zijn dat je form instellingen dusdanig zijn dat je geen record mag toevoegen:
Me.AllowAdditions staat dan op false.

Hint:
Gebruik vbYesNo i.p.v. 4. Als je overgaat naar een volgende versie van Access dan blijft je applicatie werken zoals deze nu ook doet.
 
Ja, dat klopt.

Misschien is je controlsource gekoppeld aan een query waarin je geen record kan toevoegen? Dat is meestal het geval als er meerdere tabellen zijn gejoined. Het kan ook zijn dat je form instellingen dusdanig zijn dat je geen record mag toevoegen:
Me.AllowAdditions staat dan op false.

Hint:
Gebruik vbYesNo i.p.v. 4. Als je overgaat naar een volgende versie van Access dan blijft je applicatie werken zoals deze nu ook doet.

Guus,

Nog bedank voor de Hint , ga ze zeker toepassen ;)


Ik gebruik geen Query en
Me.AllowAdditions staat op True

Heb een bijlage meegestuurd , kunt misschien eens kijken

op nieuw klikken
waarde ingeven die al bestaat
op toevoegen klikken
message ' Afdeling bestaat al wilt u nieuwe ingave doen 'komt te voorschijn
klik op Yes
Message 'Wilt u de veranderingen opslaan '

klik op No

en hier gebeurd de foutmelding
 

Bijlagen

Synchronisatie probleem

Code:
Private Sub Form_BeforeUpdate(Cancel As Integer)
Dim Result As Long

 If Me.Dirty Then
[B]2)[/B]   Result = MsgBox("Wilt u de veranderingen opslaan?", vbInformation + vbYesNo, "Record gewijzigd!")
      If Result = vbNo Then
         Debug.Print "Form_BeforeUpdate : Cancel = " & Cancel
         Cancel = True
      Else
         Debug.Print "Form_BeforeUpdate : Cancel = " & Cancel
        Cancel = False
       'Er is ja geantwoord, de normale acties mogen plaatsvinden.
       'Geen extra code nodig dus...
      End If
 End If

End Sub

Private Sub OpslaanCmd_Click()

    Dim intRetVal As Integer
    
    If DCount("Afdelingsnaam", "Afdelingen", "[Afdelingsnaam] = '" & CStr(Forms!Afdelingen!Afdelingsnaam.Value) & "'") >= 1 Then
   
       intRetVal = MsgBox("Afdeling bestaat al" & vbCrLf & "Wilt u een nieuwe ingave doen ?", 4, "Afdelingsnaam Opslaan")
       Debug.Print "OpslaanCmd_Click : intRetVal = " & intRetVal
       If intRetVal = vbYes Then
[B]1)[/B]          DoCmd.GoToRecord , , acNewRec
       Else
          If Me.Dirty Then 'Het toevoegen van een nieuw of gewijzigd record wordt teruggedraaid.
              DoCmd.DoMenuItem acFormBar, acEditMenu, acUndo, , acMenuVer70
          End If
       End If
    Else
       DoCmd.GoToRecord , , acNewRec 'Een nieuw record toevoegen.
       Refresh
    End If
End Sub
Je hebt een synchronisatie probleem. Nog voordat er een nieuw record 1) wordt aangemaakt wordt er een BeforeUpdate event 2) afgevuurd. Dat gaat goed tenzij je het opslaan van het (vorige) record onderbreekt. Want daarna komt er een NewRecord commando terwijl je nog met die andere bezig was.
Als je je code aanpast met een controle of er een nieuw record gemaakt moet worden dan werkt het weer.
Code:
Option Compare Database
Option Explicit

Dim mblnNewRecord As Boolean

Private Sub Form_BeforeUpdate(Cancel As Integer)
Dim Result As Long

 If Me.Dirty And Not mblnNewRecord Then
   Result = MsgBox("Wilt u de veranderingen opslaan?", vbInformation + vbYesNo, "Record gewijzigd!")
      If Result = vbNo Then
         Debug.Print "Form_BeforeUpdate : Cancel = " & Cancel
         Cancel = True
      Else
         Debug.Print "Form_BeforeUpdate : Cancel = " & Cancel
        Cancel = False
       'Er is ja geantwoord, de normale acties mogen plaatsvinden.
       'Geen extra code nodig dus...
      End If
 End If

End Sub

Private Sub OpslaanCmd_Click()

    Dim intRetVal As Integer
    
    If DCount("Afdelingsnaam", "Afdelingen", "[Afdelingsnaam] = '" & CStr(Forms!Afdelingen!Afdelingsnaam.Value) & "'") >= 1 Then
   
       intRetVal = MsgBox("Afdeling bestaat al" & vbCrLf & "Wilt u een nieuwe ingave doen ?", 4, "Afdelingsnaam Opslaan")
       Debug.Print "OpslaanCmd_Click : intRetVal = " & intRetVal
       If intRetVal = vbYes Then
          mblnNewRecord = True
          DoCmd.GoToRecord , , acNewRec
       Else
          mblnNewRecord = False
          If Me.Dirty Then 'Het toevoegen van een nieuw of gewijzigd record wordt teruggedraaid.
              DoCmd.DoMenuItem acFormBar, acEditMenu, acUndo, , acMenuVer70
          End If
       End If
    Else
       DoCmd.GoToRecord , , acNewRec 'Een nieuw record toevoegen.
       Refresh
    End If
End Sub
 
Guus,

Gij zijt super , super :love:


:p

Had ik nooit gevonden

Groeten
Romain
 
Heb nu de meeste mogelijkheden uitgeprobeerd ,

Als ik nu echter een ingave doe die al bestaat dan krijg ik een messagebox van
'Afdeling bestaat al , wilt u een nieuwe ingave doen .' Dit werkt zoals het hoord.

Als ik nu op ja druk kan ik dus een nieuwe ingave doen in mijn textvak maar als ik dan op commandoknop toevoegen klik krijg ik geen messagebox meer van Private Sub Form_BeforeUpdate ' Wilt u de veranderingen opslaan ?' en wordt de toevoeging direct gedaan .

Hoe komt dit, iemand een idee ?

Groetjes Romain
 
Hallo Romain,

je vraag komt me een beetje onlogisch voor.
Je hebt immers al gevraagd of er nieuwe gegevens moeten worden ingevoerd?
Dus waarom zou je dat nogmaals willen vragen?

Als je dat toch wilt, moet je de code van Guus aanpassen.
Waar precies staat aangegeven in de code:

Code:
'Er is ja geantwoord, de normale acties mogen plaatsvinden.
'Geen extra code nodig dus...

Groet,

Tardis
 
Hallo Romain,

je vraag komt me een beetje onlogisch voor.
Je hebt immers al gevraagd of er nieuwe gegevens moeten worden ingevoerd?
Dus waarom zou je dat nogmaals willen vragen?

Hoi Tardis,


Je hebt gelijk maar ik zou alles willen voorzien van moest de persoon zich bedenken dat hem toch de mogelijkheid heeft om te annuleren..
Maar misschien ben ik te ver aan het gaan met de mogelijkheden

Bedankt
 
Status
Niet open voor verdere reacties.
Terug
Bovenaan Onderaan