Save en sluiten knoppen

Status
Niet open voor verdere reacties.

Bandito

Gebruiker
Lid geworden
8 okt 2012
Berichten
199
Beste allemaal,


Ik ben een registratie systeem aan het maken waarin ik werknemers registreer. Het formulier heeft een knop bewerken waarmee ik de gegevens van werknemers kan bewerken. Wanneer er op de knop bewerken wordt gedrukt verdwijnt deze knop en komt de knop opslaan tevoorschijn.

Ik zou graag willen dat deze knop alleen klikbaar wordt wanneer er gegevens veranderen.

Daarnaast zit er ook een knop sluiten op het formulier. Ik heb voor deze knop code gevonden die altijd de vraag vraagt: wilt u de gegevens opslaan? Ja / Nee en dan slaat hij op en/of sluit het formulier. Nu zou ik graag willen dat deze vraag alleen komt wanneer er daadwerkelijk iets is veranderd en er dus iets op te slaan is. Wanneer er niks is veranderd is opslaan namelijk overbodig.


In makkelijkere taal: ik zou het graag zoals Word / Excell opslaan willen. Wanneer ik zelf opsla is het niet nodig dat bij afsluiten om opslaan gevraagd wordt. Wanneer ik vergeet op te slaan wil ik bij afsluiten dat het programma me eraan herinnert dat er wijzigingen aan zijn gebracht en dat ik wellicht mijn veranderde gegevens wil bewaren.

Zou iemand mij hiermee kunnen helpen?
 
Laatst bewerkt:
Ik werk het liefst met één knop, die dus gewoon de hele tijd op het scherm staat. Op basis van de Caption (bijschrift) verander ik de functie en het bijschrift.
Code:
    If Me.cmdPersoonBewerken.Caption = "Kandidaat bewerken" Then
        iKleur = Me.cmdPersoonBewerken.BackColor
        Me.AllowEdits = True
        With Me.cmdPersoonBewerken
            .Caption = "Kandidaat opslaan"
            .FontBold = True
            .BackColor = Kleur
        End With
    ElseIf Me.cmdPersoonBewerken.Caption = "Kandidaat opslaan" Then
        With Me.cmdPersoonBewerken
            .BackColor = iKleur
            .Caption = "Kandidaat bewerken"
            .FontBold = False
        End With
        If Me.Dirty Then Me.Dirty = False
        DoCmd.RunCommand acCmdSaveRecord
        Me.AllowEdits = False
    End If

En op je Sluiten knop:
Code:
Sub cmdSluiten()
    If Me.Dirty Then
        If MsgBox("Je hebt deze kandidaat nog niet opgeslagen; wil je het formulier sluiten?" & vbLf _
            & "Je raakt alle wijzigingen kwijt.", vbYesNo + vbDefaultButton2) = vbYes Then
            DoCmd.RunCommand acCmdUndo
        Else
            Me.Dirty = False
            DoCmd.RunCommand acCmdSaveRecord
        End If
    End If
    DoCmd.Close acForm, Me.Form.Name
End Sub
 
Hoi Octafish,

Bedankt voor je antwoord, ik ga het uitproberen.

Dat veranderen van de caption is nieuw voor me. Waar plaats ik deze code dan? Gewoon onder Click()?
 
Ja, de knop krijgt natuurlijk gewoon een <Bij klikken> gebeurtenis. Eigenlijk hang je dus verschillende knopfuncties aan één knop, die je met een Select Case (als het er meer dan 2 zijn) op basis van de Knoptekst uitleest en triggert.
 
Hoi Octafish,

Sorry voor mijn onwetendheid maar ik krijg de volgende fout op de volgende regel:

Compileerfout: Kan de methode of het gegevenslid niet vinden

iKleur = Me.cmdPersoonBewerken.BackColor


Moet ik .BackColor eerst ergens declareren?

Edit: Wanneer ik de .BackColor lines uit de code haal werkt het wel. Toch ben ik nieuwsgierig naar hoe ik de .BackColor moet gebruiken
 
Laatst bewerkt:
Ik gebruik een variabele iKleur die ik gebruik om eerst de bestaande kleur op te slaan, en verderop om de kleur weer terug te zetten. Dus de knop heeft verschillende kleuren, naast dus een andere Caption (Bijschrift). Daarmee geef je de functie van de knop een extra signaal. Vermoedelijk moet je de variabele iKleur nog declareren want gebruik je bovenin de optie Option Explicit die het declareren van variabelen afdwingt.
 
Hoi Octafish,

Wanneer ik iets in het formulier (stel ik pas de voornaam aan) verander en ik druk op de knop opslaan werkt het perfect.

Echter wanneer ik op sluiten druk krijg ik altijd de msgbox met de waarschuwing te zien, ook al druk ik ervoor op opslaan (en de waarschuwing over opslaan dus niet meer hoef te krijgen).

Code:
Private Sub cmdSluiten_Click()
 If Me.Dirty Then
        If MsgBox("Je hebt deze kandidaat nog niet opgeslagen; wil je het formulier sluiten?" & vbLf _
            & "Je raakt alle wijzigingen kwijt.", vbYesNo + vbDefaultButton2) = vbYes Then
            DoCmd.RunCommand acCmdUndo
        Else
            Me.Dirty = False
            DoCmd.RunCommand acCmdSaveRecord
        End If
    End If
    DoCmd.Close acForm, Me.Form.Name
    Forms!Medewerkers.Requery
End Sub
 
Dan heb je tóch iets aan de status van het formulier veranderd waardoor Dirty=True wordt ingesteld. Test anders eens uit in de stapmodus nadat je op <Ctrl>+<s> hebt gedrukt en verder niks hebt gedaan.
 
Hoi Octafish, na wat aanpassingen zijn we er bijna.

Er diende een tweetal .requiry aan de code toegevoegd te worden om de sluiten knop beter te laten werken:

Code:
Private Sub cmdKandidaatBewerken_Click()

If Me.cmdKandidaatBewerken.Caption = "&Bewerken" Then
        
        Me.AllowEdits = True
        With Me.cmdKandidaatBewerken
            .Caption = "&Opslaan"
            .FontBold = True

        End With
        
    ElseIf Me.cmdKandidaatBewerken.Caption = "&Opslaan" Then
        
        With Me.cmdKandidaatBewerken
            
            .Caption = "&Bewerken"
            .FontBold = False
                 
                 Forms!MedewerkersUitgebreid.Requery
                 Forms!Medewerkers.Requery
        
        End With
                
    ElseIf Me.Dirty Then Me.Dirty = False
    DoCmd.RunCommand acCmdSaveRecord
    Me.AllowEdits = False
        
End If
     
End Sub

Nu doen bijna alle scenario's het op eentje na: Wanneer ik bij sluiten op nee druk (en dus het forum open wil houden met de bewerkte waarden en de wijzigingen niet wil opslaan) dan sluit hij het forum toch en slaat hij de wijzigingen toch op.
Wanneer ik op ja druk druk gaat het wel goed: het forum sluit en de wijzigingen worden niet doorgevoerd.

Code:
Private Sub cmdSluiten_Click()
 If Me.Dirty Then
        If MsgBox("Je hebt deze kandidaat nog niet opgeslagen; wil je het formulier sluiten?" & vbLf _
            & "Je raakt alle wijzigingen kwijt.", vbYesNo + vbDefaultButton2) = vbYes Then
            DoCmd.RunCommand acCmdUndo
        Else
            Me.Dirty = False
            DoCmd.RunCommand acCmdSaveRecord
        End If
    End If
    DoCmd.Close acForm, Me.Form.Name
End Sub

Ik heb wat aanpassingen proberen te doen maar ik weet niet waar het stuk van het no scenario staat en weet niet hoe ik zeg dat er eigenlijk niks gebeurt als ik op nee druk.
 
Laatst bewerkt:
Waarom zet je nou al die overbodige lege regels in je code? Nou moet ik nodeloos scrollen :)
Code:
Private Sub cmdKandidaatBewerken_Click()

    If Me.cmdKandidaatBewerken.Caption = "&Bewerken" Then
        Me.AllowEdits = True
        With Me.cmdKandidaatBewerken
            .Caption = "&Opslaan"
            .FontBold = True
        End With
    ElseIf Me.cmdKandidaatBewerken.Caption = "&Opslaan" Then
        With Me.cmdKandidaatBewerken
            .Caption = "&Bewerken"
            .FontBold = False
            Forms!MedewerkersUitgebreid.Requery
            Forms!Medewerkers.Requery
        End With
    ElseIf Me.Dirty Then Me.Dirty = False
        DoCmd.RunCommand acCmdSaveRecord
        Me.AllowEdits = False
    End If
     
End Sub

Je moet nog (terug naar de vraag) een extra regel opnemen:
Code:
Private Sub cmdSluiten_Click()
 If Me.Dirty Then
        If MsgBox("Je hebt deze kandidaat nog niet opgeslagen; wil je het formulier sluiten?" & vbLf _
            & "Je raakt alle wijzigingen kwijt.", vbYesNo + vbDefaultButton2) = vbYes Then
            DoCmd.RunCommand acCmdUndo
            GoTo Stoppen
        Else
            Me.Dirty = False
            DoCmd.RunCommand acCmdSaveRecord
        End If
    End If

Stoppen:
    DoCmd.Close acForm, Me.Form.Name
End Sub
 
Mijn excuses, ik wou wat orde creëren. Natuurlijk zijn er meerde manieren om orde te creëren ;)
Grappig dat je daarover begint, ik heb daar nog een vraagstuk voor liggen maar die bewaar ik voor een later moment.

Terug naar de knop sluiten:

So close, but yet so far away (voor mij).

Het anwoord op "Je hebt deze kandidaat nog niet opgeslagen; wil je het formulier sluiten?" doet nog niet wat ie zou moeten doen. Wanneer hier "nee" op geantwoord wordt moet het formulier MedewerkersUitgebreid geopend blijven en moeten de aangebrachte wijzigingen nog op zijn plaats zijn. De wijzigingen mogen dan nog niet doorgevoerd zijn in de database.

Nu is het nog zo dat het formulier toch gesloten wordt. De data wordt gelukkig niet opgeslagen in de tabel.

Het leek me redelijk eenvoudig om dit te veranderen maar door het schuiven met de regels ontstaan er alleen maar vervelendere fouten.

Kort gezegd: hoe hou ik het formulier open als er "nee" bij de msgbox wordt geantwoord?

Code:
Private Sub cmdSluiten_Click()
If Me.Dirty Then
        If MsgBox("Je hebt deze kandidaat nog niet opgeslagen; wil je het formulier sluiten?" & vbLf _
            & "Je raakt alle wijzigingen kwijt.", vbYesNo + vbDefaultButton2) = vbYes Then
            DoCmd.RunCommand acCmdUndo
            GoTo Stoppen
        Else
            Me.Dirty = False
            DoCmd.RunCommand acCmdUndo
        End If
    End If

Stoppen:
    DoCmd.Close acForm, Me.Form.Name
End Sub
 
Sorry, mijn fout. Ik begreep 'm verkeerd.
Code:
Private Sub cmdSluiten_Click()
On Error GoTo Stoppen

    If Me.Dirty Then
        If MsgBox("Je hebt deze kandidaat nog niet opgeslagen; wil je het formulier sluiten?" & vbLf _
            & "Je raakt alle wijzigingen kwijt.", vbYesNo + vbDefaultButton2) = vbYes Then
            Exit Sub
        Else
            Me.Dirty = False
            DoCmd.RunCommand acCmdSaveRecord
            DoCmd.Close acForm, Me.Form.Name
        End If
    End If

Stoppen:
End Sub
 
Sorry, het is er helaas niet beter op geworden:

Sluiten werkt niet meer als ik het formulier MedewerkersUitgebreid open en niks doe; De knop doet dan niks. Ook wanneer ik de Msgbox krijg en daar Ja of Nee antwoord stop de sluiten knop met werken.

Scenario: Ik bewerk een medewerker, sla hem niet op, en druk op sluiten -> Ja sluiten en dus niet opslaan. Het form blijft open en de instellingen worden niet opgeslagen.
Scenario: Ik bewerk een medewerker, sla hem niet op, en druk op sluiten -> Nee, niet sluiten en dus niet opslaan en het forum moet open blijven. Het forum sluit en de instellingen worden opgeslagen.

je zou denken een kwestie van regels omwisselen;

Code:
Private Sub cmdSluiten_Click()
On Error GoTo Stoppen

    If Me.Dirty Then
        If MsgBox("Je hebt deze kandidaat nog niet opgeslagen; wil je het formulier sluiten?" & vbLf _
            & "Je raakt alle wijzigingen kwijt.", vbYesNo + vbDefaultButton2) = vbYes Then
            DoCmd.RunCommand acCmdSaveRecord
            DoCmd.Close acForm, Me.Form.Name
        Else
            Me.Dirty = False
            Exit Sub
        End If
    End If

Stoppen:
End Sub

Helaas, dit lost het probleem niet op;

Ja antwoorden op de vraag: hij blijft wijzigingen doorvoeren. Nee op de vraag: hij blijft de wijzigingen doorvoeren.Ik heb de regel DoCmd.RunCommand acCmdSaveRecord al weg gehaald maar toch blijft hij de wijzigingen doorvoeren.
 
Wanneer hier "nee" op geantwoord wordt moet het formulier MedewerkersUitgebreid geopend blijven en moeten de aangebrachte wijzigingen nog op zijn plaats zijn. De wijzigingen mogen dan nog niet doorgevoerd zijn in de database.
De mgsbox verschijnt alleen als er iets is gewijzigd op het formuiler. Zo niet, dan gebeurt er inderdaad niks maar dat lijkt mij logisch.
De twee scenario's lijken elkaar tegen te spreken:
Scenario: Ik bewerk een medewerker, sla hem niet op, en druk op sluiten -> Ja sluiten en dus niet opslaan. Het form blijft open en de instellingen worden niet opgeslagen.
Scenario: Ik bewerk een medewerker, sla hem niet op, en druk op sluiten -> Nee, niet sluiten en dus niet opslaan en het forum moet open blijven. Het forum sluit en de instellingen worden opgeslagen.
Je wilt dus in beide gevallen niet opslaan . Lijkt mij niet logisch.

Dit lijkt mij logisch:
Code:
Private Sub cmdSluiten_Click()
On Error GoTo Stoppen

    If Me.Dirty Then
        If MsgBox("Je hebt deze kandidaat nog niet opgeslagen; wil je het formulier sluiten?" & vbLf _
            & "Je raakt alle wijzigingen kwijt.", vbYesNo + vbDefaultButton2) = vbYes Then
            Exit Sub
        Else
            Me.Dirty = False
            DoCmd.RunCommand acCmdSaveRecord
        End If
    Else
        DoCmd.Close acForm, Me.Form.Name
    End If

Stoppen:
End Sub
 
Laatst bewerkt:
Ik kan wel zien dat ik mijn vorige post op vrijdag heb geschreven. Wat een onduidelijk geschreven bericht, mijn excuses.

#1 Wanneer ik een medewerker bewerk en niet opsla en vervolgens op sluiten druk krijg ik het volgende bericht: "U hebt de aangebrachte wijzigingen nog niet opgeslagen, wilt u het formulier sluiten?"

Als ik hier op "Ja" druk verwacht ik, en lijkt me logisch, dat het formulier(MedewerkersUitgebreid) waarop ik de wijzigingen heb aangebracht sluit en de wijzigingen niet worden opgeslagen.

Nu is het zo dat wanneer ik op "Ja" druk dat ik terugkeer naar het formulier waarop ik wijzigingen heb aangebracht (MedewerkersUitgebreid). De gegevens worden niet opgeslagen. Het probleem in dit stukje is dus dat het formulier MedewerkersUitgebreid niet sluit terwijl het wel zou moeten sluiten.

#2 Wanneer ik een medewerker bewerk en niet opsla en vervolgens op sluiten druk krijg ik het volgende bericht: "U hebt de aangebrachte wijzigingen nog niet opgeslagen, wilt u het formulier sluiten?"

Als ik hier op "Nee" druk verwacht ik, en lijkt me logisch, dat het formulier niet sluit en de wijzigingen niet doorgevoerd worden in tblMedewerkers. Het formulier MedewerkersUitgebreid moet eigenlijk zo terugkeren als het moment voordat ik op sluiten druk (er veranderd niets). De aangebracht wijzigingen blijven wel in de teksboxen staan maar worden niet opgeslagen.

Nu is het zo dat wanneer ik op "Nee" druk dat ik op het juiste formulier (MedewerkersUitgebreid) blijf maar de wijzigingen worden wel doorgevoerd. Het enige wat hier dus ontbreekt is het voorkomen dat gegevens in tblMedewerkers worden geupdate.

Ik hoop dat het zo wat duidelijker is dan mijn vorige post.
 
Laatst bewerkt:
Het was voor iedereen vrijdag :).
Code:
Private Sub cmdSluiten_Click()
On Error GoTo Stoppen

    If Me.Dirty Then
        If MsgBox("Je hebt deze kandidaat nog niet opgeslagen; wil je het formulier sluiten?" & vbLf _
            & "Je raakt alle wijzigingen kwijt.", vbYesNo + vbDefaultButton2) = vbYes Then
            Me.Undo
            DoCmd.Close acForm, Me.Form.Name, acSaveNo
        Else
            Exit Sub
        End If
    Else
        DoCmd.Close acForm, Me.Form.Name
    End If

Stoppen:
End Sub
 
Alhoewel de maandag vaak ook zwaar is kan de mijne niet meer stuk.

Het werkt! Mijn dank is groot!

Bedankt voor alle hulp en je geduld ;)
 
Status
Niet open voor verdere reacties.
Steun Ons

Nieuwste berichten

Terug
Bovenaan Onderaan