Hallo liebe Experten,
ich habe ein Formular zum Anlegen eines Datensatzes/Profils. Die Eingabefelder sind auf mehrere Seiten eines Registersteuerelementes verteilt. Einige der Felder sollen Pflichtfelder sein. Auf der letzten Registerseite soll sich eine Schaltfläche zum speichern des Datensatzes befinden. Bisher habe ich dafür ein Makro angelegt, aber ich würde das gerne mit VBA machen.
Beim Klick auf die Schaltfläche soll folgendes passieren:
1. Prüfung ob Pflichtfelder gefüllt sind -> wenn nicht, soll eine Messagebox (OkOnly) erscheinen "Please fill in all required fields." und der Speichervorgang soll einfach abgebrochen werden.
2. sind alle Pflichtfelder ausgefüllt soll eine Messagebox erscheinen "Save profile?" (OkCancel) woraufhin beim OK klicken der Datensatz gespeichert wird und bei Cancel der Speichervorgang abgebrochen wird. (logisch ;D)
3. Sobald der Datensatz jetzt gespeichert wird, soll ein neues Formular "frmHome" geöffnet werden und das aktuelle Formular zum Anlagen des DS geschlossen werden.
Ich habe viel probiert, aber ich kriege das irgendwie alles nicht so unter einen Hut, wie ich es gerne hätte.
Private Sub cmdSave_Click()
...
End Sub
und
ZitatPrivate Sub Form_BeforeUpdate(Cancel As Integer)
...
End Sub
Was muss da rein? ???
Es wäre schön, wenn das ginge ohne, dass ich die Pflichtfelder in der Tabelle auf "Eingabe erforderlich: ja" stellen müsste. Der check in der VBA dürfte reichen.
Danke schon mal, dieses Forum war mir bisher eine große Hilfe!!
Gruß D
Hallo,
was alles hast Du denn probiert?
Private Sub Form_BeforeUpdate(Cancel As Integer)
If IsNull(Me!Feld1) Then
Msgbox "Feld1 nicht ausgefüllt",vbOkOnly
Me!Feld1.Setfocus
Cancel=true
End If
If IsNull(Me!Feld2) Then
Msgbox "Feld2 nicht ausgefüllt",vbOkOnly
Me!Feld2.Setfocus
Cancel=true
End If
.
.
.
If Cancel Then
If Msgbox ("Trotzdem speichern?",VbYesNo) =vbyes Then Cancel = False
End If
End Sub
Sub Form_Afterupdate()
Docmd.Close acForm,Me.Name
Docmd.Openform "frmHome"
End Sub
Hallo,
im Anhang findest Du ein einfaches Beispiel für Pflichtfelder.
In diesem Formular geht gar nix mehr. Man kann noch nicht mal die DB beenden ohne Prüfung.
Hey,
danke schon mal für den Code.
ZitatPrivate Sub cmdCreateSave_Click()
DoCmd.Save acForm, "frmCreateNewCompanyProfile"
DoCmd.OpenForm "frmHome"
DoCmd.Close acForm, "frmCreateNewCompanyProfile"
End Sub
Private Sub Form_BeforeUpdate(Cancel As Integer)
If IsNull(Me!txtCreateCompanyName) Then
MsgBox "Company name required", vbOKOnly
Me!txtCreateCompanyName.SetFocus
Cancel = True
End If
MsgBox "Save as new company profile?", vbOKCancel, "save"
End Sub
So sieht es aktuell aus, ich habe mein ursprüngliches Makro zum Speichern jetzt mit den DoCmd. Operationen ersetzt.
Ist der company name nicht eingetragen kommt zwar die Messagebox, aber er schließt das Formular immer, dabei soll das erst passieren, nachdem "Save as new company profile?" OK angeklickt wurde. Sonst möchte ich, dass er den Speichern/Öffnen/Schließen Vorgang einfach abbricht.
Vorher hatte ich die Pflichtfelder als Eingabe erforderlich: ja eingestellt. Hat dann etwas gefehlt, waren die Fehlermeldungen nicht so ersichtlich, wie sie für den einfachen Anwender hätten sein sollen und das Formular ist dann trotzdem immer geschlossen worden.
Dein Code ist schon mal ein Fortschritt, wie sorge ich dafür, dass das Formular nur geschlossen wird wenn die Pflichtfelder ausgefüllt sind und der Speichervorgang bestätigt wurde? Ich hoffe ihr versteht was ich meine.
Hallo,
vermutlich hast Du meinen Code nicht vollständig gelesen/umgesetzt...
Zitat von: DF6GL am November 28, 2016, 13:11:50
Hallo,
vermutlich hast Du meinen Code nicht vollständig gelesen/umgesetzt...
-.-' scrollen müsste man können.
Das funktioniert schon mal sehr gut, danke bis hier!
Eine "trotzdem speichern" Funktion soll es allerdings nicht geben.
Also:
Private Sub Form_BeforeUpdate(Cancel As Integer)
If IsNull(Me!txtCreateCompanyName) Then
MsgBox "Company name required", vbOKOnly
Me!txtCreateCompanyName.SetFocus
Cancel = True
End If
End Sub
Was jetzt noch fehlt ist eine Messagebox, die vor dem speichern auftaucht und noch ein mal fragt ob gespeichert werden soll. Also nachdem Access gemerkt hat, dass alle Pflichtfelder vollständig sind eine Nachfrage vor dem speichern, sonst Abbruch und wieder im Formular, damit der Anwender, nachdem er auf speichern geklickt doch noch die Möglichkeit hat Änderungen vorzunehmen.
Hallo,
ZitatWas jetzt noch fehlt ist eine Messagebox, die vor dem speichern auftaucht und noch ein mal fragt ob gespeichert werden soll.
In meiner Beispieldb in #2 ist das alles drin, nicht gesehen ?
Hallo,
dann schreib halt:
.
.
If not Cancel Then
Cancel =Msgbox ("Speichern?",vbYesNo) =vbNo
End If
.
Zitat von: MzKlMu am November 28, 2016, 14:48:51
Hallo,
ZitatWas jetzt noch fehlt ist eine Messagebox, die vor dem speichern auftaucht und noch ein mal fragt ob gespeichert werden soll.
In meiner Beispieldb in #2 ist das alles drin, nicht gesehen ?
Danke für deine Hilfe, ich habe:
Private Sub Form_BeforeUpdate (Cancel As Integer)
If Cancel = False Then
If MsgBox("Speichern?", vbYesNo) = vbNo Then
Me.Undo
End If
End If
End Sub
übernommen, allerdings löscht Me.Undo alle Einträge in den Feldern, das darf nicht passieren, die Einträge die gemacht wurden sollen noch stehen bleiben um bei einem Abbruch des Speichervorgangs Ergänzungen machen zu können.
ZitatHallo,
dann schreib halt:
.
.
If not Cancel Then
Cancel =Msgbox ("Speichern?",vbYesNo) =vbNo
End If
.
Klicke ich auf "Ja" speichert er und schließt das Formular, bei "nein" kommt eine Fehlermeldung:
"Einzelschritt"
"frmCreateNewCompanyProfile : cmdSave1 : OnClick : Eingebettetes Makro" Fehlernummer 3021
Bisher habe ich für den Savebutton ein Makro angelegt "Datensatz speichern", den VBA Code dafür habe ich bisher nicht rausfinden können.
Private Sub cmdSaveVBA_Click()
DoCmd.Save acForm, "frmCreateNewCompanyProfile"
End Sub
ist es jedenfalls nicht. :-\
Danke für eure Geduld :)
Hallo,
Zitatallerdings löscht Me.Undo alle Einträge in den Feldern
Und um welche Maßnahme dagegen konnte es sich wohl handeln ??
Lass das Me.Undo einfach weg....
Einen Speichern-Button brauchst Du nicht.
Um das Speichern von Daten(sätzen) durchzuführen, reicht der Wechsel zu einem anderen DS oder das Schließen des Forms.
Per VBA ginge es so:
Docmd.Runcommand accmdSaveRecord
oder
Me.Dirty=false
Docmd.Save hat einen anderen Hintergrund. (sichert die Einstellungen eines Forms.)
Weiterhin: Wirf das Makro beim Klick-Ereignis des Buttons "cmdSave1" heraus.
Okay also ich habe jetzt am Schluss einen "Close" Button.
Private Sub cmdClose_Click()
DoCmd.RunCommand acCmdSaveRecord
End Sub
Private Sub Form_BeforeUpdate(Cancel As Integer)
If IsNull(Me!txtCreateCompanyName) Then
MsgBox "Company name required", vbOKOnly
Me!txtCreateCompanyName.SetFocus
Cancel = True
End If
If Not Cancel Then
Cancel = MsgBox("Speichern?", vbYesNo) = vbNo
End If
End Sub
Sub Form_Afterupdate()
DoCmd.Close acForm, Me.Name
DoCmd.OpenForm "frmHome"
End Sub
Bei "Ja" funktioniert alles, bei "Nein" kommt "Laufzeitfehler '3021': Kein aktueller Datensatz."
Ich hab das Gefühl ich bin fast am Ziel. ;D
Hallo,
probier mal:
Private Sub cmdClose_Click()
DoCmd.Close acForm, Me.Name
End Sub
Zitat von: DF6GL am November 28, 2016, 16:47:43
Hallo,
probier mal:
Private Sub cmdClose_Click()
DoCmd.Close acForm, Me.Name
End Sub
Wenn ich Daten eingebe und auf "Speichern -> Ja" gehe kommt Laufzeitfehler '2501' "Die Aktion Close wurde abgebrochen."
Bei "Nein" schließt er das Formular einfach. :/
Hallo,
bei Nein ist es doch ok...
Für ja schreib noch
On Error Resume Next vor den Code...
Ansonsten lad die DB mal hier hoch.. debuggt und gezippt....
Oder schau Dir den Vorschlag vom Klaus an, ob er Deine Vorstellung trifft.
Bei "Nein" soll er im Formular bleiben, mit allem was darin steht, also quasi einfach nur die Messagebox schließen, als wäre der Close-Button nicht gedrückt worden.
Nachdem ich "Error Resume Next" eingegeben habe kommt "Sie haben als Einstellung der Ereigniseigenschaft den Ausdruck Beim Klicken eingegeben. Dieser Ausdruck hat einen Fehler verursacht: Außerhalb einer Prozedur ungültig."
Ich wünsche noch einen schönen Abend, ich schaue morgen wieder hier rein.
Grüße und noch mal danke für die Hilfe heute!
Hallo,
etwa so:
Option Compare Database
Option Explicit
Private Sub cmdClose_Click()
DoCmd.Close acForm, Me.Name
DoCmd.OpenForm "frmHome"
End Sub
Private Sub Form_BeforeUpdate(Cancel As Integer)
If IsNull(Me!txtCreateCompanyName) Then
MsgBox "Company name required", vbOKOnly
Me!txtCreateCompanyName.SetFocus
Cancel = True
End If
If Not Cancel Then
Cancel = MsgBox("Speichern?", vbYesNo) = vbNo
End If
End Sub
Hey,
nach wie vor schließt sich das Formular, wenn ich auf Speichern? -> Nein klicke. :-\
Hallo,
das Schließen des Formulars musst Du aktiv verhindern. Und dazu kann nur das Ereignis "Beim Entladen" verwendet werden, weil es nur dort den Parameter Cancel gibt.
Das kannst Du alles in meinem Beispiel in #2 nachvollziehen.
Also wenn ich das richtig verstanden habe, sorgt die Form_Unload Funktion dafür, dass der Anwender Access nicht versehentlich schließen kann.
Das ist aber nicht mein Ziel, ich werde leider aus dem #2 nicht all zu schlau, meine VBA Kenntnisse sind ziemlich begrenzt.
Private Sub cmdClose_Click()
DoCmd.RunCommand acCmdSaveRecord
End Sub
Private Sub Form_BeforeUpdate(Cancel As Integer)
If IsNull(Me!txtCreateCompanyName) Then
MsgBox "Company name required", vbOKOnly
Me!txtCreateCompanyName.SetFocus
Cancel = True
End If
End Sub
Sub Form_Afterupdate()
DoCmd.Close acForm, Me.Name
MsgBox "Profile has been saved successfully", vbOKOnly
DoCmd.OpenForm "frmHome"
End Sub
Das ist jetzt mein Code, ich habe mich jetzt gegen die Messagebox (vbYesNo) vor dem speichern entschieden und dafür eine vbOkOnly eingebaut, die das speichern nach dem schließen bestätigt.
Das Problem ist, dass wenn das Pflichtfeld nicht ausgefüllt ist, der Laufzeitfehler 3021 auftaucht.
Wie kann ich den Close-Vorgang abbrechen um das entsprechende Pflichtfeld zu ergänzen und den Laufzeitfehler umgehen?
Es fällt mir schwer das aus deiner, auf meine DB zu übertragen Klaus. :-\
Edit: Ich habe "On error resume next" an allen möglichen Stellen eingebaut, aber das hat nicht funktioniert.
Ich habs raus! Danke euch beiden!!