Form opslaan met knoppen bewerken, opslaan en sluiten

Status
Niet open voor verdere reacties.

Bandito

Gebruiker
Lid geworden
8 okt 2012
Berichten
199
Beste,

Een tijd geleden zijn wij bezig geweest met een form waarop een knop met bewerken, opslaan en sluiten zit.

Situatie:
Wanneer er op cmdBewerken wordt gedrukt kunnen er gegevens op het form bewerkt worden. Wanneer er vervolgens op cmdOpslaan wordt gedrukt worden de gegevens opgeslagen in de tabel. Wanneer er dan vervolgens op cmdSluiten wordt gedrukt sluit het form zonder enige melding.

Wanneer er op cmdBewerken wordt gedrukt kunnen er gegevens op het form bewerkt worden. Wanneer er vervolgens niet op cmdOpslaan wordt gedrukt worden de gegevens niet opgeslagen op de tabel. Wanneer er dan vervolgens op cmdSluiten wordt gedrukt krijg de gebruiker een melding: "U heeft de wijzigingen nog niet opgeslagen; wilt u het formulier sluiten"? Met de keuze Ja of Nee.

Code:

Code:
Private Sub cmdBewerken_Click()

On Error GoTo Stoppen
    If Me.cmdBewerken.Caption = "&Bewerken" Then
               
        With Me.cmdBewerken
            .Caption = "&Opslaan"
            cmdEmail.Visible = False
            cmdVerwijder.Visible = True
            
        For Each Control In Me.Controls
            If Control.ControlType = acTextBox Then
            Select Case Control.Name
                   Case _
                            "txtDebiteurnummer", _
                            "txtDebiteurnaam", _
                            "txtStraat", _
                            "txtHuisnummer", _
                            "txtPostcode", _
                            "txtPlaats", _
                            "txtProvincie", _
                            "txtLand", _
                            "txtWebsite", _
                            "txtVoornaam", _
                            "txtAchternaam", _
                            "txtFunctie", _
                            "txtMobielnummer", _
                            "txtBedrijfsnummer", _
                            "txtEmail", _
                            "txtOpmerkingen"
            With Control
                .Locked = False
                .BorderStyle = 4
                .BorderColor = RGB(255, 165, 0)
            End With
            End Select
    End If
Next
    End With
    ElseIf Me.cmdBewerken.Caption = "&Opslaan" Then
                   
        With Me.cmdBewerken
            .Caption = "&Bewerken"
            cmdEmail.Visible = True
            cmdVerwijder.Visible = False
            
        For Each Control In Me.Controls
            If Control.ControlType = acTextBox Then
            Select Case Control.Name
                   Case _
                            "txtDebiteurnummer", _
                            "txtDebiteurnaam", _
                            "txtStraat", _
                            "txtHuisnummer", _
                            "txtPostcode", _
                            "txtPlaats", _
                            "txtProvincie", _
                            "txtLand", _
                            "txtWebsite", _
                            "txtVoornaam", _
                            "txtAchternaam", _
                            "txtFunctie", _
                            "txtMobielnummer", _
                            "txtBedrijfsnummer", _
                            "txtEmail", _
                            "txtOpmerkingen"
            With Control
                    .Locked = True
                    .BorderStyle = 1
                    .BorderColor = RGB(199, 199, 199)
            End With
            End Select
    End If
Next
            Forms!Debiteuren.Requery
            Forms!DebiteurenUitgebreid.Requery
            Forms!Debitueren.lstDebiteuren.Requery
    End With
    ElseIf Me.Dirty Then Me.Dirty = False
        DoCmd.RunCommand acCmdSaveRecord
    End If
    
Stoppen:
End Sub

Code:
Private Sub cmdSluiten_Click()
On Error GoTo Stoppen

    If Me.Dirty Then
        If MsgBox("U heeft de wijzigingen nog niet opgeslagen; wilt u het formulier sluiten?" & vbLf _
            & "U 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

Probleem:
Nu is het zo dat de code soms wel en soms niet werkt. Dit maakt het voor mij lastig om de een fout te ontdekken en vraag daarom jullie hulp.

Soms is het zo dat wanneer ik gegevens bewerkt, vervolgens op opslaan druk en daarna op sluiten dat ik de melding krijg dat de er niet is opgeslagen. Dit terwijl ik wel op opslaan heb gedrukt. Het rare is dat hij het dan wel weer doet als ik acces afsluit en opnieuw opstart en dezelfde handelingen verricht.

Het komt ook voor dat wanneer ik op bewerken druk, ik wijzigingen aanbreng en ik op opslaan druk dat alle textboxen leeg worden gemaakt. Dit terwijl ik normaal gesproken op hetzelfde forum blijf en mijn gewijzigde gegevens te zien krijg.
Het is dan wel zo dat wanneer dit gebeurt ik geen bericht van sluiten krijg. Helaas wil ik graag de gegevens die ik zojuist heb veranderd te zien krijgen.


Zelf denk ik dat het Me.Dirty command af en toe in de war wordt geschopt. Mocht dit het geval zijn, is er een manier om zelf de Me.Dirty in te stellen op true of false wanneer ik op een knop druk?

Bij voorbaat dank,
 
Laatst bewerkt:
Waarom je knop niet goed werkt, zou ik op basis van je verhaal niet kunnen zeggen; vermoedelijk wordt het formulier toch ergens in een Edit mode gezet. Als je de optie <Recordkiezer> op JA zet, kun je dat simpel controleren doordat je dan in de recordpointer een potloodje ziet of een driehoekje. Het potloodje geeft dan aan dat je in de Edit modus zit, en dus de status Dirty hebt.

Als je de eigenschap <Extra Info> (<Tag>) niet gebruikt, kun je veel simpeler (en beter te onderhouden) aangeven welke tekstvakken je wel en niet wilt inschakelen. Dan krijg je deze code:
Code:
            For Each Control In Me.Controls
                With Control
                    If .ControlType = acTextBox Then
                        If .Tag = "Edit" Then
                            .Locked = False
                            .BorderStyle = 4
                            .BorderColor = RGB(255, 165, 0)
                        End If
                    End If
                End With
            Next
In het voorbeeld zet ik in de te bewerken tekstvakken dus in Extra Info de tekst "Edit", en op basis daarvan wordt een tekstvak dan aan- of uit gezet. Aanpassen doe je dan dus op het formulier door die tekst al of niet toe te voegen aan tekstvakken.
 
Hallo,

Ik weet nog niet precies wat ik met <Extra Info> <Tag> moet gaan doen. In het forum is het namelijk zo dat alle textboxen editable zijn wanneer er op bewerken wordt gedrukt.


Bedankt voor de tip. Het blijkt inderdaad dat het forum in de Edit modus zit en er niet uitgaat wanneer er op cmdOpslaan wordt gedrukt. Het is dan dus ook logisch dat ik het bericht "U heeft de wijzigingen nog niet opgeslagen; wilt u het formulier sluiten"?

Vanzelfsprekend wil ik dit niet en moet het forum uit de Edit modus gaan wanneer ik opslaan druk. Enig idee hoe ik dit voor elkaar krijg?

Edit:
Nu ben ik het programma weer aan het doorlopen en werkt het wel gewoon. Heel raar.
Is het dus mogelijk om edit modus geforceerd te sluiten door middel van een command? Dan is het denk ik mogelijk om dit onbetrouwbare (wel of niet werken van opslaan) te elimineren.
 
Laatst bewerkt:
Ik weet nog niet precies wat ik met <Extra Info> <Tag> moet gaan doen. In het forum is het namelijk zo dat alle textboxen editable zijn wanneer er op bewerken wordt gedrukt.
Waarom maak je in jouw code dan een selectie op de tekstvelden? Dat is dan een volledig overbodige (en nogal tijdrovende) bezigheid geweest om om dat allemaal uit te zoeken en in de code te zetten. De code kan dus nog wat korter:
Code:
Private Sub cmdBewerken_Click()
On Error GoTo Stoppen
    If Me.cmdBewerken.Caption = "&Bewerken" Then
        With Me.cmdBewerken
            .Caption = "&Opslaan"
            cmdEmail.Visible = False
            cmdVerwijder.Visible = True
            With Control
                For Each Control In Me.Controls
                    If .ControlType = acTextBox Then
                        .Locked = False
                        .BorderStyle = 4
                        .BorderColor = RGB(255, 165, 0)
                    End If
                Next
            End With
        End With
    ElseIf Me.cmdBewerken.Caption = "&Opslaan" Then
        With Me.cmdBewerken
            .Caption = "&Bewerken"
            cmdEmail.Visible = True
            cmdVerwijder.Visible = False
            With Control
                For Each Control In Me.Controls
                    If Control.ControlType = acTextBox Then
                        .Locked = True
                        .BorderStyle = 1
                        .BorderColor = RGB(199, 199, 199)
                    End If
                Next
            End With
            If Me.Dirty Then Me.Dirty = False
            DoCmd.RunCommand acCmdSaveRecord
            Forms!Debiteuren.Requery
            Forms!DebiteurenUitgebreid.Requery
            Forms!Debitueren.lstDebiteuren.Requery
        End With
    End If
    
Stoppen:
End Sub
En dit zou ook het probleem met het opslaan moeten oplossen.
 
Hey,

Het grote probleem is hiermee inderdaad opgelost.

Er dient met bovenstaande code wel een klein ander probleempje aan;

De titel is ook een textbox. Hier zit een stukje code in zodat de titel van de debiteur wordt weergegeven. Deze textbox is vergrendeld.
Wanneer ik het formulier open ziet het er zo uit:1.png

Als ik nu op bewerken druk veranderd de titel in:
2.png

Wanneer ik nu opslaan druk en alle textboxen vergrendel blijft de witte randlijn zichtbaar:
3.png

Is het mogelijk om deze textbox uit te sluiten van bovenstaande code?
 
De titel is ook een textbox.
Ik zal niet zeggen dat het niet mag, maar slim is het niet. Titels zijn in mijn ogen namelijk altijd labels. Je gebruikt een titel namelijk niet om aan een veld te koppelen, dus er is geen enkele reden om daar geen label voor te gebruiken.
 
De reden waarom het een tekstvak is, is omdat ik dan bij Besturingselementbron de volgende code kan zetten: =Nz([Debiteurnaam];"Geen debiteurnaam geselecteerd")


Kan een label ook de naam van de debiteurnaam geven? In bovenstaande voorbeeld dus Kerr France maar als ik een andere debiteurnaam aanklik een andere naam.
 
Status
Niet open voor verdere reacties.
Steun Ons

Nieuwste berichten

Terug
Bovenaan Onderaan